YOLOv3代码详解:
一、预测过程:
1.网络结构的定义:
网络最后得到的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