背景:深度学习引入目标检测领域以来,给目标检测领域带来了很多突破性的进展,文章“Deep Learning for Generic Object Detection: A Survey”由香港中文大、国防科技大、芬兰奥卢大学、澳大利亚悉尼大学、加拿大滑铁卢大学的研究者共同发布的一篇综述文章,系统的总结了2013年深度学习引入目标检测领域以来的进展。非常具有参考意义。
目的:本文在该论文基础上,总结相应目标检测主流模型,并广泛参考资料。文章内容对于后续目标检测项目和科研很有参考意义。
参考论文地址:https://arxiv.org/abs/1809.02165
未完,持续更新
目录
一、目标检测概况及进展
目的:目标检测:从一个图像之中定位出物体。
意义:目标检测是计算机视觉领域最基础的问题之一。深度学习给目标检测带来了很多突破性的进展。
本文作用:提供了深度学习给目标检测领域带来的一个综合的概述。
图为历年最好的模型在voc数据集上的mAP,红线为引入深度学习的时间点。我们可以看出,引入深度学习后,目标检测领域的mAP达到了一个快速的上升。
图为经典的目标检测模型出现的时间点,左为手动提取特征,例如SIFT,HOG,LBP等等,模型多进展缓慢,右边为深度学习提取(DCNN)特征。
经典的主流目标检测模型出现的时间。
二、主流架构
2.1 主流架构概览
取窗法依然为目标检检测的主流。
缺点:
- 窗口数量多,并且随着像素点的增长会呈二次方的增长。
- 窗口的斜率和大小都会增加搜索空间。
- 巨大的搜索空间使算法运算复杂度很高。
策略:
- 级联
- 共享运算出的特征
- 减少单个滑窗的运算量
2.2 两种主流架构
两种主流架构分别为单阶段和双阶段。
双阶段
一个阶段提出备选框,一个阶段对备选框进行判断。是一个两阶段级联的网络。主要为RCNN系列的网络。
- RCNN
- SPPNet(Spatial Pyramid Pooling)
- Fast RCNN
- Faster RCNN
- RFCN(Region based FullyConvNet)
- Mask RCNN
- Light Head RCNN
单阶段
单阶段的网络,整个生成备选框的过程一体化的实现。代表有YOLO系列和SSD(single shot detector)
- DetectorNet
- OverFeat
- YOLO
- YOLOv2 and YOLO9000
- SSD(Single Shot Detector)
三、双阶段目标检测模型
即备选框的生成和备选框的判断是两个过程。以RCNN系列为主流和代表。
3.1 RCNN
【RCNN论文笔记】https://blog.csdn.net/baidu_32173921/article/details/71741970
RCNN是最早出现的目标检测模型。相当于运用AlexNet来获取目标框。
RCNN训练过程
- 先用ImageNet训练AlexNet
- 用标注的样本框对训练好的AlexNet进行fine-tune
- 用这个AlexNet提取出训练样本框的特征
- 用提取出的特征训练SVM分类器
RCNN测试过程
- 运用SelectiveSearch的方式生成备选框 选择性搜索(selective search)https://blog.csdn.net/guoyunfei20/article/details/78723646
- 将生成的备选框送入AlexNet进行判断,回归类和回归框
RCNN缺点
- 多阶段的复杂的训练过程
- SVM与备选框的生成过程非常耗费运算和存储资源
- 测试过程缓慢,对每一个备选框都要进行一次AlexNet+SVM分类
3.2 SPPNet
https://blog.csdn.net/v1_vivian/article/details/73275259
- •Introducedthe traditional spatial pyramid pooling (SPP)into CNN architectures.
- •Addedan SPP layer on top of the lastconvolutional (CONV) layer to obtain features of fixed-length for the FClayers.
- •Onlyneeds torun theconvolutional layers once on the entire test image togenerate fixed-lengthfeatures for region proposals of arbitrary size.
在此之前,所有的神经网络都是需要输入固定尺寸的图片,比如224*224(ImageNet)、32*32(LenNet)、96*96等。这样对于我们希望检测各种大小的图片的时候,需要经过crop,或者warp等一系列操作,这都在一定程度上导致图片信息的丢失和变形,限制了识别精确度。
SPP-Net在最后一个卷积层后,接入了金字塔池化层,使用这种方式,可以让网络输入任意的图片,而且还会生成固定大小的输出。
金字塔池化:当网络输入的是一张任意大小的图片,这个时候我们可以一直进行卷积、池化,直到网络的倒数几层的时候,也就是我们即将与全连接层连接的时候,就要使用金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量。
优点:
- 输入图像可以随意尺寸
- 先卷积提取特征,再根据特征生成备选框的特征,节省大量运算
3.3 Fast RCNN and Faster RCNN
https://www.cnblogs.com/skyfsm/p/6806246.html
Fast RCNN
- •End-to-enddetectortraining
- •Simultaneouslylearns asoftmax classifierand class-specific bounding box regression using amultitask loss
- •Sharingthe computation of convolution acrossregion proposals, and addsRoIpoolinglayerbetweenthe last CONVand FClayer to extract afixed-length feature.
Faster RCNN
- •VGG16 model
- •Proposedan efficient and accurate RegionProposal Network (RPN) to generating region proposals. They utilizesingle networkto accomplish the task of RPN for region proposaland FastRCNN for region classification.
Fast RCNN
https://blog.csdn.net/shenxiaolu1984/article/details/51036677
- 最后一个卷积层后加了一个ROI pooling layer;
- 损失函数使用了multi-task loss(多任务损失)函数,将边框回归直接加到CNN网络中训练。分类Fast R-CNN直接用softmax替代R-CNN用的SVM进行分类。
- Fast R-CNN是端到端(end-to-end)的。
实验过程
- 网络末端同步训练的分类和位置调整,提升准确度
- 使用多尺度的图像金字塔,性能几乎没有提高
- 倍增训练数据,能够有2%-3%的准确度提升
- 网络直接输出各类概率(softmax),比SVM分类器性能略好
- 更多候选窗不能提升性能
Faster RCNN
Faster R-CNN可以简单地看做“区域生成网络RPNs + Fast R-CNN”的系统,用区域生成网络代替FastR-CNN中的Selective Search方法。Faster R-CNN这篇论文着重解决了这个系统中的三个问题:
1. 如何设计区域生成网络;
2. 如何训练区域生成网络;
3. 如何让区域生成网络和Fast RCNN网络共享特征提取网络。
RPN
RPN的核心思想是使用CNN卷积神经网络直接产生Region Proposal,使用的方法本质上就是滑动窗口(只需在最后的卷积层上滑动一遍),因为anchor机制和边框回归可以得到多尺度多长宽比的Region Proposal。
RPN网络也是全卷积网络(FCN,fully-convolutional network),可以针对生成检测建议框的任务端到端地训练,能够同时预测出object的边界和分数。只是在CNN上额外增加了2个卷积层(全卷积层cls和reg)。
①将每个特征图的位置编码成一个特征向量(256dfor ZF and 512d for VGG)。
②对每一个位置输出一个objectness score和regressedbounds for k个region proposal,即在每个卷积映射位置输出这个位置上多种尺度(3种)和长宽比(3种)的k个(3*3=9)区域建议的物体得分和回归边界。
RPN网络的输入可以是任意大小(但还是有最小分辨率要求的,例如VGG是228*228)的图片。如果用VGG16进行特征提取,那么RPN网络的组成形式可以表示为VGG16+RPN。
3.4 RFCN与Mask RCNN
https://blog.csdn.net/baidu_32173921/article/details/71741970
RFCN关键思想
分类需要特征具有平移不变性,检测则要求对目标的平移做出准确响应。现在的大部分CNN在分类上可以做的很好,但用在检测上效果不佳。SPP,Faster R-CNN类的方法在ROI pooling前都是卷积,是具备平移不变性的,但一旦插入ROI pooling之后,后面的网络结构就不再具备平移不变性了。因此,本文想提出来的position sensitive score map这个概念是能把目标的位置信息融合进ROI pooling。
R-FCN是在Faster R-CNN的框架上进行改造,
- 第一,把base的VGG16换车了ResNet,
- 第二,把Fast R-CNN换成了先用卷积做prediction,再进行ROI pooling。
由于ROI pooling会丢失位置信息,故在pooling前加入位置信息,即指定不同score map是负责检测目标的不同位置。pooling后把不同位置得到的score map进行组合就能复现原来的位置信息。
MASK RCNN
mask rcnn是何凯明基于以往的faster rcnn架构提出的新的卷积网络,一举完成了object instance segmentation.
该方法在有效地目标的同时完成了高质量的语义分割。把原有的Faster-RCNN进行扩展,添加一个分支使用现有的检测对目标进行并行预测。
主要贡献其实就是roi align以及加了一个mask分支。
四、单阶段目标检测模型
即输入图像与输出最终的框和分类是一个整体的过程。主流模型为YOLO系列和最新的SSD
- DetectNet
- OverFeat
- YOLO
- YOLOv2 and YOLO9000
- SSD(Single Shot Detector)
4.1 DetectNet 与 OverFeat
DetectNet与OverFeat是早期的单阶段目标检测模型。
https://blog.csdn.net/qq_35732097/article/details/79027095
Overfeat 把图像分类、定位、检测三个任务整合到一个框架中。Overfeat 在ILSVRC2013 的定位比赛中获得第一名。Overfeat是一个特征提取器。
主要是把分类网络换成回归网络,然后在各个scale 下训练回归网络来预测bounding box;然后融合预测的各个bounding box。
Multi-Scale Classification:
传统的检测/定位算法是固定image不变,采用不同的sliding window来支持不同尺度的物体。
对于CNN,sliding window的大小就是训练时input的大小,是不可改变的。所以,CNN支持多尺度的方法就是固定sliding window的大小,改变image的大小(将图像resize到对应的尺度上)。
我们最终分类是通过这样的步骤:
1.在每个尺度下,去每个类的最大值,这样构成C维向量;
2.对不同尺度的C维向量取均值
3.取平均化后的C维向量的Top1或Top5作为预测的类
合并预测
1.在6个尺度下运行分类网络,在每个尺度下选取top-k个类别,即对每张图片预测类别,放在Cs集合中(这里面是一张图片的s尺度下类别集合)。
2.在每个尺度s下,运行回归网络预测bbox,将Cs中每个类的bbox放在Bs集合中。
3.将各个尺度的Bs取并集,为B。
4.对bbox进行融合:
是分类和定位的结合。不同的是,一张图片可能多个位置同时训练,且图片中没有物体的时候,需要预测背景。
4.2 YOLOv1
https://blog.csdn.net/u014380165/article/details/72616238
- •GoogLeNet + YOLO layer
- •Unifieddetector casting object detection as aregressionproblem from image pixels to spatially separatedboundingboxes and associated class probabilities.
- •YOLO makesmore localization errors resulting from the coarsedivision ofbounding box location, scale and aspect ratio.
- •YOLO may fail to localize some objects, especiallysmall ones, possibly because the grid division is quite coarse, andbecauseby construction each grid cell can only contain one object.
算法首先把输入图像划分成S*S的格子,然后对每个格子都预测B个bounding boxes,每个bounding box都包含5个预测值:x,y,w,h和confidence。x,y就是bounding box的中心坐标,与grid cell对齐(即相对于当前grid cell的偏移值),使得范围变成0到1;w和h进行归一化(分别除以图像的w和h,这样最后的w和h就在0到1范围)
即得到每个bounding box属于哪一类的confidence score。也就是说最后会得到20*(7*7*2)=20*98的score矩阵,括号里面是bounding box的数量,20代表类别。接下来的操作都是20个类别轮流进行:在某个类别中(即矩阵的某一行),将得分少于阈值(0.2)的设置为0,然后再按得分从高到低排序。最后再用NMS算法去掉重复率较大的bounding box(NMS:针对某一类别,选择得分最大的bounding box,然后计算它和其它bounding box的IOU值,如果IOU大于0.5,说明重复率较大,该得分设为0,如果不大于0.5,则不改;这样一轮后,再选择剩下的score里面最大的那个bounding box,然后计算该bounding box和其它bounding box的IOU,重复以上过程直到最后)。
缺点
- 位置精确性差,对于小目标物体以及物体比较密集的也检测不好,比如一群小鸟。
- YOLO虽然可以降低将背景检测为物体的概率,但同时导致召回率较低。
4.3 YOLOv2与YOLO9000
为提高物体定位精准性和召回率,YOLO作者提出了 《YOLO9000: Better, Faster, Stronger》 (Joseph Redmon, Ali Farhadi, CVPR 2017, Best Paper Honorable Mention),相比v1提高了训练图像的分辨率;引入了faster rcnn中anchor box的思想,对网络结构的设计进行了改进,输出层使用卷积层替代YOLO的全连接层,联合使用coco物体检测标注数据和imagenet物体分类标注数据训练物体检测模型。相比YOLO,YOLO9000在识别种类、精度、速度、和定位准确性等方面都有大大提升。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
原文: https://www.cnblogs.com/makefile/p/YOLOv3.html © 康行天下
Ultilizinga number of strategies drawn fromexisting work
- Using simpler DarkNet19 instead of GoogLeNet
- Batch normalization
- Removingthe fullyconnected layers
- Anchorboxes learned withk-means
- Multi-scale training
Batch Normalization: v1中也大量用了Batch Normalization,同时在定位层后边用了dropout,v2中取消了dropout,在卷积层全部使用Batch Normalization。
高分辨率分类器:v1中使用224 × 224训练分类器网络,扩大到448用于检测网络。v2将ImageNet以448×448 的分辨率微调最初的分类网络,迭代10 epochs。
Anchor Boxes:v1中直接在卷积层之后使用全连接层预测bbox的坐标。v2借鉴Faster R-CNN的思想预测bbox的偏移.移除了全连接层,并且删掉了一个pooling层使特征的分辨率更大一些.另外调整了网络的输入(448->416)以使得位置坐标是奇数只有一个中心点(yolo使用pooling来下采样,有5个size=2,stride=2的max pooling,而卷积层没有降低大小,因此最后的特征是416/(2^5)=13).v1中每张图片预测7x7x2=98个box,而v2加上Anchor Boxes能预测超过1000个.检测结果从69.5mAP,81% recall变为69.2 mAP,88% recall.
4.4 YOLOv3
https://blog.csdn.net/leviopku/article/details/82660381
DBL:如图1左下角所示,也就是代码中的Darknetconv2d_BN_Leaky,是yolo_v3的基本组件。就是卷积+BN+Leaky relu。对于v3来说,BN和leaky relu已经是和卷积层不可分离的部分了(最后一层卷积除外),共同构成了最小组件。
resn:n代表数字,有res1,res2, … ,res8等等,表示这个res_block里含有多少个res_unit。这是yolo_v3的大组件,yolo_v3开始借鉴了ResNet的残差结构,使用这种结构可以让网络结构更深(从v2的darknet-19上升到v3的darknet-53,前者没有残差结构)。对于res_block的解释,可以在图1的右下角直观看到,其基本组件也是DBL。
concat:张量拼接。将darknet中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层add的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。
backbone 整个v3结构里面,是没有池化层和全连接层的。前向传播过程中,张量的尺寸变换是通过改变卷积核的步长来实现的,比如stride=(2, 2),这就等于将图像边长缩小了一半(即面积缩小到原来的1/4)。在yolo_v2中,要经历5次缩小,会将特征图缩小到原输入尺寸的1/25
1/25,即1/32。输入为416x416,则输出为13x13(416/32=13)。
Output : yolo v3输出了3个不同尺度的feature map,如上图所示的y1, y2, y3。这也是v3论文中提到的为数不多的改进点:predictions across scales
这个借鉴了FPN(feature pyramid networks),采用多尺度来对不同size的目标进行检测,越精细的grid cell就可以检测出越精细的物体。
y1,y2和y3的深度都是255,边长的规律是13:26:52
对于COCO类别而言,有80个种类,所以每个box应该对每个种类都输出一个概率。
yolo v3设定的是每个网格单元预测3个box,所以每个box需要有(x, y, w, h, confidence)五个基本参数,然后还要有80个类别的概率。所以3*(5 + 80) = 255。这个255就是这么来的。(还记得yolo v1的输出张量吗? 7x7x30,只能识别20类物体,而且每个cell只能预测2个box,和v3比起来就像老人机和iphoneX一样)
4.5 SSD
https://blog.csdn.net/a8039974/article/details/77592395
SSD effectively combines ideasfrom RPNin FasterRCNN,YOLO and multiscaleCONV featuresto achieve fast detection speed while stillretaining highdetection quality.
SSD,全称Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一种目标检测算法,截至目前是主要的检测框架之一,相比Faster RCNN有明显的速度优势,相比YOLO又有明显的mAP优势(不过已经被CVPR 2017的YOLO9000超越)。SSD具有如下主要特点:
- 从YOLO中继承了将detection转化为regression的思路,同时一次即可完成网络训练
- 基于Faster RCNN中的anchor,提出了相似的prior box;
- 加入基于特征金字塔(Pyramidal Feature Hierarchy)的检测方式,相当于半个FPN思路
进SSD算法的优点应该很明显:运行速度可以和YOLO媲美,检测精度可以和Faster RCNN媲美。除此之外,还有一些鸡毛蒜皮的优点,不解释了。这里谈谈缺点:
- 需要人工设置prior box的min_size,max_size和aspect_ratio值。网络中prior box的基础大小和形状不能直接通过学习获得,而是需要手工设置。而网络中每一层feature使用的prior box大小和形状恰好都不一样,导致调试过程非常依赖经验。
- 虽然采用了pyramdial feature hierarchy的思路,但是对小目标的recall依然一般,并没有达到碾压Faster RCNN的级别。作者认为,这是由于SSD使用conv4_3低级feature去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题。
五、基础子问题
5.1 特征表示
- 1.Detectingwith combined features of multiple CNN layers
- 2. Detecting at multiple CNN layers;
- 3. Combinations of the above two methods