OneFlow快速上手教程
作者:Edison_G
OneFlow我还没有正式试用,但是通过资料查找和代码解读,感觉上手还是比较简单,后期有机会和大家分享详细代码解读。
快速上手
安装 OneFlow 稳定发布版
使用以下命令安装 OneFlow 最新稳定版本:
python3 -m pip install --find-links https://oneflow-inc.github.io/nightly oneflow_cu102 --user
系统要求:
- Python >= 3.5
- Nvidia Linux x86_64 driver version >= 440.33
如果提示 找不到 对应版本,请尝试升级 pip
:
python3 -m pip install --upgrade --user pip
安装 OneFlow with legacy CUDA
支持其它较早版本 CUDA 的 OneFlow 的安装方法如下:
python3 -m pip install --find-links https://oneflow-inc.github.io/nightly oneflow_cu101 --user
python3 -m pip install --find-links https://oneflow-inc.github.io/nightly oneflow_cu100 --user
python3 -m pip install --find-links https://oneflow-inc.github.io/nightly oneflow_cu92 --user
python3 -m pip install --find-links https://oneflow-inc.github.io/nightly oneflow_cu91 --user
python3 -m pip install --find-links https://oneflow-inc.github.io/nightly oneflow_cu90 --user
从源码编译安装 OneFlow
如果你希望通过编译源码安装 OneFlow,可以参考 OneFlow源码仓库的 README,在编译 OneFlow 源码之前,强烈推荐先阅读 Troubleshooting。
YoloV3
快速开始
开始前,请确保您已正确安装了oneflow,并且在python3环境下可以成功import oneflow。
- 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目录下,即可使用。
预测/推理
运行:
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
即可,数据集制作过程见下文【数据集制作】部分。
数据集制作
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在同一目录 )。
至此,完成整个数据集的准备过程。
训练
修改yolo_train.sh脚本中的参数,令:--image_path_file="data/COCO/trainvalno5k.txt"并执行:
sh yolo_train.sh
即可开始训练过程,更详细的参数介绍如下:
- --gpu_num_per_node 每台机器使用的gpu数量
- --batch_size batch 批大小
- --base_lr 初始学习率
- --classes 目标类别数量(COCO 80;VOC 20)
- --model_save_dir 模型存放文件夹路径
- --dataset_dir 训练/验证集文件夹路径
- --num_epoch 迭代总轮数
- --save_frequency 指定模型保存的epoch间隔
- CodeSmith 创建Ado.Net自定义模版(一)
- CodeSmith 创建Ado.Net自定义模版(二)
- 一文读懂卷积神经网络CNN
- NVIDIA张建中:自主学习芯片,推动人工智能发展
- CodeSmith 创建Ado.Net自定义模版(三)
- Android注解学习(2)
- Android注解学习(2)
- 机器学习之——距离度量学习
- Enterprise Library Policy Injection Application Block 之三:PIAB的扩展—创建自定义CallHandler(提供Source Code下载)
- CodeSmith 创建Ado.Net自定义模版(四)
- TensorFlow图像分类教程
- Enterprise Library Policy Injection Application Block 之一: PIAB Overview
- Python教学——第七天
- 大数据将带来电视媒体生态式变革!大数据如何深度融合电视媒体?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring 基于注解的 IOC 与 AOP
- Leetcode 1319 连通网络的操作次数(并查集)
- Leetcode 77. 组合 (排列组合,回溯)
- C++17特性 string_view substr只要常数复杂度,且省内存
- MQ 系列之 ActiveMQ 基本使用
- 使用脚本定时备份 MySQL 数据库
- 解决数独问题用人工智能还是量子计算?
- Leetcode 39. 组合总和(dfs)
- 短视频APP制作,设置高斯模糊
- 使用 Sunny-Ngrok 将内网程序发布到外网
- Leetcode 17. 电话号码的字母组合 (dfs)
- Java实现md5和base64加密解密的示例代码
- Spring 基于 XML 的 AOP
- SpringBoot 集成 Apache Camel FTP 实现文件同步
- Spring 基于 XML 的 IOC