美文网首页深度学习
从图像分类到目标检测

从图像分类到目标检测

作者: Byte猫 | 来源:发表于2019-06-12 11:40 被阅读0次

图像分类解决了是什么的问题,目标检测解决了在哪里的问题。简单来说就是在图像分类的基础上,以包围盒的(bounding box)形式框出物体。



很多计算机视觉任务(如人脸识别,车牌识别,场景描述)背后的基础都是目标检测。自从 AlexNet 获得 ILSVRC 2012 挑战赛冠军后,用 CNN 进行图像分类成为主流。目标检测也得益于CNN在图像分类领域的进步发展越来越快。

技术路线:基于滑动窗口的方案

1、滑窗法

滑窗法(Sliding Window)是一种经典的目标检测方法。首先对输入图像进行不同窗口大小的滑窗进行从左往右、从上到下的滑动。每次滑动时候对当前窗口执行分类器(分类器是事先训练好的)。如果当前窗口得到较高的分类概率,则认为检测到了物体。对每个不同窗口大小的滑窗都进行检测后,会得到不同窗口检测到的物体标记,这些窗口大小会存在重复较高的部分,最后采用非极大值抑制(Non-Maximum Suppression, NMS)的方法进行筛选。最终,经过NMS筛选后获得检测到的物体。


交并比(IOU)与非最大抑制(NMS)
(1)交并比(IOU)
交并比用来描述两个边框的重合程度,重合度IOU计算公式为:IOU=(A∩B)/(A∪B),即两框覆盖区域的交集与并集的面积比。IOU越大,说明两个边框重合度越高。


(2)非最大抑制(NMS)
当边框预测环节生成了大量提议边框后,接着要为每个矩形框做类别分类概率,最后需要判别哪些矩形框是没用的。

所谓的非极大值抑制就是根据分类器类别分类概率做排序,从小到大排序,先拿最大概率候选框与其他框计算重叠度IOU,丢弃高于阈值的提议框。然后从没有被丢弃的提议框中再找最大概率提议框,重复上述操作.....直到找到所有被保留下来的提议框。

滑窗法简单易于理解,但是不同窗口大小进行图像全局搜索导致效率低下,而且设计窗口大小时候还需要考虑物体的长宽比。所以,对于实时性要求较高的分类器,不推荐使用滑窗法。

技术路线:基于候选区域的方案

候选区域(Region Proposal),就是预先找出图中目标可能出现的位置,通过利用图像中的纹理、边缘、颜色等信息,保证在选取较少窗口(几千个甚至几百个)的情况下保持较高的召回率。
候选区域方法比传统的滑动窗口方法获取的质量要更高。比较常用的生成候选区域的方法有:SelectiveSearch(SS,选择性搜索)、Edge Boxes(EB)、RPN网络。

1、R-CNN

该方法作为深度学习用于物体识别的开山之作,后续很多基于候选区域为基础的方法都是在该方法上进行改进得到的。该方案首先利用一种选择搜索算法(selective search)从图中选出2000个左右的候选框,对每一个候选框内的图片缩放至指定的大小并放入CNN中进行特征提取,并将指定的特征存储下来。提取出特征后使用SVM进行分类,最后通过非极大值抑制输出结果。


选择搜索法(selective search)
选择搜索算法的主要观点:图像中物体可能存在的区域应该是有某些相似性或者连续性区域的。基于这一想法采用子区域合并的方法进行提取提议边界框。首先,对输入图像用分割算法产生许多小的子区域。其次,根据这些子区域之间相似性(相似性标准主要有颜色、纹理、大小等等)进行区域合并,不断的进行区域迭代合并。每次迭代过程中对这些合并的子区域做外切矩形(bounding boxes),这些子区域外切矩形就是通常所说的提议框。它的计算效率优于滑窗法,而且由于采用子区域合并策略,所以可以包含各种大小的疑似物体框。 合并区域相似的指标多样性,提高了检测物体的概率。


