摘要
- 遗留物检测算法:基于OpenCV通过背景减除法实现遗留物检测
- 2022年刚入职时,公司在做VCA(Video Content Analyze,视频结构化产品),我第一个任务是完成遗留物检测算法,通过本次任务我接触到了OpenCV以及一些基础的图像知识和常见处理方法。
- 借助面试机会,梳理一下遗留物检测任务。
背景
- 2022年6月刚入职,公司主要在做边缘计算产品,产品具有区域入侵,烟火检测,口罩检测,越线检测等算法。
- 我先学习了OpenCV,FFmpeg,基于A311D智能盒子的硬件推理加速(前处理,推理,后处理)。基于以上知识,开始了遗留物检测算法的开发。
- 遗留物检测算法,是在固定场景下检测是否有物品遗留,有物品遗留超出指定事件,产生告警信息。
思路
- 由于当时刚接触视觉检测,没有深度学习相关基础,所以选择通过传统计算机视觉算法实现。
- 大致思路
- 背景建模
- 运动检测
- 驻留时间分析
背景建模
方法一:
- 开始是取第一帧作为背景,固定时间(12h)刷新背景。
- 问题:随时时间变化,光照随着变化,虽然是室内场景,但是物体的阴影变化,窗户的光照影响导致误判率很高
方法二:
- 基于OpenCV提供的算法进行背景建模:MOG2(高斯混合模型)和KNN(K-Nearest Neighbors).由于MOG相对于KNN计算开销较低,实时性较好,适合部署至边缘设备,所以选择了MOG2
- 通过提供参数调整接口,提供动态调参功能。
动态检测
- 通过背景减除法,分离出前景和背景
- 对前景先做开运算(先腐蚀,后膨胀),主要作用是去除噪声区域,同时保持整体形状
- 然后再做闭运算(先膨胀,后腐蚀),主要作用是填充小孔洞,同时保持整体形状。
- 查找轮廓,通过轮廓的面积过滤小面积噪声
- 定义一个全局的存储追踪目标的容器,第一帧开始所有的目标都存入,遍历第二帧检测的所有目标,依次在上一帧中查找IOU大于0.3的,如果大于0.3,则表示同一个目标,如果IOU大于0.8,表示物体处于静止状态,将静止标志设置为true,将目标的ID和属性信息存储到新的容器中。循环结束后,将新的容器赋值到全局容器,更新追踪目标。
- 最后判断,遍历当前目标容器,当目标的时间超出阈值,且静止标志为真时,触发告警。