大概的思路如下
- 就是利用mobile-ssd轻量化模型进行目标检测,识别我的人脸和杯子,如果离的比较近就认为已经喝水了(毕竟杯子到嘴边的情况只能是喝水的时候才会发生,谁没事和杯子贴贴?)
- 在树莓派4B上安装环境部署模型
- 写出逻辑,进行实时图像判断
其实除了目标检测,还可以使用图像分类(判断是否是喝水的状态,理论上效果会更好)、人体关键点检测(非常具有挑战性的一种方法)等等,我是因为目标检测比较熟悉且有进一步开发的需要,所以采用了目标检测的方法。
模型训练
本次模型采用了mobile-ssd模型,为了保证模型的准确率,训练所用的数据均为自己采集的。训练好的模型会放在ssd-model下,预训练模型在pretrained-model下。
数据准备
为了平衡计算速度和准确率,本次采集了640×480大小的图片,推理的时候也会使用这个大小。
我是用Windows自带的相机应用,选择640×480的大小,来采集数据集,更方便一点,如下图所示:
实现判断喝水的需求,没有必要标注整个脸部,我选择标注month和cup,如下图所示:
总共采集了44张图片,经过了水平翻转、高斯噪点、随机亮度的增强,最终得到了264条数据。
如果时间足够,想保证稳定性,一定要多采一些!!!
如果不是数据特别少,请慎重考虑高斯噪点增强,这会增加不少训练时间
最后的数据集是放在了work目录下:
label_list自己手动新建一下,重命名加后缀名.txt就可以修改,修改完之后再删掉后缀名就行,里面存放你的标签名,一行一个标签名
我的label_list的内容如下
我们还需要生成train.txt和eval.txt,生成方法在下面的代码块里
开始训练
- 训练的脚本就是train.py,需要修改以下几点
- train.py line 26,包含背景类,比如你有四类,就要加上一类背景类,写5
- data_dir 就是你的train.txt eval.txt image annotation所在的目录
- 模型会用data_dir + file_list 找到train.txt, 再根据train.txt里面的相对路径,找到图片和标签
- train.py line 46,batch_size可以修改的大一点,因为需要的显存特别小,bs可以非常大,也可以去train.txt 和eval.txt里,调整一下训练集和验证集的数据量
- 建议在32G环境下训练,一般30分钟内就能出结果。
功能实现
注意,这个地方我放的源码是在树莓派上可以正常运行的,强烈建议大家提前去看一下Paddle Lite的文档,很详细
代码编写
在实际运行的过程中发现,逻辑判断只需要判断杯子就可以,因为杯子放在桌子上,摄像头根本看不到,平时拿起杯子就是喝水的,所以逻辑判断写的很简单。
效果展示
测试30秒不喝水就进行提醒。
其实有一点点小遗憾,屏幕上的文字提醒终究是不如图像或者声音舒服,然后手上没有合适的小屏幕,有没有声音播放工具,遗憾只能留到下次解决了。