需求
- 检测是否完成每道工序
- 检测完成每道工序的时间
- 检测完成每道工序动作的标准性(没有很好的idea,未实现)
方案
功能的实现基于目标检测。目标检测是对视频帧进行处理,因此工作重点在于如何定义动作。以“擦门”为例:
- [法一] 在标注数据集时定义,这样很直接。标注框内包含“手”、“抹布”和“门”,label就是“clean_door”;
- [法二] 在后处理中定义。比如以”越界“(或”IoU“)为判断依据,标注时只有单个对象—“抹布”和“门”。“抹布” 和“门”IoU由“0” —> 非“0”,开始擦门;反之擦门结束。
实际测试结果法二的效果(就检测对象的置信度而言)会好于法一。法一要做到样本的多样性,“手”、“门“和”抹布“三个元素的组合再加上环境因素变化,多少张图片的数量级才能满足数据集的多样性不好评估;而法二中,识别单个元素,每个对象用100张以上的自建数据集就可以做demo。
后处理可以根据需求DIY。举个例子,基于法二,工序1需要A和B两个个检测对象,工序2需要B和C两个检测对象。检测到正在实现工序1则只显示A和B框,完成工序1提示需要完成工序2(这时也可以记录时间点作为动作开始的时间,用于计算工作效率等等),此时只显示B和C的检测框。实现这样效果只需要在不同的工序通过设置flag,显示需要显示的检测框。
代码
我手上的项目是暂时都是基于yolov7的,github上找目标检测网络很方便,就不多此一举了。
XXX
如果下游任务只关注动作结果,上述的方案可以解决大多数问题;如果下游任务希望更多的关注过程,或者动作行为通多对单帧图片的检测不好对其进行定义(比如操作是否合规,动作是否准确)…这样的话,仅关注一张图片忽略图片中信息的连续性不行,需要加上时序信息,换而言之是对视频信息(不管是连续还是离散的)做处理。
测试过基于MMaction2的TSN和slowfast。存在两个问题:1.demo检测的是本地视频,视频是”精心“挑选过的,所以看着效果很好,细看还是有漏检误判的情况;2. 实时性,在4070显卡上测试,从打开摄像头到出图象有10s左右的延迟,不知道问题出哪儿了(延迟的情况在基于pytorchvideo的实现中没出现)。
这是对最近工作的小结,希望通过抛砖引玉看到更多解决方案。