Skip to content

Releases: Oneflow-Inc/one-yolov5

v1.2.0

14 Feb 10:13
5a3c08c
Compare
Choose a tag to compare

clash_resources.zip

0x0. 引言

  • 🌟 v1.2.0同步了ultralytics yolov5的上游分支v7.0 ,同时支持分类,目标检测,实例分割任务
原图 目标检测: 目标检测是指从图像中检测出多个物体并标记它们的位置和类别。目标检测任务需要给出物体的类别和位置信息,通常使用边界框(bounding box)来表示。目标检测可以应用于自动驾驶、视频监控、人脸识别等领域。
图像分类: 图像分类是指给定一张图像,通过计算机视觉技术来判断它属于哪一类别。 图像分类是一种有监督学习任务,需要通过训练样本和标签来建立分类模型。在图像分类中,算法需要提取图像的特征,然后将其分类为预定义的类别之一。例如,图像分类可以用于识别手写数字、识别动物、区分汽车和自行车等。 实例分割: 实例分割是指从图像中检测出多个物体并标记它们的位置和类别,同时对每个物体进行像素级的分割。 实例分割要求更为精细的信息,因为它需要将物体的每个像素都分配给对应的物体。 实例分割可以应用于医学影像分析、自动驾驶、虚拟现实等领域。

0x1. 快速开始

安装

Python>=3.7.0 的环境中克隆版本仓并安装 requirements.txt,包括 OneFlow nightly 或者 oneflow>=0.9.0

git clone https://github.com/Oneflow-Inc/one-yolov5  # 克隆
cd one-yolov5
pip install -r requirements.txt  # 安装

0x2. 在COCO上的精度表现

yolov5s-default

后端 GPU metrics/mAP_0.5, metrics/mAP_0.5:0.95, wandb 日志
OneFlow 4 37.659 56.992 One-YOLOv5s-default
PyTorch 1 37.65 56.663 YOLOV5s-default

数据 results.txt

启动指令:
python -m oneflow.distributed.launch --nproc_per_node 4  \ 
train.py --batch-size 128 --data coco.yaml --weights " " --cfg models/yolov5s.yaml --img 640 --epochs 300

yolov5s-seg

后端 GPU mAP_0.5:0.95(B) mAP_0.5:0.95(M) wandb 日志
OneFlow 8 37.558 31.402 One-YOLOv5s-seg_v1.2.0
PyTorch 1 37.705 31.651 YOLOV5s-seg
OneFlow后端启动指令
python -m oneflow.distributed.launch --nproc_per_node  8  \
    segment/train.py \
    --data coco.yaml \
    --weights ' ' \
    --cfg yolov5s-seg.yaml   \
    --img 640  \
    --batch-size 320    \
    --device 0,1,2,4      \
    --epochs 300  \
    --bbox_iou_optim --multi_tensor_optimize 

0x3. 在COCO上的单GPU性能表现

单卡 amp epoch gpu batch 数据集 模型 time(min)
OneFlow False 1 1 8 coco yolov5s-default 18:49
PyTorch False 1 1 8 coco yolov5s-default 21:56
OneFlow False 1 1 16 coco yolov5s-default 14:34
PyTorch False 1 1 16 coco yolov5s-default 17:46
OneFlow False 1 1 8 coco yolov5s-seg 25:36
PyTorch False 1 1 8 coco yolov5s-seg 33:16
OneFlow False 1 1 16 coco yolov5s-seg 24:07
PyTorch False 1 1 16 coco yolov5s-seg 29:55
测试环境
- 机器  ( 8GPU  NVIDIA GeForce RTX 3090, 24268MiB)
-  oneflow.__version__= '0.9.1+cu117
- torch.__version__= '1.13.0+cu117'
- export NVIDIA_TF32_OVERRIDE=0  # PyTorch使用FP32训练 


# 测试指令:
# OneFlow后端
python   train.py \
    --batch-size 8 \
    --data coco.yaml \
    --weights ' ' \
    --cfg models/yolov5s.yaml \
    --img 640 \
    --epochs 1  \
    --bbox_iou_optim --multi_tensor_optimize

python segment/train.py \
    --data coco.yaml \
    --weights ' ' \
    --cfg  models/segment/yolov5s-seg.yaml \
    --img 640 \
    --batch-size 8
    --epochs 1 \
    --bbox_iou_optim --multi_tensor_optimize 

# PyTorch后端:
export NVIDIA_TF32_OVERRIDE=0 # 使用fp32
python  \
    train.py \
    --batch-size 8 \
    --data coco.yaml \
    --weights ' ' \
    --cfg models/yolov5s.yaml \
    --img 640 \
    --epochs 1  \

