当前位置:   article > 正文

一文读懂物体检测(包括R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD物体检测)_物体识别算法

物体识别算法

   一文读懂物体检测(包括R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD物体检测)

                                                                                                                                                                         ——Danbinabo

一、目标检测常见算法

object detection,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别。所以,object detection要解决的问题就是物体在哪里以及是什么的整个流程问题。

 

然而,这个问题可不是那么容易解决的,物体的尺寸变化范围很大,摆放物体的角度,姿态不定,而且可以出现在图片的任何地方,更何况物体还可以是多个类别。

 

目前学术和工业界出现的目标检测算法分成3类:

1. 传统的目标检测算法:Cascade + HOG/DPM + Haar/SVM以及上述方法的诸多改进、优化;

 

2. 候选区域/框 + 深度学习分类:通过提取候选区域,并对相应区域进行以深度学习方法为主的分类的方案,如:

R-CNN(Selective Search + CNN + SVM)

SPP-net(ROI Pooling)

Fast R-CNN(Selective Search + CNN + ROI)

Faster R-CNN(RPN + CNN + ROI)

R-FCN

等系列方法;

 

3. 基于深度学习的回归方法:YOLO/SSD/DenseBox 等方法;以及最近出现的结合RNN算法的RRC detection;结合DPM的Deformable CNN等

000

 

0000000000

传统目标检测流程:

1)区域选择(穷举策略:采用滑动窗口,且设置不同的大小,不同的长宽比对图像进行遍历,时间复杂度高)

2)特征提取(SIFT、HOG等;形态多样性、光照变化多样性、背景多样性使得特征鲁棒性差)

3)分类器分类(主要有SVM、Adaboost等)

 

二、传统的目标检测算法

 

2.1 从图像识别的任务说起

 

这里有一个图像任务:既要把图中的物体识别出来,又要用方框框出它的位置。

这个任务本质上就是这两个问题:一:图像识别,二:定位。

 

图像识别(classification):

输入:图片

输出:物体的类别

评估方法:准确率

 

定位(localization):

输入:图片

输出:方框在图片中的位置(x,y,w,h)

评估方法:检测评价函数intersection-over-union(关于什么是IOU,请参看本深度学习分类下第55题:https://www.julyedu.com/question/big/kp_id/26/ques_id/2138)

卷积神经网络CNN已经帮我们完成了图像识别(判定是猫还是狗)的任务了,我们只需要添加一些额外的功能来完成定位任务即可。

 

定位的问题的解决思路有哪些?

思路一:看做回归问题

看做回归问题,我们需要预测出(x,y,w,h)四个参数的值,从而得出方框的位置。

步骤1:

*先解决简单问题, 搭一个识别图像的神经网络

*在AlexNet VGG GoogleLenet上fine-tuning一下(关于什么是微调fine-tuning,请参看本深度学习分类下第54题:https://www.julyedu.com/question/big/kp_id/26/ques_id/2137)

 

 

步骤2:

*在上述神经网络的尾部展开(也就说CNN前面保持不变,我们对CNN的结尾处作出改进:加了两个头:“分类头”和“回归头”)

*成为classification + regression模式

 

步骤3:

*Regression那个部分用欧氏距离损失

*使用SGD训练

 

步骤4:

*预测阶段把2个头部拼上

*完成不同的功能

 

这里需要进行两次fine-tuning

第一次在ALexNet上做,第二次将头部改成regression head,前面不变,做一次fine-tuning

 

Regression的部分加在哪?

 

有两种处理方法:

  • 加在最后一个卷积层后面(如VGG)

  • 加在最后一个全连接层后面(如R-CNN)

 

regression太难做了,应想方设法转换为classification问题。

regression的训练参数收敛的时间要长得多,所以上面的网络采取了用classification的网络来计算出网络共同部分的连接权值。

 

思路二:取图像窗口

  • 还是刚才的classification + regression思路

  • 咱们取不同的大小的“框”

  • 让框出现在不同的位置,得出这个框的判定得分

  • 取得分最高的那个框

 

左上角的黑框:得分0.5

右上角的黑框:得分0.75

左下角的黑框:得分0.6

右下角的黑框:得分0.8

根据得分的高低,我们选择了右下角的黑框作为目标位置的预测。

注:有的时候也会选择得分最高的两个框,然后取两框的交集作为最终的位置预测。

 

疑惑:框要取多大?

取不同的框,依次从左上角扫到右下角。非常粗暴啊。

 

总结一下思路:

对一张图片,用各种大小的框(遍历整张图片)将图片截取出来,输入到CNN,然后CNN会输出这个框的得分(classification)以及这个框图片对应的x,y,h,w(regression)。

 

 

这方法实在太耗时间了,做个优化。

原来网络是这样的:

 

 

优化成这样:把全连接层改为卷积层,这样可以提提速。

 

 

2.2 物体检测(Object Detection)

 

当图像有很多物体怎么办的?难度可是一下暴增啊。

 

那任务就变成了:多物体识别+定位多个物体

那把这个任务看做分类问题?

看成分类问题有何不妥?

  • 你需要找很多位置, 给很多个不同大小的框

  • 你还需要对框内的图像分类

  • 当然, 如果你的GPU很强大, 恩, 那加油做吧…

 

所以,传统目标检测的主要问题是:

1)基于滑动窗口的区域选择策略没有针对性,时间复杂度高,窗口冗余

2)手工设计的特征对于多样性的变化没有很好的鲁棒性

 

看做classification, 有没有办法优化下?我可不想试那么多框那么多位置啊!

 

三、候选区域/窗 + 深度学习分类

 

3.1 R-CNN横空出世

 

有人想到一个好方法:预先找出图中目标可能出现的位置,即候选区域(Region Proposal)。利用图像中的纹理、边缘、颜色等信息,可以保证在选取较少窗口(几千甚至几百)的情况下保持较高的召回率(Recall)。

 

所以,问题就转变成找出可能含有物体的区域/框(也就是候选区域/框,比如选2000个候选框),这些框之间是可以互相重叠互相包含的,这样我们就可以避免暴力枚举所有框了。

 

 

大牛们发明好多选定候选框Region Proposal的方法,比如Selective Search和EdgeBoxes。那提取候选框用到的算法“选择性搜索”到底怎么选出这些候选框的呢?具体可以看一下PAMI2015的“What makes for effective detection proposals?”

 

以下是各种选定候选框的方法的性能对比。

 

 

有了候选区域,剩下的工作实际就是对候选区域进行图像分类的工作(特征提取+分类)。

 

对于图像分类,不得不提的是2012年ImageNet大规模视觉识别挑战赛(ILSVRC)上,机器学习泰斗Geoffrey Hinton教授带领学生Krizhevsky使用卷积神经网络将ILSVRC分类任务的Top-5 error降低到了15.3%,而使用传统

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/718831
推荐阅读
  

闽ICP备14008679号