yolov3实现细节

参考

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_databox_data中。

索引值递增i+1,当完成n个一轮之后,重新将i置0,再次调用shuffle洗牌数据。

image_databox_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

猜你喜欢

转载自blog.csdn.net/weixin_38145317/article/details/88712491