1.背景
物体检测(object detection)是计算机视觉非常重要的一个领域。RCNN作为该领域的开山鼻祖,在深度学习出现之前,传统方法始终无法处理好物体检测问题(会通过非常庞大的计算,来算出结果),在深度学习方法引入之后,物体检测领域就有了改变。最著名的是RCNN系列,另外还有YOLO、SSD系列。
首先总结一下RCNN。
2.步骤
RCNN算法分为4个步骤
- 候选区域生成: 一张图像生成1K~2K个候选区域 (采用Selective Search 方法)
- 特征提取: 对每个候选区域,使用深度卷积网络提取特征 (CNN)
- 类别判断/位置精修: 使用回归器精细修正候选框位置, 而特征送入每一类的SVM 分类器,判别是否属于该类,并且用NMS提出掉相似的框,保留最准确的框。
文章图片
可以认为这是一种非监督的方式,它就是看图像中每个pixel的相似程度,如图像中边缘特征比较明显的地方,像素之间明显的地方,根据这个,它会把图像分成很多区域块,根据这些区域块,会找出很多矩形框,也就是会生成2k候选框。然后Warp To Fixed Size将每个框,resize到相同大小大概2k个。流程如图:
文章图片
2.2特征提取 2000张图片后面紧接着一个卷积神经网络,提取图像特征。
**问题一:为什么要resize成大小一样的2k张:
答:Selective Search 后接的是一个卷积神经网络,后面有fc层,最后向量的维度2000*4096是一样的,所以必须要输入图像一样。
文章图片
2.3类别判断/位置精修(分类与回归,即SVM Classification + NMS + BBox Regression) **以现在的眼光看过去,实际上SVM完全没有必要用到,完全可以上一步CNN得到特征后直接做分类与回归,而没有必要再用SVM再多一次。
**其中弄清楚一个很重要的问题NMS是什么,即非极大值抑制(Non-Maximum Suppression):
我们知道首先是通过2.1得到了2k个region proposal(候选区域), 经过2.2得到2k个feature vector(向量),经过SVM的到2k个result bbox,这个bbox它有一些属性,比如【id/socre(0-1)/】,首先id的意思就是第几个,score就是判断是不是手的概率,怎么判断呢,即设置一个阈值,比如0.8,小于它就提出掉不要了。通过阈值的筛选,最后2k个变成200个,NMS就是从这200个里面,评分最高的几类。
文章图片
比如图中的检测手的任务,我们通过阈值剔除掉其余1.8k只手,就要用剩下两百个框通过NMS筛到只留四个框,分别代表四只手。
NMS数学及代码解释:
文章图片
B是每个框(200个),S是B的得分情况,比如0.8,0.92,0.982,0.99......(200个),Nt是阈值
首先遍历一下B, 找到200个中最大的S,将找到的最大分值bm给到M,然后B - bm更新为199个,然后依次循环剩下的199个,分别与最大值bm做IOU计算,设置一个阈值,假如为0.3,大于0.3的我们就认为是在检测同一个物体,就会被剔除掉,实际上NMS更新出现在这里。
假如若检测将本之间重叠,比如:
文章图片
这种情况剔除掉谁也不合适,都是需要检测的内容。
所以针对NMS的改进,用一个高斯分布:
【R-CNN小结】e-iou(M, bi) ? σ,即它会对相似度高的有抑制作用,相似度越高,会尽可能使之讲到阈值之下。
代码:https://github.com/passional/cv_tool/blob/main/nms.py
3.一些问题缺点 速度特别慢,主要是因为它把很多的内容拆成很多很多部分,比如必须需要用Selective Search纯手算proposal,然后需要把2000个proposal全部仍到CNN中去,去算feature vector,然后还没完,还要将feature vector扔到传统机器学习SVM去分类。
参考目录:RCNN-将CNN引入目标检测的开山之作-晓雷的文章
基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN-冠军的试练的博客
RCNN系列