运动目标检测

一、基于图像处理的方法

1、最初的想法如下:

  • 读取首帧的图像(转为灰度图)
  • 把当前帧的图像(转为灰度图)与首帧灰度图做差
  • 对做差得到的图像进行二值化、膨胀处理
  • 寻找轮廓,抑制掉过小的轮廓,找到车辆的大致位置

当然了,这个方法的效果十分不好,如图:

原因如下:

  • 首帧也存在车辆,不是背景图,做差会存在误差
  • 邻近的小车会识别为一辆车的轮廓,而一辆大车可能会识别为多辆车的轮廓

对于问题一,想到了一种解决方法,使用两帧差,而不是当前帧与首帧的差。但由于车辆运动并没有那么快,连续两帧之间几乎完全相同,导致效果也不好。

再改进一下,如果采用当前帧与前N帧的差,而不是与前一帧的差。由于不同镜头中车辆运动的快慢不同,N的取值很难设定,效果还是不好。

2、使用opencv自带的createBackgroundSubtractorMOG2方法创建背景图,再使用当前帧与背景图做差。

这次的效果好多了,但是远处的车辆依然无法准确检测。

二、基于深度学习的方法

图像处理的效果是有上限的,毕竟它不知道什么是车什么不是车。下面写写我试过的基于深度学习的方法。

基于深度学习的检测方法分为两种:one stage和two stage。

(一)two stage

最初的检测方法大部分是基于two stage的,顾名思义,two stage方法分为两步:

  • 生成备选框
  • 利用CNN对备选框进行分类,然后修正备选框的位置

基于CNN应用在全图上的优良性能,这个方法还是十分自然的。

1、R-CNN

  • 通过Selective Search方法筛出备选框
  • 将备选框resize成特定大小的图片,然后提取定长的特征向量
  • 使用SVM进行分类
  • 利用非极大值抑制(NMS)去掉重复的备选框
  • 使用回归方法修正备选框的位置

RCNN的问题是太慢了,很难做到实时处理,原因是所有备选框都会过一遍CNN,严重影响了运行速度。

2、fast R-CNN

RCNN:图像——备选框——CNN——特征向量——SVM

fast R-CNN:图像——CNN——ROI pooling——特征向量

刚才写到了,RCNN运行慢的原因是所有备选框均需要过一遍CNN,以提取到等长的特征向量。如果把全图过一遍CNN,再提取特征向量,会导致这些向量不等长,从而使得下面的处理无法进行。

fast R-CNN解决了这个问题,使用ROI pooling的方法提取到了等长的特征向量,从而使得只需要过一遍CNN,运行速度大大提升。fast R-CNN还去掉了最后的SVM,成为了端对端的检测方法。

经试验,确实快了不少,但还是难以做到实时处理。

3、faster R-CNN

faster R-CNN使用基于anchor box的RPN 网络代替Selective Search方法寻找备选框,进一步提升了运行速度。

然而,还是做不到实时处理……

(二)one stage

one stage方法不再需要预先生成备选框,而是对图像不同位置的候选框进行分析处理。最典型的方法当属yolo。

1、yolov1

  • 把图像划分为7*7的网格
  • 在每个网格内预测两个框(每个框的置信度和在不同类别上的概率)
  • 去除可能性较低的框,使用NMS去除重复的框

2、yolov2

改进:

  • 使用kmeans方法得到anchor box
  • 批量归一化
  • 多尺度预测

3、yolov3

改进:

  • 主干网络使用darknet-53

yolov4和yolov5我还没有试验,使用yolov3已经可以实现相当好的实时处理效果了。

检测部分没别的了,有机会把跟踪部分也写一下。

更多推荐