代码实现1
代码实现2

R-CNN的训练可分成下几步:
(1)通过选择性搜索,对待检测的图片进行搜索出约2000个候选窗口。
(2)把这2000个候选窗口的图片都缩放到227*227,然后分别输入CNN中(论文中使用的CNN网络是AlexNet,数据集为ImageNet),每个候选窗口提取出一个特征向量,也就是说利用CNN对每个候选窗口进行提取特征向量,并将提取到的特征存储起来。
(3)把上面每个候选窗口的对应特征向量,利用SVM算法进行分类识别。

R-CNN的缺点是计算量太大。在一张图片中,通过选择搜索法得到的有效区域往往在1000个以上,这意味着要重复计算1000多次神经网络,非常耗时。另外,在训练阶段,还需要把所有特征保存起来再通过SVM进行训练,这也是非常耗时且麻烦的。

创新
使用了选择搜索法作为边框预测算法。
使用了CNN提取图像特征

2、SPP-net

R-CNN 需要足够多的提议窗口才能保证准确度, 而很多区域是相互重叠的。R-CNN 的训练和推理过程都很缓慢。例如,我们生成了 2000 个的区域提议,每个区域提议分别进入 CNN。换句话说,我们对不同的候选窗口重复了进行了 2000 次的提取特征。
后来,2015年发表在IEEE上的论文《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》提出了一个对R-CNN的优化措施,那就是"空间金字塔池化"。
空间金字塔池化的英文全称是Spatial Pyramid Pooling(简称SPP),其核心就是SPP池化层。含有SPP池化层的SPP-net不需要对每个候选区域(2000个左右)提取卷积特征图,只需要对整图提一次卷积特征图,然后将候选区域映射到卷积特征层上即可,从而提升了速度。此外,它还解决了深度网络固定输入层尺寸的这个限制,使得网络可以享受不限制输入尺寸带来的好处。

SPP池化层实现对不同尺寸的兼容


金字塔池化其实就是把每个输入的候选区域的特征图分别分成4X4=16块,2X2=4块,1X1=1块(不变),取每块的最大值作为代表,总共21块,即每张候选区域的特征图都会转换为固定的21维的特征向量。

对比R-CNN,SPP-net的训练过程是:
(1)通过选择性搜索,对待检测的图片进行搜索出2000个候选区域。这一步和R-CNN一样。
(2) 特征提取阶段。这一步就是和R-CNN最大的区别了,这一步骤的具体操作是把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选区域,再对各个候选区域采用金字塔空间池化(SPP池化层),提取出固定长度的特征向量。而R-CNN输入的是每个候选区域,然后在进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,速度会大大提升。
(3)最后一步也是和R-CNN一样,采用SVM算法进行特征向量分类识别。

SPP-net对R-CNN最大的改进就是特征提取步骤做了修改,其他模块仍然和R-CNN一样。和R-CNN相比,SPP-net速度提高了百倍。

创新
提出了一种从候选区域到全图特征之间的对应映射关系,通过此种映射关系可以直接获取到候选区域的特征向量(了解映射方法)
提出了一种适应不同输入尺寸提取固定长度特征的网络结构

3、Fast R-CNN

Ross Girshick在2015年推出Fast R-CNN,构思精巧,流程更为紧凑,大幅提升了目标检测的速度。Fast R-CNN和R-CNN相比,测试时间从49秒减少到2.3秒。
相对于R-CNN与SPP-net,Fast R-CNN的主要亮点有:Fast R-CNN直接使用Softmax替代了RCNN中SVM进行分类,不再对网络进行分步训练;用ROI层代替SPP层,可以更高效地训练更新整个网络。

ROI池化层


ROI池化层实际上是SPP池化层的一个精简版,SPP池化层对每个候选区域使用了不同大小的金字塔映射,而ROI池化层只需要下采样到一个7x7的矩阵。
由于VGG16网络conv5_3有512个特征图,这样每个候选区域就对应了一个7X7X512维度的特征向量

