目标检测之YOLO系列-V1至V3详解

YOLOv1(You only look once:Unified,Real-Time Object Detection)-2015

特点

它将目标检测任务当作是一个回归任务处理,这个回归任务包括在空间上独立的两部分:定位框和对应的类别概率; 它不像R-CNN那样先用卷积神经网络在建议区域提取特征,然后再用SVM做分类之后进一步提炼bounding boxes,而是整个过程都在一个完整的神经网络中完成。YOLOv1 容易出现定位错误,但是它能够很好地区分前景和背景,同时它提取特征的能力很强.

优点

1.YOLO 执行速度很快(相比于其他检测系统,论文的最大亮点),因为它是一个端对端的网络(pipeline);
2.YOLO 在预测中对整张图的全局合理性把握得更好,因为YOLO在训练和测试中使用的是整张图片,这表明它在某种程度上编码了图片的类别和图片内容信息。作者在论文中提到,YOLO比Fast RCNN 减少了将近一半的背景错误。这里的background error我理解为出现bounding box,里面没有所谓的前景物体;
3.YOLO 能够提取到目标通用的特征,作者用自然图片训练,用艺术图片测试,效果比DPM和R-CNN效果要好很多。

缺点

1.YOLOv1 在精确度上落后于当前最好的检测系统,主要来源于坐标定位的不准确,因为这些坐标预测都是从标签bounding box数据中以一种新的宽高比率统计抽象出来,这个过程很容易出现定位不准确。
2. 大的bounding box和小的bounding box对相同的小错误的敏感度相同。这与直觉逻辑不合,因为直觉告诉我们对于相同的小错误,小的bounding box应该更加敏感。虽然作者试图在损失函数中使用平方根来克服这个缺点,但是只能部分解决。
3.YOLOv1 对密集物体,重叠面积大的物体不好预测,作者在论文中提到,每个格子负责预测一个物体,但是如果一个格子内有两个或者多个物体,就必然会丢失物体

检测处理思想

在这里插入图片描述
将输入图片划分为SxS的格子(逻辑区域),如果物体的中心坐标落在某个格子中,那么这个格子就负责检测这个物体(包括bounding box的坐标和类别概率)。每个格子预测B个bounding boxes和B个置信度,这个置信度表示这个格子预测的bounding boxes包含物体的可信程度
论文作者将置信度定义为 P r ( O b j e c t ) × I O U P_r(Object) \times IOU Pr(Object)×IOUIOU的值为预测bounding box和真实bounding box交集除以它们的并集,因为这样可以将IOU压缩到0到1之间, P r ( O b j e c t ) P_r(Object) Pr(Object)的值为0或者1,表示存不存在目标物体
每一个bounding box包括五个元素,x,y,w,h,confidence。
坐标(x,y)表示的是box的中心坐标,并且是相对于格子的边界而言,w和h也是相对于整张图片的宽度和高度而言。置信度预测的值表示预测框和真实框的IOU值。
虽然每个格子预测B个bounding box,但是每个格子只预测一组类条件概率,注意这里不是anchor,因为多个bounding box共用了一组class probability。所以网络架构的最后一层实际预测了B个bouding box和一组类别概率,注意这只是针对于一个格子,所以在不考虑batch size的情况下,实际预测输出长度为SxSx(Bx5+C),作者在Pascal VOC数据集上训练时S = 7,B=2, C=20

分析置信度如何处理

在训练过程中,哪些格子里面有目标物体是确定的,所以 P r ( O b j e c t ) P_r(Object) Pr(Object)的值为0或者为1是确定的,IOU的值是通过预测bounding box和label bounding box的交集计算得到的,所以训练过程中的置信度不是直接预测的,而是通过 P r ( O b j e c t ) × I O U P_r(Object) \times IOU Pr(Object)×IOU计算得到的。在测试过程中,我们无法知道 P r ( O b j e c t ) P_r(Object) Pr(Object)的值,label bounding box的坐标等信息,所以测试过程中的置信度是直接预测的。同理class probabilities也类似。
测试选择最终的bounding box作为显示框(因为有B个bounding box)的选择条件是什么呢作者在论文中提到用预测的类概率和直接预测的置信度的乘积作为衡量标准。所以说在实现过程中,我必须自己设定一个阈值来筛选最终的bounding box,这个值是多少,论文中没有明说,得我们结合自己的数据集微调。

