YOLO算法(You Only Look Once)系列讲解与实现(待完善)

时间:2022-11-27 07:55:10


前言


一、指标分析

1.mAP (mean Average Precision)

综合衡量检测效果,各类别Precision-Recall曲线下面积的平均值。精度为:
P r e c i s i o n = T P T P + F P Precision=\frac{TP}{TP+FP} Precision=TP+FPTP
召回率为:
R e c a l l = T P T P + F N Recall=\frac{TP}{TP+FN} Recall=TP+FNTP
其中 T P TP TP F P FP FP F N FN FN T N TN TN分别为被检测到相关true positives、被检测到无关false positives、未检测到相关true negatives、未检测到无关false negatives。 计算得到如下Precision-Recall曲线:
YOLO算法(You Only Look Once)系列讲解与实现(待完善)

蓝色折线为实际精度,红色折线为最大精度,mAP可以通过计算红色折线的期望获得。

2.IOU

真实区域和预测区域的交集/并集

二、YOLO

将检测问题转化为回归问题。

1.YOLO-v1

(1)步骤

(1)将一幅图像分成S×S个,如果某个目标的中心落在这个网格单元(grid cell)中,则该单元就负责预测此目标。
(2)每个网格单元要预测B个边界盒子(bounding box),每个边界盒子除了要预测位置之外,还要附带一个置信度(confidence)值。每个网格还要预测C个类别的分数。
当S取7,B取2,C取20时,我们所需要得到的预测结果大小是7×7×30。
YOLO算法(You Only Look Once)系列讲解与实现(待完善)

(2)网络结构

YOLO算法(You Only Look Once)系列讲解与实现(待完善)

首先,通过7×7的卷积层,步距为2,然后通过一个2×2的最大池化层,步距也为2。
然后,通过3×3的卷积层,步距为1,然后通过一个2×2的最大池化,步距为2.
等等。
在4096全连接层前,进行展平处理。通过4096全连接层后,再通过一个1470个结点的全连接层。
最后,重整(reshape)成一个7×7×30的矩阵。

(3)损失函数

YOLO算法(You Only Look Once)系列讲解与实现(待完善)

关于bounding box损失,为什么要用根号再平方呢?
因为对于不同大小的目标而言,在同样的偏移量下,计算得到的IOU差异一致,并不合理。改为根号再开平方,则可使得小目标IOU大于大目标。
confidence损失符号含义
obj部分计算正样本的损失,noobj计算负样本的损失。

(4)存在问题

(1)对小目标检测效果差。
(2)定位不准确

2.YOLO-v2

(1)新的尝试-Better

Batch Normalization
对训练收敛有较大的改善,对模型有正则化效果,减少了正则化处理,提升了超过2%的mAP,dropout层(用于减轻过拟合的层)不再必要。
High Resolution Classifier
由224×224的分类器改为448×448的分类器,提升了4%的mAP。
Convolutional With Anchor Boxes
YOLO_v1中没有用到基于anchor的边界框定位,定位效果较差,因此YOLO_v2版本对此进行改进。
Dimension Clusters
采用k-means聚类方法获得先验anchor。
Direct location prediction
直接基于anchor预测的话,会出现训练模型不稳定的情况,特别是训练的前期。这是由于预测anchor中心坐标 ( x , y ) (x,y) (x,y)不稳定所导致的,由于x和y的数值没有限定可能出现偏移量过大,错失目标的情况。入下式:
x = ( t x ∗ w a ) + x a y = ( t y ∗ h a ) + y a x=(t_x*w_a)+x_a \\ y=(t_y*h_a)+y_a x=(txwa)+xay=(tyha)+ya
因此YOLO的作者采用了新的限定方法:
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 P r ( o b j e c t ) ∗ I O U ( b , o b j e c t ) = σ ( t o ) b_x=\sigma(t_x)+c_x\\ b_y=\sigma(t_y)+c_y\\ b_w=p_we^{t_w}\\ b_h=p_he^{t_h} \\ Pr(object)*IOU(b,object)=\sigma(t_o) bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=phethPr(object)IOU(b,object)=σ(to)
其中,假设原点在美国grid cell的左上角,则中心坐标为 ( c x , c y ) (c_x,c_y) (cx,cy),并且bounding box的高度和宽度分别为 p w , p h p_w,p_h pw,ph。同时, t x , t y t_x,t_y tx,ty分别是我们对anchor预测的一个偏移量,利用 σ \sigma σ函数将中心坐标限定在grid cell中。使得mAP有了5%的提升。
Fine-Grained Features
在高层预测特征图上结合一些低层信息,因为这些底层信息包含更多的图像细节在里面,而这些细节也是检测小目标所需要的。通过passthrough layer这一层实现。如下图所示,其中最后一层卷积层的125来自5个anchor参数加上20个类别(VOC数据集),还要乘以五个概率分数:
YOLO算法(You Only Look Once)系列讲解与实现(待完善)

