71502e0c7e2ade4ad43c8e7126e65c9f.png

最近大半年一直在准备论文,没有时间更新。最近论文投了打算来回顾一下经典的目标检测论文。之后会写一些弱监督检测的介绍,为了与弱监督检测区分,这里把所有使用包围盒标注的检测算法都叫做全监督检测算法。

eb562ef483228443009c89fd74c5797d.png
yolo预测时的工作流程

说YOLO之前,先简单回顾一下经典的RCNN系列,RCNN系列方法都是先产生propoosals,然后提取proposals的特征之后利用特征来预测proposals是目标的概率以及对proposals进行修正。RCNN直接把proposals切割下来然后利用CNN提取特征,fast-RTCNN通过roi-pooling直接从共享的feature-map上得到proposals的特征,大大提升了检测速度。faster通过RPN先来生成数量更精确数量更少的proposal.能够进一步提升检测速度和精度。但是提取proposals特征的过程终究还是很耗时。YOLO没有region proposals的生成和特征提取过程,而是直接将图片划分成S*S的格子,然后直接在格子的基础上回归到目标框。每个格子会预测B个框的(x,y,w,h,confidence)五个个值,以及一个C类的分类置信度。也就是网络一共输出 (S*S)*(B*5+C)维的一个tensor。在VOC数据集中,S为7,B为2, C为20。所以最后的输出为7*7*30。这些输出通过在最后的feature-map之后通过两个全连接层可以直接拿到,所以网络速度非常快.

021c7932a8c9821de5ed75a130d2486f.png
yolo网络结构

下面将会按照YOLO的训练过程,YOLO的预测过程以及自己的一些理解的过程叙述。

1.YOLO的训练

以VOC数据集举例,YOLO会把图像分为7*7的grid,网络输出每个grid cell中2个bounding box的坐标和置信度,同时每个grid cell还会预测20类的分类置信度。这样最后的输出就是7*7*30维。训练过程中最重要的就是确定这些输出值的回归目标,以及loss的计算方法。

1.1 gt assignment

训练网络时,首先要确定gt assignment ,也就是 每个ground-truth框由哪一个bounding box负责,反过来说就是每个bounding box的训练目标到底是什么,确定了训练目标之后,才能计算loss训练网络。不是每一个bounding box的预测值都会参与求loss的过程。假设一共有K个ground-truth,有7*7个grid cell,每个cell会预测出两个bounding-box.在yolo中,每个ground-truth只会assign给一个bounding box,如果gt的中心落在某个cell中,那么这个gt将会assign给cell中和gt IOU比较大的bounding-box。也就是

1)根据ground-truth的中心来选择grid-cell,

2)根据选中的grid-cell中和ground-truth IOU比较大的一个bounding box.

选出来的和ground-truth绑定的bounding box,在训练时就会当做正样本来计算位置回归的损失。这一点和RCNN系列是一样的,RCNN系列也会通过和ground-truth的IOU来选取一些proposals作为正样本,同样在计算位置回归损失时,只考虑采样出来的正样本的损失。

1.2 输出值的意义及其回归目标

之前说了,在YOLO中,针对每个grid-cell,网络会输出两个bounding box的位置信息预测(x,y,w,h)和bounding box的置信度。和RCNN类似,位置信息预测(x,y,w ,h)的回归目标都是经过归一化的值。中心位置(x,y)的回归目标实际上是相对于grid-cell左上角的偏移值,用grid-cell的size对其进行归一化,长宽(w,h)的回归目标也是图像的长宽进行了归一化。这样这四个值理论上来说都是0到1之间。置信度的回归目标是一个条件概率Pr(Object)*IOU(truth,pred),当gt assign给某个bounding box时,Pr(Object) =1,预测值就是bounding-box和这个gt的IOU,否则Pr(Object)为0,这个值就是0。此外每个grid-cell还会预测一个20维的分类置信度,如果某个类的中心落在这个cell中,那么对应的这个类的分类置信度就是1,否则为0.

1.3 Loss的计算

ced59f5223e5e0959f56e32d58116ea6.png

yolo将目标检测看做回归问题,所有的loss都采用均方误差。公式中的

表示cell i 中bounding box j 是否有ground truth与之绑定(1.1节),如果某个ground-truth object assign给cell i 中的bounding box j,那么这个值为1,否则为0,
与之相反。
表示是否有ground truth的中心落入cell i中

从上往下看loss一共分为五项,其中前两项是位置回归loss,后面两项是正负样本bounding box的置信度的loss,最后一项是每个cell的分类loss。

位置回归Loss包括中心点和长宽两项,位置回归Loss只考虑和ground truth绑定的bounding box,也就是

为1的项。因为大部分的bounding-box都没有gt与之绑定,导致位置回归的训练样本非常少,为了防止网络训歪,作者给位置回归损失前都加了参数
来增加回归损失的权重,在VOC2007里
取5。需要注意的是,这里w,h的均方误差在计算的时候进行了开方。这里是考虑到对于尺寸较小的框对于宽高系数更敏感。开方之后能增加小框的偏差对loss的影响。具体可以看下面这张图,开方之后,小框的尺寸变动对loss的影响更大。

f2d0b09640403b2765699ecdd7f28483.png

boudingbox 置信度loss的包括正样本(

)的分类损失和负样本(
)的损失,根据1.2所说,正样本的回归目标是bounding box和gt的IOU(也有一些博客说这里可以直接设置为1)负样本的回归目标就是0. 因为YOLO里分类损失里没有特殊的背景类,这里框的置信度能够起到区分前景背景和衡量框的好坏的作用。同样,因为负样本太多,所以这里给loss加了一个系数
来平衡训练过程,在论文里这个值取0.5.

cell的分类损失,因为分类损失中不包含背景类,这里同样只计算中心点落在其中的cell的分类损失。

3.Inference

输出包含每个grid cell两个bounding box的坐标预测和置信度预测,以及每个grid cell的分类置信度。最后每个框的得分通过将框的置信度和cell的分类置信度相乘得到

54cb5befcba675e4bdaa2e0565738c0f.png

坐标预测要按照grid cell的位置和图片的大小变换到实际的坐标和尺寸。最后在所有结果上进行NMS就能得到最后的输出。


只是粗略的看了一下YOLO的论文,没有看过具体的代码实现,上述内容掺杂了自己的理解,如果有错,希望大家多多指正。

另外,看完论文还有一个疑惑,YOLO不像RCNN和SSD,RCNN对于所有proposals 使用的是相同的回归器和分类器,SSD也是通过卷积操作共享了回归器和分类器,而YOLO没有一个统一的回归器,而是通过两个全连接层直接得到各个bounding box的预测值,这样做的好处在于可以让每一个预测都来自于全图的特征,不会受到卷积感受野或者roi-pooling这样提取局部特征的方法的限制,但是我理解这种情况下每个位置的bounding box的检测器参数都是不同的,训练时,只有出现过目标的位置的参数得到了训练,那么如果在测试数据里,目标出现在训练集里没出现过的位置上,这个位置的网络参数还能检测出物体吗?

更多推荐