网络结构

论文作者说这个YOLOv1的网络架构(Darknet)借鉴了GoogLeNet思想。整个检测网络包括24个卷积层和2个全连接层,并且在适当的位置使用卷积核为1x1的卷积层来减少特征空间(即feature map的数量),这一点和GoogLeNet的inception模块不同。具体结构如论文中结构图:
在这里插入图片描述
其中7764后面的2表示移动步长stride=2,其他的类似,没有的表示默认步长为1。

训练过程

作者认为检测的过程需要更多的视觉信息,所以调整了训练图片的分辨率,即预训练过程使用的图像分辨率是224224,在darknet网络中正式**训练时使用的图片分辨率是448448**.
对于前面所说bounding box,作者也做了一些处理,将bounding box的w,h除以训练图像的宽度和高度(448*448),使其值在0-1之间。至于bouding box的x,y的实际值意义,作者认为不是相对于整张图片的中心坐标值,而是相对于的对应格子坐标左上边界偏移值,所以x,y的值也在0-1之间,这个地方有些难以理解。我的理解是:格子的坐标是(0,0),(0,1)…(6,6)等等,共有49格子,通过置信度为每一格子从B个bounding boxes中筛选一个最终的bounding box,所以在整张图片就剩下49个bounding boxes,他们的格子坐标分别是(0+x,0+y),(0+x, 1+y)…(6+x,6+y),注意这里的每个格子的x和y是不同的值,因为每一个格子bounding box都预测了对应的x,y.
最后通过我们设定的置信度阈值使用非极大值抑制方法从这49个bounding box中筛选;还有一种做法就是直接从98个bounding boxes使用非极大值抑制方法筛选。从图片的全局性来考虑,第一种方法更能体现图片的整体性。
确定完bounding boxes后,用bounding box坐标值乘以与原图的比例值就可以在原图中框出相应的物体。至于激活函数,作者在论文中提到除了最后一层使用了线性激活函数, 其他层都使用了leaky激活函数

损失函数

(sum-square error),平方和误差损失函数简单,易于优化,但是对准确率的提升效果不好,作者分析原因有两点:
1.把坐标误差和分类误差看得同等重要不合理;
2.那些没有包含物体,置信度趋向于0(但不是0,累计和还是很大的)的格子相比于有目标物体格子的数量要多很多,这将最终导致格子的损失梯度过高,从而使模型不稳定,过早发散。
为了解决这两个问题,作者增大了bounding box坐标预测损失的权重减少了没有包含目标物体置信度损失的权重,其坐标损失权重为5,没有目标物体的置信度损失权重为0.5,其他损失权重为1
同时作者论文中提到,损失函数应该体现较小的损失变化对大的bounding box影响比小的bounding box的影响小,使用w和h的平方根能够部分解决这个问题。最终的损失函数为:
在这里插入图片描述
上述损失函数的下标 i 表示第 i 个格子,下标 i j 表示第 i 个格子的第 j 个bounding box。可见在训练过程中计算损失时使用的所有的bounding box,如果格子里面实际没有物体,对应的实际标签值为0。有物体的格子就用真实标签值。

YOLOv2:(YOLO9000:Better,Faster,Stronger)-2016

论文概要

在这篇论文中,作者介绍了两个模型YOLO9000和YOLOv2。YOLO9000是能够检测超过9000个类的的实时检测系统YOLOv2是一个标准的图片目标物体的检测系统(可以在数据集Pascal voc,COCO上检测)。在YOLO9000中,作者提出了联合训练方法,这种方法可以使YOLO9000对没有检测标签数据的物体类别进行检测预测【翻译得有些拗口,我的理解是同时在检测数据集COCO和分类数据集上ImageNet上训练神经网络】。在YOLOv2中,作者使用了多尺度训练方法,这使得YOLOv2可以同时在不同大小的数据集上训练,这样做的目的是为了平衡速度和精度。

更好(Better)

