参考:https://zhuanlan.zhihu.com/p/51727352
https://blog.csdn.net/qq_18941713/article/details/90776197
yolo系列算法是one stage思想的,即直接提取特征来预测物体的类别和位置。
yolov1
其核心思想是输入整个图片,提取特征后直接进行回归/分类。
论文细节如下:
- 首先将图片分为sxs的网格,图中为7x7=49个网格(grid),如果待检测物体的中心点落在其中一个网格上,那么这个网格负责去预测这个物体。其中,每个网格只能产生2个预测框(bounding box),那么共产生了98个bbox并且带有置信度confidence,这些框基本覆盖了整个图片。
不同于一般的iou,训练的时候,这里的iou是这样计算的:
这样设计
其中,若中心点在这个网格中,Pr(Object)=1,否则为0。
测试的时候:
这样子设计,即保证了预测bbox属于某一类的概率,又反应了bbox是否包含目标以及坐标的信息。 - 对每一个网格,将其对应的bbox输入神经网络后,输出有(x,y,w,h,confidence)。其中x,y是指当前格子预测得到的物体的bounding box的中心位置的坐标。w,h是bounding box的宽度和高度。注意:实际训练过程中,w和h的值使用图像的宽度和高度进行归一化到[0,1]区间内;x,y是bounding box中心位置相对于当前格子位置的偏移值,并且被归一化到[0,1]。此外,还有分类信息,即样本总共有c类。B为每个网格产生的bbox的个数,则对整个图片来说,输入神经网络后,输出的个数为 SxSx(5*B+c)。例如, 在PASCAL VOC中,图像输入为448x448,取S=7,B=2,一共有20个类别(C=20)。则输出就是7x7x30的一个tensor。
关于x,y的计算,如下图:
假设椭圆为目标,绿色长方形为标定的目标框,红点为框的中心点,即其坐标为(3,7),其处在(1,4)的网格中
对于网格,红点坐标为(0.5,0.5)。根据原图位置计算得到相对于特征图位置的公式如下:可根据下面公式验证。
网络结构如下:
激活函数:最后一层使用的是标准的线性激活函数,其他的层都使用leaky relu 。
3.损失函数
由上一步可知,yolov1的损失分为3个方面,坐标损失,置信度损失,分类损失,作者全部使用了mse作为损失函数,但如果直接相加的话,无法权衡8维坐标(因为是2个bbox)损失和2维的置信度损失和20维的分类损失的重要程度。考虑到每个损失的贡献率,作者给坐标损失权重
=5。又因为在一幅图片中,没有目标的网格占多数,所给给没有目标的置信度损失权重
=0.5,有目标的置信度损失为1。如下:
其中
,表示第i个网格第j个bbox是否包含目标。
表示包含目标的第i个网格。对应到输出tensor上如下图:
注意到,对于分类损失,只有当网格包含目标时,才会计算,不包含目标时,分类全置为0,不参与运算,可参考吴恩达的相关课程。
注意到,坐标损失中关于w和h,采用的是开根号的形式,映射到下面这张图上。这时因为,对于不同大小的bbox,宽和高计算出的偏移量损失贡献率是不一样的,采用根号的形式,可以尽量减小对小bbox的敏感度。这样子可以稍微平衡一下大bbox和bbox对损失的贡献率。这样子可以使得训练波动更小一点。
总的来说,这样设计损失函数可以让坐标,置信度,分类概率三者达到一个较好的平衡。
但仍存在一些不足
-
虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体,对于多个小目标中心在同一个网格中时,只能检测出一个,对于小物体的召回率不够高,群体小物体检测也不合适。
-
文中产生的bbox的长宽是根据数据集的特性设定的,对于具有特殊长宽的物体,该网络的泛化能力偏弱。
-
对于不同大小目标的坐标损失函数的设定权重是相同的,虽然采用了开根号的设定,但该loss function有待加强。
-
因为网络的最后一层为全连接层,导致测试时输入图像的分辨率要与训练时的相同。
yolov2
yolov1的精度相对于其他网络还比较低。
1) Batch normnization
2)anchor box
下面是yolov1和v2的一个对比,