百度飞桨PaddlePaddle-21天零基础实践深度学习-目标检测

概念

边界框

<1> xyxyxyxy,即(x1,y1,x2,y2)(x_1, y_1, x_2, y_2)。其中(x1,y1)(x_1, y_1)是矩形框左上角的坐标,(x2,y2)(x_2, y_2)是矩形框右下角的坐标。

<2> xywhxywh,即(x,y,w,h)(x, y, w, h),其中(x,y)(x,y)是矩形框中心点的坐标,ww是矩形框的宽度,hh是矩形框的高度。

训练数据集的标签里会给出目标物体真实边界框所对应的(x1,y1,x2,y2)(x_1, y_1, x_2, y_2),被称为真实框

模型会对目标物体可能出现的位置进行预测,由模型预测出的边界框则称为预测框

锚框

锚框——假象框——候选区域
先设定好锚框的大小和形状,再以图像上某一个点为中心画出矩形框。
锚框 微调 变成预测框

在训练过程中,模型通过学习不断的调整参数,最终能学会如何判别出锚框所代表的候选区域是否包含物体,如果包含物体的话,物体属于哪个类别,以及物体边界框相对于锚框位置需要调整的幅度。

交并比(衡量指标)

IoU=ABABIoU=\frac{A\bigcap B}{A\bigcup{B}}

数据读取和预处理

批量数据读取与加速——多线程读取数据

预处理主要作用是扩大训练数据集,拥有更多的图像特征,抑制过拟合,提升模型的泛化能力。

方法:
随机改变亮暗、对比度、饱和度和颜色等 随机填充 随机裁剪 随机缩放 随机翻转 随机打乱真实框排列顺序 Mixup…

模型YOLOv3

需要先产生候选区域,再对候选区域做分类和位置坐标的预测,这类算法被称为两阶段目标检测算法

YOLO-V3使用单个网络结构,在产生候选区域的同时即可预测出物体类别和位置,使得YOLO-V3算法具有更快的速度,能到达实时响应的水平。

YOLO-V3基本思想

<1> 产生候选区域——生成锚框——生成预测框——对候选区域标注

<2> 卷积神经网络提取特征——根据输出特征图计算预测框位置和类别——建立输出特征图与预测框之间的关联

<3> 建立损失函数
百度飞桨PaddlePaddle-21天零基础实践深度学习-目标检测

xywhxywh格式:

左上角的位置坐标(cx,cy)(c_{x},c_{y}),预测框的中心坐标:
bx=cx+σ(tx) b_{x}=c_{x}+\sigma (t_{x})by=cy+σ(ty) b_{y}=c_{y}+\sigma (t_{y})
σ(x)\sigma(x)即Sigmoid函数。

锚框的大小在模型中可以当作是超参数。
锚框尺寸ph,pw(p_{h},p_{w}),生成预测框的大小:
bh=phethb_{h}=p_{h}e^{t_{h}}bw=pwetwb_{w}=p_{w}e^{t_{w}}

预测框能够跟真实框重合——求解tt的值

将预测框坐标中的bx,by,bh,bwb_{x},b_{y},b_{h},b_{w} 设置为真实框的位置,即可求解出tt的数值。

对候选区域进行标注

  1. 锚框是否包含物体,这可以看成是一个二分类问题,使用标签objectness来表示。当锚框包含了物体时,objectness=1,表示预测框属于正类;当锚框不包含物体时,设置objectness=0,表示锚框属于负类。

  2. 如果锚框包含了物体,那么它对应的预测框的中心位置和大小应该是?,tx,ty,tw,tht_{x}, t_{y}, t_{w}, t_{h}应该是?,使用location标签。

3.如果锚框包含了物体,那么具体类别是?,这里使用变量label来表示其所属类别的标签。
百度飞桨PaddlePaddle-21天零基础实践深度学习-目标检测

卷积神经网络提取特征

YOLO-V3算法使用的骨干网络是Darknet53。在检测任务中,保留从输入到C0部分的网络结构,作为检测模型的基础网络结构,也称为骨干网络。YOLO-V3模型会在骨干网络的基础上,再添加检测相关的网络模块。
百度飞桨PaddlePaddle-21天零基础实践深度学习-目标检测

根据输出特征图计算预测框位置和类别

  1. 预测框是否包含物体。objectness=1objectness=1的概率是?,可以用网络输出一个实数xx,可以用Sigmoid(x)Sigmoid(x)表示objectness为正的概率PobjP_{obj}

  2. 预测物体位置和形状。物体位置和形状tx,ty,tw,tht_{x}, t_{y}, t_{w}, t_{h}, 可以用网络输出4个实数来表示tx,ty,tw,tht_{x}, t_{y}, t_{w}, t_{h}

  3. 预测物体类别。预测图像中物体的具体类别。总的类别数为C,需要预测物体属于每个类别的概率(P1,P2,...,PC)(P_{1}, P_{2}, ..., P_{C}),可以用网络输出C个实数(x1,x2,...,xC)(x_{1}, x_{2}, ..., x_{C}),对每个实数分别求Sigmoid函数,让Pi=Sigmoid(xi)P_{i}=Sigmoid(x_{i}),则可以表示出物体属于每个类别的概率。

建立输出特征图与预测框之间的关联

ii行第jj列的小方块区域跟特征图上的像素点(i,j)(i,j)对应起来,解决了空间位置的对应关系。

对于一个预测框,网络需要输出(5+C)(5+C)个实数来表征它是否包含物体、位置和形状尺寸以及属于每个类别的概率。

每个小方块区域产生K个预测框,每个预测框需要(5+C)(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计算

多尺度检测

将高层级的特征图尺寸放大之后跟低层级的特征图进行融合,得到的新特征图既能包含丰富的语义信息,又具有较多的像素点,能够描述更加精细的结构。

开启端到端训练

将三个层级的特征图与对应锚框之间的标签关联起来,并建立损失函数,总的损失函数等于三个层级的损失函数相加。通过极小化损失函数,可以开启端到端的训练过程。
百度飞桨PaddlePaddle-21天零基础实践深度学习-目标检测

预测

预测过程可以分为两步:

1.通过网络输出计算出预测框位置和所属类别的得分。
2.使用非极大值抑制来消除重叠较大的预测框。

模型效果及可视化

1.创建数据读取器以读取单张图片的数据

2.定义绘制预测框的画图函数

3.读取指定的图片,输入网络并计算出预测框和得分,然后使用多分类非极大值抑制消除冗余的框。将最终结果可视化。

优化

防止梯度消失和梯度爆炸

更换**函数
ResNet block
batch normalization
梯度截断 设置阈值
预训练+微调

防止过拟合

数据增强
提前停止
权重正则化 L1 L2…
dropout

参数调优

学习率
训练轮数
优化函数
在线难例挖掘

后处理

模型融合
测试结果融合
根据实际任务改进