export NVIDIA_TF32_OVERRIDE=0 # 使用fp32
python segment/train.py \
    --data coco.yaml \
    --weights ' ' \
    --cfg  models/segment/yolov5s-seg.yaml \
    --img 640 \
    --epochs 1 \
    --batch-size 8

特性 & bug 修复

特性

01 同时支持分类,目标检测,实例分割任务 分割和分类模型训练示例
检测模型训练示例
02 支持flask_rest_api 使用flask_rest_api示例
03 支持使用 wandb 对实验跟踪和可视化功能 使用coco128数据集 对 wandb 集成可视化测试示例
操作指南
04 oneflow_hub_support_pilimage 操作指南
05 为每个batch的compute_loss部分减少一次h2d和cpu slice_update操作 pr: optim_slice_update_in_compute_loss
06 优化 bbox_iou 函数和模型滑动平均部分,大幅提升训练性能 消费级显卡的春天,GTX 3090 YOLOv5s单卡完整训练COCO数据集缩短11.35个小时
07 兼容FlowFlops,训练时可以展示模型的FLOPs 基于 Flowflops 详解深度学习网络的 FLOPs 和 MACs 计算方案

用户反馈的bug

记录了一些用户反馈的常见问题

  1. 出现满屏的误检框, 可能到原因场景太单一,泛化不够 ,更多可见我们关于 如何准备一个好的数据集介绍 或者导出onnx模型进行部署时代码有错误。

  2. 这个应该是让batch维度可以动态 你加了dynamic参数? 暂时不支持该参数,可以自己编辑onnx模型。相关教程请参考: https://github.com/Oneflow-Inc/one-yolov5/releases/download/v1.2.0_/openmmlab.pptx

  3. 模型导出onnx时,出现 /tmp/oneflow_model322 类似报错。oneflow新老版本兼容性问题:因为这个是之前旧版本创建的文件但是没清理,删了就可以解决了。

  4. 训练过程loss,map,检测框等可视化 我们适配了wandb

  5. device选择这里因为CUDA_VISIBLE_DEVICES环境变量设置放在import oneflow之后会失败,导致device选择失败了,可以export CUDA_VISIBLE_DEVICES=1 这样子手动控制下。

  6. autobatch功能 oneflow这边缺少个memory_reserved api ,我们会尽快补齐这个api,现在还是先手动指定下batch_size, 我们将在下个版本解决并且会直接支持导出batch维度为动态的模型。

下个版本的展望

  • 继续提升one-yolov5单卡模式的训练速度。
  • 解决目前训练时显存比 ultralytics 偏大的问题。
  • cpu模式下也支持onnx模型的导出。
  • OneFlow 研发的amp train目前已经开发完成正在测试中,下个版本将合并进main分支。
  • autobatch功能 。

附件

常用预训练模型下载列表

