mindspore/model_zoo/official/cv/retinanet/README_CN.md

15 KiB
Raw Blame History

logo

Retinanet 描述

RetinaNet算法源自2018年Facebook AI Research的论文 Focal Loss for Dense Object Detection。该论文最大的贡献在于提出了Focal Loss用于解决类别不均衡问题从而创造了RetinaNetOne Stage目标检测算法这个精度超越经典Two Stage的Faster-RCNN的目标检测网络。

论文 Lin T Y , Goyal P , Girshick R , et al. Focal Loss for Dense Object Detection[C]// 2017 IEEE International Conference on Computer Vision (ICCV). IEEE, 2017:2999-3007.

模型架构

Retinanet的整体网络架构如下所示

链接

数据集

数据集可参考文献.

MSCOCO2017

  • 数据集大小: 19.3G, 123287张80类彩色图像

    • 训练:19.3G, 118287张图片

    • 测试:1814.3M, 5000张图片

  • 数据格式:RGB图像.

    • 注意数据将在src/dataset.py 中被处理

环境要求

脚本说明

脚本和示例代码

.
└─Retinanet
  ├─README.md
  ├─scripts
    ├─run_single_train.sh                     # 使用Ascend环境单卡训练
    ├─run_distribute_train.sh                 # 使用Ascend环境八卡并行训练
    ├─run_eval.sh                             # 使用Ascend环境运行推理脚本
  ├─src
    ├─config.py                               # 参数配置
    ├─dataset.py                              # 数据预处理
    ├─retinanet.py                            # 网络模型定义
    ├─init_params.py                          # 参数初始化
    ├─lr_generator.py                         # 学习率生成函数
    ├─coco_eval                               # coco数据集评估
    ├─box_utils.py                            # 先验框设置
    ├─_init_.py                               # 初始化
  ├─train.py                                  # 网络训练脚本
  └─eval.py                                   # 网络推理脚本

脚本参数

在train.py和config.py脚本中使用到的主要参数是:
"img_shape": [600, 600],                                                                        # 图像尺寸
"num_retinanet_boxes": 67995,                                                                   # 设置的先验框总数
"match_thershold": 0.5,                                                                         # 匹配阈值
"nms_thershold": 0.6,                                                                           # 非极大抑制阈值
"min_score": 0.1,                                                                               # 最低得分
"max_boxes": 100,                                                                               # 检测框最大数量
"global_step": 0,                                                                               # 全局步数
"lr_init": 1e-6,                                                                                # 初始学习率
"lr_end_rate": 5e-3,                                                                            # 最终学习率与最大学习率的比值
"warmup_epochs1": 2,                                                                            # 第一阶段warmup的周期数
"warmup_epochs2": 5,                                                                            # 第二阶段warmup的周期数
"warmup_epochs3": 23,                                                                           # 第三阶段warmup的周期数
"warmup_epochs4": 60,                                                                           # 第四阶段warmup的周期数
"warmup_epochs5": 160,                                                                          # 第五阶段warmup的周期数
"momentum": 0.9,                                                                                # momentum
"weight_decay": 1.5e-4,                                                                         # 权重衰减率
"num_default": [9, 9, 9, 9, 9],                                                                 # 单个网格中先验框的个数
"extras_out_channels": [256, 256, 256, 256, 256],                                               # 特征层输出通道数
"feature_size": [75, 38, 19, 10, 5],                                                            # 特征层尺寸
"aspect_ratios": [(0.5,1.0,2.0), (0.5,1.0,2.0), (0.5,1.0,2.0), (0.5,1.0,2.0), (0.5,1.0,2.0)],   # 先验框大小变化比值
"steps": ( 8, 16, 32, 64, 128),                                                                 # 先验框设置步长
"anchor_size":(32, 64, 128, 256, 512),                                                          # 先验框尺寸
"prior_scaling": (0.1, 0.2),                                                                    # 用于调节回归与回归在loss中占的比值
"gamma": 2.0,                                                                                   # focal loss中的参数
"alpha": 0.75,                                                                                  # focal loss中的参数
"mindrecord_dir": "/cache/MindRecord_COCO",                                                     # mindrecord文件路径
"coco_root": "/cache/coco",                                                                     # coco数据集路径
"train_data_type": "train2017",                                                                 # train图像的文件夹名
"val_data_type": "val2017",                                                                     # val图像的文件夹名
"instances_set": "annotations_trainval2017/annotations/instances_{}.json",                      # 标签文件路径
"coco_classes": ('background', 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus',     # coco数据集的种类
                 'train', 'truck', 'boat', 'traffic light', 'fire hydrant',
                 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog',
                 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra',
                 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie',
                 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball',
                 'kite', 'baseball bat', 'baseball glove', 'skateboard',
                 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup',
                 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
                 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza',
                 'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed',
                 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote',
                 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink',
                 'refrigerator', 'book', 'clock', 'vase', 'scissors',
                 'teddy bear', 'hair drier', 'toothbrush'),