创新
提出了ROI池化层
使用Softmax替代了SVM执行分类

Fast-RCNN很重要的一个贡献是成功的让人们看到了Region Proposal+CNN这一框架实时检测的希望,原来多类检测真的可以在保证准确率的同时提升处理速度,也为后来的Faster-RCNN做下了铺垫。

4、Faster R-CNN

Fast R-CNN测试时每张图像前馈网络只需0.2秒,但瓶颈在于提取候选区域需要2秒。Faster R-CNN不再使用现有的无监督候选区域生成算法,而引入了候选区域网络(Region Proposal Network, RPN)作为代替。RPN 快速且高效地扫描每一个位置,来评估在给定的区域内是否需要作进一步处理,其实现方式如下:通过输出 k 个边界框建议,每个边界框建议都有 2 个值——代表每个位置包含目标对象和不包含目标对象的概率。
Faster R-CNN的测试时间是0.2秒,接近实时。后来有研究发现,通过使用更少的候选区域,可以在性能损失不大的条件下进一步提速。

区域提议网络(Region proposal network)
Faster R-CNN抛弃了传统的滑动窗口和SS方法,直接使用RPN生成候选区域,这也是Faster R-CNN的巨大优势,能极大提升候选区域的生成速度。
RPN 会在最后卷积层的输出(一个特征图)上用滑动窗口(通常是 3x3)方法进行潜在对象检测。每个窗口,RPN会使用一组定义好的锚点框(anchors,也叫锚盒)生成多个可能的 RoI,每个 RoI 都被视为区域建议。锚点框是宽高比固定的方框,例如宽矮或高瘦方框。

9个矩形共有3种形状,长宽比为大约为{1:1,1:2,2:1}

对于每个建议,该网络都生成一个概率 Pc,将该区域分类为对象(或非对象)区域,并包含该对象的一组边界框坐标。
对象概率很低的区域(例如 Pc < 0.5)被丢弃。
所以,仅仅是个二分类而已!
了解更多

Faster R-CNN 网络工作流如下


创新
提出了RPN网络代替SS,实现了真正的端到端检测

5、R-FCN

RCNN 在目标检测上取得了很大的成功,比如 SPPnet、Fast R-CNN、Faster R-CNN 等,这些方法的典型特征都是一个二分网络,以 ROI池化层为界,前面子网络用于特征提取,后面子网络用于目标检测。
在特征提取子网络我们可以通过共用一个CNN来提升速度,那么检测子网络是否也可以这么做呢(而不是对每个候选区域都做一遍计算)?这就是设计 R-FCN 的动机:通过最大化共享计算来提升检测子网络部分的速度。
R-FCN即基于区域的全卷积网络 (Region-based Fully Convolutional Net),可以在每个输出之间完全共享计算。作为全卷积网络,它在模型设计过程中遇到了一个特殊的问题。
一方面,当对一个目标进行分类任务时,我们希望学到模型中的位置不变性(location invariance):无论这只猫出现在图中的哪个位置,我们都想将它分类成一只猫。另一方面,当进行目标检测任务时,我们希望学习到位置可变性(location variance):如果这只猫在左上角,那么我们希望在图像左上角这个位置画一个框。
所以,问题出现了,我们应该如何在位置不变性(location invariance)和位置可变性(location variance)之间做出权衡呢?
R-FCN 提出了一种全新的特征聚集方法,主要思想是在特征聚集时人工引入位置信息,从而有效改善较深的神经网络对物体位置信息的敏感程度。

位置敏感的ROI池化
运行RPN网络,以生成候选区域。
对于每一个候选区域首先被平均分割成 k^2个子区域,然后通过一层1*1的卷积核生成通道数为 k^2*(C+1) 的特征图。这里,k^2代表一个候选区域里所有子区域的数量,(C+1)代表所有的类别数加上背景。
对每个子区域,都会判断这个子区域是否匹配具体目标的对应位置,给出相应的得分。
k^2个子区域的得分求平均,得到对应类的分数。
将所有类的得分组成的(C+1)维向量使用 softmax 回归,来对候选区域进行分类。



