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 目录下,即可使用。

3. 预测/推理

运行:

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 \"$PWD\"}" <5k.part) 5k.part | tr -d '\t' > 5k.txt

paste <(awk "{print \"$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. 项目版本与分支管理之阿里AoneFlow模式分析

    前言 在我前期的项目管理的经验中,一个项目需要维护多个产品及多个版本,这给版本与分支的管理增加了难度.前期没有重视,使得分支太多太乱,版本也没记录好,引发了很多的问题.在多种分支与版本的管理模式下,最 ...

  2. 模型转换[yolov3模型在keras与darknet之间转换]

    首先借助qqwweee/keras-yolo3中的convert.py和tensorrt例子yolov3_onnx,并重新编写了代码,实现将darknet格式的yolov3的yolov3.cfg和yo ...

  3. yolov3和darknet opencv版编译安装及基本测试

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 一.准备工作: 安装pkg-config:sudo apt-get install pkg-confi ...

  4. 基于YOLOv3和Qt5的车辆行人检测(C++版本)

    概述 YOLOv3: 车辆行人检测算法 GitHub Qt5: 制作简单的GUI OpenCV:主要用于putText.drawRec等 Step YOLOv3检测结果 Fig 1. input im ...

  5. 利用YOLOV3训练自己的数据

    写在前面:YOLOV3只有修改了源码才需要重新make,而且make之前要先make clean. 一.准备数据 在/darknet/VOCdevkit1下建立文件夹VOC2007. voc2007文 ...

  6. YOLOv3:训练自己的数据(附优化与问题总结)

    环境说明 系统:ubuntu16.04 显卡:Tesla k80 12G显存 python环境: 2.7 && 3.6 前提条件:cuda9.0 cudnn7.0 opencv3.4. ...

  7. 第十一节,利用yolov3训练自己的数据集

    1.环境配置 tensorflow1.12.0 Opencv3.4.2 keras pycharm 2.配置yolov3 下载yolov3代码:https://github.com/qqwweee/k ...

  8. AI佳作解读系列(二)——目标检测AI算法集杂谈:R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3

    1 引言 深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理.本文着重与分析目标检测领域的深度学习方法,对其中的经典模型框架进行深入分析. 目标检测可以理解为是物 ...

  9. 目标检测网络之 YOLOv3

    本文逐步介绍YOLO v1~v3的设计历程. YOLOv1基本思想 YOLO将输入图像分成SxS个格子,若某个物体 Ground truth 的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这 ...

随机推荐

  1. linux下python调用.so文件

    前言 使用python 调用Fanuc的动态链路库.so 文件读取数据 环境要求 环境 需求 ubuntu16.04 32位 python3.5 32位 配置 把so文件添加到默认路径 ln -s / ...

  2. 【Scrapy(二)】Scrapy 中的 Pipline,Item,Shell组件

    Pipline: 1.爬虫项目与爬虫的区别与关联: 一个爬虫项目可以包含多个爬虫,如下图中爬虫项目firstspider 包含多个爬虫itcst 和爬虫itcast1 2.多个爬虫是公用一套Pipli ...

  3. hdu4400 BFS+STL

    题意:        煤矿爆炸,每个煤矿有自己的x,y,d,d是他爆炸后会是d距离内的爆炸,每次输入一个爆炸的煤矿,问你这个煤矿爆炸会有多少个煤矿爆炸. 思路:       爆炸的过程就是搜索的过程, ...

  4. Python爬虫之使用正则表达式抓取数据

    目录 匹配标签 匹配title标签 a标签 table标签 匹配标签里面的属性 匹配a标签里面的URL 匹配img标签里的 src 相关文章:Linux中的正则表达式 Python中的正则表达式 实例 ...

  5. Win64 驱动内核编程-17. MINIFILTER(文件保护)

     MINIFILTER(文件保护) 使用 HOOK 来监控文件操作的方法有很多,可以在 SSDT 上 HOOK 一堆和 FILE 有关的函数,也可以对 FSD 进行 IRP HOOK,不过这些方法既不 ...

  6. json对象的获取

    <script type="text/javascript"> var person = { //json对象定义开始 name:'tom', //字符串 age:24 ...

  7. 安装google cloud sdk报错解决方法总结(超全)

    前提:python环境最好是2.7,如果是python3可能会出很多小毛病:能用64位系统就尽量用64位,32位系统安装也很多毛病 一.Error1:Unzip Failed: Error openi ...

  8. FreeSql之Expression表达式拼接参数扩展

    在FreeSql源码中Expression表达式拼接默认最多支持到5个泛型参数,当我们使用表关联比较多的时候,就需要进行扩展. 新建一个类,将命名空间改为System.Linq.Expressions ...

  9. Windows子系统Ubuntu安装宝塔面板

    首先你需要安装Ubuntu子系统,安装方法点击这里,安装完成后再进行下面的步骤. 安装宝塔面板 输入命令 wget -O install.sh http://download.bt.cn/instal ...

  10. 远程连接mysql出现"Can't connect to MySQL server 'Ip' ()"的解决办法

    1.大多是防火墙的问题(参考链接:https://blog.csdn.net/jiezhi2013/article/details/50603366) 2.上面方法不能解决,不造成影响情况下可关闭防火 ...