前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Github 项目 - YOLOV3 的 TensorFlow 复现

Github 项目 - YOLOV3 的 TensorFlow 复现

作者头像
AIHGF
修改2020-06-11 16:39:00
4.3K0
修改2020-06-11 16:39:00
举报
文章被收录于专栏:AIUAIAIUAI

原文:Github 项目 - YOLOV3 的 TensorFlow 复现 - AIUAI

Github 项目 - tensorflow-yolov3 作者:YunYang1994 论文:yolov3

最近 YunYang1994开源的基于 TensorFlow(TF-Slim) 复现的 YOLOv3 复现,并支持自定义数据集的训练.

该开源项目组成:

  • YOLO v3 网络结构
  • 权重转换Weights converter (用于将加载的 COCO 权重导出为 TF checkpoint)
  • 基础测试 demo
  • 支持 GPU 和 CPU 版本的 NMS
  • Training pipeline
  • 计算 COCO mAP

1. YOLOV3 主要原理

参考:yolo系列之yolo v3【深度解析】- 木盏 - CSDN

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 系列算法比较灵活,特别适合作工程算法.

1.1. 网络结构

该项目里使用了预训练的网络权重,其中,共有 80 个训练的 yolo 物体类别(COCO 数据集).

记物体类别名 - coco.namesc,其是从 1 到 80 的整数,每个数字分别表示对应的类别名标签. 如,c=3 表示的分类物体类别为 cat.

深度卷积层学习的图像特征,送入到分类器和回归器中,以进行检测预测.(边界框坐标,对应的类别标签,等).

如图:

image
image

From yolo系列之yolo v3【深度解析】- 木盏 - CSDN

image
image

Darknet-19 vs Darknet-53 网络层结构 (From yolo系列之yolo v3【深度解析】- 木盏 - CSDN)

YOLOV3 输出了三个不同尺度的特征图 - y1, y2, y3,如图:

image
image

这种多尺度预测方式,借鉴了 FPN(Feature pyramid networks),对不同尺寸的目标进行预测,越精细的单元网格( grid cell) 可以检测出越精细的物体.

YOLOV3 设定每个网格单元输出 3 个矩形框box 的预测,每个 box 需要五个参数(x, y, w, h, confidence),再对应 80 个类别的概率,则可得到 3*(5 + 80) = 255.

image
image

From YOLOv3代码分析(Keras+Tensorflow)

1.2. 网络输入与输出

[1] - 网络输入:[None, 416, 416, 3]

[2] - 网络输出:矩形框中物体的置信度,矩形框位置的列表,检测到的物体类别名. 每个矩形框表示为 6 个数:(Rx, Ry, Rh, Rw, Pc, C1,…Cn). 其中,n=80,即 c 是 80 维向量. 矩形框最终的向量大小为 5 + 80=85. 如图:

image
image

图中第一个数字 Pc 为物体的置信;第二个到第四个数字数字 bx, by, bh, bw 表示矩形框坐标信息;最后的 80 个数字中每个分别表示对应于类别的输出概率.

1.3. 设置 score 阈值过滤边界框

输出结果可能包含多个矩形框,可能是 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

如:

1.4. NMS 处理

设置 score 阈值过滤预测的矩形框后,还是可能有大量的重叠矩形框. 进一步的操作是,采用 NMS(non-maximum suppression) 算法.

  • Discard all boxes with Pc <= 0.4
  • While there are any remaining boxes :
    • Pick the box with the largest Pc
    • Output that as a prediction
    • Discard any remaining boxes with IOU>=0.5 with the box output in the previous step

如:

NMS 采用了 IoU(Intersection over Union) 函数. NMS 例示如图:NMS 的输入是 4 个重叠的矩形框,输出是只有一个矩形框.

image
image

1.5. 相关材料

[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日時点の、速度、精度ともに世界最高のリアルタイム物体検出手法です

2. YOLOV3 项目入手

[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:

如:

image
image
image
image

3. YOLOV3 训练

3.1. 下载预训练权重文件

YOLOV3 使用在Imagenet上预训练好的模型参数(文件名称: darknet53.conv.74,大小76MB)基础上继续训练. darknet53.conv.74下载链接: https://pjreddie.com/media/files/darknet53.conv.74.

3.2. 快速入手训练

这里给出 YOLOV3 训练过程的简单示例.

采用 python3 core/convert_tfrecord.py 将图片数据集转换为 tfrecords 文件.

3.3. 训练 COCO 数据集

[1] - 首先,需要下载 COCO2017 数据集,并放到路径 ./data/train_data/COCO 中.

[2] - 提取 COCO 数据集中的一些有用信息,如边界框(bounding box), category id 等,并生成 .txt 文件.

即可得到 ./data/train_data/COCO/train2017.txt. 每一行为一个样本,如:

[3] - 接着,将图像数据集转换为 .tfrecord 数据集,以二进制文件的方式存储数据. 之后,即可进行模型训练.

YOLOV2 的训练过程为例:

image
image

3.4. 在 COCO 数据集上的评估验证(待续)

4. YOLOV3 模型定义

core/common.py

core/yolov3.py

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年01月30日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. YOLOV3 主要原理
    • 1.1. 网络结构
      • 1.2. 网络输入与输出
        • 1.3. 设置 score 阈值过滤边界框
          • 1.4. NMS 处理
            • 1.5. 相关材料
            • 2. YOLOV3 项目入手
            • 3. YOLOV3 训练
              • 3.1. 下载预训练权重文件
                • 3.2. 快速入手训练
                  • 3.3. 训练 COCO 数据集
                    • 3.4. 在 COCO 数据集上的评估验证(待续)
                    • 4. YOLOV3 模型定义
                    相关产品与服务
                    腾讯云代码分析
                    腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档