You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mindspore/model_zoo/official/cv/yolov3_darknet53/README_CN.md

17 KiB

目录

YOLOv3-DarkNet53描述

You only look onceYOLO是最先进的实时物体检测系统。YOLOv3非常快速和准确。

先前的检测系统重新利用分类器或定位器来执行检测,将模型应用于多个位置和尺度的图像。图像的高分区域被认为是检测。 YOLOv3使用了完全不同的方法。该方法将单个神经网络应用于全图像将图像划分为区域并预测每个区域的边界框和概率。这些边界框由预测概率加权。

YOLOv3使用了一些技巧来改进训练提高性能包括多尺度预测、更好的主干分类器等等详情见论文。

论文: YOLOv3: An Incremental Improvement.Joseph Redmon, Ali Farhadi, University of Washington

模型架构

YOLOv3使用DarkNet53执行特征提取这是YOLOv2中的Darknet-19和残差网络的一种混合方法。DarkNet53使用连续的3×3和1×1卷积层并且有一些快捷连接而且DarkNet53明显更大它有53层卷积层。

数据集

使用的数据集:COCO 2014

  • 数据集大小19G123287张图片80个物体类别

    • 训练集13G82783张图像
    • 验证集6GM40504张图像
    • 标注241M训练/验证标注
  • 数据集的文件目录结构如下所示

        ├── dataset
            ├── coco2014
                ├── annotations
                │   ├─ train.json
                │   └─ val.json
                ├─ train
                │   ├─picture1.jpg
                │   ├─ ...
                │   └─picturen.jpg
                └─ val
                    ├─picture1.jpg
                    ├─ ...
                    └─picturen.jpg
    

环境要求

快速入门

  • 通过官方网站安装MindSpore后您可以按照如下步骤进行训练和评估如果在GPU上运行请在python命令中添加--device_target=GPU或者使用“_gpu”shell脚本“xxx_gpu.sh”
  • 在运行任务之前需要准备backbone_darknet53.ckpt和hccl_8p.json文件。
    • 使用src路径下的convert_weight.py脚本将darknet53.conv.74转换成mindspore ckpt格式。

      python convert_weight.py --input_file ./darknet53.conv.74
      

      可以从网站下载 darknet53.conv.74文件。 也可以在linux系统中使用指令下载该文件。

      wget https://pjreddie.com/media/files/darknet53.conv.74
      
    • 可以运行model_zoo/utils/hccl_tools/路径下的hccl_tools.py脚本生成hccl_8p.json文件下面指令中参数"[0, 8)"表示生成0-7的8卡hccl_8p.json文件。

      python hccl_tools.py --device_num "[0,8)"
      
# training_shape参数定义网络图像形状默认为""。
# 意思是使用10种形状作为输入形状或者可以设置某种形状。
# 通过python命令执行训练示例(1卡)。
python train.py \
    --data_dir=./dataset/coco2014 \
    --pretrained_backbone=darknet53_backbone.ckpt \
    --is_distributed=0 \
    --lr=0.1 \
    --T_max=320 \
    --max_epoch=320 \
    --warmup_epochs=4 \
    --training_shape=416 \
    --lr_scheduler=cosine_annealing > log.txt 2>&1 &
# shell脚本单机训练示例(1卡)
sh run_standalone_train.sh dataset/coco2014 darknet53_backbone.ckpt
# 对于Ascend设备使用shell脚本分布式训练示例(8卡)
sh run_distribute_train.sh dataset/coco2014 darknet53_backbone.ckpt rank_table_8p.json
# 对于GPU设备使用shell脚本分布式训练示例(8卡)
sh run_distribute_train_gpu.sh dataset/coco2014 darknet53_backbone.ckpt
# 使用python命令评估
python eval.py \
    --data_dir=./dataset/coco2014 \
    --pretrained=yolov3.ckpt \
    --testing_shape=416 > log.txt 2>&1 &
# 通过shell脚本运行评估
sh run_eval.sh dataset/coco2014/ checkpoint/0-319_102400.ckpt

脚本说明

脚本及样例代码

.
└─yolov3_darknet53
  ├─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中启动评估
    ├─run_standalone_train_gpu.sh     # 在GPU中启动单机训练(1卡)
    ├─run_distribute_train_gpu.sh     # 在GPU中启动分布式训练(8卡)
    └─run_eval_gpu.sh                 # 在GPU中启动评估
  ├─src
    ├─__init__.py                     # python初始化文件
    ├─config.py                       # 参数配置
    ├─darknet.py                      # 网络骨干
    ├─distributed_sampler.py          # 数据集迭代器
    ├─initializer.py                  #参数初始化器
    ├─logger.py                       # 日志函数
    ├─loss.py                         # 损失函数
    ├─lr_scheduler.py                 # 生成学习率
    ├─transforms.py                   # 预处理数据
    ├─util.py                         # 工具函数
    ├─yolo.py                         # yolov3网络
    ├─yolo_dataset.py                 # 为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_backbone PRETRAINED_BACKBONE
                        DarkNet53的ckpt文件。默认设置""。
  --resume_yolov3 RESUME_YOLOV3
                        YOLOv3的ckpt文件用于微调。默认设置""。
  --lr_scheduler LR_SCHEDULER
                        学习率调度器选项exponentialcosine_annealing。默认设置exponential。
  --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.9。
  --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。

