目标检测基础知识介绍
导语:最近看了很多的关于目标检测的博客和论文,看的似懂非懂;因此今天开始写一下自己的学习心得,希望能给需要的人一些帮助。
摘要:
在今天之前我的大部分时间都花在学习图像的分类上,主要是学习经典的卷积神经网络(LeNet/AlexNet/NIN/VGG/Google/ResNet)等等,然后利用迁移学习(transfer learning)技术对不同图像的分类任务(classification)进行训练(train)。但是,一直以来没有学习关于目标检测(object detection)的相关内容,就觉得自己的知识始终是有很大的空缺。因此从今天开始学习目标检测的相关知识,这篇博客将主要用来记录一些很基础的知识或者这个方向的研究现状和发展趋势(trend)。
1、计算机视觉(CV,Computer Vision)领域任务是什么?
目前计算机视觉(CV,computer vision)与自然语言处理(Natural Language Process, NLP)及语音识别(Speech Recognition)并列为人工智能(AI,artificial intelligence)·机器学习(ML,machine learning)·深度学习(DL,deep learning)方向的三大热点方向 。
图像分类、目标检测、分割是计算机视觉领域的三大任务。
如何从图像中解析出可供计算机理解的信息,是机器视觉(Machine Vision)的中心问题。深度学习模型由于其强大的表示能力,加之数据量的积累和计算力的进步,成为机器视觉的热点研究方向。那么,如何理解一张图片呢?根据任务的需要,有图1中所示三个主要的层次:
图1:机器理解图像的三个层次
一是分类(Classification),即是将图像结构化为某一类别的信息,用事先确定好的类别(category)或实例ID来描述图片。这一任务是最简单、最基础的图像理解任务,也是深度学习模型最先取得突破和实现大规模应用的任务。其中,ImageNet是最权威的评测集,每年的ILSVRC催生了大量的优秀深度网络结构,为其他任务提供了基础。在应用领域,人脸、场景的识别等都可以归为分类任务。
二是检测(Detection)。分类任务关心整体,给出的是整张图片的内容描述,而检测则关注特定的物体目标,要求同时获得这一目标的类别信息和位置信息(classification + localization)。相比分类,检测给出的是对图片前景和背景的理解,我们需要从背景中分离出感兴趣的目标,并确定这一目标的描述(类别和位置),因此检测模型的输出是一个列表,列表的每一项使用一个数组给出检出目标的类别和位置(常用矩形检测框的坐标表示)。
三是分割(Segmentation)。分割包括语义分割(semantic segmentation)和实例分割(instance segmentation),前者是对前背景分离的拓展,要求分离开具有不同语义的图像部分,而后者是检测任务的拓展,要求描述出目标的轮廓(相比检测框更为精细)。分割是对图像的像素级描述,它赋予每个像素类别(实例)意义,适用于理解要求较高的场景,如无人驾驶中对道路和非道路的分割。
图像分类(image classification)是将图像划分(divide)为单个类别,通常对应于图像中最突出的物体。但是现实世界的很多图像通常包含的不只是一个物体,此时如果使用图像分类模型为图像分配一个单一标签其实是非常粗糙的,并不准确。对于这样的情况,就需要目标检测(object detection)模型,目标检测模型可以识别一张图片的多个物体,并可以定位出不同物体(给出边界框)。目标检测在很多场景有用,如无人驾驶和安防系统。
** 2、常用的目标检测(Object Detection)算法的综述**
常见的经典目标检测算法如下图2所示:
图2:常用的经典目标检测算法图
目标检测的基本思路:同时解决定位(localization) + 识别(Recognition)。
多任务学习,带有两个输出分支。一个分支用于做图像分类,即全连接+softmax判断目标类别,和单纯图像分类区别在于这里还另外需要一个“背景”类。另一个分支用于判断目标位置,即完成回归任务输出四个数字标记包围盒位置(例如中心点横纵坐标和包围盒长宽),该分支输出结果只有在分类分支判断不为“背景”时才使用。详细结构如下图3所示:
图3:目标检测的多任务学习结构
传统的目标检测框架,主要包括三个步骤:
(1)利用不同尺寸的滑动窗口框住图中的某一部分作为候选区域;
(2)提取候选区域相关的视觉特征。比如人脸检测常用的Harr特征;行人检测和普通目标检测常用的HOG特征等;
(3)利用分类器进行识别,比如常用的SVM模型。
目前目标检测领域的深度学习方法主要分为两类:两阶段(Two Stages)的目标检测算法;一阶段(One Stage)目标检测算法。
两阶段(Two Stages):首先由算法(algorithm)生成一系列作为样本的候选框,再通过卷积神经网络进行样本(Sample)分类。
常见的算法有R-CNN、Fast R-CNN、Faster R-CNN等等。
一阶段(One Stage ):不需要产生候选框,直接将目标框定位的问题转化为回归(Regression)问题处理(Process)。
常见的算法有YOLO、SSD等等。
基于候选区域(Region Proposal)的,如R-CNN、SPP-net、Fast R-CNN、Faster R-CNN、R-FCN;
基于端到端(End-to-End),无需候选区域(Region Proposal)的,如YOLO、SSD。
对于上述两种方式,基于候选区域(Region Proposal)的方法在检测准确率和定位精度上占优,基于端到端(End-to-End)的算法速度占优。相对于R-CNN系列的“看两眼”(候选框提取和分类),YOLO只需要“看一眼”。总之,目前来说,基于候选区域(Region Proposal)的方法依然占据上风,但端到端的方法速度上优势明显,至于后续的发展让我们拭目以待。
** 3、目标检测的候选框是如何产生的?**
如今深度学习发展如日中天,RCNN/SPP-Net/Fast-RCNN等文章都会谈及候选边界框(Bounding boxes)的生成与筛选策略。那么候选框是如何产生的?又是如何进行筛选的呢?其实物体候选框获取当前主要使用图像分割与区域生长技术。区域生长(合并)主要由于检测图像中存在的物体具有局部区域相似性(颜色、纹理等)。目标识别与图像分割技术的发展进一步推动有效提取图像中信息。
根据目标候选区域的提取方式不同,传统目标检测算法可以分为基于滑动窗口的目标检测算法和基于选择性搜索的目标检测算法。滑窗法(Sliding Window)作为一种经典的物体检测方法,个人认为不同大小的窗口在图像上进行滑动时候,进行卷积运算后的结果与已经训练好的分类器判别存在物体的概率。选择性搜索(Selective Search)是主要运用图像分割技术来进行物体检测。
(1)滑动窗口(Sliding Window)
采用滑动窗口的目标检测算法思路非常简单,它将检测问题转化为了图像分类问题。其基本原理就是采用不同大小和比例(宽高比)的窗口在整张图片上以一定的步长进行滑动,然后对这些窗口对应的区域做图像分类,这样就可以实现对整张图片的检测了。但是这个方法有致命的缺点,就是你并不知道要检测的目标大小是什么规模,所以你要设置不同大小和比例的窗口去滑动,而且还要选取合适的步长。但是这样会产生很多的子区域,并且都要经过分类器去做预测,这需要很大的计算量,所以你的分类器不能太复杂,因为要保证速度。接下来,我们看一下滑窗法的物体检测流程图如图4所示:
图4:滑窗法目标检测流程图
通过滑窗法流程图分析具体步骤:首先对输入图像进行不同窗口大小的滑窗进行从左往右、从上到下的滑动。每次滑动时候对当前窗口执行分类器(分类器是事先训练好的)。如果当前窗口得到较高的分类概率,则认为检测到了物体。对每个不同窗口大小的滑窗都进行检测后,会得到不同窗口检测到的物体标记,这些窗口大小会存在重复较高的部分,最后采用非极大值抑制(Non-Maximum Suppression, NMS)的方法进行筛选。最终,经过NMS筛选后获得检测到的物体。
滑窗法简单易于理解,但是不同窗口大小进行图像全局搜索导致效率低下,而且设计窗口大小时候还需要考虑物体的长宽比。所以,对于实时性要求较高的分类器,不推荐使用滑窗法。
(2)选择性搜索(Selective Search)
滑窗法类似穷举进行图像子区域搜索,但是一般情况下图像中大部分子区域是没有物体的。学者们自然而然想到只对图像中最有可能包含物体的区域进行搜索以此来提高计算效率。选择搜索方法是当下最为熟知的图像bouding boxes提取算法,其目标检测的流程图如下图5所示。
图5:选择性搜索目标检测流程图
选择搜索算法的主要观点:图像中物体可能存在的区域应该是有某些相似性或者连续性区域的。因此,选择搜索基于上面这一想法采用子区域合并的方法进行提取候选边界框(bounding boxes)。首先,对输入图像进行分割算法产生许多小的子区域(大约2000个子区域)。其次,根据这些子区域之间相似性(相似性标准主要有颜色、纹理、大小等等)进行区域合并,不断的进行区域迭代合并。每次迭代过程中对这些合并的子区域做外切矩形(bounding boxes),这些子区域外切矩形就是通常所说的候选框。
选择搜索优点:
(a)计算效率优于滑窗法。
(b)由于采用子区域合并策略,所以可以包含各种大小的疑似物体框。
(c)合并区域相似的指标多样性,提高了检测物体的概率。
具体细节可参考博客:https://blog.csdn.net/mao_kun/article/details/50576003
https://blog.csdn.net/qq_30638831/article/details/82799739
4、什么是预测框和人工标注框的重合度IOU(Intersection Over Union)?
为了评价Bounding-box Regression模型对目标物体的标注效果,我们提出了预测框和人工标注框重合度IOU的概念。下面简单介绍一下这个定义:物体检测需要定位出物体的Bounding-box,就像下面的图6所示一样,我们不仅要定位出车辆的Bounding-box 我们还要识别出Bounding-box 里面的物体就是车辆。对于Bounding-box的定位精度,有一个很重要的概念,因为我们算法不可能百分百跟人工标注的数据完全匹配,因此就存在一个定位精度评价公式:IOU(也叫作交并比)。IOU定义了两个Bounding-box的重叠度,如下图7所示:
* ![image](https://upload-images.jianshu.io/upload_images/46858-1785fcc818349c56.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)*
图6:标注边界框的汽车 图7:IOU定义展示图
矩形框A、B的一个重合度IOU计算公式为:
IOU=(A∩B)/(A∪B)
就是矩形框A、B的重叠面积占A、B并集的面积比例:
IOU=SI/(SA+SB-SI)
5、什么是NMS—非极大值抑制(Non-Maximun Suppression)?
学习R-CNN算法必然要了解一个重要的概念——非极大值抑制(NMS)。比如,我们会从一张图片中找出N多个可能包含物体的Bounding-box,然后为每个矩形框计算其所属类别的概率。可以参看下图8所示。
图8:找出的多个判断为汽车类别的边界矩形框
正如上面的图片所示,假如我们想定位一个车辆,最后算法就找出了一堆的方框,每个方框都对应一个属于汽车类别的概率。我们需要判别哪些矩形框是没用的。采用的方法是非极大值抑制:先假设有6个矩形框,根据分类器类别分类概率做排序,从小到大分别属于车辆的概率分别为A、B、C、D、E、F。
(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
如此循环往复知道没有剩余的矩形框,然后找到所有被保留下来的矩形框,就是我们认为最可能包含汽车的矩形框。
R-CNN算法中NMS的具体做法:
假设有20类,2000个建议框,最后输出向量维数2000*20,则每列对应一类,一行是各个建议框的得分,NMS算法步骤如下:
① 对2000×20维矩阵中每列按从大到小进行排序;
② 从每列最大的得分建议框开始,分别与该列后面的得分建议框进行IoU计算,若IoU>阈值,则剔除得分较小的建议框,否则认为图像中存在多个同一类物体;
③ 从每列次大的得分建议框开始,重复步骤②;
④ 重复步骤③直到遍历完该列所有建议框;
⑤ 遍历完2000×20维矩阵所有列,即所有物体种类都做一遍非极大值抑制;
⑥ 最后剔除各个类别中剩余建议框得分少于该类别阈值的建议框。
** 6、Region Proposal建议框的Crop/Wrap具体做法?**
R-CNN论文中采用的是各向异性缩放,padding=16的精度最高。作者使用了最简单的一种变换,即无论候选区域是什么尺寸,先在每个建议框周围context(图像中context指RoI周边像素)加上16个像素值为建议框像素平均值的边框,再直接变形为227×227的大小。
(1)各向异性缩放(非等比缩放)
这种方法很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227*227;有比例上的形变扭曲。
(2)各向同性缩放
因为图片扭曲后,会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案。这个有两种办法。
① 直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;
② 先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值);
** 7、Bounding-box Regression方法**
回归器是线性的,输入为Alexnet pool5的输出。Bounding-box回归认为候选区域和Ground-tTruth之间是线性关系(因为在最后从SVM内确定出来的区域比较接近Ground-Truth,这里近似认为可以线性关系),训练回归器的输入为N对值,[图片上传失败...(image-8bd798-1597372341479)]
,分别为候选区域的框坐标和真实的框坐标,下面在不必要时省略i。这里选用的Proposal必须和Ground Truth的IoU>0.6才算是正样本。Bounding-box对以及输入特征如下图9所示:
图9:Bounding-box对以及输入特征
从候选框P到预测框[图片上传失败...(image-ac7070-1597372341479)]
的基本思路如下:
因为我们在分类之后得到候选框P [图片上传失败...(image-71ce24-1597372341478)]
,其中[图片上传失败...(image-925b68-1597372341478)]
和[图片上传失败...(image-bb3657-1597372341478)]
为候选框的中心点,[图片上传失败...(image-513bcd-1597372341478)]
和[图片上传失败...(image-1a8eba-1597372341478)]
为候选框的宽高,下面介绍中所有框的定位都用这种定义,即x和y表示中心点坐标,w和h表示框的宽高。我们知道了候选框的表示,那么只要估计出候选框与真实框的平移量和尺度缩放比例,就可以得到我们的估计框了。
回归模型的训练阶段表示为图10所示:
图10:回归模型的损失函数
根据上述的损失函数模型,求解出最优解权重W,权重乘以pool5的特征得到平移参数和缩放参数。
在边界回归的测试阶段:
测试阶段权重参数已经训练出来了,上式中[图片上传失败...(image-f85c2b-1597372341478)]
为Alexnet pool5输出的特征,所以可以求出[图片上传失败...(image-d0835d-1597372341478)]
这四个变换。然后,利用下图11的公式求出预测出来包含物体的边界框。
图11:求预测边界框公式