目录
YOLOv3-tiny描述
You only look once(YOLO)是最先进的实时物体检测系统。YOLOv3非常快速和准确。
先前的检测系统重新利用分类器或定位器来执行检测,将模型应用于多个位置和尺度的图像。图像的高分区域被认为是检测。
YOLOv3使用了完全不同的方法。该方法将单个神经网络应用于全图像,将图像划分为区域,并预测每个区域的边界框和概率。这些边界框由预测概率加权。
YOLOv3使用了一些技巧来改进训练,提高性能,包括多尺度预测、更好的主干分类器等等,详情见论文。
而YOLOv3-tiny是YOLOv3的简化版,修改了backbone,而且只保留了两个预测分支,速度特别快,可以满足性能要求。
论文: YOLOv3: An Incremental Improvement.Joseph Redmon, Ali Farhadi,
University of Washington
模型架构
YOLOv3使用DarkNet53执行特征提取,这是YOLOv2中的Darknet-19和残差网络的一种混合方法。DarkNet53使用连续的3×3和1×1卷积层,并且有一些快捷连接,而且DarkNet53明显更大,它有53层卷积层。
而YOLOv3-tiny使用conv+maxpooling混合叠加执行特征提取,backbone特征结构如下:
backbone:
# [from, number, module, args]
[[-1, 1, Conv, [16, 3, 1]], # 0
[-1, 1, nn.MaxPool2d, [2, 2, 0]], # 1-P1/2
[-1, 1, Conv, [32, 3, 1]],
[-1, 1, nn.MaxPool2d, [2, 2, 0]], # 3-P2/4
[-1, 1, Conv, [64, 3, 1]],
[-1, 1, nn.MaxPool2d, [2, 2, 0]], # 5-P3/8
[-1, 1, Conv, [128, 3, 1]],
[-1, 1, nn.MaxPool2d, [2, 2, 0]], # 7-P4/16
[-1, 1, Conv, [256, 3, 1]],
[-1, 1, nn.MaxPool2d, [2, 2, 0]], # 9-P5/32
[-1, 1, Conv, [512, 3, 1]],
[-1, 1, nn.ZeroPad2d, [[0, 1, 0, 1]]], # 11
[-1, 1, nn.MaxPool2d, [2, 1, 0]], # 12
]
目标检测部分特征结构如下:
head:
[[-1, 1, Conv, [1024, 3, 1]],
[-1, 1, Conv, [256, 1, 1]],
[-1, 1, Conv, [512, 3, 1]], # 15 (P5/32-large)
[-2, 1, Conv, [128, 1, 1]],
[-1, 1, nn.Upsample, [None, 2, 'nearest']],
[[-1, 8], 1, Concat, [1]], # cat backbone P4
[-1, 1, Conv, [256, 3, 1]], # 19 (P4/16-medium)
[[19, 15], 1, Detect, [nc, anchors]], # Detect(P4, P5)
]
数据集
使用的数据集:COCO 2017
- 数据集大小:19G,123287张图片,80个物体类别
- 训练集:18G,118287张图像
- 验证集:777M,5000张图像
- 标注:241M,训练/验证标注
- 数据集的文件目录结构如下所示
├── dataset
├── coco2017
├── annotations
│ ├─ train.json
│ └─ val.json
├─ train2017
│ ├─picture1.jpg
│ ├─ ...
│ └─picturen.jpg
└─ val2017
├─picture1.jpg
├─ ...
└─picturen.jpg
- 如果,用户使用的是用户自己的数据集,则需要将数据集格式转化为coco数据格式,并且,json文件中的数据要和图片数据对应好。
接入用户数据后,因为图片数据尺寸和数量不一样,lr、anchor_scale和training_shape可能需要适当调整。
环境要求
- 硬件(Ascend/GPU)
- 框架
- 如需查看详情,请参见如下资源:
脚本说明
脚本及样例代码
.
└─YOLOv3-tiny
├─310_infer
├─inc
└─utils.h # 推理代码头文件
├─src
├─main.cc # 主要推理代码
└─utils.cc # 工具函数
├─aipp.cfg # aipp配置文件
├─build.sh # cmake项目配置脚本
└─CMakeLists.txt # CMakeLists.txt
├─model_utils
├─__init__.py # python初始化文件
├─config.py # 获取.yaml配置参数
├─device_adapter.py # 根据参数设置获取云上或者本地设备参数
├─local_adapter.py # 获取本地设备参数
└─moxing_adapter.py # 获取云上设备参数及云上数据准备
├─scripts
├─run_standalone_train.sh # 在Ascend中启动单机训练(1卡)
├─run_distribute_train.sh # 在Ascend中启动分布式训练(8卡)
├─run_eval.sh # 在Ascend910中启动评估
└─run_infer_310.sh # 在Ascend310中启动评估
├─src
├─__init__.py # python初始化文件
├─distributed_sampler.py # 数据集迭代器
├─initializer.py # 参数初始化器
├─logger.py # 日志函数
├─loss.py # 损失函数
├─lr_scheduler.py # 生成学习率
├─transforms.py # 多尺度等预处理数据
├─util.py # 工具函数
├─yolo_dataset.py # 创建数据集
├─yolo_tiny.py # YOLOv3-tiny网络结构
├─weight
└─mytiny.ckpt # YOLOv3-tiny预训练模型
├─default_config.yaml # 参数配置
├─hccl__tools.py # 生成hccl配置文件
├─README.md # YOLOv3相关说明
├─eval.py # 评估网络
└─train.py # 训练网络
脚本参数
train.py中主要参数如下:
可选参数:
-h, --help 显示此帮助消息并退出。
--Device_target 实现代码的设备:“Ascend" | "GPU"。默认设置:"Ascend"。
--data_dir DATA_DIR 训练数据集目录。
--per_batch_size PER_BATCH_SIZE
训练批次大小。默认设置:32。
--pretrained_model PRETRAINED_Model
预训练模型。默认设置:""。
--resume_yolov3 RESUME_YOLOV3
YOLOv3的ckpt文件,用于微调。默认设置:""。
--lr_scheduler LR_SCHEDULER
学习率调度器,选项:exponential,cosine_annealing。默认设置:cosine_annealing。
--lr LR 学习率。默认设置:0.001。
--lr_epochs LR_EPOCHS
lr changing轮次,用“,”分隔。默认设置: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.937。
--loss_scale LOSS_SCALE
静态损失等级。默认设置:1024。
--label_smooth LABEL_SMOOTH
CE中是否使用标签平滑。默认设置:0。
--label_smooth_factor LABEL_SMOOTH_FACTOR
独热平滑强度。默认设置:0.1。
--log_interval LOG_INTERVAL
日志记录迭代间隔。默认设置:100。
--ckpt_path CKPT_PATH
检查点保存位置。默认设置:outputs/。
--ckpt_interval CKPT_INTERVAL
保存检查点间隔。默认设置:None。
--is_save_on_master IS_SAVE_ON_MASTER
在主进程序号或所有进程序号上保存ckpt。1为主进程序号, 0为所有进程序号。默认设置:1。
--is_distributed IS_DISTRIBUTED
是否分布训练,1表示是,0表示否,默认设置:1。
--rank RANK 分布式本地排名。默认设置:0。
--group_size GROUP_SIZE
设备进程总数。默认设置:1。
--need_profiler NEED_PROFILER
是否使用调优器。0表示否,1表示是。默认设置:0。
--training_shape TRAINING_SHAPE
固定训练形状。默认设置:""。
--resize_rate RESIZE_RATE
多尺度训练的调整率。默认设置:None。
训练过程
训练
运行以下命令。如果在GPU上运行,请在python命令中添加--device_target=GPU
```python
python train.py \
--data_dir=/data/COCO2017 \
--pretrained_backbone=weight/mytiny.ckpt \
--is_distributed=0 \
--lr=0.01 \
--T_max=320 \
--max_epoch=320 \
--warmup_epochs=4 \
--ignore_threshold=0.5 \
--training_shape=416 \
--lr_scheduler=cosine_annealing > log.txt 2>&1 &
上述python命令将在后台运行,您可以通过log.txt
文件查看结果。
对于Ascend设备,使用shell脚本训练示例(单卡)
#单卡训练
bash run_standalone_train.sh /data/COCO2017 weight/mytiny.ckpt
对于Ascend设备,使用shell脚本分布式训练示例(8卡)
#8卡训练
bash run_distribute_train.sh /data/COCO2017 weight/mytiny.ckpt rank_table_8p.json
在modelarts上进行8卡训练(Ascend)
(1)上传代码到桶里
(2)上传预训练模型到桶里,或者使用转换好的mytiny.ckpt
(3)上传数据集到桶里
(4)设置代码目录、启动文件、数据集、训练输出位置、作业日志路径
(5)设置参数:
在网页设置参数 checkpoint_url = obs://your_checkpoint_path
在网页设置参数 enable_modelarts=True
在网页设置参数 per_batch_size=32
在网页设置参数 is_distributed=1
在网页设置参数 pretrained_model= mytiny.ckpt
(6)设置节点
(7)创建训练作业
评估过程
评估
运行以下命令。如果在GPU上运行,请在python命令中添加--device_target=GPU
。
python eval.py --data_dir=/data/COCO2017 --pretrained=weight/0-320_146560.ckpt --testing_shape=416 > log.txt 2>&1 &
或者
bash run_eval.sh /data/COCO2017/ weight/0-320_146560.ckpt
上述python命令将在后台运行,您可以通过log.txt文件查看结果。测试数据集的mAP如下:
# log.txt
=============coco eval result=========
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.162
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.352
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.128
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.048
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.170
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.267
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.164
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.258
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.280
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.108
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.298
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.427
导出mindir模型
python export.py --ckpt_file [CKPT_PATH] --file_name [FILE_NAME] --file_format [FILE_FORMAT]
参数ckpt_file
是必需的,目前,EXPORT_FORMAT
必须在 ["AIR", "MINDIR"]中进行选择,建议首选MINDIR。
推理过程
用法
在执行推理之前,需要通过export.py导出mindir文件。
目前仅可处理batch_Size为1,由于使用了DVPP硬件进行图片处理,因此图片必须满足JPEG编码格式,否则将会报错。
# Ascend310 推理
bash run_infer_310.sh [MINDIR_PATH] [DATA_PATH] [ANNO_PATH] [DEVICE_ID]
DEVICE_ID
可选,默认值为 0。
结果
推理结果保存在当前路径,可在acc.log中看到最终精度结果。
=============coco eval result=========
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.164
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.357
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.128
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.051
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.173
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.269
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.165
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.259
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.282
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.110
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.300
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.433
模型描述
性能
评估性能
参数 |
YOLOv3-tiny |
资源 |
Ascend 910;CPU 192核;内存 2048G; |
上传日期 |
2021-08-24 |
MindSpore版本 |
1.2.1 |
数据集 |
COCO2017 |
训练参数 |
epoch=320,batch_size=32,lr=0.001,momentum=0.937,ignore_threshold=0.5 |
优化器 |
Momentum |
损失函数 |
带logits的Sigmoid交叉熵 |
输出 |
边界框和标签 |
损失 |
39 |
速度 |
1卡:145.3毫秒/步; |
总时长 |
8卡:18小时 |
推理性能
参数 |
YOLOv3-tiny |
资源 |
Ascend 910 |
上传日期 |
2021-08-24 |
MindSpore版本 |
1.2.1 |
数据集 |
COCO2017,5000张图像 |
batch_size |
1 |
输出 |
mAP0.5:0.95=0.164, mAP0.5=0.357 |
随机情况说明
在distributed_sampler.py、transforms.py、yolo_dataset.py文件中有随机种子。