形象地说就是,在处理每个候选区域时候,我们会将其切分成多个子区域,在每个子区域上反复询问系统:「这看起来像是人脸的『上-左』部分吗?」,「这看起来像是人脸的『上-中』部分吗?」,「这看起来像是人脸的『上-右』部分吗?」等等。系统会对所有类重复这个过程。
如果有足够的子区域表示「是的,我的确匹配人脸的这个部分!」那么该区域就会被分类成人脸。

创新
提出了位置敏感的ROI池化结构,在同等质量下检测速度比Faster R-CNN提升了几倍

R-CNN, Fast R-CNN, Faster R-CNN, R-FCN这些算法的演进思路是逐渐提高网络中图像级别计算的比例,同时降低区域级别计算的比例。R-CNN中几乎所有的计算都是区域级别计算,而R-FCN中几乎所有的计算都是图像级别计算。

技术路线:基于直接回归的方案

基于候选区域的方法由于有两步操作,虽然检测性能比较好,但速度上离实时仍有一些差距。基于直接回归的方法不需要候选区域,直接输出分类/回归结果。这类方法由于图像只需前馈网络一次,速度通常更快,可以达到实时。

1、YOLO v1

YOLO意思是You Only Look Once,创造性的将候选区和对象识别这两个阶段合二为一,看一眼图片就能知道有哪些对象以及它们的位置。
它首先将图像resize到448x448作为输入,然后将图片划分为7x7的网格(grid)。物体的中心落在哪个网格,就由那个网格负责预测!所以一张图片最多能检测出49个对象,因为7x7=49。
每个网格允许预测出2个边框(bounding box,包含某个对象的矩形框),总共 49*2=98 个边框。可以理解为98个候选区,它们很粗略的覆盖了图片的整个区域。

不是Anchor!
Faster RCNN手工设置了n个先验框(Anchor,预先设置好位置的边框)的设计,每个先验框有不同的大小和宽高比。YOLO的边框看起来很像一个网格对应2个先验框,但它们不是。YOLO并没有预先设置2个边框的大小和形状,也没有对每个边框分别输出一个对象的预测。它的意思仅仅是对一个对象预测出2个边框,选择预测得相对比较准的那个。

去掉候选区这个步骤以后,YOLO的结构非常简单,就是单纯的卷积、池化最后加了两层全连接。单看网络结构的话,和普通的CNN对象分类网络几乎没有本质的区别。所以粗略来说,YOLO的整个结构就是输入图片经过神经网络的变换得到一个输出的张量,如下图所示。


先在ImageNet上做了预训练,然后在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层。对于卷积层和全连接层,采用Leaky ReLU激活函数,但是最后一层却采用线性激活函数。由于检测任务一般需要更高清的图片,所以将网络的输入从224x224增加到了448x448。

因为只是一些常规的神经网络结构,所以,理解YOLO的设计的时候,重要的是理解输入和输出的映射关系。

输入和输出的映射关系

我们先考虑一个网格只对应一个边框的情况。

置信度意味着包含对象且位置准确的程度,C1、C2、C3分别是三种分类对象的概率

边框的置信度
边框的置信度 = 该边框内存在对象的概率 * 该边框与该对象实际边框的IOU
用公式来表示就是:
Confidence = Pr(Object)*IOU_{pred}^{true}
综合来说,一个边框的置信度Confidence意味着它是否包含对象且位置准确的程度。置信度高表示这里存在一个对象且位置比较准确,置信度低表示可能没有对象或者即便有对象也存在较大的位置偏差。

Cx,Cy表示中心点在网格内的位置 w代表锚盒在图像中的宽度占比,h代表锚盒在图像中的高度占比

