跳转至

one-yolov5 v1.2.0 released

0x0. 引言

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

0x1. 快速开始

安装 在[**Python>=3.7.0**](https://www.python.org/) 的环境中克隆版本仓并安装 [requirements.txt](https://github.com/Oneflow-Inc/one-yolov5/blob/main/requirements.txt),包括 [OneFlow nightly 或者 oneflow>=0.9.0](https://docs.oneflow.org/master/index.html) 。
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 6.86MB yolov5n-cls 4.87MB yolov5n-seg 4.11MB
yolov5s 14.12MB yolov5s6 24.78MB yolov5s-cls 10.52MB yolov5s-seg 14.87MB
yolov5m 40.82MB yolov5m6 68.96MB yolov5m-cls 24.89MB yolov5m-seg 42.36MB
yolov5l 89.29MB yolov5l6 147.36MB yolov5l-cls 50.88MB yolov5l-seg 91.9MB
yolov5x 166.05MB yolov5x6 269.62MB yolov5x-cls 92.03MB yolov5x-seg 170.01MB
Back to top