matlab运动目标检测
fast R-CNN解决了这个问题,使用ROI pooling的方法提取到了等长的特征向量,从而使得只需要过一遍CNN,运行速度大大提升。刚才写到了,RCNN运行慢的原因是所有备选框均需要过一遍CNN,以提取到等长的特征向量。如果把全图过一遍CNN,再提取特征向量,会导致这些向量不等长,从而使得下面的处理无法进行。对于问题一,想到了一种解决方法,使用两帧差,而不是当前帧与首帧的差。最典型的方法当属
运动目标检测
一、基于图像处理的方法
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已经可以实现相当好的实时处理效果了。
检测部分没别的了,有机会把跟踪部分也写一下。
更多推荐


所有评论(0)