在分类数为3的情况下,经过神经网络对输入图像信息的提取和变换,一个网格及其周边的信息被识别和整理,最后编码到了8(5+3)维向量中。
如果分类数为20呢?我们会得到一个25(20+5)维向量。
如果一个网格对应两个边框呢?这就是30(5x2+20)维向量。

因为网格和边框设置的比较稀疏,所以这个版本的YOLO训练出来后预测的准确率和召回率都不是很理想,后续的v2、v3版本还会改进。当然,因为其速度能够满足实时处理的要求,所以对工业界还是挺有吸引力的。

2、SSD

SSD算法,其英文全名是Single Shot MultiBox Detector,Single shot指明了SSD算法属于one-stage方法,MultiBox指明了SSD是多框预测。
在YOLO v1之后SSD横空出世,它在准确度上比YOLO v1要好很多。
相比YOLO v1,SSD有如下特点:
(1)SSD采用CNN来直接进行检测,而不是像YOLO v1那样在全连接层之后做检测;
(2)SSD提取了不同尺度的特征图来做检测,大尺度特征图(较靠前的特征图)可以用来检测小物体,而小尺度特征图(较靠后的特征图)用来检测大物体;
(3)SSD采用了不同尺度和长宽比的先验框(Anchors)。
YOLO v1算法缺点是难以检测小目标,而且定位不准,上面的几项特性使得SSD在一定程度上克服了这些缺点。
SSD采用VGG16作为基础模型,然后在VGG16的基础上新增了卷积层来获得更多的特征图以用于检测。SSD与YOLO v1的网络结构对比如下图所示。上面是SSD模型,下面是YOLO v1模型,可以明显看到SSD利用了多尺度的特征图做检测。模型的输入图片大小是300×300(还可以是512×512,其与前者网络结构没有差别,只是最后新增一个卷积层)

3、YOLO v2

SSD的出现表明端到端的单阶段目标检测模型如果善加调理,在拥有较快速度的同时,一样可以达到与像Faster-RCNN等双阶段目标检测模型类似的准确度。
经过一年的蛰伏之后,YOLO v2于2016年问世。它有效地借鉴了Faster-RCNN/SSD中使用的思想。YOLO v2相对v1版本,在继续保持处理速度的基础上,三个方面进行了改进:
预测更准确(Better)
(1)使用高分辨率图像微调分类模型
原来的YOLO v1版本的网络在预训练的时候采用的图像输入为224x224(这是因为一般预训练的分类模型都是在ImageNet数据集上进行的),然后在检测的时候采用448x448的输入图像,这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。
YOLO v2将预训练分成两步。先用224x224的输入从头开始训练网络,大概160个epoch(表示将所有训练数据循环跑160次),然后再将输入调整到448x448,再训练10个epoch。注意这两步都是在ImageNet数据集上操作。最后再在检测的数据集上微调(fine-tuning),也就是检测的时候用448x448的图像作为输入就可以顺利过渡了。YOLO的作者的实验表明这样操作可以提高3.7的mAP。
(2)加入了批量归一化层(Batch Normalization)
随着神经网络的训练,网络层的输入分布会发生变动,逐渐向激活函数取值两端靠拢,如:sigmoid激活函数,此时会进入饱和状态,梯度更新缓慢,对输入变动不敏感,甚至梯度消失导致模型难以训练。通过对网络的每一个卷积层之后激活函数之前加入BN层,可以将分布拉到均值为0,标准差为1的正态分布,从而使激活函数处于对输入值敏感的区域,从而加快模型训练,最终有2的mAP提升。此外,BN层还能起到类似dropout的正则化作用,可以从模型中去掉Dropout并使用较大的学习率而不会产生过拟合。
(3)采用先验框(Anchor Boxes)
借鉴Faster RCNN的做法,YOLO v2也尝试采用先验框(anchor)。在每个网格预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度,这些先验框作为预定义的候选区在神经网络中将检测其中是否存在对象,以及微调边框的位置。
同时YOLO v2移除了全连接层。另外去掉了一个池化层,使网络卷积层输出具有更高的分辨率。
之前YOLO v1并没有采用先验框,并且每个网格只预测两个边框,整个图像98个。YOLO v2如果每个网格采用9个先验框,总共有13x13x9=1521个先验框。所以,相对YOLO v1的81%的召回率,YOLO v2的召回率大幅提升到88%。同时有0.2的mAP轻微下降。
不过YOLO v2接着进一步对先验框进行了改良。
(4)聚类提取先验框尺度
之前先验框都是手工设定的,YOLO v2尝试统计出更符合样本中对象尺寸的先验框,这样就可以减少网络微调先验框到实际位置的难度。YOLO v2的做法是对训练集中标注的边框进行聚类分析,以寻找尽可能匹配样本的边框尺寸。
聚类算法最重要的是选择如何计算两个边框之间的"距离",对于常用的欧式距离,大边框会产生更大的误差,但我们关心的是边框的IOU。所以,YOLO v2在聚类时采用以下公式来计算两个边框之间的"距离"。
d(box,centroid)=1-IOU(box,centroid)
centroid是聚类时被选作中心的边框,box就是其它边框,d就是两者间的"距离"。IOU越大,"距离"越近。
(5)约束预测边框的位置
作者在引入先验框的时候遇到的另一个问题是模型不稳定,尤其是在训练刚开始的时候。作者认为这种不稳定主要来自预测框的(x,y)值。其位置预测公式为:

