背景:深度学习引入目标检测领域以来,给目标检测领域带来了很多突破性的进展,文章“Deep Learning for Generic Object Detection: A Survey”由香港中文大、国防科技大、芬兰奥卢大学、澳大利亚悉尼大学、加拿大滑铁卢大学的研究者共同发布的一篇综述文章,系统的总结了2013年深度学习引入目标检测领域以来的进展。非常具有参考意义。
目的: 本文在该论文基础上,总结相应目标检测主流模型,并广泛参考资料。文章内容对于后续目标检测项目和科研很有参考意义。
参考论文地址:https://arxiv.org/abs/1809.02165
未完,持续更新
目录
一、目标检测概况及进展
二、主流架构
2.1 主流架构概览
2.2 两种主流架构
双阶段
单阶段
三、双阶段目标检测模型
3.1 RCNN
RCNN训练过程
RCNN测试过程
RCNN缺点
3.2 SPPNet
3.3 Fast RCNN and Faster RCNN
Fast RCNN
Faster RCNN
3.4 RFCN与Mask RCNN
RFCN关键思想
MASK RCNN
四、单阶段目标检测模型
4.1 DetectNet 与 OverFeat
4.2 YOLOv1
4.3 YOLOv2与YOLO9000
4.4 YOLOv3
4.5 SSD
五、基础子问题
5.1 特征表示
5.2 局部特征表示
六、数据集与表现
七、主流模型性能总结
目的:目标检测:从一个图像之中定位出物体。
意义:目标检测是计算机视觉领域最基础的问题之一。深度学习给目标检测带来了很多突破性的进展。
本文作用:提供了深度学习给目标检测领域带来的一个综合的概述。
图为历年最好的模型在voc数据集上的mAP,红线为引入深度学习的时间点。我们可以看出,引入深度学习后,目标检测领域的mAP达到了一个快速的上升。
图为经典的目标检测模型出现的时间点,左为手动提取特征,例如SIFT,HOG,LBP等等,模型多进展缓慢,右边为深度学习提取(DCNN)特征。
经典的主流目标检测模型出现的时间。
取窗法依然为目标检检测的主流。
缺点:
策略:
两种主流架构分别为单阶段和双阶段。
一个阶段提出备选框,一个阶段对备选框进行判断。是一个两阶段级联的网络。主要为RCNN系列的网络。
单阶段的网络,整个生成备选框的过程一体化的实现。代表有YOLO系列和SSD(single shot detector)
即备选框的生成和备选框的判断是两个过程。以RCNN系列为主流和代表。
【RCNN论文笔记】 https://blog.csdn.net/baidu_32173921/article/details/71741970
RCNN是最早出现的目标检测模型。相当于运用AlexNet来获取目标框。
https://blog.csdn.net/v1_vivian/article/details/73275259
在此之前,所有的神经网络都是需要输入固定尺寸的图片,比如224*224(ImageNet)、32*32(LenNet)、96*96等。这样对于我们希望检测各种大小的图片的时候,需要经过crop,或者warp等一系列操作,这都在一定程度上导致图片信息的丢失和变形,限制了识别精确度。
SPP-Net在最后一个卷积层后,接入了金字塔池化层,使用这种方式,可以让网络输入任意的图片,而且还会生成固定大小的输出。
金字塔池化:当网络输入的是一张任意大小的图片,这个时候我们可以一直进行卷积、池化,直到网络的倒数几层的时候,也就是我们即将与全连接层连接的时候,就要使用金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量。
优点:
https://www.cnblogs.com/skyfsm/p/6806246.html
Fast RCNN
Faster RCNN
https://blog.csdn.net/shenxiaolu1984/article/details/51036677
实验过程
- 网络末端同步训练的分类和位置调整,提升准确度
- 使用多尺度的图像金字塔,性能几乎没有提高
- 倍增训练数据,能够有2%-3%的准确度提升
- 网络直接输出各类概率(softmax),比SVM分类器性能略好
- 更多候选窗不能提升性能
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。
https://blog.csdn.net/baidu_32173921/article/details/71741970
分类需要特征具有平移不变性,检测则要求对目标的平移做出准确响应。现在的大部分CNN在分类上可以做的很好,但用在检测上效果不佳。SPP,Faster R-CNN类的方法在ROI pooling前都是卷积,是具备平移不变性的,但一旦插入ROI pooling之后,后面的网络结构就不再具备平移不变性了。因此,本文想提出来的position sensitive score map这个概念是能把目标的位置信息融合进ROI pooling。
R-FCN是在Faster R-CNN的框架上进行改造,
由于ROI pooling会丢失位置信息,故在pooling前加入位置信息,即指定不同score map是负责检测目标的不同位置。pooling后把不同位置得到的score map进行组合就能复现原来的位置信息。
mask rcnn是何凯明基于以往的faster rcnn架构提出的新的卷积网络,一举完成了object instance segmentation.
该方法在有效地目标的同时完成了高质量的语义分割。把原有的Faster-RCNN进行扩展,添加一个分支使用现有的检测对目标进行并行预测。
主要贡献其实就是roi align以及加了一个mask分支。
即输入图像与输出最终的框和分类是一个整体的过程。主流模型为YOLO系列和最新的SSD
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进行融合:
是分类和定位的结合。不同的是,一张图片可能多个位置同时训练,且图片中没有物体的时候,需要预测背景。
https://blog.csdn.net/u014380165/article/details/72616238
算法首先把输入图像划分成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作者提出了 《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 © 康行天下
Ultilizing a number of strategies drawn from existing work
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.
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一样)
https://blog.csdn.net/a8039974/article/details/77592395
SSD effectively combines ideas from RPN in Faster RCNN, YOLO and multiscale CONV features to achieve fast detection speed while still retaining high detection quality.
SSD,全称Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一种目标检测算法,截至目前是主要的检测框架之一,相比Faster RCNN有明显的速度优势,相比YOLO又有明显的mAP优势(不过已经被CVPR 2017的YOLO9000超越)。SSD具有如下主要特点:
进SSD算法的优点应该很明显:运行速度可以和YOLO媲美,检测精度可以和Faster RCNN媲美。除此之外,还有一些鸡毛蒜皮的优点,不解释了。这里谈谈缺点: