物体检测yolo3 学习笔记3
我们继续来看yolo3的实现细节,如何随机生成图片数据:
在训练过程中,模型调用fit_generator方法,按批次创建数据,输入模型,进行训练。其中,数据生成器wrapper是data_generator_wrapper,用于验证数据格式,最终调用data_generator,
data_generator输入参数是:
annotation_lines:标注数据的行,每行数据包含图片路径,和框的位置信息;
batch_size:批次数,每批生成的数据个数;
input_shape:图像输入尺寸,如(416, 416);
data_path: 数据文件路径
anchors:anchor box列表,9个宽高值;
num_classes:类别的数量;
在数据生成器data_generator中,数据的总行数是n,循环输出固定批次数batch_size的图片数据image_data和标注框数据box_data。
在第0次时,将数据洗牌shuffle,调用get_random_data解析annotation_lines[i],生成图片image和标注框box,添加至各自的列表image_data和box_data中。
索引值递增i+1,当完成n个一轮之后,重新将i置0,再次调用shuffle洗牌数据。
将image_data和box_data都转换为np数组,其中:
#batch_size = 16
image_data: (16, 416, 416, 3) box_data: (16, 20, 5) # 每个图片最多含有20个框
接着,将框的数据box_data、输入图片尺寸input_shape、anchor box列表anchors和类别数num_classes转换为真值y_true,其中y_true是3个预测特征的列表:
[(16, 13, 13, 3, 6), (16, 26, 26, 3, 6), (16, 52, 52, 3, 6)]
最终输出:图片数据image_data、真值y_true、每个图片的损失值np.zeros(batch_size)。不断循环while True,生成的批次数据,与epoch步数相同,即steps_per_epoch。
在get_random_data中,分离图片image和标注框box,输入:
数据annotation_line:图片地址和框的位置类别;
图片尺寸input_shape:如(416, 416);
数据random:随机开关;
image, box = get_random_data(annotation_lines[i], input_shape, random=True)
我们具体看一下get_random_data 函数,它是从yolo3.utils文件中import:
from yolo3.utils import get_random_data
第1步,解析annotation_line数据:
将annotation_line按空格分割为line列表;
使用PIL读取图片image路径;
图片的宽和高,iw和ih;
输入尺寸的高和宽,h和w;
图片中的标注框box,box是5维,4个点和1个类别;
第2步,如果是非随机,即if not random:
将图片等比例转换为416x416的图片,其余用灰色填充,即(128, 128, 128),同时颜色值转换为0~1之间,即每个颜色值除以255;
将边界框box等比例缩小,再加上填充的偏移量dx和dy,因为新的图片部分用灰色填充,影响box的坐标系,box最多有max_boxes个,即20个。
第3步,如果是随机:
通过jitter参数,随机计算new_ar和scale,生成新的nh和nw,将原始图像随机转换为nw和nh尺寸的图像,即非等比例变换图像。
将变换后的图像,转换为416x416的图像,其余部分用灰色值填充。
根据随机数flip,随机左右翻转FLIP_LEFT_RIGHT图片。
在HSV坐标域中,改变图片的颜色范围,hue值相加,sat和vat相乘,先由RGB转为HSV,再由HSV转为RGB,添加若干错误判断,避免范围过大。
将所有的图片变换,增加至检测框中,并且包含若干异常处理,避免变换之后的值过大或过小,去除异常的box。
最终,返回图像数据image_data和边框数据box_data。box的4个值是(xmin, ymin, xmax, ymax),第5位不变,是标注框的类别,如0~n。
- 点赞
- 收藏
- 关注作者
评论(0)