一、模型部分
会根据所提供的9个先验框在darknet输出的三个特征层【y1,y2,y3】
(形状分别是(N,255,13,13),(N,255,26,26),(N,255,52,52)
)中的每个格点grid_cell上,预测三个框,这三个框的长宽比不是随意取的,是取自根据数据集聚类得到的9个先验框的长宽,这样三个特征层正好使用了9个先验框。
二、训练部分
会根据数据集,该数据集是xml
格式或者其他格式,里面的主要内容就是【img,每一个目标的框信息以及所属类别】
,得出和模型输出相同形状的数据,形状分别是[(m,13,13,3,85),(m,26,26,3,85),(m,52,52,3,85)]
。因为是由真实框得来的数据,所以肯定没有那么多,比如此时的框都只有一种宽高,也即真实宽高,并不像上面每一个grid_cell
有三个框。所以为了和模型输出形状相同,在没有框的地方(对应矩阵里元素的位置)的数据其实都是零。这样就可以将y_true
和y_out
送入loss
函数计算误差,然后更新模型参数即可。
1、计算loss所需参数
在计算loss
的时候,实际上是y_pre
和y_true
之间的对比:y_pre
就是一幅图像经过网络之后的输出,内部含有三个特征层的内容,其需要解码才能够在图上作画;y_true
就是一个真实图像中,它的每个真实框对应的(13,13)、(26,26)、(52,52)
网格上的偏移位置、长宽与种类。其仍需要编码才能与y_pred
的结构一致。实际上y_pre
和y_true
内容的shape都是
(batch_size,13,13,3,85)
(batch_size,26,26,3,85)
(batch_size,52,52,3,85)
2、y_pre是什么
对于yolov3的模型来说,网络最后输出的内容就是三个特征层每个网格点对应的预测框及其种类,即三个特征层分别对应着图片被分为不同size的网格后,每个网格点上三个先验框对应的位置、置信度及其种类。
对于输出的y1、y2、y3
而言:
- […, : 2]指的是相对于每个网格点的偏移量,
- […, 2: 4]指的是宽和高,
- […, 4: 5]指的是该框的置信度,
- […, 5: ]指的是每个种类的预测概率。
现在的y_pre
还是没有解码的,解码了之后才是真实图像上的情况。
3、y_true是什么。
y_true就是一个真实图像中,它的每个真实框对应的(13,13)、(26,26)、(52,52)
网格上的偏移位置、长宽与种类。其仍需要编码才能与y_pred的结构一致。在yolov3中,其使用了一个专门的函数用于处理读取进来的图片的框的真实情况。
def preprocess_true_boxes(true_boxes, input_shape, anchors, num_classes):
其输入为:
- true_boxes:shape为
(m, T, 5)
代表m张图T个框的x_min、y_min、x_max、y_max、class_id
。 - input_shape:输入的形状,此处为416、416
- anchors:代表9个先验框的大小
- num_classes:种类的数量。
其实对真实框的处理是将真实框转化成图片中相对网格的xyhw,步骤如下:
- 取框的真实值,获取其框的中心及其宽高,除去input_shape变成比例的模式。
- 建立全为0的
y_true,y_true
是一个列表,包含三个特征层,shape分别为(m,13,13,3,85),(m,26,26,3,85),(m,52,52,3,85)
。 - 对每一张图片处理,将每一张图片中的真实框的wh和先验框的wh对比,计算IOU值,选取其中IOU最高的一个,得到其所属特征层
(在13 * 13,26 * 26与52 * 52三种尺寸中选择一个)
及其网格点的位置,在对应的y_true中将内容进行保存。
三、预测解码
1、会先将模型部分输出的结果转换成(N,3,85,13,13),(N,3,85,26,26),(N,3,85,52,52)
。维度中的85包含了4+1+80,分别代表x_offset、y_offset、h和w、置信度、分类结果
,也即【(x_offset,y_offset,h,w)、confidence、class_prob】
。
2、yolov3的解码过程(已经进行过loss计算,得到了最终的预测结果)就是将每个网格点加上它对应的x_offset和y_offset
,加完后的结果就是预测框的中心,然后再利用先验框和h、w
结合计算出预测框的长和宽。这样就能得到整个预测框的位置了。不过此时是归一化的,还需要将其转换到比如416*416
大小的尺寸上。
3、当然得到最终的预测结构后还要进行得分排序与非极大抑制筛选,这一部分基本上是所有目标检测通用的部分。筛选之后,我们还需要将框信息转换到原图(注意,此处指的是原图,并非416*416
)尺寸上,这样就可以得到最终的框信息,在原图上画框和标记检测结果即可。
附上参考工程:
https://blog.csdn.net/weixin_44791964/article/details/103276106