!18648 fix eval of yolov5

Merge pull request !18648 from zhouyaqiang0/master
This commit is contained in:
i-robot 2021-06-23 06:30:05 +00:00 committed by Gitee
commit e07f1e3a98
4 changed files with 370 additions and 4 deletions

View File

@ -371,7 +371,7 @@ YOLOv5 on 118K images(The annotation and data format must be the same as coco201
| Resource | Ascend 910; CPU 2.60GHz, 192cores; Memory, 755G | | Resource | Ascend 910; CPU 2.60GHz, 192cores; Memory, 755G |
| uploaded Date | 5/14/2021 (month/day/year) | | uploaded Date | 5/14/2021 (month/day/year) |
| MindSpore Version | 1.0.0-alpha | | MindSpore Version | 1.0.0-alpha |
| Dataset | 11.8K images | | Dataset | 118K images |
| Training Parameters | epoch=320, batch_size=8, lr=0.01, momentum=0.9 | | Training Parameters | epoch=320, batch_size=8, lr=0.01, momentum=0.9 |
| Optimizer | Momentum | | Optimizer | Momentum |
| Loss Function | Sigmoid Cross Entropy with logits, Giou Loss | | Loss Function | Sigmoid Cross Entropy with logits, Giou Loss |

View File

@ -0,0 +1,365 @@
# 目录
- [YOLOv5说明](#yolov5说明)
- [模型架构](#模型架构)
- [数据集](#数据集)
- [环境要求](#环境要求)
- [快速入门](#快速入门)
- [脚本说明](#脚本说明)
- [脚本和示例代码](#脚本和示例代码)
- [脚本参数](#脚本参数)
- [训练过程](#训练过程)
- [训练](#训练)
- [测试过程](#测试过程)
- [测试](#测试)
- [评估过程](#评估过程)
- [评估](#评估)
- [转换过程](#转换过程)
- [转换](#转换)
- [模型说明](#模型说明)
- [性能](#性能)
- [评估性能](#评估性能)
- [推理性能](#推理性能)
- [ModelZoo主页](#modelzoo主页)
# [YOLOv5描述](#目录)
YOLOv5作为先进的检测器它比所有可用的替代检测器更快FPS并且更准确MS COCO AP50 ... 95和AP50
本文已经验证了大量的特征,并选择使用这些特征来提高分类和检测的精度。
这些特性可以作为未来研究和开发的最佳实践。
[代码](https://github.com/ultralytics/yolov5)
# [模型架构](#目录)
选择CSP Focus主干、SPP附加模块、PANet路径聚合网络和YOLOv5基于锚点头作为YOLOv5架构。
# [数据集](#目录)
支持的数据集:[MS COCO]或与MS COCO格式相同的数据集
支持的标注:[MS COCO]或与MS COCO相同格式的标注
- 目录结构如下,由用户定义目录和文件的名称:
```shell
©À©¤©¤ dataset
©À©¤©¤ YOLOv5
©À©¤©¤ annotations
©¦ ©À©¤ train.json
©¦ ©¸©¤ val.json
©À©¤ images
©À©¤ train
©¦ ©¸©¤images
©¦ ©À©¤picture1.jpg
©¦ ©À©¤ ...
©¦ ©¸©¤picturen.jpg
©¸©¤ val
©¸©¤images
©À©¤picture1.jpg
©À©¤ ...
©¸©¤picturen.jpg
```
建议用户使用MS COCO数据集来体验模型
其他数据集需要使用与MS COCO相同的格式。
# [环境要求](#目录)
- 硬件 Ascend
- 使用Ascend处理器准备硬件环境。
- 框架
- [MindSpore](https://cmc-szv.clouddragon.huawei.com/cmcversion/index/search?searchKey=Do-MindSpore%20V100R001C00B622)
- 更多关于Mindspore的信息请查看以下资源
- [MindSpore教程](https://www.mindspore.cn/tutorial/zh-CN/master/index.html)
- [MindSpore API](https://www.mindspore.cn/api/zh-CN/master/index.html)
# [快速入门](#目录)
通过官方网站安装MindSpore后您可以按照如下步骤进行训练和评估
``` shell
# training_shape参数定义网络图像形状默认为[640, 640]。
```
```shell
# python命令执行训练示例1卡
python train.py \
--data_dir=./dataset/xxx \
--is_distributed=0 \
--lr=0.01 \
--T_max=320 \
--max_epoch=320 \
--warmup_epochs=4 \
--training_shape=640 \
--lr_scheduler=cosine_annealing > log.txt 2>&1 &
```
```shell
# shell脚本单机训练示例1卡
sh run_standalone_train.sh dataset/xxx
```
```shell
# 对于Ascend设备使用shell脚本分布式训练示例8卡
sh run_distribute_train.sh dataset/xxx rank_table_8p.json
```
```python
# 使用python命令评估
python eval.py \
--data_dir=./dataset/xxx \
--pretrained=yolov5.ckpt \
--testing_shape=640 > log.txt 2>&1 &
```
```python
# shell脚本执行评估
sh run_eval.sh dataset/xxx checkpoint/xxx.ckpt
```
# [脚本说明](#目录)
## [脚本和示例代码](#目录)
```python
©¸©¤yolov5
©À©¤README.md
©À©¤mindspore_hub_conf.md # Mindspore Hub配置
©À©¤scripts
©À©¤run_standalone_train.sh # 在Ascend中启动单机训练1卡
©À©¤run_distribute_train.sh # 在Ascend中启动分布式训练8卡
©¸©¤run_eval.sh # 在Ascend中启动评估
©À©¤src
©À©¤__init__.py # Python初始化文件
©À©¤config.py # 参数配置
©À©¤yolov5_backbone.py # 网络骨干
©À©¤distributed_sampler.py # 数据集迭代器
©À©¤initializer.py # 参数初始化器
©À©¤logger.py # 日志函数
©À©¤loss.py # 损失函数
©À©¤lr_scheduler.py # 生成学习率
©À©¤transforms.py # 预处理数据
©À©¤util.py # 工具函数
©À©¤yolo.py # YOLOv5网络
©À©¤yolo_dataset.py # 为YOLOv5创建数据集
©À©¤eval.py # 评估验证结果
©À©¤export.py # 将MindSpore模型转换为AIR模型
©¸©¤train.py # 训练网络
```
## [脚本参数](#目录)
train.py中主要参数如下
```shell
可选参数:
-h, --help 显示此帮助消息并退出
--device_target 实现代码的设备“Ascend”默认值|“GPU”
--data_dir DATA_DIR 训练数据集目录
--per_batch_size PER_BATCH_SIZE
训练的批处理大小。 默认值8。
--pretrained_backbone PRETRAINED_BACKBONE
YOLOv5主干文件。 默认值:""。
--resume_yolov5 RESUME_YOLOV5
YOLOv5的ckpt文件用于微调。
默认值:""
--lr_scheduler LR_SCHEDULER
学习率调度器取值选项exponential
cosine_annealing。 默认值exponential
--lr LR 学习率。 默认值0.01
--lr_epochs LR_EPOCHS
LR变化轮次用“,”分隔。
默认值220,250
--lr_gamma LR_GAMMA 将LR降低一个exponential lr_scheduler因子。
默认值0.1
--eta_min ETA_MIN cosine_annealing调度器中的eta_min。 默认值0
--T_max T_MAX cosine_annealing调度器中的T-max。 默认值320
--max_epoch MAX_EPOCH
训练模型的最大轮次数。 默认值320
--warmup_epochs WARMUP_EPOCHS
热身轮次。 默认值0
--weight_decay WEIGHT_DECAY
权重衰减因子。 默认值0.0005
--momentum MOMENTUM 动量。 默认值0.9
--loss_scale LOSS_SCALE
静态损失尺度。 默认值1024
--label_smooth LABEL_SMOOTH
CE中是否使用标签平滑。 默认值0
--label_smooth_factor LABEL_SMOOTH_FACTOR
原one-hot的光滑强度。 默认值0.1
--log_interval LOG_INTERVAL
日志记录间隔步数。 默认值100
--ckpt_path CKPT_PATH
Checkpoint保存位置。 默认值outputs/
--ckpt_interval CKPT_INTERVAL
保存checkpoint间隔。 默认值None
--is_save_on_master IS_SAVE_ON_MASTER
在master或all rank上保存ckpt1代表master0代表
all ranks。 默认值1
--is_distributed IS_DISTRIBUTED
是否分发训练1代表是0代表否。 默认值:
1
--rank RANK 分布式本地进程序号。 默认值0
--group_size GROUP_SIZE
设备进程总数。 默认值1
--need_profiler NEED_PROFILER
是否使用profiler。 0表示否1表示是。 默认值0
--training_shape TRAINING_SHAPE
恢复训练形状。 默认值:""
--resize_rate RESIZE_RATE
多尺度训练的缩放速率。 默认值None
```
## [训练过程](#目录)
### 训练
```python
python train.py \
--data_dir=/dataset/xxx \
--is_distributed=0 \
--lr=0.01 \
--T_max=320 \
--max_epoch=320 \
--warmup_epochs=4 \
--training_shape=640 \
--lr_scheduler=cosine_annealing > log.txt 2>&1 &
```
上述python命令将在后台运行您可以通过log.txt文件查看结果。
训练结束后您可在默认输出文件夹下找到checkpoint文件。 得到如下损失值:
```shell
# grep "loss:" train/log.txt
2021-05-13 20:50:25,617:INFO:epoch[0], iter[100], loss:loss:2648.764910, fps:61.59 imgs/sec, lr:1.7226087948074564e-05
2021-05-13 20:50:39,821:INFO:epoch[0], iter[200], loss:loss:764.535622, fps:56.33 imgs/sec, lr:3.4281620173715055e-05
2021-05-13 20:50:53,287:INFO:epoch[0], iter[300], loss:loss:494.950782, fps:59.47 imgs/sec, lr:5.1337152399355546e-05
2021-05-13 20:51:06,138:INFO:epoch[0], iter[400], loss:loss:393.339678, fps:62.25 imgs/sec, lr:6.839268462499604e-05
2021-05-13 20:51:17,985:INFO:epoch[0], iter[500], loss:loss:329.976604, fps:67.57 imgs/sec, lr:8.544822048861533e-05
2021-05-13 20:51:29,359:INFO:epoch[0], iter[600], loss:loss:294.734397, fps:70.37 imgs/sec, lr:0.00010250374907627702
2021-05-13 20:51:40,634:INFO:epoch[0], iter[700], loss:loss:281.497078, fps:70.98 imgs/sec, lr:0.00011955928493989632
2021-05-13 20:51:52,307:INFO:epoch[0], iter[800], loss:loss:264.300707, fps:68.54 imgs/sec, lr:0.0001366148208035156
2021-05-13 20:52:05,479:INFO:epoch[0], iter[900], loss:loss:261.971103, fps:60.76 imgs/sec, lr:0.0001536703493911773
2021-05-13 20:52:17,362:INFO:epoch[0], iter[1000], loss:loss:264.591175, fps:67.33 imgs/sec, lr:0.00017072587797883898
...
```
### 分布式训练
对于Ascend设备使用shell脚本分布式训练示例8卡
```shell
sh run_distribute_train.sh dataset/coco2017 rank_table_8p.json
```
上述shell脚本将在后台运行分布式训练。 您可以通过train_parallel[X]/log.txt文件查看结果。 得到如下损失值:
```shell
# 分布式训练示例8卡
...
2021-05-13 21:08:41,992:INFO:epoch[0], iter[600], loss:247.577421, fps:469.29 imgs/sec, lr:0.0001640283880988136
2021-05-13 21:08:56,291:INFO:epoch[0], iter[700], loss:235.298894, fps:447.67 imgs/sec, lr:0.0001913209562189877
2021-05-13 21:09:10,431:INFO:epoch[0], iter[800], loss:239.481037, fps:452.78 imgs/sec, lr:0.00021861353889107704
2021-05-13 21:09:23,517:INFO:epoch[0], iter[900], loss:232.826709, fps:489.15 imgs/sec, lr:0.0002459061215631664
2021-05-13 21:09:36,407:INFO:epoch[0], iter[1000], loss:224.734599, fps:496.65 imgs/sec, lr:0.0002731987042352557
2021-05-13 21:09:49,072:INFO:epoch[0], iter[1100], loss:232.334771, fps:505.34 imgs/sec, lr:0.0003004912578035146
2021-05-13 21:10:03,597:INFO:epoch[0], iter[1200], loss:242.001476, fps:440.69 imgs/sec, lr:0.00032778384047560394
2021-05-13 21:10:18,237:INFO:epoch[0], iter[1300], loss:225.391021, fps:437.20 imgs/sec, lr:0.0003550764231476933
2021-05-13 21:10:33,027:INFO:epoch[0], iter[1400], loss:228.738176, fps:432.76 imgs/sec, lr:0.0003823690058197826
2021-05-13 21:10:47,424:INFO:epoch[0], iter[1500], loss:225.712950, fps:444.54 imgs/sec, lr:0.0004096615593880415
2021-05-13 21:11:02,077:INFO:epoch[0], iter[1600], loss:221.249353, fps:436.77 imgs/sec, lr:0.00043695414206013083
2021-05-13 21:11:16,631:INFO:epoch[0], iter[1700], loss:222.449119, fps:439.89 imgs/sec, lr:0.00046424672473222017
...
```
## [评估过程](#目录)
### 验证
```python
python eval.py \
--data_dir=./dataset/coco2017 \
--pretrained=yolov5.ckpt \
--testing_shape=640 > log.txt 2>&1 &
OR
sh run_eval.sh dataset/coco2017 checkpoint/yolov5.ckpt
```
上述python命令将在后台运行。 您可以通过log.txt文件查看结果。 测试数据集的mAP如下
```shell
# log.txt
=============coco eval reulst=========
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.372
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.574
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.403
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.219
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.426
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.480
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.302
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.504
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.560
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.619
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.674
```
## [转换过程](#目录)
### 转换
如果您想推断Ascend 310上的网络则应将模型转换为AIR
```python
python export.py [BATCH_SIZE] [PRETRAINED_BACKBONE]
```
# [模型说明](#目录)
## [性能](#目录)
### 评估性能
YOLOv5应用于118000张图像上标注和数据格式必须与COCO 2017相同
|参数| YOLOv5s |
| -------------------------- | ----------------------------------------------------------- |
| 资源 | Ascend 910CPU 2.60GHz192核内存755G |
|上传日期| 2021年05月14日 |
| MindSpore版本|1.0.0-alpha|
|数据集|118000张图像|
|训练参数|epoch=320, batch_size=8, lr=0.01, momentum=0.9|
| 优化器 | Momentum |
|损失函数|Sigmoid Cross Entropy with logits, Giou Loss|
|输出|heatmaps |
| 损失 | 53 |
|速度| 1卡55 img/s8卡440 img/sshape=640|
| 总时长 | 80小时 |
| 微调检查点 | 58M .ckpt文件 |
|脚本| <https://gitee.com/mindspore/mindspore/tree/master/model_zoo/> |
### 推理性能
YOLOv5应用于5000张图像上标注和数据格式必须与COCO val 2017相同
|参数| YOLOv5s |
| -------------------------- | ----------------------------------------------------------- |
| 资源 | Ascend 910CPU 2.60GHz192核内存755G |
|上传日期| 2021年05月14日 |
| MindSpore版本 | 1.2.0 |
|数据集|5000张图像|
|批处理大小|1|
|输出|边框位置和分数,以及概率|
|精度|map=36.8~37.2%shape=640|
|推理模型| 58M.ckpt文件|
# [随机情况说明](#目录)
在dataset.py中我们设置了“create_dataset”函数内的种子。
在var_init.py中我们设置了权重初始化的种子。
# [ModelZoo主页](#目录)
请浏览官网[主页](https://gitee.com/mindspore/mindspore/tree/master/model_zoo)。

View File

@ -18,6 +18,7 @@ import argparse
import datetime import datetime
import time import time
import sys import sys
import ast
from collections import defaultdict from collections import defaultdict
import numpy as np import numpy as np
@ -56,7 +57,7 @@ parser.add_argument('--nms_thresh', type=float, default=0.6, help='threshold for
parser.add_argument('--ann_file', type=str, default='', help='path to annotation') parser.add_argument('--ann_file', type=str, default='', help='path to annotation')
parser.add_argument('--testing_shape', type=str, default='', help='shape for test ') parser.add_argument('--testing_shape', type=str, default='', help='shape for test ')
parser.add_argument('--ignore_threshold', type=float, default=0.001, help='threshold to throw low quality boxes') parser.add_argument('--ignore_threshold', type=float, default=0.001, help='threshold to throw low quality boxes')
parser.add_argument('--multi_label', type=ast.iteral_eval, default=True, help='whether to use multi label') parser.add_argument('--multi_label', type=ast.literal_eval, default=True, help='whether to use multi label')
parser.add_argument('--multi_label_thresh', type=float, default=0.1, help='threshhold to throw low quality boxes') parser.add_argument('--multi_label_thresh', type=float, default=0.1, help='threshhold to throw low quality boxes')
args, _ = parser.parse_known_args() args, _ = parser.parse_known_args()
@ -115,7 +116,7 @@ class DetectionEngine:
for clsi in self.results[img_id]: for clsi in self.results[img_id]:
dets = self.results[img_id][clsi] dets = self.results[img_id][clsi]
dets = np.array(dets) dets = np.array(dets)
keep_index = self._diou_nms(dets, thresh=nms_thresh) keep_index = self._diou_nms(dets, thresh=self.nms_thresh)
keep_box = [{'image_id': int(img_id), keep_box = [{'image_id': int(img_id),
'category_id': int(clsi), 'category_id': int(clsi),

View File

@ -78,7 +78,7 @@ def parse_args(cloud_args=None):
# logging related # logging related
parser.add_argument('--log_interval', type=int, default=100, help='Logging interval steps. Default: 100') parser.add_argument('--log_interval', type=int, default=100, help='Logging interval steps. Default: 100')
parser.add_argument('--ckpt_path', type=str, default='outputs/', help='Checkpoint save location. Default: outputs/') parser.add_argument('--ckpt_path', type=str, default='outputs/', help='Checkpoint save location. Default: outputs/')
parser.add_argument('--ckpt_interval', type=int, default=None, help='Save checkpoint interval. Default: None') parser.add_argument('--ckpt_interval', type=int, default=10, help='Save checkpoint interval. Default: 10')
parser.add_argument('--is_save_on_master', type=int, default=1, parser.add_argument('--is_save_on_master', type=int, default=1,
help='Save ckpt on master or all rank, 1 for master, 0 for all ranks. Default: 1') help='Save ckpt on master or all rank, 1 for master, 0 for all ranks. Default: 1')