x = (t_x*w_a)+x_a \\ y = (t_y*h_a)+y_a

其中x,y是预测边框的中心,x_a,y_a是先验框(anchor)的中心点坐标,w_a,h_a是先验框(anchor)的宽和高,t_x,t_y是要学习的参数。
由于t_x,t_y的取值没有任何约束,因此预测边框的中心可能出现在任何位置,训练早期阶段不容易稳定。YOLO v2调整了预测公式,将预测边框的中心约束在特定网格内。
σ
b_x = σ(t_x)+c_x \\ b_y = σ(t_y)+c_y \\ b_w = p_w*e^{t_w} \\ b_h = p_h*e^{t_h} \\ σ(t_o) = Pr(Object)*IOU(box,object)

其中b_x,b_y,b_w,b_h是预测边框的中心和宽高,σ(t_o)是预测边框的置信度,c_x,c_y是当前网格左上角到图像左上角的距离,p_w,p_h是先验框的宽和高。σ是sigmoid函数。是要学习的参数,分别用于预测边框的中心和宽高,以及置信度。t_x,t_y,t_w,t_h,t_o是要学习的参数,分别用于预测边框的中心和宽高,以及置信度。

根据新的计算公式,预测边框的蓝色中心点被约束在蓝色背景的网格内。约束边框位置使得模型更容易学习,且预测更为稳定。
(6)passthrough层检测细粒度特征
对象检测面临的一个问题是图像中对象会有大有小,输入图像经过多层网络提取特征,最后输出的特征图中(比如YOLO v2中输入416x416经过卷积网络下采样最后输出是13x13),较小的对象可能特征已经不明显甚至被忽略掉了。为了更好的检测出一些比较小的对象,最后输出的特征图需要保留一些更细节的信息。
YOLO v2引入一种称为passthrough层的方法在特征图中保留一些细节信息。具体来说,就是在最后一个pooling之前,特征图的大小是26x26x512,将其1拆4,直接传递(passthrough)到池化层后(并且又经过一组卷积)的特征图,两者叠加到一起作为输出的特征图。

1个4x4拆成4个2x2

