YOLOv3代码详解:

一、预测过程:

1.网络结构的定义:




yolov5 TensorFlow区别 tensorflow和yolo区别_yolov5 TensorFlow区别


网络最后得到的detect_1,detect_2,detect_3.

三个尺度的形状分别为:[1, 507(13X13X3), 5+c]、[1, 2028, 5+c]、[1, 8112, 5+c]

其中Yolo_block是一个正常卷积(不改变图像大小)组成的模块,生成route和inputs两个结果,route 用于配合下一个尺度的特征一起计算,返回值inputs用于输入检测层进行bbox_atrrs单元的计算。

detect_layer为检测层,这里用到了候选框,来自于训练数据集的样本。在模型训练时,需要对数据集的标注样本进行聚类分析,得到具体尺寸,代表目标样本中最常见的尺寸,在训练或者模型测试时,将尺寸数据作为先验知识一起放到模型里,可以提高模型准确率。


#定义候选框,来自coco数据集


这一部分需要重点理解:

候选框的个数怎么定,其数量的大小对结果有怎样的影响?


def


2.预训练权重的加载:

该文件是二进制格式.weights,文件前5个int32值是标题信息,标题之后是网络的权重


#加载权重


这里返回的assign_ops是各种tf.assign()操作的list,在session中run(load_ops),可以将权重值付给模型中的各变量。

3.使用NMS方法,对结果去重

因为是检测模块生成的是中心点、宽和高的形式,需要其进行转化,将中心点、高、宽坐标 转化为[x0, y0, x1, y1]坐标形式:


def


从检测层一张图片可以检测出[1, 507(13X13X3), 5+c] + [1, 2028, 5+c] + [1, 8112, 5+c],三个尺度,一共10647个结果,其中很可能出现重复的物体,为保留检测结果的唯一性,得用非极大值抑制方法对10647个结果进行去重:

1)从所有的检测框找到置信度较大(置信度大于某个阈值)的那个框 2)挨个计算其与剩余框面积的重叠度(intersection over union,IOU) 3)按照IOU阈值过滤,如果大于一定阈值(重合度过高),将该框剔除 其中,置信度阈值和iou阈值需要提前给出


#使用NMS方法,对结果去重


其中用到的iou计算函数:


#定义函数计算两个框的内部重叠情况(IOU)box1,box2为左上、右下的坐标[x0, y0, x1, x2]


4.图片检测结果的显示:


#将级别结果显示在图片上


二、训练过程:

1.训练样本的准备:

1.1 读取样本信息

这里的数据集是VOC2007,主要是读取.jpg读片文件获取图像信息,然后通过解析.xml文件获取每个标注框包含位置信息和类别信息。

首先得到的是.xml文件的路径列表,包含了所有.xml文件的路径,


#定义样本路径


每个.xml包含了对应.jpg图像的文件名,结合图像文件夹的路径,可以获得.xml文件对应的.jpg图片文件的路径。一张图片里包含多张标注框(boxes),每个标注框包含位置信息和类别信息


image_name, boxes, coded_labels = parse_annotation(self.ann_names[self._index], self.img_dir, self.lable_names)


图片信息和标注框的信息经过image augment和resize后,生成新的尺寸下的图片和标注框信息。


def


至此,一张图片的信息读取和预处理的过程已经完成,得到三样信息

1)图片 1张

2)多个标注框的位置

3)多个标注框所包含目标的类别

现在要做的是怎样把这三类信息转化成yolo-v3需要的训练数据(主要是标签信息)。

1.2制作标签

得到样本信息后,现在要做的是怎样把这三类信息转化成yolo-v3需要的训练数据(主要是标签格式)。

YOLO_V3网络最后输出三个尺度的信息,以416*416大小的图片为例,将它输入yolo_v3网落,最后得到的输出为三个大小为[batch_size, 13X13X3, 5+20],[batch_size, 26X26X3, 5+20],[batch_size,52X52X3, 5+20], 需要得到3个大小(指各维度上的大小总乘积,因为在计算loss的时候,可以用reshape的方法使得标签值和预测值的shape一致)和预测值一样的标签格式。

1)将标签设置成3个尺度的矩阵,每个尺度下对应三个不同大小的候选框,也就是一共9个候选框,它们由数据集中所有标注框的大小进行聚类得到的聚类中心。

2)每个矩阵的高和宽分别和模型的三个输出尺度相同,13x13,26x26,52x52

3)每个矩阵中的点可以看成一个格子

4)每个尺度下对应3个不同大小的候选框,也就是一共9个候选框,它们由数据集中所有标注框的大小进行聚类得到的聚类中心。

5)每个格子中包含这个尺度下对应的三个候选框的信息

6)每个候选框的信息包括了中心点的坐标、高和宽(标注框相对候选的缩放比例值)、属于该分类的概率(置信度)、该分类的one-hot编码。)

具体过程:

1)构造3个矩阵当作标签放置的容器,每个的大小如上所示,并向这三个矩阵填充0作为初始值。shape = 【13,13, 3,5+20】

2)根据标注框的物体的高和宽的尺寸,找到与之最为接近的候选框,根据这些候选框对应的索引值,可以知道它对应矩阵(1个矩阵对应3个候选框)的索引值,以及它在矩阵中的索引值。

3)计算物体在矩阵上的中心点的位置,以及相对于候选框的缩放比例值

4)按照相应的索引值,定位到相应矩阵的相应位置,将候选框的信息填入其中。

最后的结果:

假设有1张图片,上面有4个标注框,最后得到的标签结果是,在3个矩阵的候选框维度上(一共9维),只有4维的信息是对应的标注框信息填充值,其它维度上都是初始填充值0.

1.3 构建YOLO_v3模型

在预测过程中已经阐述过了,最后的得到三个尺寸的预测结果,和预测过程不同的是,不用concate三个尺寸的结果已经进行NMS去重

1.4 损失函数的计算:


import