训练过程

训练

python train.py \
    --data_dir=./dataset/coco2014 \
    --pretrained_backbone=darknet53_backbone.ckpt \
    --is_distributed=0 \
    --lr=0.1 \
    --T_max=320 \
    --max_epoch=320 \
    --warmup_epochs=4 \
    --training_shape=416 \
    --lr_scheduler=cosine_annealing > log.txt 2>&1 &

上述python命令将在后台运行您可以通过log.txt文件查看结果。如果在GPU上运行请在python命令中添加--device_target=GPU

训练结束后,您可在默认输出文件夹下找到检查点文件。损失值的实现如下:

# grep "loss:" train/log.txt
2020-08-20 14:14:43,640:INFO:epoch[0], iter[0], loss:7809.262695, 0.15 imgs/sec, lr:9.746589057613164e-06
2020-08-20 14:15:05,142:INFO:epoch[0], iter[100], loss:2778.349033, 133.92 imgs/sec, lr:0.0009844054002314806
2020-08-20 14:15:31,796:INFO:epoch[0], iter[200], loss:535.517361, 130.54 imgs/sec, lr:0.0019590642768889666
...

模型检查点将会储存在输出目录。

分布式训练

对于Ascend设备使用shell脚本分布式训练示例(8卡)

sh run_distribute_train.sh dataset/coco2014 darknet53_backbone.ckpt rank_table_8p.json

对于GPU设备使用shell脚本分布式训练示例(8卡)

sh run_distribute_train_gpu.sh dataset/coco2014 darknet53_backbone.ckpt

上述shell脚本将在后台运行分布训练。您可以通过train_parallel[X]/log.txt文件查看结果。损失值的实现如下:

# 分布式训练示例(8卡)
epoch[0], iter[0], loss:14623.384766, 1.23 imgs/sec, lr:7.812499825377017e-05
epoch[0], iter[100], loss:1486.253051, 15.01 imgs/sec, lr:0.007890624925494194
epoch[0], iter[200], loss:288.579535, 490.41 imgs/sec, lr:0.015703124925494194
epoch[0], iter[300], loss:153.136754, 531.99 imgs/sec, lr:0.023515624925494194
epoch[1], iter[400], loss:106.429322, 405.14 imgs/sec, lr:0.03132812678813934
...
epoch[318], iter[102000], loss:34.135306, 431.06 imgs/sec, lr:9.63797629083274e-06
epoch[319], iter[102100], loss:35.652469, 449.52 imgs/sec, lr:2.409552052995423e-06
epoch[319], iter[102200], loss:34.652273, 384.02 imgs/sec, lr:2.409552052995423e-06
epoch[319], iter[102300], loss:35.430038, 423.49 imgs/sec, lr:2.409552052995423e-06
...

评估过程

评估

运行以下命令。如果在GPU上运行请在python命令中添加--device_target=GPU或者使用“_gpu”shell脚本“xxx_gpu.sh”

python eval.py \
    --data_dir=./dataset/coco2014 \
    --pretrained=yolov3.ckpt \
    --testing_shape=416 > log.txt 2>&1 &

或者

sh run_eval.sh dataset/coco2014/ checkpoint/0-319_102400.ckpt

上述python命令将在后台运行您可以通过log.txt文件查看结果。测试数据集的mAP如下

# log.txt
=============coco eval reulst=========
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.311
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.528
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.322
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.127
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.323
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.428
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.259
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.398
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.423
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.224
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.442
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.551

模型描述

性能

评估性能

参数 YOLO YOLO
模型版本 YOLOv3 YOLOv3
资源 Ascend 910CPU 2.60GHz192核内存755G NV SMX2 V100-16GCPU 2.10GHz96核内存251G
上传日期 2020-06-31 2020-09-02
MindSpore版本 1.1.1 1.1.1
数据集 COCO2014 COCO2014
训练参数 epoch=320batch_size=32lr=0.001momentum=0.9 epoch=320batch_size=32lr=0.1momentum=0.9
优化器 Momentum Momentum
损失函数 带logits的Sigmoid交叉熵 带logits的Sigmoid交叉熵
输出 边界框和标签 边界框和标签
损失 34 34
速度 1卡350毫秒/步; 1卡: 600毫秒/步;
总时长 8卡13小时 8卡: 18小时(shape=416)
参数(M) 62.1 62.1
微调检查点 474M (.ckpt文件) 474M (.ckpt文件)
脚本 https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/yolov3_darknet53 https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/yolov3_darknet53

推理性能

参数 YOLO YOLO
模型版本 YOLOv3 YOLOv3
资源 Ascend 910 NV SMX2 V100-16G
上传日期 2020-06-31 2020-08-20
MindSpore版本 1.1.1 1.1.1
数据集 COCO201440504张图像 COCO201440504张图像
batch_size 1 1
输出 mAP mAP
准确性 8卡: 31.1% 8卡: 29.7%~30.3% (shape=416)
推理模型 474M (.ckpt文件) 474M (.ckpt文件)

随机情况说明

在distributed_sampler.py、transforms.py、yolo_dataset.py文件中有随机种子。

ModelZoo主页

请浏览官网主页