目标检测(object detection),就是在给定的图片中精确找到物体所在位置,并标注出物体的类别。所以,object detection要解决的问题就是物体在哪里以及是什么的整个流程问题。
然而,这个问题可不是那么容易解决的,物体的尺寸变化范围很大,摆放物体的角度,姿态不定,而且可以出现在图片的任何地方,更何况物体还可以是多个类别。
目前学术和工业界出现的目标检测算法分成3类:
- 传统的目标检测算法:Cascade + HOG/DPM + Haar/SVM以及上述方法的诸多改进、优化;
- 候选区域/框 + 深度学习分类:通过提取候选区域,并对相应区域进行以深度学习方法为主的分类的方案,如:
- 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
等系列方法;
- 基于深度学习的回归方法:YOLO/SSD/DenseBox 等方法;以及最近出现的结合RNN算法的RRC detection;结合DPM的Deformable CNN等
参考链接:https://cloud.tencent.com/developer/article/1549986
传统目标检测方法
传统目标检测流程:
1)区域选择(穷举策略:采用滑动窗口,且设置不同的大小,不同的长宽比对图像进行遍历,时间复杂度高)
2)特征提取(SIFT、HOG等;形态多样性、光照变化多样性、背景多样性使得特征鲁棒性差)
3)分类器分类(主要有SVM、Adaboost等)
传统目标检测方法主要分为以下几个发展阶段:
- 基于滑动窗口的方法
- 通过在不同位置和尺度上滑动窗口来检测目标
- 典型代表:Viola-Jones检测器(用于人脸检测)
- 使用Haar-like特征和AdaBoost分类器
- 计算量大,效率较低
- 基于特征提取的方法
- 使用手工设计的特征描述符
- 常见特征:
- HOG(方向梯度直方图)
- SIFT(尺度不变特征变换)
- SURF(加速稳健特征)
- 结合SVM等分类器进行目标识别
- 典型应用:DPM(可变形部件模型)
- 基于区域提议的方法
- 首先生成可能包含目标的候选区域
- 然后对每个区域提取特征并分类
- 代表性算法:
- Selective Search
- Edge Boxes
- 为后续深度学习目标检测方法奠定了基础
传统的目标检测算法
卷积神经网络CNN已经帮我们完成了图像识别(判定是猫还是狗)的任务,我们只需要添加一些额外的功能来完成定位任务即可。
思路一 :作为回归问题解决,直接在整张图像上预测出(x,y,w,h)四个参数的值,回归部分用欧式距离作为损失函数。神经网络的尾部展开,一个用于classification ,另外一个用于regression。
思路二 :取图像窗口
• 整体采取的还是刚才的classification + regression思路
• 取不同的大小的"框"
• 让框出现在不同的位置,得出这个框的判定得分,作为训练时的标签
• 预测时,取得分最高的那个框作为预测结果
用各种大小的框(遍历整张图片)将图片截取出来(一般是窗口滑动),输入到CNN,然后CNN会输出这个框的得分(classification)以及这个框图片对应的x,y,h,w(regression),我们以得分最大的那个框作为最终的预测位置。
注意:有的时候也会选择得分最高的两个框,然后取两框的交集作为最终的位置预测。
传统目标检测面临的问题:
1)基于滑动窗口的区域选择策略没有针对性,时间复杂度高,窗口冗余
2)手工设计的特征对于多样性的变化没有很好的鲁棒性
参考链接:https://blog.csdn.net/qq_41427568/article/details/102000012
现代目标检测方法
参考链接:https://blog.csdn.net/qq_41427568/article/details/102000012
https://blog.csdn.net/m0_44975814/article/details/143742985
https://cloud.tencent.com/developer/article/1549986
R-CNN(Region Proposal + CNN)
原理:
- 候选区域生成:R-CNN 首先使用传统的方法(如 Selective Search)生成一系列可能包含物体的候选区域。Selective Search 是一种基于颜色、纹理、大小、形状等多种特征的图像分割方法,通过合并相似的区域来生成候选区域。
- 特征提取:对于每个候选区域,R-CNN 使用预训练的卷积神经网络(如 AlexNet)提取特征。将每个候选区域缩放到固定大小(如 227x227),然后输入到卷积神经网络中进行前向传播,提取最后一层卷积层的输出作为该候选区域的特征表示。
- 分类:在特征提取之后,使用支持向量机(SVM)对每个候选区域进行分类,判断其是否属于某个类别。
- 回归:使用边界框回归器对候选区域的位置进行调整,使其更加准确地贴合物体的边界,即对于属于某一类别的候选框,训练一个线性回归模型去判定这个框是否完美。
缺点 :R-CNN流程的第一步中对原始图片通过Selective Search提取的候选框region proposal多达2000个左右,而这2000个候选框每个框都需要进行CNN提特征+SVM分类,计算量很大,导致R-CNN检测速度很慢,一张图都需要47s。
R-CNN有一些相当大的缺点(把这些缺点都改掉了,就成了Fast R-CNN)。
- 大缺点:由于每一个候选框都要独自经过CNN,这使得花费的时间非常多。
- 解决:共享卷积层,现在不是每一个候选框都当做输入进入CNN了,而是输入一张完整的图片,在第五个卷积层再得到每个候选框的特征。
应用场景:R-CNN 系列算法在多个领域有广泛应用,如安防监控中对人员、车辆等目标的检测;医疗影像分析中对病变组织、器官等的识别;工业质检中对产品缺陷的检测等。
Fast R-CNN
原理:
1.在图像中确定约1000-2000个候选框 (使用选择性搜索Selective Search)
2.对整张图片输进CNN,得到feature map
3.找到每个候选框在feature map上的映射patch(这个区域也被称为Region Of Interest 或ROI),将此patch作为每个候选框的卷积特征输入到SPP layer(金字塔池化层)和之后的层
4.对候选框中提取出的特征,使用分类器判别是否属于一个特定类
5.对于属于某一类别的候选框,用回归器进一步调整其位置
对比R-CNN,Fast R-CNN主要有两个地方不同,第一是在最后一个卷积层后面加入了一个ROI pooling层,第二是在损失函数中使用了多任务损失函数(multi-task loss),将Bounding Box Regressing直接加入到CNN网络中进行反向传播训练。
(1)ROI pooling layer其实是一个SPP-NET(金字塔池化层)的精简版。SPP-NET对每个候选框使用了不同大小的金字塔映射,比如说使用1 ∗ 1 , 2 ∗ 2 , 4 ∗ 4 11,2 2,4*41∗1,2∗2,4∗4三个尺寸来划分候选框在特征图上对应的patch,最后得出1+4+16=21个区域,对于每个区域使用max pooling层,从而得到固定大小的输出(21 * 特征图深度)。而ROI pooling layer只需要将特征图上每个patch划分成7x7=49块,对每一块进行max pooling。这样所有的候选框的patch都对应了一个7x7x最后一层卷积的kernel_num的张量,作为后续网络的输入。
参考链接:RoI Pooling Layer
(2)Fast R-CNN直接使用softmax层替代SVM分类,同时将边框回归的损失函数也加入到了网络中,构成了多任务损失函数,这样整个训练过程是端到端的。
也就是说,之前R-CNN的处理流程是先提proposal,然后CNN提取特征,之后用SVM分类器,最后再做bbox regression,而在Fast R-CNN中,作者巧妙的把bbox regression放进了神经网络内部,与region分类和并成为了一个multi-task模型,实际实验也证明,这两个任务能够共享卷积特征,并相互促进。
原来的方法R-CNN:许多候选框(比如两千个)-->CNN-->得到每个候选框的特征-->分类+回归
现在的方法Fast R-CNN:一张完整图片-->CNN-->得到每张候选框的特征-->分类+回归
所以容易看见,Fast R-CNN相对于R-CNN的提速原因就在于:不过不像R-CNN把每个候选区域给深度网络提特征,而是整张图提一次特征,再把候选框映射到conv5上,而SPP只需要计算一次特征,剩下的只需要在conv5层上操作就可以了。
Faster R-CNN
Fast R-CNN存在的问题:存在瓶颈:选择性搜索,找出所有的候选框,这个也非常耗时。那我们能不能找出一个更加高效的方法来求出这些候选框呢?
解决:加入一个提取边缘的神经网络,也就说找到候选框的工作也交给神经网络来做了。
所以,rgbd在Fast R-CNN中引入Region Proposal Network(RPN)替代Selective Search,同时引入anchor box应对目标形状的变化问题(anchor就是位置和大小固定的box,可以理解成事先设置好的固定的proposal)。具体做法:
•将RPN放在最后一个卷积层的后面
•RPN直接训练得到候选区域
RPN简介:
•在feature map上滑动窗口
•建一个神经网络用于物体分类+框位置的回归
•滑动窗口的位置提供了物体的大体位置信息
•框的回归提供了框更精确的位置
原理:
- 特征提取:使用卷积神经网络提取输入图像的特征,得到特征图。常用的骨干网络有 VGG、ResNet 等。
- 区域提议网络(RPN):在特征图上引入区域提议网络(RPN),用于生成候选区域。RPN 通过在特征图上滑动窗口,每个窗口位置生成多个不同大小和比例的锚框(anchor),然后对这些锚框进行分类(判断是否包含目标)和回归(调整锚框的位置和大小),得到初步的候选区域。
- RoI Pooling:将 RPN 生成的候选区域映射到特征图上,然后使用 RoI Pooling(Region of Interest Pooling)操作将不同大小的候选区域转换为固定大小的特征向量,以便后续的分类和回归操作。
- 分类:使用全连接层对 RoI Pooling 后的特征向量进行分类,使用分类器判别是否属于一个特定类
- 回归:对于属于某一类别的候选框,用回归器进一步调整其位置,得到最终的目标检测结果,包括目标的类别和精确的位置信息。
可以看到,从Fast R-CNN到Faster R-CNN最大的变化是选择候选框的策略。Fast R-CNN使用选择性搜索,找出所有的候选框,这个过程非常耗时。所以在Faster R-CNN中,加入一个提取边缘的神经网络,也就是说找到候选框的工作也交给神经网络来做了。
应用场景:Faster R-CNN 在目标检测的准确性上有较高的表现,适用于对检测精度要求较高的场景,如医学影像诊断中对病灶的检测和分析;卫星图像中对特定目标的识别和定位等。
总的来说,从R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走来,基于深度学习目标检测的流程变得越来越精简,精度越来越高,速度也越来越快。可以说基于Region Proposal的R-CNN系列目标检测方法是当前目标检测技术领域最主要的一个分支。同时因为这些技术需要先进行Region Proposal确定候选框,再针对候选框进行回归与分类,所以我们也将采用这种思想的目标检测技术称为两步法。
SSD(Single Shot MultiBox Detector)
Faster R-CNN的方法目前是主流的目标检测方法,但是速度上并不能满足实时的要求。YOLO和SSD这类的方法慢慢显现出其重要性,利用整张图作为网络的输入,直接在图像的多个位置上回归出这个位置的目标边框以及目标所属的类别,这种没有事先通过Region Proposal生成候选框的思想称为一步法。
早期的Yolov1存在很多问题,比如v1使用整图特征在7*7的粗糙网格内回归对目标的定位并不是很精准。那是不是可以结合Region Proposal的思想实现精准一些的定位?SSD结合YOLOv1的回归思想以及Faster R-CNN的anchor机制做到了这点。(anchor的理解:其实就是人工规定的Region Proposal,在训练前确定所有anchors的大小、位置后,在以后的训练过程中就固定使用这些anchors,不用再在Region Proposal上耗费多余的时间)
SSD从Faster R-CNN中吸收了anchor box这一思想,采用的是均匀地将不同尺寸的default box分配到不同尺度的feature map上。例如6个feature map的尺度,default box的大小从20%到90%的占比,同时有aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]] ,最终可以计算出不同default box大小。
原理:
- 多尺度特征图检测:利用卷积神经网络的不同层的特征图进行目标检测。在不同尺度的特征图上,每个像素点都对应着不同大小和比例的默认边界框(prior box)。通过这种方式,可以在不同尺度上检测不同大小的目标,提高了对多尺度目标的检测能力。
- 直接回归:与 YOLO 类似,SSD 也是一种 "端到端" 的检测算法,直接对目标的类别和位置进行回归预测。对于每个默认边界框,预测其是否包含目标以及目标的类别和位置偏移量,以便将默认边界框调整到更准确的位置。
应用场景:SSD 算法在速度和精度之间取得了较好的平衡,因此在一些对实时性和准确性都有要求的场景中得到应用,如机器人视觉系统中对周围环境的感知和目标识别;智能交通系统中对车辆、行人等的检测和跟踪等
YOLO(You Only Look Once)系列
原理:
- 网格划分:将输入图像分成 SxS 个网格。每个网格负责预测该网格内是否存在目标以及目标的类别和位置信息。
- 边界框预测:每个网格预测多个边界框,每个边界框用五个预测值表示,即 x,y,w,h 和 confidence(置信度)。其中,(x,y) 是边界框的中心坐标,w 和 h 是边界框的宽度和高度,这四个值都被归一化到 (0,1) 区间以便于训练;置信度反映了当前边界框中存在目标的可能性以及预测框与真实框的交并比。
- 类别预测:预测每个网格分别属于每种目标类别的条件概率。在测试时,属于某个网格的多个边界框共享所有类别的条件概率,每个边界框属于某个目标类别的置信度为边界框的置信度与类别条件概率的乘积。
Yolov3横空出世,在速度和精度上打败了他的对手SSD,可以说是目前性能较好的一步法目标检测算法,v3经历了两个版本的迭代,在吸取前代产品经验的同时,也采取了其他目标检测算法(比如SSD)的一些优点,性能表现十分强劲。
参考:https://blog.csdn.net/litt1e/article/details/88907542
应用场景:由于其检测速度快,YOLO 系列算法适用于对实时性要求较高的场景,如自动驾驶中对道路上的车辆、行人、交通标志等的实时检测;智能监控系统中对异常行为的实时监测和预警;无人机对环境的实时监测等