常用预训练模型下载列表
Model Size(MB) Model Size(MB) Model Size(MB) Model Size(MB)
yolov5n 3.87MB [yolov5n6](https://github.com/ultra...
Read more

v1.1.0

03 Dec 06:40
62dea0e
Compare
Choose a tag to compare

one-yolov5 v1.1.0 发布

feature

01 完善代码仓库的示例文档
02 RTX 3090 FP32 YOLOv5s的训练速度提升了近20%,其它网络均有不同程度的加速 所有的优化都集中于 `bbox_iou_optim` 和 `multi_tensor_optimizer` 这两个扩展的 Flag,只要我们训练的时候打开这两个Flag就可以享受到 [消费级显卡的春天,RTX 3090 YOLOv5s单卡完整训练COCO数据集缩短11.35个小时](https://mp.weixin.qq.com/s/Qh3JCAaPox3TUB0a6Lb_ug) 这里提到的所有优化了。其他的运行命令和 One-YOLOv5 原版本没有变化,以 One-YOLOv5 在 RTX 3090 上使用 COCO 数据集训练 yolov5s 为例, 命令为: python train.py --batch 16 --cfg models/yolov5s.yaml --weights '' --data coco.yaml --img 640 --device 0 --epoch 1 --bbox_iou_optim --multi_tensor_optimizer
单卡 amp epoch gpu batch 网络结构文件 time(min)
OneFlow False 1 1 8 yolov5s.yaml 14:53
PyTorch False 1 1 8 yolov5s.yaml 25:10
OneFlow False 1 1 16 yolov5s.yaml 12:11
PyTorch False 1 1 16 yolov5s.yaml 14:38
OneFlow False 1 1 8 hub/yolov5x6.yaml 1:26:22
PyTorch False 1 1 8 hub/yolov5x6.yaml 1:36:29
测试指令
# OneFlow & yolov5s.yaml:
python train.py --batch  16 --cfg models/hub/yolov5x6.yaml --weights '' --data coco.yaml --img 640 --device 0 --epoch 1 --bbox_iou_optim --multi_tensor_optimize

# PyTorch & yolov5s.yaml:
python train.py --batch  16 --cfg models/hub/yolov5x6.yaml --weights '' --data coco.yaml --img 640 --device 0 --epoch 1

# OneFlow & hub/yolov5x6.yaml
python train.py --batch  8 --cfg models/hub/yolov5x6.yaml --weights '' --data coco.yaml --img 640 --device 0 --epoch 1  --hyp data/hyps/hyp.scratch-high.y --noautoanchor  --bbox_iou_optim --multi_tensor_optimizer

# PyTorch & hub/yolov5x6.yaml
python train.py --batch  8 --cfg models/hub/yolov5x6.yaml --weights '' --data coco.yaml --img 640 --device 0 --epoch 1  --hyp data/hyps/hyp.scratch-high.y --noautoanchor
03 支持使用 wandb 对实验跟踪和可视化功能 使用coco128数据集 对 wandb 集成可视化测试示例
操作指南
04 oneflow_hub_support_pilimage 操作指南
05 为每个batch的compute_loss部分减少一次h2d和cpu slice_update操作 pr: optim_slice_update_in_compute_loss
06 优化 bbox_iou 函数和模型滑动平均部分,大幅提升训练性能 消费级显卡的春天,GTX 3090 YOLOv5s单卡完整训练COCO数据集缩短11.35个小时
07 兼容FlowFlops,训练时可以展示模型的FLOPs 基于 Flowflops 详解深度学习网络的 FLOPs 和 MACs 计算方案
08 模型权重发布ONNX版本,方便用户直接部署验证

bug fix

01 解决memory和loss显示错位问题
02 无法自动下载权重问题
03 修复单独运行yolo.py脚本ModuleNotFoundError
04 修复通过追加保存模型的方式

one-yolov5 文档更新

发布了的文章

持续新增中...

已开发待发布的教程和源码解读

FAQ

训练前,请先阅读 本文的FAQ总结的一些常见问题 !(这可以节省您的时间)

注意⚠️:

  • oneflow目前不支持windows平台
  • 目前OneFlow 需要安装 nightly 版本,等OneFlow后续新版本发布后可以安装稳定版。
  • --batch 必须是GPU数量的整数倍。
  • ddp模式训练时,GPU 0 将比其他GPU占用略多的内存,因为它维护EMA并负责检查点等。

v1.0.0

19 Oct 00:46
498c15e
Compare
Choose a tag to compare

Full Changelog: https://github.com/Oneflow-Inc/one-yolov5/commits/v1.0

0x0 动机

为了说明使用 OneFlow 训练目标检测模型的可行性以及性能的优越性,最近我们将 ultralytics 版 YOLOv5(https://github.com/ultralytics/yolov5)通过import oneflow as torch的方式迁移为了OneFlow后端(对应YOLOv5的commit号为:48a85314bc80d8023c99bfb114cea98d71dd0591)。并对 YOLOv5 中相关的教程进行了汉化,添加了一系列详细的代码解读,原理讲解以及部署教程,希望使得 YOLOv5 项目对用户更加透明化。另外我们也将在性能这个角度进行深入探索,本次我们发布的OneFlow后端的YOLOv5只是一个基础版本,没有用上任何的优化技巧。目前我们在小 Batch 进行训练时相比于 PyTorch 有5%-10%左右的性能优势,而对于大 Batch 则性能和 PyTorch 持平。相信在后续的一些定制化的性能优化技巧下(比如nn.Graph加持,算子的优化),我们可以继续提升YOLOv5在COCO等数据集的训练速度,更有效缩短目标检测模型的训练时间。

不过即使你对 OneFlow 带来的性能提升不太感兴趣,我们相信文档网站中对 YOLOv5 教程的汉化以及源码剖析也会是从零开始深入学习 YOLOv5 一份不错的资料。欢迎在仓库给我们提出宝贵的意见。🌟🌟🌟

欢迎star one-yolov5项目 获取最新的动态。

0x1. 差异

我们将 YOLOv5 的后端从 PyTorch 换成 OneFlow 之后除了性能优势外还做了一些差异化的内容,其中一些内容已经完成,还有一些正在进行中,下面简单展示一下:

这一系列的文章我们将逐步开发,Review 以及发布并且会有相应的视频讲解,我们将这个系列的文章叫作:《YOLOv5全面解析教程》 🎉🎉🎉

0x2. 在COCO上的精度表现

我们以 yolov5n 网络为例, result.csv 这个日志展示了我们基于 one-yolov5 在 COCO 上从零开始训练 YOLOv5n 网络的日志。下图展示了 box_loss , obj_loss, cls_lossmap_0.5, map_0.5:0.95 等指标在训练过程中的变化情况:

图片

最终在第 300 个 epoch 时,我们的 map_0.5 达到了 0.45174map_0.5:0.95 达到了 0.27726

ultralytics/yolov5 给出的精度数据 一致(注意官网给出的精度指定 iou 为 0.65 的精度,而上述 csv 文件中是在 iou 为 0.60 下的精度,使用我们训练的权重并把 iou 指定为 0.65 可以完全对齐官方给出的精度数据)。

关于这一点,我们可以使用 ultralytics/yolov5 来验证一下:

python val.py  --weights yolov5n.pt --data data/coco.yaml --img 640 --iou 0.60

输出:

val: data=data/coco.yaml, weights=['yolov5n.pt'], batch_size=32, imgsz=640, conf_thres=0.001, iou_thres=0.6, max_det=300, task=val, device=, workers=8, single_cls=False, augment=False, verbose=False, save_txt=False, save_hybrid=False, save_conf=False, save_json=True, project=runs/val, name=exp, exist_ok=False, half=False, dnn=False
YOLOv5 🚀 v6.1-384-g7fd9867 Python-3.8.13 torch-1.10.0+cu113 CUDA:0 (NVIDIA GeForce RTX 3080 Ti, 12054MiB)

cuda:0
Fusing layers... 
YOLOv5n summary: 213 layers, 1867405 parameters, 0 gradients, 4.5 GFLOPs
val: Scanning '/data/dataset/fengwen/coco/val2017.cache' images and labels... 4952 found, 48 missing, 0 empty, 0 corrupt: 100%|█████
                 Class     Images  Instances          P          R      mAP50   mAP50-95: 100%|██████████| 157/157 [00:40<00:00,  3.
                   all       5000      36335      0.573      0.432      0.456      0.277

上面的输出可以说明我们和 ultralytics/yolov5 的精度是完全对齐的。

在 one-yolov5 从零开始训练 yolov5n 进行精度复现的命令为 (2卡DDP模式) :

python  -m oneflow.distributed.launch --nproc_per_node 2 train.py --data  data/coco.yaml  --weights ' ' --cfg models/yolov5n.yaml --batch 64

0x3. 在COCO上的性能表现

以下的性能结果都是直接将 PyTorch 切换为 OneFlow 之后测试的,并没有做针对性优化,后续会在此基础上继续提升 OneFlow 后端 YOLOv5 的训练速度。

在 3080Ti 的性能测试结果

单卡测试结果

  • 以下为GTX 3080ti(12GB) 的yolov5测试结果(oneflow后端 vs PyTorch后端)
  • 以下测试结果的数据配置均为coco.yaml,模型配置也完全一样,并记录训练完coco数据集1个epoch需要的时间
  • 由于oneflow eager目前amp的支持还不完善,所以我们提供的结果均为fp32模式下进行训练的性能结果
  • PyTorch版本 yolov5 code base链接:https://github.com/ultralytics/yolov5
  • OneFlow版本 yolov5 code base链接:https://github.com/Oneflow-Inc/one-yolov5
  • cuda 版本 11.7, cudnn 版本为 8.5.0
  • 测试的命令为:python train.py --batch 16 --cfg models/yolov5n.yaml --weights '' --data coco.yaml --img 640 --device 0 ,其中 batch 参数是动态变化的

图片

可以看到,在 batch 比较小的时候 OneFlow 后端的 YOLOv5 相比于 PyTorch 有 5%-10% 左右的性能优势,这可能得益于 OneFlow 的 Eager 运行时系统可以更快的做 CUDA Kernel Launch。而 batch 比较大的时候 OneFlow 后端的 YOLOv5 相比于 PyTorch 的性能差不多是持平,这可能是因为当 Batch 比较大的时候 CUDA Kernel Launch 的开销相比于计算的开销会比较小。

两卡DDP测试结果

  • 配置和单卡均一致
  • 测试的命令为:python -m oneflow.distributed.launch --nproc_per_node 2 train.py --batch 16 --data coco.yaml --weights '' --device 0,1 ,其中 batch 参数是动态变化的

图片

得益于单卡的性能优势,在 2 卡DDP模式下,OneFlow 后端的 YOLOv5 在小 batch 的训练时间也是稍微领先 PyTorch 后端的 YoloV5 ,而对于大 Batch 来说性能和 PyTorch 相比也是差不多持平。

0x4. 总结

我们基于 OneFlow 移植了 ultralytics 版的 YOLOv5 ,在精度训练达标的情况下还可以在 Batch 比较小时取得一些性能优势。此外,我们对 YOLOv5 中相关的教程进行了汉化,添加了一系列详细的代码解读,原理讲解以及部署教程,希望使得 YOLOv5 项目对用户更加透明化。相信对想深入了解 YOLOv5 的读者我们的 《YOLOv5全面解析教程》 也是一份不错的学习资料。