"num_classes": 81,                                                                              # 数据集类别数
"voc_root": "",                                                                                 # voc数据集路径
"voc_dir": "",
"image_dir": "",                                                                                # 图像路径
"anno_path": "",                                                                                # 标签文件路径
"save_checkpoint": True,                                                                        # 保存checkpoint
"save_checkpoint_epochs": 1,                                                                    # 保存checkpoint epoch数
"keep_checkpoint_max":1,                                                                        # 保存checkpoint的最大数量
"save_checkpoint_path": "./model",                                                              # 保存checkpoint的路径
"finish_epoch":0,                                                                               # 已经运行完成的 epoch 数
"checkpoint_path":"/home/hitwh1/1.0/ckpt_0/retinanet-500_458_59.ckpt"                           # 用于验证的checkpoint路径

训练过程

用法

使用shell脚本进行训练。shell脚本的用法如下:

# 八卡并行训练示例:

创建 RANK_TABLE_FILE
sh run_distribute_train.sh DEVICE_NUM EPOCH_SIZE LR RANK_TABLE_FILE PRE_TRAINED(optional) PRE_TRAINED_EPOCH_SIZE(optional)

# 单卡训练示例:

sh run_single_train.sh DEVICE_ID EPOCH_SIZE LR PRE_TRAINED(optional) PRE_TRAINED_EPOCH_SIZE(optional)

注意:

RANK_TABLE_FILE相关参考资料见链接, 获取device_ip方法详见链接.

运行

训练前先创建MindRecord文件以COCO数据集为例
python create_data.py --dataset coco

Ascend:
# 八卡并行训练示例(在retinanet目录下运行)
sh scripts/run_distribute_train.sh 8 500 0.09 RANK_TABLE_FILE(创建的RANK_TABLE_FILE的地址) PRE_TRAINED(预训练checkpoint地址可选) PRE_TRAINED_EPOCH_SIZE预训练EPOCH大小可选

例如sh scripts/run_distribute_train.sh 8 500 0.09 scripts/rank_table_8pcs.json

# 单卡训练示例(在retinanet目录下运行)
sh scripts/run_single_train.sh 0 500 0.09

结果

训练结果将存储在示例路径中。checkpoint将存储在 ./model 路径下,训练日志将被记录到 ./log.txt 中,训练日志部分示例如下:

epoch: 2 step: 458, loss is 120.56251
lr:[0.000003]
Epoch time: 164034.415, per step time: 358.154
epoch: 3 step: 458, loss is 11.834166
lr:[0.000028]
Epoch time: 164292.012, per step time: 358.716
epoch: 4 step: 458, loss is 10.49008
lr:[0.000046]
Epoch time: 164822.921, per step time: 359.875
epoch: 5 step: 458, loss is 12.134182
lr:[0.000064]
Epoch time: 164531.610, per step time: 359.239

评估过程

用法

使用shell脚本进行评估。shell脚本的用法如下:

sh scripts/run_eval.sh [DATASET] [DEVICE_ID]

运行

sh scripts/run_eval.sh coco 0

checkpoint 可以在训练过程中产生.

结果

计算结果将存储在示例路径中,您可以在 eval.log 查看.

 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.347
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.503
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.385
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.134
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.366
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.501
 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.412
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.414
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.152
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.434
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.598

========================================

mAP: 0.34747137754625645

模型说明

性能

训练性能

参数 Ascend
模型名称 Retinanet
运行环境 Ascend 910CPU 2.6GHz192coresMemory 755G系统 Euler2.8
上传时间 10/01/2021
MindSpore 版本 1.2.0
数据集 123287 张图片
Batch_size 32
训练参数 src/config.py
优化器 Momentum
损失函数 Focal loss
最终损失 0.582
精确度 (8p) mAP[0.3475]
训练总时间 (8p) 23h16m54s
脚本 链接

推理性能

参数 Ascend
模型名称 Retinanet
运行环境 Ascend 910CPU 2.6GHz192coresMemory 755G系统 Euler2.8
上传时间 10/01/2021
MindSpore 版本 1.2.0
数据集 5k 张图片
Batch_size 32
精确度 mAP[0.3475]
总时间 10 mins and 50 seconds

随机情况的描述

dataset.py 脚本中, 我们在 create_dataset 函数中设置了随机种子. 我们在 train.py 脚本中也设置了随机种子.

ModelZoo 主页

请核对官方 主页.