该层将低层和高层结合,原理如下:
YOLO算法(You Only Look Once)系列讲解与实现(待完善)

将原图的4×4的特征图拆解为四个2×2的特征图,长度和宽度变为原来的一半,深度变为原来的四倍。而流程图中,首先将低层的26×26×512经过一个1×1的卷积处理(源于YOLO作者原码,而YOLO作者原论文并未提到),压缩为26×26×64的矩阵。然后通过passthrough layer变为13×13×256矩阵,然后和高层的13×13×1024在深度层次上进行拼接,变为13×13×1080。使得mAP提升了1%。

Multi-Scale Training
提升模型鲁棒性。不使用固定的输入图像尺寸,而是每迭代十个batches,就将图像进行一个随机地缩放,尺寸从320×320、352×352、384×384…608×608中选择。

(2)新的尝试-Faster

BankBone: Darknet-19
输出为224×224是为了与其他算法比较,本算法更常用416×416的。
YOLO算法(You Only Look Once)系列讲解与实现(待完善)

(3)其他细节

由于本文着重讲解YOLO_v3,因此不再赘述匹配正负样本和计算误差的方法,其他细节如下所示(取自原文):
YOLO算法(You Only Look Once)系列讲解与实现(待完善)

3.YOLO-v3

(1)新的尝试

BankBone: Darknet-53
YOLO算法(You Only Look Once)系列讲解与实现(待完善)

检测准确的进一步提升,利用卷积层替换最大池化层。而且convolutional不单是一个卷积层,组成如下所示:
YOLO算法(You Only Look Once)系列讲解与实现(待完善)
而每个方框对应一个残差结构:
YOLO算法(You Only Look Once)系列讲解与实现(待完善)
bounding box仍使用k-means算法,有九个尺度,每个预测特征值上各三个

特征图层 特征图大小 预设边界框尺寸 预设边界框数量
特征图层1 13×13 (116×90), (156×198), (373×326) 13×13×3
特征图层2 26×26 (30×61), (62×45), (59×119) 26×26×3
特征图层3 52×52 (10×13), (16×30), (33×23) 52×52×3

N × N × [ 3 ∗ ( 4 + 1 + 80 ) ] N×N×[3*(4+1+80)] N×N×[3(4+1+80)]个参数:N对应13、26或52,每个scale会预测3个尺度,每个尺度会预测4+1+80个参数(COCO数据集,80个类别),anchor有四个参数,再加上一个YOLO有个独有的confidence score。
YOLO算法(You Only Look Once)系列讲解与实现(待完善)
得到整体的流程图:
YOLO算法(You Only Look Once)系列讲解与实现(待完善)
YOLO算法(You Only Look Once)系列讲解与实现(待完善)

三、代码实现


总结

图片和内容参考:
1.视频YOLO系列理论合集(YOLOv1~v3)