本文适合刚入门物体检测的人群学习,不涉及公式推理。
*摘要
*相关物体检测数据集介绍
*现有的主流物体检测算法
*物体检测的难点与挑战
*相关术语介绍
*物体检测的传统算法概述
*基于深度学习的物体检测算法
R-CNN
Fast-RCNN
Faster-RCNN
YOLO
*物体检测动手实践
*参考文献
相比于图像分类,图像中物体检测是计算机视觉中一个更加复杂的问题,因为图像分类只需要判断出图像属于哪一类就行,而在物体检测中,图像里可能有多个物体,我们需要对所有物体进行种类判别和位置确定,所以比图像分类更具有挑战性,应用于物体检测的深度学习模型也会更加复杂。本文将会着重介绍几种基于深度学习的物体检测方法。
如下图为物体检测效果图:
物体检测
图a只需要判断出图像是牛,而图b需要检测出图中有两只牛并且确定其位置。
物体分类与物体检测区别
待识别的物体有20类: person bird, cat, cow, dog, horse, sheep aeroplane, bicycle, boat, bus, car, motorbike, train bottle, chair, dining table, potted plant, sofa, tv/monitor
所有的标注图片都有Detection需要的label, 但只有部分数据有Segmentation Label。
VOC2007中包含9963张标注过的图片, 由train/val(交叉验证)/test三部分组成, 共标注出24,640个物体。
VOC2007的test数据label已经公布, 之后的没有公布(只有图片,没有label)。
对于检测任务,VOC2012的trainval/test包含08-11年的所有对应图片。 trainval有11540张图片共27450个物体。
对于分割任务, VOC2012的trainval包含07-11年的所有对应图片, test只包含08-11。trainval有 2913张图片共6929个物体。
Detection Label (Ground truth)格式:
<annotation>
<folder>VOC2007</folder>
<filename>009961.jpg</filename>
<source>
<database>The VOC2007 Database</database>
<annotation>PASCAL VOC2007</annotation>
<image>flickr</image>
<flickrid>334575803</flickrid>
</source>
<owner>
<flickrid>dictioncanary</flickrid>
<name>Lucy</name>
</owner>
<size><!--image shape-->
<width>500</width>
<height>374</height>
<depth>3</depth>
</size>
<segmented>0</segmented><!--是否有分割label-->
<object>
<name>dog</name> <!--类别-->
<pose>Unspecified</pose><!--物体的姿态-->
<truncated>0</truncated><!--物体是否被部分遮挡(>15%)-->
<difficult>0</difficult><!--是否为难以辨识的物体, 主要指要结体背景才能判断出类别的物体。虽有标注, 但一般忽略这类物体-->
<bndbox><!--bounding box-->
<xmin>69</xmin>
<ymin>4</ymin>
<xmax>392</xmax>
<ymax>345</ymax>
</bndbox>
</object>
</annotation>
提交结果文件格式:
<image identifier> <confidence> <left> <top> <right> <bottom>
比如,comp3_det_test_car.txt:
000004 0.702732 89 112 516 466
000006 0.870849 373 168 488 229
000006 0.852346 407 157 500 213
000006 0.914587 2 161 55 221
000008 0.532489 175 184 232 201
有YOLO、SSD、rcnn、fast rcnn及faster rcnn等 注:后边部分内容会对算法进行详细介绍
针对单个物体实例而言,通常由于图像采集过程中光照条件、拍摄视角、距离的不同,物体自身的非刚体形变以及其他物体的部分遮挡使得物体实例的表观特征产生很大的变化,给视觉识别算法带来了极大的困难。
属于同一类的物体表观特征差别比较大,其原因有前面提到的各种实例层次的变化,但这里更强调的是类内不同实例的差别,例如图 3(a)所示,同样是椅子,外观却是千差万别;其次是类间模糊性,即不同类的物体实例具有一定的相似性,如图 3(b)所示,左边的是一只狼,右边的是一只哈士奇,但我们从外观上却很难分开二者;再次是背景的干扰,在实际场景下,物体不可能出现在一个非常干净的背景下,往往相反,背景可能是非常复杂的、对我们感兴趣的物体存在干扰的,这使得识别问题的难度大大加大。
困难与挑战与图像的视觉语义相关,这个层次的困难往往非常难以处理,特别是对现在的计算机视觉理论水平而言。一个典型的问题称为多重稳定性。如图所示,图 3(c)左边既可以看成是两个面对面的人,也可以看成是一个燃烧的蜡烛;右边则同时可以解释为兔子或者小鸭。同样的图像,不同的解释,这既与人的观察视角、关注点等物理条件有关,也与人的性格、经历等有关,而这恰恰是视觉识别系统难以很好处理的部分。
图一
图二
bounding box:矩形框 SPP:Spatial Pyramid Pooling SVM:支持向量机 RPN:Region Proposal Network
目标检测系统架构(pipeline)主要包括三个模块:区域检测模块、特征提取模块以及分类器模块。三个模块之间一般是线性的关系。检测系统中间可能会根据相应的需求添加特定模块,但是大多数系统包括以上三个模块。
目标检测系统架构
区域检测模块主要处理图像检测区域窗口的问题。根据获得区域待检测窗口方法的不同,物体检测方法大致可分为稠密检测窗提取(蛮力搜索)和稀疏检测窗两类方法。稠密检测窗提取方法,比如滑动窗法,相对比较简单,它是通过使用训练好的模板在输入图像的多个尺度上图像金字塔上进行滑动扫描,通过确定最大响应位置找到目标物体的矩形窗口。稀疏检测窗提取方法,则一般利用某些先验或其他图像任务的结果,选择最有可能成为物体的检测窗口,比如选择性搜方法,对图像分割的结果进行利用,通过区域融合生产目标检测窗。(算法具体内容自行了解,比如边缘盒算法,选择性算法)
这是最重要和最关键的步骤,传统的特征提取方法,比如HOG、SIFT特征,通过计算图像局部区域的梯度特征,得到图像边缘或角点特征。相比现在深度学习的提取特征方法,这些方法都是根据图像的某些性质通过人工设计相应的特征。缺点很明显,第一人工设计很麻烦,第二很具有局限性,特征提取不够完整,而深度卷积神经网络就可以客服这些不足。
分类器模块是物体图像检测与分类系统的结果输出,用于评价整个检测系统的性能。在模式识别和机器学习领域中,常用的分类器包括:逻辑回归、softmax、SVM、ada-boost等。在深度学习模型中一般采用SVM和softmax。
暂时略
既然传统的物体检测方法局限性很大,此时随着深度学习的发展,基于深度学习的物体检测算法R-CNN横空出世了。
R-CNN物体检测系统概览
SVM分类器训练样本
使用回归器精细修正候选框位置
Fast-RCNN主要贡献在于对R-CNN进行加速,只有速度够快,才能做到实时处理。那么Fast-RCNN是改进了R-CNN哪些地方提高了处理速度呢?
SPP:Spatial Pyramid Pooling(空间金字塔池化) 它有两个特点: 1.结合空间金字塔方法实现CNNs的多尺度输入。
一般CNN后接全连接层或者分类器,他们都需要固定的输入尺寸,因此不得不对输入数据进行crop或者warp,这些预处理会造成数据的丢失或几何的失真。SPP Net的第一个贡献就是将金字塔思想加入到CNN,实现了数据的多尺度输入。在卷积层和全连接层之间加入了SPP layer。此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出尺度始终是固定的。
2.只对原图提取一次卷积特征
在R-CNN中,每个候选框先resize到统一大小,然后分别作为CNN的输入,这样是很低效的。所以SPP Net根据这个缺点做了优化:只对原图进行一次卷积得到整张图的feature map,然后找到每个候选框zaifeature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层。节省了大量的计算时间。
Fast-RCNN正是通过融合了SPP的设计(这一层称之为ROI Pooling),有了以上这两个优点,使得Fast-RCNN比R-CNN快多了。
原来的方法:许多候选框(比如两千个)-->CNN(两千次卷积)-->得到每个候选框的特征(不同尺度特征图不行)-->分类+回归 现在的方法:一张完整图片-->CNN(一次卷积)-->得到每张候选框的特征(可以不同尺度特征图不行,因为这里加了一层SSP net 称之为ROI Pooling)-->分类+回归
其还有个贡献是多任务Loss层:将分类和边框回归进行合并(又一个开创性的思路),通过多任务Loss层进一步整合深度网络,统一了训练过程,从而提高了算法准确度。
Fast-RCNN虽然加快了不少速度,但是其选择性搜索,找出所有的候选框,这个也非常耗时,于是有人就在Fast-RCNN的基础上解决了这个问题,提出了更快的Faster-RCNN。
Faster-RCNN特点(创新点):候选框提取不一定要在原图上做,特征图上同样可以,在低分辨率上做意味着计算量减小。 那么怎么在特征图上做候选框提取呢:于是有人提出了用神经网络去做,加入一个边缘提取的神经网络,称之为Region Proposal Network(RPN)。 具体加入方法: • 将RPN放在最后一个卷积层的后面 • RPN训练好后能使用其直接得到候选区域
Faster-RCNN
算法对比图
https://zhuanlan.zhihu.com/p/25236464
暂时略
1.http://blog.csdn.net/weixin_35653315/article/details/71028523. 2.https://zhuanlan.zhihu.com/p/25236464. 3.http://blog.csdn.net/AkashaicRecorder/article/details/68942949. 4.黄凯奇,任伟强,谭铁牛.图像物体分类与检测算法综述,中国科学院自动化研究所模式识别国家重点实验室智能感知与计算研究中心,12(36),2013:1225-1240. 5.夏源.基于深度学习的图像物体检测与分类,北京邮电大学,2016. 6.https://www.cnblogs.com/skyfsm/p/6806246.html 7.https://blog.csdn.net/linolzhang/article/details/54344350 8.https://blog.csdn.net/shenxiaolu1984/article/details/51066975