探索 YOLO v3 实现细节 - 第 1 篇 训练
YOLO, 即 You Only Look Once(你只看一次)的缩写, 是一个基于卷积神经网络 (CNN) 的物体检测算法. 而 YOLO v3 https://pjreddie.com/media/files/papers/YOLOv3.pdf 是 YOLO 的第 3 个版本(即 YOLO https://arxiv.org/abs/1506.02640 ,YOLO 9000 https://arxiv.org/abs/1612.08242 ,YOLO v3 https://arxiv.org/abs/1804.02767 ), 检测效果, 更准更强.
YOLO 是一句美国的俗语, You Only Live Once, 人生苦短, 及时行乐.
本文介绍如何实现 YOLO v3 算法, keras 框架. 这是第 1 篇, 训练. 当然还有第 2 篇, 至第 n 篇, 这是一个完整版 :)
本文的源码 https://github.com/SpikeKing/keras-yolo3-detection :https://github.com/SpikeKing/keras-yolo3-detection
1. 参数
模型的训练参数, 5 个参数:
(1) 已标注框的图片数据集, 格式如下:
图片的位置 框的 4 个坐标和 1 个类别 ID(xmin,ymin,xmax,ymax,label_id) ...
dataset/image.jpg 788,351,832,426,0 805,208,855,270,0
复制代码
(2) 标注框类别的汇总, 即数据集所标注物体的全部类别列表, 如下:aeroplane
bicycle
bird
...
复制代码
(3) 预训练模型, 用于迁移学习 (Transfer Learning) 中的微调(Fine Tune), 可选 YOLO v3 已训练完成的 COCO 模型权重, 即:
pretrained_path = 'model_data/yolo_weights.h5'
复制代码
(4) 预测特征图 (Prediction Feature Map) 的 anchor 框 (anchor box) 集合:
3 个尺度 (scale) 的特征图, 每个特征图 3 个 anchor 框, 共 9 个框, 从小到大排列;
1~3 是大尺度 (52x52) 特征图所使用的, 4~6 是中尺度(26x26),7~9 是小尺度(13x13);
大尺度特征图检测小物体, 小尺度检测大物体;
9 个 anchor 来源于边界框 (Bounding Box) 的 K-Means 聚类.
其中, COCO 的 anchors, 如下:
10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
复制代码
(5) 图片输入尺寸, 默认为 416x416.
图片尺寸满足 32 的倍数, 在 DarkNet 网络中, 含有 5 次步长为 2 的降采样卷积(32=2^5). 降采样卷积的实现如下:
x = DarknetConv2D_BN_Leaky(num_filters, (3, 3), strides=(2, 2))(x)
复制代码
在最底层时, 特征图尺寸需要满足为奇数, 如 13, 以保证中心点落在唯一框中. 如果为偶数时, 则中心点落在中心的 4 个框中, 导致歧义.
2. 创建模型
创建 YOLOv3 的网络模型, 输入:
input_shape: 图片尺寸;
anchors:9 个