参考
https://mp.weixin.qq.com/s/T9LshbXoervdJDBuP564dQ
https://blog.csdn.net/qm5132/article/details/83651291
https://mp.weixin.qq.com/s/T9LshbXoervdJDBuP564dQ
训练过程
1. 数据准备
(1) 预测特征图的anchor框集合
-
3个尺度的特征图,每个特征图3个anchor框,共9个框,从小到大排列;
-
框1~3在大尺度52x52特征图中使用,框4~6是中尺度26x26,框7~9是小尺度13x13;
-
大尺度特征图用于检测小物体,小尺度检测大物体;
-
9个anchor来源于边界框的K-Means聚类。
例如,COCO的anchors列表,如下:
10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
(2)图片输入尺寸,默认为416x416,选择416的原因是:
-
图片尺寸满足32的倍数,在DarkNet网络中,执行5次步长为2卷积,降采样,其卷积操作如下:
x = DarknetConv2D_BN_Leaky(num_filters, (3, 3), strides=(2, 2))(x)
在最底层时,特征图尺寸需要满足为奇数,如13,以保证中心点落在唯一框中。如果为偶数时,则中心点落在中心的4个框中,导致歧义。
keras-yolo3遇到的一些注意点与解决思路
1. fit_generator
在训练中,模型调用的fit_generator方法,按照批次创建数据,输入模型,进行训练,其中,数据生成器wrapper是data_generator_wrapper,用于验证数据格式,最终调用data_generator
- annotation_lines:标注数据的行,每行数据包含图片路径,和框的位置信息;
- batch_size:批次数,每批生成的数据个数;
- input_shape:图像输入尺寸,如(416, 416);
- anchors:anchor box列表,9个宽高值;
- num_classes:类别的数量;
在data_generator_wrapper
中,验证输入参数是否正确,再调用data_generator
,这也是wrapper函数的常见用法。
数据生成器
在数据生成器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数组,其中:
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
。