根据YOLO v2的代码,特征图先用1x1卷积从 26x26x512 降维到 26x26x64,再做1拆4并passthrough。
passthrough层检测细粒度特征有1的mAP提升。
(7)多尺度图像训练
因为去掉了全连接层,YOLO v2可以输入任何尺寸的图像。因为整个网络下采样倍数是32,作者采用了{320,352,...,608}等10种输入图像的尺寸,这些尺寸的输入图像对应输出的特征图宽和高是{10,11,...19}。训练时每10个batch就随机更换一种尺寸,使网络能够适应各种大小的对象检测。
多尺度图像训练对mAP有1.4的提升。
(8)高分辨率图像的对象检测
因为YOLO v2调整网络结构后能够支持多种尺寸的输入图像(通常是使用416x416的输入图像),如果用较高分辨率的输入图像,比如544x544,则mAP可以达到78.6,有1.8的提升。
速度更快(Faster)
为了进一步提升速度,YOLO v2使用了一个新的分类网络作为特征提取部分,参考了前人的工作经验。类似于VGG,网络使用了较多的3x3卷积核,在每一次池化操作后把通道数翻倍。借鉴了network in network的思想,网络使用了全局平均池化(global average pooling)做预测,把1x1的卷积核置于3x3的卷积核之间,用来压缩特征。使用batch normalization稳定模型训练,加速收敛,正则化模型。
最终得出的基础模型就是Darknet-19,包含19个卷积层、5个最大值池化层(max pooling layers )。Darknet-19处理一张照片需要55.8亿次运算,imagenet的top-1准确率为72.9%,top-5准确率为91.2%。Darknet-19的精度不弱于VGG-16,但浮点运算量减少到约1/5,提供了更快的运算速度。

识别对象更多(Stronger)
众多周知,检测数据集的标注要比分类数据集打标签繁琐的多,所以ImageNet分类数据集比VOC等检测数据集高出几个数量级。所以在YOLO v1中,边界框的预测其实并不依赖于物体的标签,YOLO v2实现了在分类和检测数据集上的联合训练。对于检测数据集,可以用来学习预测物体的边界框、置信度以及为物体分类,而对于分类数据集可以仅用来学习分类,但是其可以大大扩充模型所能检测的物体种类。
......
虽然YOLO v2做出了一些改进,但总的来说网络结构依然很简单。就是一些卷积+pooling,从416x416x3 变换到 13x13x5x25。稍微大一点的变化是增加了batch normalization,增加了一个passthrough层,去掉了全连接层,以及采用了5个先验框。

对比YOLO v1的输出张量,YOLO v2的主要变化就是会输出5个先验框,且每个先验框都会尝试预测一个对象。输出的 13x13x5x25 张量中,25维向量包含20个对象的分类概率+4个边框坐标+1个边框置信度。

4、YOLO v3

作为YOLO系列目前最新的算法,YOLO v3 的模型比YOLO v2既有保留又有改进。
(1)网络结构

YOLO每一代的提升很大一部分决定于骨干(backbone)网络的提升,从v2的darknet-19到v3的darknet-53。yolo_v3还提供可替换的backbone——tiny darknet。要想性能牛叉,backbone可以用Darknet-53,要想轻量高速,可以用tiny-darknet。

darknet-53

darknet-53是可以和resnet-152正面刚的backbone。darknet-53与resnet-152具有相似的性能,速度提高2倍。darknet-53也可以实现每秒最高的测量浮点运算。这意味着网络结构可以更好地利用GPU,从而使其评估效率更高,速度更快。这主要是因为ResNets的层数太多,效率不高。

(2)多尺度特征进行对象检测

