一·效果展示
1号——原视频;2号——最终视频;3号——光流法;4号——参数
二·环境要求
- keras == 2.1.6
- pillow == 6.1.0
- pyQt5 == 5.13.0
- matplotlib == 3.1.1
- numpy == 1.16.4
- opencv-python == 4.1.0.25
- sklearn == 0.21.2
- scipy == 1.2.1
- tensorflow == 1.14.0
三·开发流程
1·判别条件
- Curve_catastrophe.py :计算轨迹方向变化值,默认设置大于 25 度为轨迹突变
- box_overlap.py:计算事故参与双方(车与车,人与车) box 重合度,默认大于0.2为潜在事故发生
- speed_jump.py:计算目标速度是否发生突变,默认十帧之间速度变化率小于0.5则速度发生突变
- central_offset.py:计算目标是否长时间保持固定,默认两帧之间中心点误差不超过图像宽度的0.02倍,则认为保持静止。默认为同时保持静止的两物体不会发生事故
- line_cross.py:将物体轨迹延伸一定绝对距离以便做相交判断,默认延伸距离R=200
- h_w:计算矩形框高宽比,用于筛选人与车。默认大于1.5的物体为人
2·光流视频
# 读取视频
cap = cv2.VideoCapture("E:/Project/Accident_Detection20190725/test_video/007.mp4")
ret, frame1 = cap.read()
prvs = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY)
hsv = np.zeros_like(frame1)
hsv[...,1] = 255
while True:
ret, frame2 = cap.read()
next = cv2.cvtColor(frame2,cv2.COLOR_BGR2GRAY)
# 稠密光流跟踪
flow = cv2.calcOpticalFlowFarneback(prvs,next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1]) # 坐标系转换
hsv[...,0] = ang*180/np.pi/2
hsv[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX)
bgr = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR)
cv2.imshow('frame2',bgr)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
elif k == ord('s'):
cv2.imwrite('opticalfb.png', frame2)
cv2.imwrite('opticalhsv.png', bgr)
prvs = next
cap.release()
cv2.destroyAllWindows()
3·数据输出
- 疑似事故方数据
其中:速度参数需要先对相机标定,而后得到像素与米的换算关系才可以精准计算。本文采用半自动化得到换算关系,即借助鼠标键盘事件。 - 图幅内所有对象的数据
4·界面制作
四·总结与展望
1·总结
- 判别条件是项目开发的重头戏,需要不断测试找到最佳的判别组合条件,同时找到合适的阈值
- 光流法对于移动目标的检测十分有效,但受限于返回值,其对后续判别帮助有限;同时因为是传统算法,所以外界因素影响下,其准确度一般
- yolo+deepsort算法是MOT检测与跟踪的不二之选,其速度与精度都很不错
- 数据输出为csv文件,可以用excel打开,直观明了,方便操作
2·展望
- 针对部分三轮车或电动车检测有误,后期应补充数据集继续训练网络
- 针对事故场景多变复杂,后期应对事故类型进行分类,采用合适的判别条件及相应的阈值
五·鸣谢
- 特别鸣谢事故检测开发组所有成员:* 子遥,* 沐 ,* 泽阳
- 鸣谢视觉测控与智能导航实验室张老板以及临港六狼团队所有成员