文章目录
前言
一、指标分析
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曲线:
蓝色折线为实际精度,红色折线为最大精度,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。
(2)网络结构
首先,通过7×7的卷积层,步距为2,然后通过一个2×2的最大池化层,步距也为2。
然后,通过3×3的卷积层,步距为1,然后通过一个2×2的最大池化,步距为2.
等等。
在4096全连接层前,进行展平处理。通过4096全连接层后,再通过一个1470个结点的全连接层。
最后,重整(reshape)成一个7×7×30的矩阵。
(3)损失函数
关于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=(tx∗wa)+xay=(ty∗ha)+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数据集),还要乘以五个概率分数:
该层将低层和高层结合,原理如下:
将原图的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的。
(3)其他细节
由于本文着重讲解YOLO_v3,因此不再赘述匹配正负样本和计算误差的方法,其他细节如下所示(取自原文):
3.YOLO-v3
(1)新的尝试
BankBone: Darknet-53
检测准确的进一步提升,利用卷积层替换最大池化层。而且convolutional不单是一个卷积层,组成如下所示:
而每个方框对应一个残差结构:
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。
得到整体的流程图:
三、代码实现
总结
图片和内容参考:
1.视频YOLO系列理论合集(YOLOv1~v3)