百度飞桨PaddlePaddle-21天零基础实践深度学习-目标检测YOLOv3
概念
边界框
<1> x y x y xyxy xyxy,即 ( x 1 , y 1 , x 2 , y 2 ) (x_1, y_1, x_2, y_2) (x1,y1,x2,y2)。其中 ( x 1 , y 1 ) (x_1, y_1) (x1,y1)是矩形框左上角的坐标, ( x 2 , y 2 ) (x_2, y_2) (x2,y2)是矩形框右下角的坐标。
<2> x y w h xywh xywh,即 ( x , y , w , h ) (x, y, w, h) (x,y,w,h),其中 ( x , y ) (x,y) (x,y)是矩形框中心点的坐标, w w w是矩形框的宽度, h h h是矩形框的高度。
训练数据集的标签里会给出目标物体真实边界框所对应的 ( x 1 , y 1 , x 2 , y 2 ) (x_1, y_1, x_2, y_2) (x1,y1,x2,y2),被称为真实框。
模型会对目标物体可能出现的位置进行预测,由模型预测出的边界框则称为预测框。
锚框
锚框——假象框——候选区域
先设定好锚框的大小和形状,再以图像上某一个点为中心画出矩形框。
锚框 微调 变成预测框
在训练过程中,模型通过学习不断的调整参数,最终能学会如何判别出锚框所代表的候选区域是否包含物体,如果包含物体的话,物体属于哪个类别,以及物体边界框相对于锚框位置需要调整的幅度。
交并比(衡量指标)
I o U = A ⋂ B A ⋃ B IoU=\frac{A\bigcap B}{A\bigcup{B}} IoU=A⋃BA⋂B
数据读取和预处理
批量数据读取与加速——多线程读取数据
预处理主要作用是扩大训练数据集,拥有更多的图像特征,抑制过拟合,提升模型的泛化能力。
方法:
随机改变亮暗、对比度、饱和度和颜色等 随机填充 随机裁剪 随机缩放 随机翻转 随机打乱真实框排列顺序 Mixup…
模型YOLOv3
需要先产生候选区域,再对候选区域做分类和位置坐标的预测,这类算法被称为两阶段目标检测算法。
YOLO-V3使用单个网络结构,在产生候选区域的同时即可预测出物体类别和位置,使得YOLO-V3算法具有更快的速度,能到达实时响应的水平。
YOLO-V3基本思想
<1> 产生候选区域——生成锚框——生成预测框——对候选区域标注
<2> 卷积神经网络提取特征——根据输出特征图计算预测框位置和类别——建立输出特征图与预测框之间的关联
<3> 建立损失函数
x y w h xywh xywh格式:
左上角的位置坐标
(
c
x
,
c
y
)
(c_{x},c_{y})
(cx,cy),预测框的中心坐标:
b
x
=
c
x
+
σ
(
t
x
)
b_{x}=c_{x}+\sigma (t_{x})
bx=cx+σ(tx)
b
y
=
c
y
+
σ
(
t
y
)
b_{y}=c_{y}+\sigma (t_{y})
by=cy+σ(ty)
σ
(
x
)
\sigma(x)
σ(x)即Sigmoid函数。
锚框的大小在模型中可以当作是超参数。
锚框尺寸
(
p
h
,
p
w
)
(p_{h},p_{w})
(ph,pw),生成预测框的大小:
b
h
=
p
h
e
t
h
b_{h}=p_{h}e^{t_{h}}
bh=pheth
b
w
=
p
w
e
t
w
b_{w}=p_{w}e^{t_{w}}
bw=pwetw
预测框能够跟真实框重合——求解 t t t的值
将预测框坐标中的 b x , b y , b h , b w b_{x},b_{y},b_{h},b_{w} bx,by,bh,bw 设置为真实框的位置,即可求解出 t t t的数值。
对候选区域进行标注
-
锚框是否包含物体,这可以看成是一个二分类问题,使用标签objectness来表示。当锚框包含了物体时,objectness=1,表示预测框属于正类;当锚框不包含物体时,设置objectness=0,表示锚框属于负类。
-
如果锚框包含了物体,那么它对应的预测框的中心位置和大小应该是?, t x , t y , t w , t h t_{x}, t_{y}, t_{w}, t_{h} tx,ty,tw,th应该是?,使用location标签。
3.如果锚框包含了物体,那么具体类别是?,这里使用变量label来表示其所属类别的标签。
卷积神经网络提取特征
YOLO-V3算法使用的骨干网络是Darknet53。在检测任务中,保留从输入到C0部分的网络结构,作为检测模型的基础网络结构,也称为骨干网络。YOLO-V3模型会在骨干网络的基础上,再添加检测相关的网络模块。
根据输出特征图计算预测框位置和类别
-
预测框是否包含物体。 o b j e c t n e s s = 1 objectness=1 objectness=1的概率是?,可以用网络输出一个实数 x x x,可以用 S i g m o i d ( x ) Sigmoid(x) Sigmoid(x)表示objectness为正的概率 P o b j P_{obj} Pobj
-
预测物体位置和形状。物体位置和形状 t x , t y , t w , t h t_{x}, t_{y}, t_{w}, t_{h} tx,ty,tw,th, 可以用网络输出4个实数来表示 t x , t y , t w , t h t_{x}, t_{y}, t_{w}, t_{h} tx,ty,tw,th
-
预测物体类别。预测图像中物体的具体类别。总的类别数为C,需要预测物体属于每个类别的概率 ( P 1 , P 2 , . . . , P C ) (P_{1}, P_{2}, ..., P_{C}) (P1,P2,...,PC),可以用网络输出C个实数 ( x 1 , x 2 , . . . , x C ) (x_{1}, x_{2}, ..., x_{C}) (x1,x2,...,xC),对每个实数分别求Sigmoid函数,让 P i = S i g m o i d ( x i ) P_{i}=Sigmoid(x_{i}) Pi=Sigmoid(xi),则可以表示出物体属于每个类别的概率。
建立输出特征图与预测框之间的关联
第 i i i行第 j j j列的小方块区域跟特征图上的像素点 ( i , j ) (i,j) (i,j)对应起来,解决了空间位置的对应关系。
对于一个预测框,网络需要输出 ( 5 + C ) (5+C) (5+C)个实数来表征它是否包含物体、位置和形状尺寸以及属于每个类别的概率。
每个小方块区域产生K个预测框,每个预测框需要 ( 5 + C ) (5 + C) (5+C)个实数预测值,则每个像素点相对应的要有 K ( 5 + C ) K(5+C) K(5+C)个实数。
对特征图进行多次卷积,并将最终的输出通道数设置为 K ( 5 + C ) K(5+C) K(5+C),即可将生成的特征图与每个预测框所需要的预测值巧妙的对应起来。
损失函数
对于每个预测框,YOLO-V3模型会建立三种类型的损失函数。
表征是否包含目标物体的损失函数,通过pred_objectness和label_objectness计算
表征物体位置的损失函数,通过pred_location和label_location计算
表征物体类别的损失函数,通过pred_classification和label_classification计算
多尺度检测
将高层级的特征图尺寸放大之后跟低层级的特征图进行融合,得到的新特征图既能包含丰富的语义信息,又具有较多的像素点,能够描述更加精细的结构。
开启端到端训练
将三个层级的特征图与对应锚框之间的标签关联起来,并建立损失函数,总的损失函数等于三个层级的损失函数相加。通过极小化损失函数,可以开启端到端的训练过程。
预测
预测过程可以分为两步:
1.通过网络输出计算出预测框位置和所属类别的得分。
2.使用非极大值抑制来消除重叠较大的预测框。
模型效果及可视化
1.创建数据读取器以读取单张图片的数据
2.定义绘制预测框的画图函数
3.读取指定的图片,输入网络并计算出预测框和得分,然后使用多分类非极大值抑制消除冗余的框。将最终结果可视化。
优化
防止梯度消失和梯度爆炸
更换激活函数
ResNet block
batch normalization
梯度截断 设置阈值
预训练+微调
防止过拟合
数据增强
提前停止
权重正则化 L1 L2…
dropout
参数调优
学习率
训练轮数
优化函数
在线难例挖掘
后处理
模型融合
测试结果融合
根据实际任务改进