更好主要指相对于YOLOv1,YOLOv2 提高了召回率,减少了定位错误,同时提高了分类精度。YOLOv2想要既做到高精度也要高速度,仅仅是增加网络的复杂性不可能提高检测速度。所以作者简化网络结构,并且做了一系列处理让特征容易被提取出来。这些操作包括:
1.Batch Normalization
(提高损失收敛速度,同时mAP提高了2个百分点)batch normalization一般加在神经网络激活函数的前面,他能够提高梯度在网络中的流动,Normalization的能够使特征全部缩放到激活函数线性区域(sigmoid),这样在反向传播的过程中,梯度都是1左右,避免了梯度消失,提升了学习率,更快达到收敛,减少模型训练对初始化的依赖
2.High Resolution Classifier
从AlexNet开始,绝大多数的分类器的输入图片的大小小于256256,[YOLOv1预训练的input image size是224224,正式训练的input image size是448448]。在YOLOv2中,用size为448448的ImageNet数据集微调分类网络10个epoches【既然是微调,和YOLOv1一样,低分辨率的ImageNet图片进行预训练分类网络,高分辨图片训练检测网络,只是在这两个过程加了一个适应性微调】,这样做的目的是使网络能够有足够的时间适应高分辨率图片的输入。然后继续用高分辨图片微调这个网络进行检测任务,作者在论文中提到这样做能够提高mAP将近4个百分点。
3.Convolutional With Anchor Boxes
作者去掉了YOLOv1的全连接层,使用anchor boxes来预测bounding boxes,同时也去掉了最后池化层使得最后feature maps的分辨率大一些。为了得到奇数形状的feature maps,作者调整输入图片的分辨率为416*416,使得最后的卷积层输出的feature maps的分辨率大小为13x13。与YOLOv1不同的是,YOLOv2为每一个bounding box预测一个类条件概率【YOLOv1中B个bounding box共用一个类条件概率】。在YOLOv1中bounding boxes数目为:SxSx(5xB+C),而在YOLOv2中bounding box数目为SxSxB(5+C)使用anchor box没有使精度提升,提高了召回率。在YOLOv1中每一幅图片值预测98个bounding boxes,在YOLOv2 预测了13139个bounding boxes,召回率肯定提高呀,所以anchor box在YOLOv2中其实没有太大的作用【个人感觉】。
4.Dimension Clusters
前面使用B=9是根据Faster R-CNN来设定的,但是9是不是最合适的,还有待检验,于是作者采用维度聚类的方法对数据集的真实标签的bounding box进行聚类分析从而确定B的取值。如果用欧式距离来衡量K-means的距离,会使得大的bounding box比小的bounding box产生更大的误差,于是作者调整距离计算公式为:
在这里插入图片描述
如下图,作者在论文中提到最终选择B=5(聚类中心有5个,意味着每一个格子的anchor box有5个)来平衡模型的复杂性和召回率,并且发现这些作为聚类中心的box比手工挑选的box要偏窄,偏高。对于聚类分析的过程作者在论文中没有详细说明。对此有一个疑惑,IOU(box,centroid)是用直接用像素点计算还是相对于最后的feature map计算。我觉得是相对于feature map计算,因为这样做可以保持与预测网络输出的bouding box的环境一样。具体的做法是:先按比例缩小真实的bouding box(原始图片的大小肯定不是416,输入的图片会按一定的比例缩放到416)再除以32(416/13),然后再计算IOU值。
在这里插入图片描述
5.Direct location prediction
直接预测坐标会导致模型不稳定,特别是在迭代早期。YOLOv2,没有采用RPN(region proposal network)的坐标预测方法,而是继续使用YOLOv1的坐标预测方法,预测相对于格子的偏移,使用logistic activation(sigmoid)函数将偏移值限定在0到1之间。具体计算示意图如下图:
在这里插入图片描述
tx和ty为预测的偏移值,sigma函数为sigmoid激活函数,pw和ph为聚类维度中的先验bounding box宽度和高度。cx和cy为格子坐标。如果要恢复为最终的显示bounding box,只需要将bx,by,bw,bh分别乘以(416/13)然后乘以缩放比例即可。这样做后,增加了5个百分点的精度。
6.Fine-Grained Feature
13x13的feature map可以提供足够信息预测较大的物体,但是对于小物体而言提供的信息仍然不够,所以作者提供了一个passthrough层利用26*26的feature map来预测小物体(可能是受SSD的启发,不同大小的特征图检测不同大小的物体)。和Resnet相似,将前面高分辨率的feature maps连接到后面低分辨率的feature map上,例如2626512的feature maps则可以转化为低分比率的feature maps 13132048,作者在论文中提到这样做提高准确率1个百分点。具体的passthrough层处理方式为:分别对高度和宽度进行倍数提取像素点组成低分辨率feature maps。
在这里插入图片描述
7.Mutil-Scale Training
YOLOv2的网络只有卷积层和池化层,所以就可以在训练进行的过程改变feature maps的shape。 为了使得YOLOv2更具鲁棒性,我们让模型能够对不同大小的图片进行训练。在训练过程中,每10个batch就换一组新尺度的图片(这里的新图片指大小不同,图片的其他属性是一样的)。由于下采样因子是32,作者将尺度设置为{320,352,…,608},同时根据输入图改变网络的大小,然后继续训练。

