本章详细讲解数据的处理问题,将coco数据集读取,以及之后自定义数据集的处理,
数据预处理思想
yolo3的数据集处理也是一大亮点,由于yolo3对数据集的输入有要求,指定的照片输入大小必须是416,所有对于不满足照片的大小有一系列的操作,如果直接resize操作,将直接损失照片信息,网络在学习分类的过程还要适应照片尺寸的问题,导致训练效果不佳,在yolo3中是先进行高和宽的调整一样大,在进行上采样的resize,同时要修改label的坐标位置,随机水平翻转,再一次随机变化大小,之后再变化到416的大小尺寸作为输入。
代码
class ListDataset(Dataset): #继承Dataset
def __init__(self, list_path, img_size=416, augment=True, multiscale=True, normalized_labels=True):
with open(list_path, "r") as file:
self.img_files = file.readlines()
self.label_files = [
path.replace("images", "labels").replace(".png", ".txt").replace(".jpg", ".txt") #这一步是生成labels的位置
for path in self.img_files
]
self.img_size = img_size
self.max_objects = 100
self.augment = augment
self.multiscale = multiscale
self.normalized_labels = normalized_labels
self.min_size = self.img_size - 3 * 32
self.max_size = self.img_size + 3 * 32
self.batch_count = 0
def __getitem__(self, index):
# ---------
# Image
# ---------
img_path = self.img_files[index % len(self.img_files)].rstrip() #按照索引的方式找到对应的路径
# Extract