YOLOv5发布于2020年4月,利用COCO数据集实现了最先进的目标检测性能。这是继YoloV3之后的一个重要改进,在网络骨干部署新架构,并且网络颈部的修改使mAP(平均精度均值)提高了10%,FPS(每秒帧数)提高了12%。
YOLOv5主要组成:CSP结构和Focus结构作为骨干、空间金字塔池化(SPP)作为附加模块、PANet路径聚合作为颈部、YOLOv3作为头部。CSP是一个新的骨干网络,可以增强CNN的学习能力。在CSP上添加空间金字塔池化模块来增加更多可接受空间,并分离出最重要的上下文特征。不同级别检测器使用PANet聚合参数,而非在YOLOv3中使用的用于对象检测的特征金字塔网络(FPN)。具体来说,CSPDarknet53包含5个CSP模块,这些模块使用的卷积C的内核大小k=3x3,步长s=2x2;在PANet和SPP中,使用的最大池化层为1x1、5x5、9x9、13x13。
使用的数据集:COCOCO2017
注:您可以使用COCO2017或与MS COCO标注格式相同的数据集运行脚本。但建议您使用MS COCO数据集来运行我们的模型。
通过官方网站安装MindSpore后,您可以按照如下步骤进行训练和评估:
#通过Python在Ascend或GPU上进行训练(单卡)
python train.py \
--device_target="Ascend" \ # Ascend或GPU
--data_dir=xxx/dataset \
--is_distributed=0 \
--yolov5_version='yolov5s' \
--lr=0.01 \
--max_epoch=320 \
--warmup_epochs=4 > log.txt 2>&1 &
# 若使用shell脚本单卡运行,请更改配置文件中的`device_target`为在Ascend/GPU上运行,并参考注释的内容,更改`T_max`、`max_epoch`、`warmup_epochs`。
bash run_standalone_train.sh [DATASET_PATH]
# 在Ascend中运行shell脚本进行分布式训练示例(8卡)
bash run_distribute_train.sh [DATASET_PATH] [RANK_TABLE_FILE]
# 在GPU运行shell脚本进行分布式训练示例(8卡)
bash run_distribute_train_gpu.sh [DATASET_PATH] [RANK_SIZE]
# 通过Python命令在Ascend或GPU上运行评估
python eval.py \
--device_target="Ascend" \ # Ascend或GPU
--data_dir=xxx/dataset \
--yolov5_version='yolov5s' \
--pretrained="***/*.ckpt" \
--eval_shape=640 > log.txt 2>&1 &
# 通过shell脚本运行评估,请将配置文件中的`device_target`更改为在Ascend或GPU上运行。
bash run_eval.sh [DATASET_PATH] [CHECKPOINT_PATH] [DEVICE_ID]
请注意,default_config.yaml是8卡上yolov5s的默认参数。Ascend和GPU上的batchsize
和lr
不同,请参考scripts/run_distribute_train.sh
或scripts/run_distribute_train_gpu.sh
中的设置。
├── model_zoo
├── README.md // 所有模型相关说明
├── yolov5
├── README.md // yolov5的相关说明
├── scripts
│ ├──docker_start.sh // 运行shell脚本启动docker
│ ├──run_distribute_train.sh // 在Ascend中进行分布式训练(8卡)
│ ├──run_distribute_train_gpu.sh // 在GPU中进行分布式训练(8卡)
│ ├──run_standalone_train.sh // 进行单卡训练
│ ├──run_infer_cpp.sh // 在310上推理的shell脚本
│ ├──run_eval.sh // 用于评估的shell脚本
│ ├──run_eval_onnx.sh // 用于onnx评估的shell脚本
├──model_utils
│ ├──config.py // 参数配置
│ ├──device_adapter.py // 获取设备信息
│ ├──local_adapter.py // 获取设备信息
│ ├──moxing_adapter.py // 装饰器
├── src
│ ├──backbone.py // 骨干网络
│ ├──distributed_sampler.py // 数据集迭代
│ ├──initializer.py // 参数初始化
│ ├──logger.py // 日志函数
│ ├──loss.py // 损失函数
│ ├──lr_scheduler.py // 生成学习率
│ ├──transforms.py // 预处理数据
│ ├──util.py // Util函数
│ ├──yolo.py // YOLOv5网络
│ ├──yolo_dataset.py // 创建YOLOv5数据集
├── default_config.yaml // 参数配置(YOLOv5s 8卡)
├── train.py // 训练脚本
├── eval.py // 评估脚本
├── eval_onnx.py // ONNX评估脚本
├── export.py // 导出脚本
train.py中主要的参数有:
可选参数:
--device_target 实现代码的设备。默认值:Ascend
--data_dir 训练数据集目录
--per_batch_size 训练的批处理大小。默认值:32(单卡),16(Ascend 8卡)或32(GPU 8卡)
--resume_yolov5 用于微调的YoLOv5的CKPT文件。默认值:""。
--lr_scheduler 学习率调度器。可选值:exponential或cosine_annealing
默认值:cosine_annealing
--lr 学习率。默认值:0.01(单卡),0.02(Ascend 8卡)或0.025(GPU 8卡)
--lr_epochs 学习率变化轮次,用英文逗号(,)分割。默认值为'220,250'。
--lr_gamma 指数级lr_scheduler系数降低学习率。默认值为0.1。
--eta_min cosine_annealing调度器中的eta_min。默认值为0。
--t_max 在cosine_annealing调度器中的T-max。默认值为300(8卡)。
--max_epoch 模型训练最大轮次。默认值为300(8卡)。
--warmup_epochs 热身总轮次。默认值为20(8卡)。
--weight_decay 权重衰减因子。默认值为0.0005。
--momentum 动量参数。默认值为0.9。
--loss_scale 静态损失缩放。默认值为64。
--label_smooth 是否在CE中使用标签平滑。默认值为0。
--label_smooth_factor 初始one-hot编码的平滑强度。默认值为0.1。
--log_interval 日志记录间隔步骤。默认值为100。
--ckpt_path CKPT文件保存位置。默认值为outputs/。
--is_distributed 是否进行分布式训练,1表示是,0表示否。默认值为0。
--rank 分布式训练的本地序号。默认值为0。
--group_size 设备的全局大小。默认值为1。
--need_profiler 是否使用Profiler,0表示否,1表示是。默认值为0。
--training_shape 设置固定训练shape。默认值为""。
--resize_rate 调整多尺度训练率。默认值为10。
--bind_cpu 分布式训练时是否绑定cpu。默认值为True。
--device_num 每台服务器的设备数量。默认值为8。
在Ascend上开始单机训练
#使用python命令进行训练(单卡)
python train.py \
--data_dir=xxx/dataset \
--yolov5_version='yolov5s' \
--is_distributed=0 \
--lr=0.01 \
--T_max=320
--max_epoch=320 \
--warmup_epochs=4 \
--per_batch_size=32 \
--lr_scheduler=cosine_annealing > log.txt 2>&1 &
在GPU上进行单卡训练时,应微调参数。
上述python命令将在后台运行,您可以通过log.txt
文件查看结果。
训练结束后,您可在默认outputs文件夹下找到checkpoint文件。得到如下损失值:
# grep "loss:" log.txt
2021-08-06 15:30:15,798:INFO:epoch[0], iter[600], loss:296.308071, fps:44.44 imgs/sec, lr:0.00010661844862625003
2021-08-06 15:31:21,119:INFO:epoch[0], iter[700], loss:276.071959, fps:48.99 imgs/sec, lr:0.00012435863027349114
2021-08-06 15:32:26,185:INFO:epoch[0], iter[800], loss:266.955208, fps:49.18 imgs/sec, lr:0.00014209879736881703
2021-08-06 15:33:30,507:INFO:epoch[0], iter[900], loss:252.610914, fps:49.75 imgs/sec, lr:0.00015983897901605815
2021-08-06 15:34:42,176:INFO:epoch[0], iter[1000], loss:243.106683, fps:44.65 imgs/sec, lr:0.00017757914611138403
2021-08-06 15:35:47,429:INFO:epoch[0], iter[1100], loss:240.498834, fps:49.04 imgs/sec, lr:0.00019531932775862515
2021-08-06 15:36:48,945:INFO:epoch[0], iter[1200], loss:245.711473, fps:52.02 imgs/sec, lr:0.00021305949485395104
2021-08-06 15:37:51,293:INFO:epoch[0], iter[1300], loss:231.388255, fps:51.33 imgs/sec, lr:0.00023079967650119215
2021-08-06 15:38:55,680:INFO:epoch[0], iter[1400], loss:238.904242, fps:49.70 imgs/sec, lr:0.00024853984359651804
2021-08-06 15:39:57,419:INFO:epoch[0], iter[1500], loss:232.161600, fps:51.83 imgs/sec, lr:0.00026628002524375916
2021-08-06 15:41:03,808:INFO:epoch[0], iter[1600], loss:227.844698, fps:48.20 imgs/sec, lr:0.00028402020689100027
2021-08-06 15:42:06,155:INFO:epoch[0], iter[1700], loss:226.668858, fps:51.33 imgs/sec, lr:0.00030176035943441093
...
运行shell脚本进行分布式训练示例(8卡)
# 在Ascend环境中运行shell脚本进行分布式训练示例(8卡)
bash run_distribute_train.sh [DATASET_PATH] [RANK_TABLE_FILE]
# 在GPU运行shell脚本进行分布式训练示例(8卡)
bash run_distribute_train_gpu.sh [DATASET_PATH] [RANK_SIZE]
上述shell脚本将在后台运行分布式训练。您可以通过文件train_parallel[X]/log.txt(Ascend)或distribute_train/nohup.out(GPU)查看结果 得到如下损失值:
# 分布式训练结果(8卡,动态shape)
...
2021-08-05 16:01:34,116:INFO:epoch[0], iter[200], loss:415.453676, fps:580.07 imgs/sec, lr:0.0002742903889156878
2021-08-05 16:01:57,588:INFO:epoch[0], iter[300], loss:273.358383, fps:545.96 imgs/sec, lr:0.00041075327317230403
2021-08-05 16:02:26,247:INFO:epoch[0], iter[400], loss:244.621502, fps:446.64 imgs/sec, lr:0.0005472161574289203
2021-08-05 16:02:55,532:INFO:epoch[0], iter[500], loss:234.524876, fps:437.10 imgs/sec, lr:0.000683679012581706
2021-08-05 16:03:25,046:INFO:epoch[0], iter[600], loss:235.185213, fps:434.08 imgs/sec, lr:0.0008201419259421527
2021-08-05 16:03:54,585:INFO:epoch[0], iter[700], loss:228.878598, fps:433.48 imgs/sec, lr:0.0009566047810949385
2021-08-05 16:04:23,932:INFO:epoch[0], iter[800], loss:219.259134, fps:436.29 imgs/sec, lr:0.0010930676944553852
2021-08-05 16:04:52,707:INFO:epoch[0], iter[900], loss:225.741833, fps:444.84 imgs/sec, lr:0.001229530549608171
2021-08-05 16:05:21,872:INFO:epoch[1], iter[1000], loss:218.811336, fps:438.91 imgs/sec, lr:0.0013659934047609568
2021-08-05 16:05:51,216:INFO:epoch[1], iter[1100], loss:219.491889, fps:436.50 imgs/sec, lr:0.0015024563763290644
2021-08-05 16:06:20,546:INFO:epoch[1], iter[1200], loss:219.895906, fps:436.57 imgs/sec, lr:0.0016389192314818501
2021-08-05 16:06:49,521:INFO:epoch[1], iter[1300], loss:218.516680, fps:441.79 imgs/sec, lr:0.001775382086634636
2021-08-05 16:07:18,303:INFO:epoch[1], iter[1400], loss:209.922935, fps:444.79 imgs/sec, lr:0.0019118449417874217
2021-08-05 16:07:47,702:INFO:epoch[1], iter[1500], loss:210.997816, fps:435.60 imgs/sec, lr:0.0020483077969402075
2021-08-05 16:08:16,482:INFO:epoch[1], iter[1600], loss:210.678421, fps:444.88 imgs/sec, lr:0.002184770768508315
2021-08-05 16:08:45,568:INFO:epoch[1], iter[1700], loss:203.285874, fps:440.07 imgs/sec, lr:0.0023212337400764227
2021-08-05 16:09:13,947:INFO:epoch[1], iter[1800], loss:203.014775, fps:451.11 imgs/sec, lr:0.0024576964788138866
2021-08-05 16:09:42,954:INFO:epoch[2], iter[1900], loss:194.683969, fps:441.28 imgs/sec, lr:0.0025941594503819942
...
在运行以下命令之前,请检查用于评估的检查点路径。以下脚本中使用的文件yolov5.ckpt是最后保存的检查点文件。
# 使用python命令进行评估
python eval.py \
--data_dir=xxx/dataset \
--pretrained=xxx/yolov5.ckpt \
--eval_shape=640 > log.txt 2>&1 &
或
# 运行shell脚本进行评估
bash run_eval.sh [DATASET_PATH] [CHECKPOINT_PATH] [DEVICE_ID]
上述python命令将在后台运行。您可以通过"log.txt"文件查看结果。测试数据集的mAP如下:
# log.txt
=============coco eval reulst=========
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.369
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.573
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.395
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.218
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.418
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.482
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.298
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.501
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.557
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.395
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.619
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.677
2020-12-21 17:16:40,322:INFO:testing cost time 0.35h
推理前需参照 MindSpore C++推理部署指南 进行环境变量设置。
python export.py --ckpt_file [CKPT_PATH] --file_name [FILE_NAME] --file_format [FILE_FORMAT]
必须设置ckpt_file参数。
file_format
的值为AIR或MINDIR
在进行推理之前,必须通过export.py
脚本导出MindIR文件。下方为使用MindIR模型进行推理的例子。
注意当前batch_Size只能设置为1。
# Ascend 310推理
bash run_infer_cpp.sh [MINDIR_PATH] [DATA_PATH] [ANN_FILE] [DVPP] [DEVICE_ID]
DVPP
必填,可选值为DVPP或CPU,不区分大小写。DVPP硬件要求宽度为16对齐和高度为偶对齐。因此,网络需要使用CPU算子来处理图像。DATA_PATH
为必填项,包含图像数据集的路径。ANN_FILE
为必填项,标注文件的路径。DEVICE_ID
是可选参数,默认值为0。推理结果保存在当前路径中,您可以在acc.log文件中找到类似如下结果。
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.369
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.573
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.395
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.218
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.418
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.482
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.298
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.501
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.557
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.395
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.619
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.677
导出ONNX模型
python export.py --ckpt_file /path/to/yolov5.ckpt --file_name /path/to/yolov5.onnx --file_format ONNX
从YOLOv5目录运行ONNX评估:
bash scripts/run_eval_onnx.sh <DATA_DIR> <ONNX_MODEL_PATH> [<DEVICE_TARGET>]
您可以通过文件eval.log查看结果。验证数据集的mAP如下所示:
=============coco eval reulst=========
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.366
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.569
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.397
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.213
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.415
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.474
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.299
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.501
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.557
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.399
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.611
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.677
YOLOv5应用于118000张图像上(标注和数据格式必须与COCO 2017相同)
参数 | YOLOv5s | YOLOv5s |
---|---|---|
资源 | Ascend 910;CPU 2.60GHz,192核;内存755GB | GPU NV SMX2 V100-32G |
上传日期 | 7/12/2021 | 9/15/2021 |
MindSpore版本 | 1.2.0 | 1.3.0 |
数据集 | 118000张图 | 118000张图 |
训练参数 | epoch=300, batch_size=8, lr=0.02,momentum=0.9,warmup_epoch=20 | epoch=300, batch_size=32, lr=0.025, warmup_epoch=20, 8p |
优化器 | 动量 | 动量 |
损失函数 | Sigmoid Cross Entropy with logits, Giou Loss | Sigmoid Cross Entropy with logits, Giou Loss |
输出 | 框和标签 | 框和标签 |
损失 | 111.970097 | 85 |
速度 | 8卡,约450FPS | 8卡,约290FPS |
总时长 | 8卡,21小时28分钟 | 8卡,35小时 |
微调检查点 | 53.62MB(.ckpt文件) | 58.87MB(.ckpt文件) |
脚本 | https://gitee.com/mindspore/models/tree/master/official/cv/YOLOv5 | https://gitee.com/mindspore/models/tree/master/official/cv/YOLOv5 |
参数 | YOLOv5s | YOLOv5s |
---|---|---|
资源 | Ascend 910;CPU 2.60GHz,192核;内存755GB | GPU NV SMX2 V100-32G |
上传日期 | 7/12/2021 | 9/15/2021 |
MindSpore版本 | 1.2.0 | 1.3.0 |
数据集 | 20000张图 | 20000张图 |
batch_size | 1 | 1 |
输出 | 边框位置和分数,以及概率 | 边框位置和分数,以及概率 |
准确率 | mAP >= 36.7%(shape=640) | mAP >= 36.7%(shape=640) |
推理模型 | 56.67MB(.ckpt文件) | 58.87MB(.ckpt文件) |
在dataset.py中,我们设置了“create_dataset”函数内的种子。我们还在train.py中使用随机种子。
请查看官方主页。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。