更快(Faster)

VGG-16是一个非常有效的分类网络,但是它很复杂,作者没有使用它,而是基于Googlenet创造了Darknet-19,他包含19个卷积层和5个最大池化层,具体结构如下:
在这里插入图片描述
训练过程
整个训练过程由三个阶段组成
第一阶段,用分辨率为224224的ImageNet 1000类图片预训练darknet-19网络160轮;
第二阶段分辨率为448
448的图片微调网络10轮,学习率设置为10的负三次方,此时top-1的精度达到了76.5%,top5的精度达到了93.3%。前两个阶段完成了分类训练;
第三阶段是检测训练,去掉分类网络的最后三层(convalutional ,avgpool,softmax),增加3层卷积核为33,通道数为1024的卷积层,每一层后面添加卷积核为11,通道数为B*(C+5)的卷积层,相当于添加了6个卷积层,训练这个网络总共160轮,开始时学习率为10的-3次,在第60轮和第90轮时,设置学习率为10的-4次,我们设置权重衰减值为0.0005,峰值为0.9。数据增强使用了随机裁剪,颜色转变等。关于YOLOv2的损失函数,论文中没有说明。
在这里插入图片描述

更强(Stronger)

在这里作者提出了一种将分类数据集和检测数据集联合训练的方法,在训练的过程,我们将这两类数据集混合,当输入的检测数据集时,反向传播全部的误差损失(YOLOv2的loss),当遇到分类数据集时,只反向传播分类误差损失。检测数据集COCO的分类比较泛(狗;船),分类数据集ImageNet比较细(哈士奇,猎犬;筏子,游艇),这就导致类别标签不具备排他性,为此,作者首创了有向图WordNet,为了简化问题,作者使用hierarchical tree表示ImageNet标签的层级关系,根节点是‘physical object’,越抽象的标签越靠近根节点层,如果一个子标签属于多个父标签节点,则将他添加到距离根节点层级距离较短的父标签节点下面。构建的这颗树称作WordTree。在执行分类任务时,我们为每一个标签节点预测一个条件概率,如果要计算一个节点标签发生的概率,从根节点出发,连乘他们的条件概率,直到到达该标签节点。根节点p(physical object) = 1.作者使用Darknet-19在1000类的ImageNet数据集上做了验证。在构建的WordTree的过程中,添加了369个中间节点,所以预测输出的概率是一个1369维的向量,并且对每一父节点的所有子节点做softmax计算。使用之前Darknet-19训练得到的参数,在增加369类的情况下,仍然获得了top1精度71.9%,top5精度90.4%的分类效果。在做检测任务,其模型称作YOLO9000,它预测p(physical object), bounding box和条件概率树。YOLO9000和YOLOv2预测输出的结构一样,YOLOv2输出5个anchor boxes,YOLO9000输出3个bounding boxes,在预测类别概率时,YOLO9000预测了1369个条件概率,外加一个p(physical object),在确定预测的最终类别时,不像YOLOv2那样简单直接选择最大的概率值为最终类别,YOLO9000需要设定一个阈值,从根节点出发,计算每一个层所有的标签节点的概率值,直到这一层至少有一个标签节点的概率达到阈值,如果这一层又多个标签节点达到阈值,选择概率值最大标签节点为最终类别,如果只有一个标签节点达到阈值就直接将最终类别预测为该类别标签。当YOLO9000遇到检测数据集图片时,和YOLOv2一样传递误差损失(包含bounding box的误差),对于类别损失的部分,只反向传播类别标签层级及以上层级的标签误差(具体的计算方法是,假设WordTree已经建立,找到真实类别标签及以上层级标签节点,分别计算他们发生的概率,真实标签节点到根节点的这条路径上的所有标签节点的值为1,其他节点为0,然后对应相减求平方和)。如果YOLO9000遇到分类数据集图片,只传递分类误差,利用每个格子(YOLO9000中,一个格子有三个anchor boxes)中自信度最高的bounding box对应的类别概率计算分类误差。(作者最后提到他有一个想法,将自信度最高的anchor box假设为真实标签bounding box值,格子中的其他anchor box与他计算IOU,IOU值大于0.3,则也反向传递bounding box误差)

