1. 目标检测问题定义
1.1 目标检测定义
目标检测是在图片中对可变数量的目标进行分类和查找。
主要难点:
- 目标种类与数量问题
- 目标尺度问题
- 外在环境干扰问题
- 形态、视角等变化
1.2 目标检测vs图像分类
1.3 目标检测vs目标分割
图三为语义分割,图四为实例分割。实例分割不仅要区分语义层面上的目标,同一类别的目标也需要划分出不同的实例。目标检测相对于目标分割更关注语义层面的分割结果,而目标分割更关注于像素级别处理的任务。 目标检测主要定位物体的位置,主要表示为一个矩形,一个矩形可以通过一个四维的数据进行表示,目标分割需要对每一个像素点来进行不同类别的划分,我们的结果就需要同原始的图片大小保持一致,所以目标分割往往会采用上采样、反卷积这样的方式来得到原始图像大小的输出结果。
2. 目标检测问题方法
2.1 传统目标检测方法到深度学习目标检测方法的变迁
(1)传统目标检测算法比较有代表性的算法有V计算法
,HOG
,DPM
等,这些方法主要是传统的手动提取特征并结合滑动窗口的方式来进行目标检测定位,存在问题主要有:
-
通过传统方式设计特征,特征难设计、特征存在的问题较多不鲁棒,比如特征对某些特定条件不适应、效率也不高。
-
通过滑动窗口的方式生成目标框并对目标框进行分类判定这种策略比较繁琐,慢,耗时,所以在2008年
DPM
算法提出后目标检测算法遇到了很大的瓶颈,很难在DPM
上进行提升。
(2)2012年卷积神经网络兴起之后利用卷积神经网络代替传统手工设计特征的方式来完成目标检测的任务,这也是基于深度学习目标检测算法的一个里程碑的事件,例如overfeat
,RCNN
方法的提出,但是这些方法在使用深度学习的时候只是利用卷积神经网络来提取特征,并没有从本质上改变搜索框提取目标区域的策略,因此这些方法在速度上依然存在瓶颈。
(3)Faster RCNN
等方法提出以后,通过RPN
网络来代替原始的窗口策略,标志基于深度学习的目标检测方法彻底完成了一个端到端的过程,使得基于深度学习的目标检测方法在性能和速度上都得到很大地提升。
(4)Yolo
、SSD
等方法不采用提取候选框的策略,而采用直接回归目标框的位置这一策略来完成目标检测和定位,再一次对目标检测算法速度进行了提升,而且在精度上也能保证原先基于propersal
候选框策略的算法基本一致。
2.2 算法基本流程
上面图表示两种方法,有候选框特征提取的方法,和特征提取直接回归的方法。两种方法目前用得比较多的都是深度学习的方法,但是这个框架同样也适用于传统方法。
2.3 传统目标检测方法
(1)viola-Jones
方法。主要采用积分图特征,结合Adaboost
分类器进行人脸检测等目标检测的任务。
(2)HOG+SVM
。主要用于行人检测任务。通过对行人目标候选区域提取HOG
特征并结合SVM
分类器来进行判定。
(3)DPM
。是基于HOG
特征的一种变种,但DPM
会加入很多的额外的策略来提升检测的精度,它是目前非深度学习目标检测方法中效果性能最优的一种方法。
2.4 深度学习目标检测方法
(1)One-stage
(YOLO
和SSD
系列) 它主要通过直接回归目标的位置这种方法来进行目标检测定位
(2)Two-stage
(Faster RCNN
系列)主要通过利用RPN
网络对候选区域进行推荐
2.5 传统目标检测方法VS深度学习目标检测方法
传统目标检测方法 | 深度学习目标检测方法 |
---|---|
手动设计特征 | 深度网络学习特征 |
滑动窗口 | Proposal 或者直接回归 |
传统分类器 | 深度网络 |
多步骤 | 端到端 |
准确度和实时性差 | 准确度高和实时性好 |
2.6 目标检测应用场景
人脸检测、文本检测、交通检测、通用物体识别、卫星图像等。
3. 传统目标检测算法
3.1 综述
输入图片,然后滑动窗口提取候选框,对窗口中的局部图像信息进行特征提取,如基于颜色的方法、基于纹理的方法、基于形状的方法以及一些中高层次语义特征的方法,这些方法有些是需要经过学习来得到的方法,比如抽取最基本的直方图特征,以及纹理特征如HOG
特征等,这样的一些稠密特征之后经过PCA
算法进行特征降维,或者LDA
算法进行空间投影,对抽取出的基本特征来进行进一步学习,来挖掘一些更加鲁棒的特征出来,因此对于传统计算机视觉中常见的特征提取方法分为三大类:
- 底层特征。颜色纹理等最基本的特征。
- 中层次特征。对底层特征进行机器学习的方法来进行特征挖掘、特征学习后得到的特征,比如
PCA
特征,LDA
学习之后的特征等一些基于优化理论来完成的特征的学习。 - 高层次的特征。将低层次或中层次特征进行进一步挖掘和表示,比如可以把一个人可以用是否戴帽子、头发的长短、所穿的服装等来表示。
目标检测算法中通常使用低层次特征和中层次特征。
然后对提取出来的特征用学习好的分类器进行分类判定。得出一系列可能为当前检测目标的候选框,这些候选框可能会存在一些重叠的状况,然后通过NMS
非极大值抑制的算法来对候选框进行合并,最后得到最终需要检测的目标,也就是算法输出的结果。
3.2 Viola-Jones
它主要用于人脸检测 ,它的主要关键点有:
Haar
特征提取- 训练人脸分类器(
Adaboost
算法等) - 滑动窗口
(1)特征
最终特征的表示形式为表示为直方图,它需要统计下面四种不同类别的特征
具体可以看这个博客:https://www.cnblogs.com/mikewolf2002/p/3438181.html
(2)Adaboost
算法
- 初始化样本的权重w,样本权重之和为1
- 训练弱分类器
- 更新样本权重
- 循环第二步
- 结合各个分类器结果,进行投票
3.3 HOG+SVM
它主要用于行人检测,行人检测的难点主要在于行人一般处于运动状态,行人的姿态存在比较多的差异,它的步骤如下:
- 提取
HOG
特征 - 训练
SVM
分类器 - 利用滑动窗口提取目标区域,进行分类判断
NMS
- 输出检测结果
(1)HOG
特征HOG
特征通过计算梯度方向来统计最后的直方图,也是纹理特征的一种,它的流程如下:
- 灰度化+
Gamma
变换。hog
特征主要用在灰度图上,gamma
变换指对整个像素的值开根号,这样整个像素的值会变小。 - 计算梯度
map
。即计算每个点在x
方向和y
方向上的梯度值,并利用这个梯度值在计算梯度夹角,方向角a=arctan(x/y)
,然后将a
量化到0-360°
,再划分为x
个段,比如18个段,20°
为一个段。 - 图像划分成小的
cell
,统计每个cell
梯度直方图。如果上面划分18个段,那么统计出的直方图维度就是18维。 - 多个
cell
组成一个block
,特征归一化。假如每个cell
得到一个18维的特征,每四个cell
组合成一个block
,那么一个block
的特征维度就是4*18
,然后归一化。 - 多个
block
串联,并归一化。
hog
特征的维度跟量化的角度有关,然后跟cell
的大小有关系,通常hog
特征有几千维,所以直接用hog
特征计算的时候计算难度也比较大,所以可以采用PCA
降维的方法进行降维
(2)SVM
SVM
的东西比较多,有需要的可以好好学习一下。
3.4 DPM
它是传统目标检测算法的巅峰之作,它是对HOG
算法的一种扩展,进行特征提取时基于HOG
特征进行扩展和优化,利用SVM
训练得到物体的梯度。它的流程如下:
- 计算
DPM
特征图 - 计算响应图
Latent SVM
分类器训练- 检测识别
(1)计算DPM特征图
对于方向特征,如果我们统计0~360°
一整圈的方向特征,则称之为有符号的梯度,如果不考虑方向,只考虑0-180°
的变换,则称之为无符号的梯度。DPM
算法在特征提取时分别针对有符号梯度和无符号梯度这两种特征进行提取。
在有符号梯度方向表示的时候将整个角度空间表示为18维的向量,对于无符号梯度方向直方图将整个角度空间表示为9维的向量,这样就能得到27维的特征,也就是说对每个cell
可以得到27维的直方图。
针对HOG+SVM
中,HOG
维度过高的弊端,通常会采用PCA
对HOG
特征进行降维,在DPM
算法中则采用一种逼近PCA
的方法来进行一种近似的处理,即对每一个cell
所提取出的27维的直方图进行求和来表示,在水平方向上求和得到4个值,在垂直方向上进行求和来得到27个值,然后将4和27个值得到拼接得到最终37维的特征向量,这样一方面避免了PCA
降维过程,因为PCA
可能会带来性能上的消耗。直接采用累加方式首先速度上有很大地提升,另外也能达到一个较好的降维的效果。
(2)计算响应图(root filter和part filter)
得到特征图后进一步计算响应图,响应图表示当前区域可能为目标的值,这个值可以理解为能量分布,当前的能量分布越高则可能为检测目标的概率越大。
响应图包括局部区域值的检测和整体的检测。比如对于一个行人来说可能要去检测他的头,检测他的胳膊,检测他的躯干,将他的局部区域检测出来之后,我们就能进一步地判定当前的目标是否是行人。
(3)Laten SVM分类器训练
针对响应图我们训练SVM
分类器进行分类识别,然后结合NMS
算法进行分类框的合并。
3.5 NMS(非极大值抑制算法)
目的:为了消除多余的框,找到最佳的物体检测的位置。
思想:选取那些邻域里分数最高的窗口,同时抑制那些分数低的窗口。
如上图右边框过多,我们只需要保留最佳的框。
(1)NMS
:
- 对所有检测到的框按照得分进行排序,选出得分最高的检测框。
- 将同得分最高的检测框的
IOU
面积大于某个阈值的框(即重叠率高的框)删除。 - 对没有处理过的检测框重新排序,选出得分最大的检测框。
- 将同当前得分最大的检测框的
IOU
面积大于某个阈值的框 ,再进行删除。 - 不断迭代这个过程,直到所有检测框都被处理后我们输出最终的检测框。
(2)soft-NMS
改进:Soft-NMS
(非极大值抑制算法)
我们直接采用阈值来对检测框进行判定是不太合理的,处理起来过于粗暴。
- 相邻区域内的检测框的分数进行调整而非彻底抑制,从而提高了高检索率情况下的准确率。
- 在低检索率时仍能对物体检测性能有明显提升。
4. 基于深度学习的目标检测算法
4.1 Two-stage基本介绍
4.1.1 概述
(1)Two-stage
目标检测算法主要通过一个完整的卷积神经网络来完成目标检测的过程。通过卷积来提取候选区域目标的特征的描述。
(2)它的典型代表有R-CNN
到fast RCNN
、faster RCNN
(3)如果不考虑two-stage
算法需要单独训练RPN
网络这一过程,可以将它理解为广义的端到端的目标检测算法。实际上它也不是完全意义上的端到端,因为在训练网络的过程中需要分为两个步骤,第一步是训练RPN
网络,第二步才是训练目标检测区域的网络。但相对于传统目标检测算法,它不需要再去额外训练分类器、做特征表示这一过程,整个目标检测的过程都通过一个从A到B的一个完整的卷积神经网络来完成,相对于传统的目标检测算法,它的精度得到了较大的提升。
(4)准确度高,速度相对one-stage
慢。
4.1.2 two-stage基本流程:
- 首先输入一个图片
- 然后对图片通过卷积神经网络进行深度特征的提取,我们把这里的卷积神经网络称为主干网络,典型的主干网络有如
VGG
,Resnet
等。 - 通过一个
RPN
网络来产生候选区域,并将候选区域分为背景和目标两种,并对目标位置进行初步预测。 ROI_Pooling
。对于多个feature map
,我们想要不去重复地计算CNN
特征,所以就要ROI Pooling
。fc
全连接进行分类和回归分别完成对候选目标类别的判定和位置的精修。
4.1.3 two-stage常见算法
4.2 Two-stage核心组件
Two-stage
核心组件有CNN
网络和RPN
网络。
4.2.1 CNN网络
CNN
网络我们通常有以下几个设计原则:
- 从简到繁再到简的卷积神经网络。最开始的网络如
LeNet
非常简单,只有几个卷积层池化层,结构简单,但在大规模任务中可能性能没那么好 。后面VGG
,DenseNet
,ResNet
等复制的网络被提出,它们一般尽可能增加网络深度来增强非线性表达能力,如DenseNet
,ResNet
且越深层次的网络对图像最初的变换更不敏感,也就是说越深层次的特征鲁棒性越好,但越深的网络会加大网络规模和导致梯度消失梯度爆炸;或者尽可能加大网络宽度来增加网络的表达能力,如GoogleNet
。在后面设计的轻量网络如MobileNet
是最后简的部分。 - 多尺度特征融合的网络
- 更轻量级的
CNN
网络,因为有些网络需要跑在终端而不是云端,如MobileNet
。可以对网络进行压缩裁剪等进行轻量化来减小网络的大小,使网络在尽可能小地损失性能的情况下压缩模型的大小,使网络最终能跑在一些性能比较差的机器上。
4.2.2 RPN网络
经过主干网络之后我们会得到feature map
, 它通常为一个n*c*w*h
维度的特征。n
为batch_size
的数量,c
为channle
的个数,w
和h
为长宽。把feature map
送给RPN
网络来完成区域推荐和候选目标的筛选。这相当于传统目标检测算法的滑动窗口策略。
-
区域推荐(
Anchor
机制)feature map
的每个锚点,用9个不同的尺度提取9个候选区域。所以一个w*h
的feature map
可以提取w*h*9
个候选区域,然后对候选区域进行筛选划分为背景和目标。用与GT
的IOU
来筛选是否是目标,比如IOU
大于0.7为正样本,小于0.3为负样本。 此时候选区域是针对特征图的,我们要找到相对于原图的特征区域的话可以通过原图下采样来找。 -
ROI Pooling
输入:特征图、
rois(1*5*1*1)
区域的坐标(I(索引),X,Y,W,H
)、ROI
参数。
输出:固定尺寸的feature map
,通过ROI
参数来设定。因为后面要进入fc
,所以要固定尺寸。 -
分类和回归
改进方向:
4.3 One-stage基本介绍
4.3.1 One-stage 综述
(1)使用CNN
卷积特征
(2)直接回归物体的类别概率和位置坐标值(无region proposal
)
(3)准确度低、速度相对two-stage
快
4.3.2 One-stage基本流程
给定输入后进入一个主干网络进行特征提取,然后直接进行区域的回归和目标的分类。在很多嵌入式产品中更加倾向于one-stage
的目标检测。
4.3.3 One-stage常见算法
其中,YOLO
和SSD
用得最多。
4.4 One-stage核心组件
4.4.1 CNN网络
CNN
网络设计原则:
- 从简到繁再到简的卷积神经网络
- 多尺度特征融合的网络
- 更轻量级的
CNN
网络
4.4.2 回归网络
(1)区域回归(置信度、位置、类别)
(2)Anchor
机制(SSD
)
SSD
算法同样采用了Anchor
机制来回归目标区域,对于经过主干网络卷积之后得到的feature map
,我们考虑feature map
中的每个点都是一个anchor
,每个anchor
提取不同尺度的长宽比,然后对这些目标区域进行位置回归和类别判定。
4.4.3 回归网络预测过程
以Yolo
为例:
Yolo
算法进行预测的时候会针对整张图片进行划分成S*S
的格子,每个网格分别预测当前网格为中心的目标区域的位置信息,预测出中心之后再给出格子的尺寸,就能在图片中找到一个矩形区域,然后再预测一个置信度。然后针对每一个格子预测出当前的格子所属的目标的类别的概率分布值。后面的省略。
由于我们采用格子划分的方式,认为每一个格子点都是目标检测的中心点,但有可能划分的格子都不是目标的中心点,所以基于中心点来预测目标区域所对应的boundingbox
这种假设会导致检测框准确度会更低;它也可能一个格子中包含两个中心点,这时候会漏检。
4.5 One-stage VS Two-stage
一些解释:
对于共享计算量,Two-stage
中提取出目标候选区域后通过共享参数的方式减小网络的模型,这一点因为one-stage
网络上所以不会被用到,Two-stage
中相当于对模型进行了正则。
具体的算法选型通常依赖于计算的瓶颈,也就是在产品中会分配给多少资源给目标检测,如果很难做到任意资源的分配的话,需要平衡算法的性能以及算法模型大小和功耗。
来源:CSDN
作者:我是天才很好
链接:https://blog.csdn.net/weixin_43593330/article/details/103760970