原文:Github 项目 - YOLOV3 的 TensorFlow 复现 - AIUAI
Github 项目 - tensorflow-yolov3 作者:YunYang1994 论文:yolov3
最近 YunYang1994开源的基于 TensorFlow(TF-Slim) 复现的 YOLOv3 复现,并支持自定义数据集的训练.
该开源项目组成:
YOLO 目标检测器基于深度卷积网络学习的特征,以检测目标物体.
正如 木盏 博文里的介绍,YOLOV3 对比 YOLOV1 和 YOLOV2,保留的部分有:
[1] - 分而治之, YOLO 系列算法是通过划分单元格进行目标检测,区别只是划分单元格的数量不同.
[2] - 激活函数采用 Leaky ReLU.
[3] - End-to-end 训练,只需一个损失函数,关注网络输入端和输出端.
[4] - YOLOV2 开始,采用 Batch Normalization 作为正则化、加速收敛和避免过拟合的方法,并将 BN 层和 Leaky ReLU 层放在每个卷积层之后.
[5] - 多尺度训练. 平衡速度和准确率,速度快,则准确率相对低;准确率高,则速度相对慢.
YOLO 系列算法的提升,很大一部分也决定于 backbone 网络的提升,如,YOLOV2 的 darknet-19 到 YOLOV3 的 darknet-53. YOLOV3 还提供了 tiny darknet. 速度快,则 backbone 可采用 tiny-darknet;性能好,则 backbone 可采用 darnket-53. YOLO 系列算法比较灵活,特别适合作工程算法.
该项目里使用了预训练的网络权重,其中,共有 80 个训练的 yolo 物体类别(COCO 数据集).
记物体类别名 - coco.names 为 c
,其是从 1 到 80 的整数,每个数字分别表示对应的类别名标签. 如,c=3
表示的分类物体类别为 cat
.
深度卷积层学习的图像特征,送入到分类器和回归器中,以进行检测预测.(边界框坐标,对应的类别标签,等).
如图:
From yolo系列之yolo v3【深度解析】- 木盏 - CSDN
Darknet-19 vs Darknet-53 网络层结构 (From yolo系列之yolo v3【深度解析】- 木盏 - CSDN)
YOLOV3 输出了三个不同尺度的特征图 - y1, y2, y3,如图:
这种多尺度预测方式,借鉴了 FPN(Feature pyramid networks),对不同尺寸的目标进行预测,越精细的单元网格( grid cell) 可以检测出越精细的物体.
YOLOV3 设定每个网格单元输出 3 个矩形框box 的预测,每个 box 需要五个参数(x, y, w, h, confidence),再对应 80 个类别的概率,则可得到 3*(5 + 80) = 255.
From YOLOv3代码分析(Keras+Tensorflow)
[1] - 网络输入:[None, 416, 416, 3]
[2] - 网络输出:矩形框中物体的置信度,矩形框位置的列表,检测到的物体类别名. 每个矩形框表示为 6 个数:(Rx, Ry, Rh, Rw, Pc, C1,…Cn). 其中,n=80,即 c
是 80 维向量. 矩形框最终的向量大小为 5 + 80=85. 如图:
图中第一个数字 Pc
为物体的置信;第二个到第四个数字数字 bx, by, bh, bw
表示矩形框坐标信息;最后的 80 个数字中每个分别表示对应于类别的输出概率.
输出结果可能包含多个矩形框,可能是 false positive 结果,或者重叠情况. 如,输入图像尺寸为 [416, 416, 3],YOLOV3 总共采用 9 个 anchor boxes(每个尺寸对应 3 个anchor boxes),则可以得到 (52x52 + 26x26 + 13x13)x3=10647 个矩形框.
因此,需要减少输出结果中的矩形框数量,比如,通过设置 score 阈值.
输入参数:
boxes
: tensor of shape [10647, 4)]scores
: tensor of shape [10647, 80]
containing the detection scores for 80 classes.score_thresh
: float value , fliter boxes with low score如:
设置 score 阈值过滤预测的矩形框后,还是可能有大量的重叠矩形框. 进一步的操作是,采用 NMS(non-maximum suppression) 算法.
Pc <= 0.4
Pc
IOU>=0.5
with the box output in the previous step如:
NMS 采用了 IoU(Intersection over Union) 函数. NMS 例示如图:NMS 的输入是 4 个重叠的矩形框,输出是只有一个矩形框.
[1] - Implementing YOLO v3 in Tensorflow (TF-Slim)
[2] - Object Detection using YOLOv2 on Pascal VOC2012
[3] - Understanding YOLO
[4] - YOLOv3目标检测有了TensorFlow实现,可用自己的数据来训练
[5] - 学员分享 | 小哥哥和用YOLOv3做目标检测的故事「文末送课」
[6] - 目标检测|YOLOv2原理与实现(附YOLOv3)
[7] - YOLOv2は、2016年12月25日時点の、速度、精度ともに世界最高のリアルタイム物体検出手法です
[1] - 下载项目:
[2] - 安装项目依赖项:
requirements.txt
:
[3] - 将加载的 COCO 权重导出为 TF Checkpoint - yolov3.ckpt
和 frozen graph - yolov3_gpu_nms.pb
.
下载 [yolov3.weight](wget https://github.com/YunYang1994/tensorflow-yolov3/releases/download/v1.0/yolov3.weights),并放到 ./checkpoint/
路径:
导出权重:
[4] - 利用路径 ./checkpoint/
中的 .pb
文件,运行测试 demo:
如:
YOLOV3 使用在Imagenet上预训练好的模型参数(文件名称: darknet53.conv.74,大小76MB)基础上继续训练. darknet53.conv.74下载链接: https://pjreddie.com/media/files/darknet53.conv.74.
这里给出 YOLOV3 训练过程的简单示例.
采用 python3 core/convert_tfrecord.py
将图片数据集转换为 tfrecords 文件.
[1] - 首先,需要下载 COCO2017 数据集,并放到路径 ./data/train_data/COCO
中.
[2] - 提取 COCO 数据集中的一些有用信息,如边界框(bounding box), category id 等,并生成 .txt
文件.
即可得到 ./data/train_data/COCO/train2017.txt
. 每一行为一个样本,如:
[3] - 接着,将图像数据集转换为 .tfrecord
数据集,以二进制文件的方式存储数据. 之后,即可进行模型训练.
以 YOLOV2 的训练过程为例: