这里给大家带来一个借助角蜂鸟实现的简单的坐姿监测器。
硬件清单参考如下:
- 角蜂鸟
- 树莓派3b
- 蜂鸣器
在角蜂鸟的内置模型中和公开的数据集中没有关于坐姿的,我们要实现效果非常好,需要大量的数据,自己去采集数据并去标记不太现实。这里我们采用角蜂鸟内置的 GoogleNet
来实现我们的需求,仿照情景记录器
做一个比较简单的坐姿监测器。
我们需要记录至少2个场景分类:
大概的处理逻辑如下:
首先,我们需要先记录我们的情景分类。
我们可以执行SDK示例程序中的 SceneRecorder.py
来记录场景,再拷贝数据文件到我们的项目中,或者仿照情景记录器自己去实现。
这里我们把情景记录与应用分开,树莓派的界面实在不够友好,我们在PC端进行场景记录,在树莓派上实现我们监测的应用。
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
为不良的坐姿。在训练的过程中,如果出现误检,需要再次记录场景,再次训练,不断扩充训练集。
蜂鸣器控制代码如下:
#!/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()