最近做了一个跌倒检测demo,使用的是lightweight_openpose+fullconnection,这篇文章是以应用为主,已经在GitHub上开源啦,
源码openpose_fall_detect
为什么使用lightweight_openpose,在此之前跑了很多模型哈,包括C3D、R3D、R(2+1)D、yolo、alphapose、STGCN、openpose等,以上模型有时间了再和大家分享,综合来说,lightweight_openpose速度快(比以上提到的模型都快),精度也很不错,接下来谈一谈这个项目的模型及怎么实现的。
lightweight_openpose VS openpose
这个轻量级的openpose相比openpose有哪些改进呢,先看看openpose的原始结构
接下来谈谈对openpose的改进
改进一:backbone:VGG19 to mobilev1
改进二:把生成keypoints和PAFs的两个网络合并成一个
改进三:把7x7的卷积换成3x3和1x1的卷积块,为保持视野,使用dil=2的空洞卷积
经过以上改进,速度相比原openpose快了很多,精度和原openpose相差很小
大致知道了如何改进的openpose,理论不多说,接下来谈谈怎么利用lightweight_openpose+fullconnection实现跌倒识别
一、
lightweight_openpose用来识别骨骼
二、
把骨骼图片传入全连接层,全连接层对骨骼进行判断,输出骨骼状态(fall or normal),发现精度还可以进一步提高,就是使用宽高比进行辅助判断,跑出来的效果确实好了很多。
关于lightweight_openpose可以参考其论文Lightweight OpenPose
及其github相关代码
关于全连接层的训练,很简单,首先生成训练集和测试集,直接利用lightweight_openpose生成后保存就好,我已经对源码做了部分修改,在pose.py文件中添加了保存功能,在demo文件调用时可以设置is_save = True
骨骼生成完后,创建test与train文件夹作为训练集与测试集,在test和train文件夹下创建fall与normal文件夹,把相应的骨骼图片放进去就好,如下图
之后训练就可以啦,几个小时就可以训练好
以下附几张效果图
为了方便操作,项目中添加了一个简单的GUI操作界面,入口文件为fall_down_detector.py
权重文件下载地址:
链接:https://pan.baidu.com/s/1QB8j7bXsmpEpfc4d3HkUIg
提取码:5d6o
任何程序错误,以及技术疑问或需要解答的,请扫码添加作者VX