YOLO2曾采用passthrough结构来检测细粒度特征,在YOLO3更进一步采用了3个不同尺度的特征图来进行对象检测。
结合上图看,卷积网络在79层后,经过下方几个黄色的卷积层得到一种尺度的检测结果。相比输入图像,这里用于检测的特征图有32倍的下采样。由于下采样倍数高,这里特征图的感受野比较大,因此适合检测图像中尺寸比较大的对象。
为了实现细粒度的检测,第79层的特征图又开始作上采样(从79层往右开始上采样卷积),然后与第61层特征图融合(Concatenation),这样得到第91层较细粒度的特征图,同样经过几个卷积层后得到相对输入图像16倍下采样的特征图。它具有中等尺度的感受野,适合检测中等尺度的对象。
最后,第91层特征图再次上采样,并与第36层特征图融合(Concatenation),最后得到相对输入图像8倍下采样的特征图。它的感受野最小,适合检测小尺寸的对象。

随着输出的特征图的数量和尺度的变化,先验框的尺寸也需要相应的调整。YOLO v2已经开始采用K-means聚类得到先验框的尺寸,YOLO v3延续了这种方法,为每种下采样尺度设定3种先验框,总共聚类出9种尺寸的先验框。在COCO数据集这9个先验框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。
分配上,在最小的13x13特征图上(有最大的感受野)应用较大的先验框(116x90),(156x198),(373x326),适合检测较大的对象。中等的26x26特征图上(中等感受野)应用中等的先验框(30x61),(62x45),(59x119),适合检测中等大小的对象。较大的52x52特征图上(较小的感受野)应用较小的先验框(10x13),(16x30),(33x23),适合检测较小的对象。
我们算一下YOLO v3共可以检测了多少个目标。对于一个416x416的输入图像,在每个尺度的特征图的每个网格设置3个先验框,总共有 13x13x3 + 26x26x3 + 52x52x3 = 10647 个预测。
对比一下,YOLO v2采用13x13x5 = 845个预测,YOLO3的尝试预测边框数量增加了10多倍,而且是在不同分辨率上进行,所以mAP以及对小物体的检测效果有一定的提升。
(3)对象分类softmax改成logistic
预测对象类别时不使用softmax,改成使用logistic的输出进行预测。这样能够支持多标签对象(比如一个人有Woman 和 Person两个标签)。

相关文章

  • 从图像分类到目标检测

    图像分类解决了是什么的问题,目标检测解决了在哪里的问题。简单来说就是在图像分类的基础上,以包围盒的(boundin...

  • 目标检测:YOLO和SSD 简介

    转载请注明出处 作为计算机视觉三大任务(图像分类、目标检测、图像分割)之一,目标检测任务在于从图像中定位并分类感兴...

  • 卷积神经网络的应用

    目标检测 图像识别中,目标检测的任务,是对输入图像样本准确进行分类的基础上,检测其中包含的某些目标,并对它们准确定...

  • 基于caffe的FCN图像分割(一)

    前言 在计算视觉领域,除了图像分类,目标检测,目标跟踪之外,图像分割也是研究的热点之一。 图像分割的常用医学图像,...

  • 人工智能学习笔记-Day20

    46 图像识别综述 46.1 图像标记 分类 46.2 目标检测 寻找位置 Faster R-CNNFaster ...

  • 《动手学深度学习》第七天2020-02-20

    https://www.boyuai.com/elites/ Task09:目标检测基础;图像风格迁移;图像分类案...

  • 《动手学深度学习》第八天2020-02-21

    https://www.boyuai.com/elites/ Task09:目标检测基础;图像风格迁移;图像分类案...

  • 2019-05-29(卷积单元—更新中)

    卷积神经网络的基本模块 视觉基本问题:图像分类、目标识别、目标检测、图像分割、目标分割。 卷积层 卷积运算:对应位...

  • Training Region-based Object Det

    1 引言 目标检测算子通常是将目标检测问题简化(reduction)为图像分类问题来进行训练, 这种简化(redu...

  • 2019-05-22

    视觉识别主要包括三大类问题:图像层次(图像分类),区域层次(目标检测)和像素层次(比如图像分割、人体姿态估计和人脸...

网友评论

    本文标题:从图像分类到目标检测

    本文链接:https://www.haomeiwen.com/subject/tuwexctx.html