YOLOv3:(An Incremental Improvement)-2018

主要工作

对YOLOv2进行了更细微的设计调整,并且重新设计了一个结构稍微复杂一点的新网络,在保证速度的前提下提高了精度。

Bounding Box Prediction

从前面的介绍知道Bounding box预测主要分为两个部分,坐标预测和置信度预测(在训练过程中,objectness置信度=IOUxboundbox预测的概率值)。YOLOv3中引入一个Objectness score概念,使用logistic regression为每一个bounding box预测一个Objectness score。
将预测的bounding boxes中与真实bounding box 重叠最大的bounding box的Objectness score赋值为1,如果这个bounding box与真实bounding box 重叠值达到设定的阈值0.5,这个bounding box的损失为0,其同一格子里面的其他bounding box只计算置信度损失,忽略坐标损失和类别损失。 我的理解是:这里bounding box是指网络模型预测的confidence,bx,by,bw,bh,计算置信度误差时,用真实标签坐标和预测坐标(bx,by,bw,bh)计算IOU,Objectness score相当于Pr(Object),所以最终的置信度计算为IOU*Pr(Object)
分析:作者忽略预测bounding box与真实bounding box的IOU达到阈值0.5的bounding box的损失(这个bounding box记作A),我的理解是0.5表示预测的bounding box已经能很好地标记框出物体,所以不用计算它的损失,每一个格子中的object由一个预测的bounding box预测,既然已经找到了较好地bounding box,所以同一个格子里面的其他bounding box没有必要计算坐标误差和分类误差,只需要计算置信度误差,用来调整置信度,最理想的效果是这些bounding box的置信度值更新为0。 论文中虽然没有说明如果bounding box A没有阈值该怎么办,但是基于我的分析,很明显既然找不到满意的bounding box,所以格子里面的所有bounding box都参与误差损失计算(包括坐标,类别和置信度),补充说明:如果格子里面确实没有物体,bounding box的IOU值永远无法达到0.5,这个格子里面的所用bounding boxes就会一直更新,最理想的情况就是置信度,坐标都为0。

Class Prediction

类别预测使用了多标签分类(多分类),没有使用softmax,而是对每一个类各自对立地使用了logistic分类器,用binary cross-entroy loss替代softmax loss,这样能较好地处理标签重叠(包含)关系(例如:女人和人)【我理解的具体连接方式,神经网络的预测bounding box那层的条件类概率输出神经元后边分别连接两个神经元(第一个神经元表示是,另一个表示不是)作为logistic regression,它的输入为类条件概率乘以置信度,这样做相当于是为每一个类别再做一次判断,能够更明确地处理标签之间的重叠关系。【是这个类或者不是】

Predictions Across Scales

YOLOv3预测三种不同尺度的box,每一种尺度预测三个anchor boxes,即 NxNx(3x(4+1+80)),所以最终的输出是3x[NxNx(3x(4+1+80))],最前面的3表示三种尺度。3种尺度,3个anchor box,是由聚类数为9决定的,按照一定的顺序(面积从小到大)将这个聚蔟box分配给不同尺度。
在YOLOv2中,为了加强对小物体的检测,引入了passthrough层,假设最后提取的feature map的size是13x13,passthrough层的作用是将上层26x26的feature map和最后层13x13的feature map连接,作为网络最后的输出。
SSD中采用了尺度融合的方式,但是没有上采样过程,只是从网络的不同层抽取不同尺度的feature map做预测
YOLOv3是采用了低分辨率feature map上采用和高分辨率feature map做融合,形成新的feature map层,对新的feature map层单独做预测。这样就是多尺度预测。如果YOLOv3最后一层也是13x13的话,那么三个尺度的大小为(13x13,26x26,52x52),第三个尺度只用第二个尺度上采样并做融合。
值得说明的是:YOLOv2中的多尺度指输入图像的大小不同,YOLOv3的多尺度是指用不同的分辨率的feature map做预测。

Feature Extractor

提出一种新的网络模型darknet53
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值