Yolov3 的 OneFlow 实现
1.简介
YOLO 系列的算法(经典的v1~v3),是单阶段目标检测网络的开山鼻祖,YOLO—You only look once,表明其单阶段的特征,正是由于网络简单,单阶段的效率较快,使其区别于 Faster-RCNN 为代表的两阶段目标检测器,从一开始推出至今,便以速度快和较高的准确率而风靡目标检测领域,受到广泛使用和好评。
而Yolov3是其中的经典和集大成者(当然官方最近也推出了 Yolov4 ),其以融合了残差网络的 Darknet-53 为骨干网络,融合了多尺度,3路输出的 feature map,上采样等特点,使其模型精度和对小目标检测能力都大为提升。

本文,提供了 Yolov3 的 OneFlow 版实现,和其他版本实现的区别在于,将输出特征的 nms 过程写进了 C++ 代码中,通过自定义 user op 的方式来调用,当然,也同时支持直接使用 python 代码处理 nms。
2.快速开始
开始前,确保已正确安装了oneflow,并且在python3环境下可以成功import oneflow。

  1. git clone 此仓库到本地
    git clone --recursive https://github.com/Oneflow-Inc/oneflow_yolov3.git
  2. 安装 python 依赖库
    pip install -r requirements.txt
  3. 在项目 root 目录下,执行:
    ./scripts/build.sh
    执行此脚本,将 cpp 代码中自定义的 op 算子编译成可调用执行的 .so 文件,将在项目路径下看到:
    • libdarknet.so
    • liboneflow_yolov3.so
    预训练模型
    使用了 Yolov3 原作者提供的预训练模型—yolov3.weight ,经转换后生成了 OneFlow 格式的模型。下载预训练模型:of_model_yolov3.zip ,并将解压后的 of_model 文件夹放置在项目 root 目录下,即可使用。
  4. 预测/推理
    运行:
    sh yolo_predict.sh
    或者:
    sh yolo_predict_python_data_preprocess.sh
    运行脚本后,将在 data/result 下生成检测后带 bbox 标记框的图片:

参数说明 - --pretrained_model 预训练模型路径
• --label_path coco 类别标签路径(coco.name)
• --input_dir 待检测图片文件夹路径
• --output_dir 检测结构输出路径
• --image_paths 单个/多个待检测图片路径,如:
–image_paths ‘data/images/000002.jpg’ ‘data/images/000004.jpg’
训练同样很简单,准备好数据集后,只需要执行:sh yolo_train.sh即可,数据集制作过程见下文【数据集制作】部分。
4. 数据集制作
Yolov3 支持任意目标检测数据集,下面以 COCO2014 制作过程为例,介绍训练/验证所需的数据集制作,其它数据集如 PASCAL VOC 或自定义数据集等,都可以采用相同格式。
资源文件
下载 COCO2014 训练集和验证集图片,将解压后的 train2014 和 val2014 放在 data/COCO/images 目录下
(如果本地已下载过 COCO2014 数据集,可以 ln 软链接 images 至本地 train2014 和 val2014 的父目录)
准备资源文件:labels,5k.part,trainvalno5k.part
wget -c https://pjreddie.com/media/files/coco/5k.part
wget -c https://pjreddie.com/media/files/coco/trainvalno5k.part
wget -c https://pjreddie.com/media/files/coco/labels.tgz
脚本
在 data/COCO 目录下执行脚本:

get label file

tar xzf labels.tgz

set up image list

