一、目标检测基础:
任务定义
基本检测流程
二、深度目标检测:
两阶段检测器:R-CNN系列,后续相关工作
单阶段监测器:YOLO,SSD,RetinaNet
三、目标检测评价:
评价方式
数据集和比较方法
1、任务定义:
目标检测:
输入:图像或者图像序列
输出:在每张/帧图像上,判断是否有指定类别的物体,如果有,给出所有物体的位置和大小(位置和大小可以用框图左上角坐标和长宽表示(x,y,w,h))**
对于类型的检测任务可以细分为:
(1)单类目标跟踪,多类/同用目标检测
(2)静态图像目标检测,视频目标检测
相关的其他计算机视觉任务
1、物体定位(Localization)
(1)给出输入图像的类别标签,并框出一个对应的物体
(2)物体定位可以看成单个物体的检测任务
例:给定上面的图像,返回cat这个标签,并在原图中框出其位置(即返回位置和大小)
2、实例分割
在输入图像上精确地标记出每一个物体的所有像素点
3.显著目标检测
(1)、显著目标:最吸引人注意力的区域/物体
(2)、前景/背景分割
2、基本检测流程
基于深度学习的目标检测方法
2012年之前是传统的目标检测算法,其准确率最好是在40%左右,截止2015年深度目标检测算法准确率已经达到了75%,其还有很大的发展空间。
两大类典型的目标检测方法:
1、两阶段检测器
(1)生成可能包含物体的候选区域Region Proposal
(2)对候选区域做进一步分类校准,得到最终的检测结果
下边详解讲述R-CNN系列:
R-CNN—>(SPP-net)---->Fast R-CNN—>Faster R-CNN
R-CNN:Regions with CNN Features:
第一步:生成候选区域
1、传统方法:滑动窗口+图像金字塔
2、专门的候选区域生成方法:Selective Search
(1)无监督:没有训练过程,不需要带标注的数据
(2)数据驱动:根据图像特征生成候选区域
(3)基于图像分割任务
Selective Search方法主要分为以下几步:
(1)用现有的分割方法将图像快速划分为多个区域
(2)基于相似度对相邻的区域进行合并
(3)不断地合并区域直到整张图像成为一个区域
(4)在合并的过程中,基于所以产生的区域给出对应的矩形框,得到用于目标检测的候选窗口
selective search属于穷举法得到候选框。
第二步:用CNN提取区域特征
1、将不同大小的候选区域缩放到相同大小:227 x 227(yolo和ssd中也是227 x 227)
对区域进行些许扩大以包含少量上下文信息
2、将所有区域送入AlexNet提取特征:5个卷积层,2个全连接层
3、以最后一个全连接层的输出作为区域的特征表示:4096维
4、有监督预训练 Pretraining
(1)、图像分类任务:ImageNet,1000类,仅有图像标签,没有物体边框标注
(2)、数据量:120万张图像
5、针对目标进行微调 Fine-tuning
(3)、目标检测任务:PascalVOC,20类,有物体边框标注
(4)、数据量:仅有数千或者上万张图像
(5)、微调是可选步骤,有助于进一步提升检测精度,用大量数据学习的预训练模型,其提取的特征已经具有较好的迁移能力
第三步:对区域进行分类+边框校准
对区域进行分类可以选择SVM或者Softmax:
1、线性SVM分类器(默认是使用SVM):
2、Softmax(一般用Softmax就能达到很好的效果了)
边框校准:
R-CNN的检测精度比较:
检测速度
问题:
CNN要求输入图像具有统一的尺寸
解决方案:使用SSP-Net:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
接下来我们又遇到了问题:
R-CNN和SPP-net的训练都包含多个单独的步骤
(1)对网络进行微调:
R-CNN对整个CNN进行微调
SPP-net只对SPP之后的(全连接)层进行微调
(2) 训练SVM
(3)训练边框回归模型
但是缺点很明显:
(1)时间长:需要用CNN提取所有训练样本的特征
(2)占用存储空间大:所有样本的特征需要存储到磁盘
(3)检测速度慢,尤其是R-CNN, R-CNN+VGG16:检测一张图需要47s
接下来就引出了Fast R-CNN
解决方案:
Fast R-CNN还有两点改进的地方:
实验:
下边的实验是测试SPP(多尺度) vs ROI pooling(单尺度)的精度对比:
SVM vs Softmax
由上图我们可以看出其进度没有明显的下降。
问题:
Fast R-CNN仍然需要专门的候选窗口生成模块
解决方案:
模型学习主要分为两种:
Faster R-CNN训练结果:
RPN的召回率
从上图可以明显的看出RPN的召回率要高于Selective Search。RPN用更少的窗口就可以做到Selective Search更多的窗口做到的事情。
卷积层:共享vs不共享
不共享的话精度只能达到68.5,共享卷积层之后精度最高可以达到69.9,共享卷积层有助于提高精度。
下边对R-CNN—>(SPP-net)---->Fast R-CNN—>Faster R-CNN进行一个总结
化零为整:多任务学习,参数/计算共享
由慢变快:SPP,ROI pooling,Truncated SVD
后续相关工作:
接下来对上述几种方法进行一个总结:
1、R-FCN(Faster R-CNN + ResNet):针对ResNet进一步实现更大计算的共享
接下来介绍Mask R-CNN
Mask R-CNN是一种检测和分割多任务协同学习的方法
2、单阶段检测器Single-Shot
单阶段检测器特点:
(1)直接给出最终的检测结果
(2)没有显示的生成候选区域的步骤
概述:
(1)YOLO
(2)SSD
(3)RetinaNet
下边进行简单介绍:
(1)YOLO:
YOLO的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。faster RCNN中也直接用整张图作为输入,但是faster-RCNN整体还是采用了RCNN那种 proposal+classifier的思想,只不过是将提取proposal的步骤放在CNN中实现了。
2.YOLO的实现方法
将一幅图像分成SxS个网格(grid cell),如果某个object的中心 落在这个网格中,则这个网格就负责预测这个object。
每个网格要预测B个bounding box,每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。
这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息,其值是这样计算的:
其中如果有object落在一个grid cell里,第一项取1,否则取0。 第二项是预测的bounding box和实际的groundtruth之间的IoU值。
每个bounding box要预测(x, y, w, h)和confidence共5个值,每个网格还要预测一个类别信息,记为C类。则SxS个网格,每个网格要预测B个bounding box还要预测C个categories。输出就是S x S x (5*B+C)的一个tensor。
注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的。
举例说明:
在PASCAL VOC中,图像输入为448x448,取S=7,B=2,一共有20个类别(C=20)。则输出就是7x7x30的一个tensor。
整个网络结构如下图所示:
在test的时候,每个网格预测的class信息和bounding box预测的confidence信息相乘,就得到每个bounding box的class-specific confidence score:
等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。
得到每个box的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。
检测进度和速度:
(2)SSD(Single-Shot Multibox Detector)
Single-Shot
训练策略:
下边是引用https://blog.csdn.net/zhangjunp3/article/details/80597312中的论文,讲解的更加详细。
SSD和Yolo一样都是采用一个CNN网络来进行检测,但是却采用了多尺度的特征图,其基本架构下图所示。下面将SSD核心设计理念总结为以下三点:
所谓多尺度采用大小不同的特征图,CNN网络一般前面的特征图比较大,后面会逐渐采用stride=2的卷积或者pool来降低特征图大小,这正如下图所示,一个比较大的特征图和一个比较小的特征图,它们都用来做检测。这样做的好处是比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标,如图4所示,8x8的特征图可以划分更多的单元,但是其每个单元的先验框尺度比较小。
与Yolo最后采用全连接层不同,SSD直接采用卷积对不同的特征图来进行提取检测结果。对于形状为 m x n x p 的特征图,只需要采用 3 x 3 x p 这样比较小的卷积核得到检测值。
在Yolo中,每个单元预测多个边界框,但是其都是相对这个单元本身(正方块),但是真实目标的形状是多变的,Yolo需要在训练过程中自适应目标的形状。而SSD借鉴了Faster R-CNN中anchor的理念,每个单元设置尺度或者长宽比不同的先验框,预测的边界框(bounding boxes)是以这些先验框为基准的,在一定程度上减少训练难度。一般情况下,每个单元会设置多个先验框,其尺度和长宽比存在差异,如图所示,可以看到每个单元使用了4个不同的先验框,图片中猫和狗分别采用最适合它们形状的先验框来进行训练,后面会详细讲解训练过程中的先验框匹配原则。
…
实验:
1、实现细节的影响:
数据增广非常关键
不用数据增广精度为65.4%,加上数据增广之后精度为72.1%,可以看出来数据增广非常重要。
精度和速度比较:
Faster R-CNN精确达到了42.7%,而SSD500精确度达到了43.7%。
Faster R-CNN的FPS为17,而SSD500的FPS为23或者58,也有了很大的提升。
由此可见无论精度还是速度SSD都优于Faster R-CNN。
下边引出DSSD::Deconvolutional Single-Shot Detector
动机:
方法就是把红色层做反卷积操作,使其和上一级蓝色层尺度相同,再把二者融合在一起,得到的新的红色层用来做预测。如此反复,仍然形成多尺度检测框架。在图中越往后的红色层分辨率越高,而且包含的上下文信息越丰富,综合在一起,使得检测精度得以提升。
预测模块
SSD的直接从数个卷积层中分别引出预测函数,预测量多达7000多,梯度计算量也很大。MS-CNN方法指出,改进每个任务的子网可以提高准确性。根据这一思想,作者在每一个预测层后增加残差模块,并且对于多种方案进行了对比,如下图所示。结果表明,增加残差预测模块后,高分辨率图片的检测精度比原始SSD提升明显。
反卷积SSD网络
为了引入更多的高级上下文信息,作者在SSD+Resnet-101之上,采用反卷积层来进行预测,和原始SSD是不同的,最终形成沙漏形的网络。添加额外的反卷积层以连续增加后面特征图的分辨率,为了加强特征,作者在沙漏形网络中采用了跳步连接(skip connection)方法。按理说,模型在编码和解码阶段应该包含对称的层,但由于两个原因,作者使解码(反卷积)的层比较浅:其一,检测只算是基础目标,还有很多后续任务,因此必须考虑速度,做成对称的那速度就快不起来。其二,目前并没有现成的包含解码(反卷积)的预训练模型,意味着模型必须从零开始学习这一部分,做成对称的则计算成本就太高了。
反卷积模块
为了整合浅层特征图和反卷积层的信息,作者引入了如figure 3所示的反卷积模块,该模块可以适合整个DSSD架构(figure1 底部实心圆圈)。作者受到论文Learning to Refine Object Segments的启发,认为用于精细网络的反卷积模块的分解结构达到的精度可以和复杂网络一样,并且更有效率。作者对其进行了一定的修改,如Figure 3所示:其一,在每个卷积层后添加批归一化层;其二,使用基于学习的反卷积层而不是简单地双线性上采样;其三,作者测试了不同的结合方式,元素求和(element-wise sum)与元素点积(element-wise product)方式,实验证明点积计算能得到更好的精度。
网络训练
训练技巧大部分和原始SSD类似。首先,依然采用了SSD的default boxes,把重叠率高于0.5的视为正样本。再设置一些负样本,使得正负样本的比例为3:1。训练中使Smooth L1+Softmax联合损失函数最小。训练前依然需要数据扩充(包含了hard example mining技巧)。另外原始SSD的default boxes维度是人工指定的,可能不够高效,为此,作者在这里采用K-means聚类方法重新得到了7种default boxes维度,得到的这些boxes维度更具代表性(此处和YOLOv2的聚类做法有点类似,可参考博客:YOLOv2 论文笔记)。
实验:
接下来引入了RetinaNet
问题:
解决方案:
实验:
上图表明不同的检测器检测的时候和精度的对应关系,可以看出RetinaNet明显优于之前的模型。
三、目标检测评价:
1、评价方式
检测框匹配:
交并比 IOU,Intersection over Union
计算公式:
匹配策略
1、贪心算法
按照得分从高到低顺序遍历,搜索满足交并比阈值的检测框
大部分数据集采用这种方式进行评测
2、匈牙利算法(用得很少)
将匹配建模成一个分配问题:最大化总的交并比
FDDB人脸检测数据集采用这种方式对检测框进行匹配
动态交并比阈值
1、不同大小的框对交并比的“敏感”程度不同
2、ImageNet在测评时对较小的物体会放宽交并比阈值
e.g 20 x 20的框包含了10 x 10的物体,交并比为0.25
按条件匹配/忽略框
例如:评测某个尺度范围的检测精度,检测到了不算对,漏检了也不算错
2、评价指标
数据集 & 方法比较
多类/通用目标检测
Pascal VOC(2007/2012)
1、类别数量:20,规模:10000,划分:训练 + 验证 + 测试
2、comp3 : 只允许用所给训练数据,comp4:允许使用外部数据
上图是目前在Pascal VOC上最佳的检测情况。
ImageNet
2013年引入检测任务,类别别数量:200,规模:100000
大网络/新结构 + 模型集成 + 其他策略
本地测试 :val2子集
MS COCO(难度最大,截至2017只能达到52.6%的精确度)
类别数量:80,规模:100000图/1000000物体
目前难度最大的目标检测数据集
单类目标检测
1、人脸检测:FDDB,Wider Face
2、行人检测:Caltech Pedestrian,CityPersons(2017发布)
3、车辆检测:UA-DETRAC
三部分内容: 一点点区别: 一般的双阶段精度高但速度慢,单精度速度快但精度稍逊。但是现在的单阶段有些算法准确性也很高了。
双阶段目标检测器采用了两段结构采样来处理类别不均衡的问题,rpn使正负样本更加均衡
使用了两阶段级联的方式来拟合bbox,先粗回归,再精调。
One stage detector 的一个通病就是既要做定位又要做classification。最后几层1x1 conv layer 的loss 混在一起,并没有什么专门做detection 或者专门做bbox regression的参数,那每个参数的学习难度就大一点。
Two stage detector 的第一个stage相当于先拿一个one stage detector 来做一次前景后景的classification + detection。这个任务比 one stage detector 的直接上手N class classification + detection 要简单很多。有了前景后景,就可以选择性的挑选样本使得正负样本更加均衡,然后拿着一些参数重点训练classification。训练classification的难度也比直接做混合的classification 和 regression 简单很多。
其实就是把一个复杂的大问题拆分成更为简单的小问题。各个参数有专攻,Two Stage Detector 在这个方面是有优势的。
one stage detector 里如果用了 focal loss 和 separate detection/classification head 那效果跟 two stage detector 应该是一样的。