上一篇简单记录了一下yolo网络的结构,LOSS定义,train方式这三部分,这一篇主要记录一下样本的加载与编码过程,方便加载自己的样本。
在开始之前先提一下pascal voc数据集的样本格式,首先是比较重要的几个,Annotation,ImageSets和JPEGImages这三个是比较重要的文件夹,里面存放的东西如下:
Annotation:里面放了一堆xml文件,每个xml文件对应着一张同名的jpg文件,xml文件里记录了对应的图片里有什么目标,目标的种类与位置信息。
JPEGImages:里面存放着与Annotation里xml文件同名对应的jpg图片
ImageSets:里面的main文件夹种,有trainval.txt和test.txt两个文本,每一行写着一个样本的名字,以及样本属性(正负样本),依靠样本名字可以去上边两个文件夹中找到对应的jpg和xml。
介绍完样本集格式,源代码中的加载方式就很容易了解,关于样本的处理都放在了pascal_voc.py中,封装了一个类。
该类的功能有两个,1.预处理样本并存储;2.根据需要提取样本供训练使用
一、样本加载及处理
注意在pascal_voc类的构造里,直接调用了self.prepare(),这个函数就是完成对样本的加载与处理,从而使pascal_voc的实例直接变成了一个充满了样本的容器。
直接进入self.prepare():
def prepare(self):
# gt_labels的结构在下面给出
gt_labels = self.load_labels()
# 这里是通过翻转来扩大样本集
if self.flipped:
print('Appending horizontally-flipped training examples ...')
gt_labels_cp = copy.deepcopy(gt_labels)
for idx in range(len(gt_labels_cp)):
gt_labels_cp[idx]['flipped'] = True
gt_labels_cp[idx]['label'] = gt_labels_cp[idx]['label'][:, ::-1, :]
for i in range(self.cell_size):
for j in range(self.cell_size):
if gt_labels_cp[idx]['label'][i, j, 0] == 1:
gt_labels_cp[idx]['label'][i, j, 1] = self.image_size - 1 - gt_labels_cp[idx]['label'][i, j, 1]
gt_labels += gt_labels_cp
np.random.shuffle(gt_labels)
self.gt_labels = gt_labels
return gt_labels