paste <(awk “{print “KaTeX parse error: Can't use function '\"' in math mode at position 4: PWD\̲"̲}" <5k.part) 5k…PWD”}” <trainvalno5k.part) trainvalno5k.part | tr -d ‘\t’ > trainvalno5k.txt

copy label txt to image dir

find labels/train2014/ -name “.txt" | xargs -i cp {} images/train2014/
find labels/val2014/ -name "
.txt” | xargs -i cp {} images/val2014/
执行脚本将自动解压缩 labels.tgz 文件,并在当前目录下生成 5k.txt 和 trainvalno5k.txt,然后将 labels/train2014 和 labels/val2014 的所有 label.txt 文件复制到对应的训练集和验证集文件夹中( 保证图片和 label 在同一目录 )。
至此,完成整个数据集的准备过程。
5.训练
修改 yolo_train.sh 脚本中的参数,令:–image_path_file=“data/COCO/trainvalno5k.txt” 并执行:
sh yolo_train.sh
即可开始训练过程,更详细的参数介绍如下:
• --gpu_num_per_node 每台机器使用的gpu数量
• --batch_size 批大小
• --base_lr 初始学习率
• --classes 目标类别数量(COCO 80;VOC 20)
• --model_save_dir 模型存放文件夹路径
• --dataset_dir 训练/验证集文件夹路径
• --num_epoch 迭代总轮数
• --save_frequency 指定模型保存的epoch间隔
说明
目前如果调用 yolo_predict.sh 执行,数据预处理部分对 darknet 有依赖
其中:
predict decoder 中调用 load_image_color、letterbox_image 函数
train decoder 中调用 load_data_detection 函数
主要涉及以下操作,在后续的版本中会使用 OneFlow decoder ops 替换
• image read
• nhwc -> nchw
• image / 255
• bgr2rgb
• resize_image
• fill_image
• random_distort_image
• clip image
• random flip image and box
• randomize_boxes
• correct_boxes

Yolov3 的 OneFlow 实现相关推荐

  1. TVM yolov3优化代码修改(编译运行OK)

    TVM yolov3优化代码修改(编译运行OK) yolov3_quantize_sample.py 附https://github.com/makihiro/tvm_yolov3_sample代码: ...

  2. Yolov3网络架构分析

    Yolov3网络架构分析 上图三个蓝色方框内表示Yolov3的三个基本组件:  CBL:Yolov3网络结构中的最小组件,由Conv+Bn+Leaky_relu激活函数三者组成.  Res uni ...

  3. TVM darknet yolov3算子优化与量化代码的配置方法

    TVM darknet yolov3算子优化与量化代码的配置方法 使用以下接口函数  tvm.relay.optimize  quantize.quantize 实际代码: convert nnv ...

  4. Wide Deep的OneFlow网络训练

    Wide & Deep的OneFlow网络训练 HugeCTR是英伟达提供的一种高效的GPU框架,专为点击率(CTR)估计训练而设计. OneFlow对标HugeCTR搭建了Wide & ...

  5. BERT模型的OneFlow实现

    BERT模型的OneFlow实现 模型概述 BERT(Bidirectional Encoder Representations from Transformers)是NLP领域的一种预训练模型.本案 ...

  6. VS Code 调试 OneFlow

    VS Code 调试 OneFlow 本文介绍如何配置 VS Code,搭建 OneFlow 的 GUI 开发环境. 如果对于 VS Code 及其插件系统还不熟悉,可以参阅官方文档. 本文包括: • ...

  7. OneFlow 并行特色

    OneFlow 并行特色 在 Consistent 与 Mirrored 视角中,已经知道 OneFlow 提供了 mirrored 与 consistent 两种看待分布式系统的视角,并且提前知道了 ...

  8. OneFlow 概念清单

    OneFlow 概念清单 本文将对 OneFlow 中涉及到的,常用的一些概念/名词做一个概括性的解释.主要内容针对算法工程师和框架开发者分为以下两部分: • 算法开发 • 框架开发 在算法开发部分, ...

  9. 使用OneFlow搭建神经网络

    使用OneFlow搭建神经网络 在 识别 MNIST 手写体数字 的例子中,通过 flow.layers 和 flow.nn 中提供的接口搭建了一个简单的 LeNet 网络.下面,将通过LeNet来介 ...

最新文章

  1. python 监控windows磁盘空间和备份大小
  2. 各种图(流程图,思维导图,UML,拓扑图,ER图)简介
  3. 导航跳转后保持选中状态 jquery高亮当前选中菜单
  4. Web3.0 兴起之际,元宇宙这杯羹怎么分?
  5. map转成url拼接请求参数
  6. java 对象访问权限_Java面向对象--访问权限
  7. Mysql安装及其配置
  8. Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (上)
  9. 按月分隔时间段,java实现,DateRange
  10. tradecenter日内交易_一个华尔街交易员一天的工作是怎样的?
  11. 搞着玩:基于Spring Boot的企业CMS系统
  12. 项目经理领导力提升与塑造:从自己干到团队干
  13. R语言笔记-分类变量列联表和独立性检验
  14. 消费者人群画像 python_如何正确打开相似人群画像算法
  15. 经纬度换算数值_经纬度转换-----度分秒以及经纬度和米
  16. 首次揭秘 | 淘宝新发布的躺平如何做3D场景化导购?
  17. 电容容量越大越好吗?
  18. cdn服务器pnk_cdn服务器是什么
  19. verilog练习:hdlbits网站上的做题笔记(5)
  20. [Practical.Vim(2012.9)].Drew.Neil.Tip20学习摘要

热门文章

  1. Test Reprot
  2. c语言中external,static关键字用法
  3. 2022-2028年中国香精香料行业投资分析及前景预测报告
  4. 如何学习数据挖掘和数据科学的7个步骤
  5. Java箭头函数,lambda函数
  6. 机房收费系统总结【4】-报错码
  7. LeetCode简单题之山羊拉丁文
  8. CPU/GPU/TPU/NPU...XPU都是什么意思?
  9. 如何运行具有奇点的NGC深度学习容器
  10. Mobileye 自动驾驶策略(一)