坐姿提醒

这里给大家带来一个借助角蜂鸟实现的简单的坐姿监测器。

硬件清单参考如下:

  • 角蜂鸟
  • 树莓派3b
  • 蜂鸣器

构思

2-1

在角蜂鸟的内置模型中和公开的数据集中没有关于坐姿的,我们要实现效果非常好,需要大量的数据,自己去采集数据并去标记不太现实。这里我们采用角蜂鸟内置的 GoogleNet 来实现我们的需求,仿照情景记录器做一个比较简单的坐姿监测器。

我们需要记录至少2个场景分类:

  • 正确的坐姿
  • 不良的坐姿

大概的处理逻辑如下:

2-2

准备

首先,我们需要先记录我们的情景分类。 我们可以执行SDK示例程序中的 SceneRecorder.py 来记录场景,再拷贝数据文件到我们的项目中,或者仿照情景记录器自己去实现。 这里我们把情景记录与应用分开,树莓派的界面实在不够友好,我们在PC端进行场景记录,在树莓派上实现我们监测的应用。

3-1

import sys
sys.path.append("../../SungemSDK-Python")
import hsapi as hs
import cv2


if __name__ == '__main__':
    cv2.namedWindow("Scene Recorder", cv2.WINDOW_NORMAL)
    try:
        net = hs.SceneRecorder(zoom=True, verbose=2)
        while True:
            result = net.run()
            key = cv2.waitKey(5)
            prob = net.record(result, key, saveFilename="./record.dat")
            cv2.imshow("Scene Recorder", result[0])
            cv2.waitKey(1)
    finally:
        cv2.destroyAllWindows()

我们需要不断去重复训练的过程,不断去修正,直到达到预期的结果。这里 1 为正确的坐姿,2 为不良的坐姿。在训练的过程中,如果出现误检,需要再次记录场景,再次训练,不断扩充训练集。

实现

4-1

蜂鸣器控制代码如下:

#!/usr/bin/env python3
# coding=utf-8

import RPi.GPIO as GPIO

PIN = 7


def setup():
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(PIN, GPIO.OUT, initial=GPIO.HIGH)


def warning(on=True):
    GPIO.output(PIN, not on)


def clean():
    GPIO.cleanup()

主要处理代码如下:

#!/usr/bin/env python3
# coding=utf-8

from SungemSDK.api import hsapi as hs
import buzzer

if __name__ == '__main__':
    buzzer.setup()
    counter = 0

    try:
        net = hs.SceneRecorder(zoom=True, verbose=2)

        # 加载存档
        result = net.run()
        net.record(result, ord("l"), saveFilename="./record.dat")

        while True:
            result = net.run()  # 读取角蜂鸟返回的结果
            prob = net.record(result, -1, saveFilename="./record.dat")

            counter = (counter + 1) if prob[1] > 0.5 else 0
            buzzer.warning(counter > 10)  # 不良坐姿大于10帧时报警
    finally:
        buzzer.clean()