108 Star 867 Fork 1.5K

MindSpore/models

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

目录

DDRNet描述

语义分割是自主车辆理解周围场景的关键技术。对于实际的自主车辆,不希望花费大量的推理时间来获得高精度的分割结果。使用轻量级架构(编码器解码器或双通道)或对低分辨率图像进行推理,最近的方法实现了非常快速的场景解析,甚至可以在单个1080Ti GPU上以100 FPS以上的速度运行。然而,在这些实时方法和基于膨胀主干的模型之间仍然存在明显的性能差距。

为了解决这个问题,受HRNet的启发,作者提出了一种具有深度高分辨率表示能力的深度双分辨率网络,用于高分辨率图像的实时语义分割,特别是道路行驶图像。作者提出了一种新的深度双分辨率网络用于道路场景的实时语义分割。 DDRNet从一个主干开始,然后被分成两个具有不同分辨率的平行深分支。一个深分支生成相对高分辨率的特征映射,另一个通过多次下采样操作提取丰富的上下文信息。为了有效的信息融合,在两个分支之间桥接多个双边连接。此外,我们还提出了一个新的模块DAPPM,它大大增加了接受域,比普通的PPM更充分地提取了上下文信息。

数据集

使用的数据集:ImageNet2012

  • 数据集大小:共1000个类、224*224彩色图像
    • 训练集:共1,281,167张图像
    • 测试集:共50,000张图像
  • 数据格式:JPEG
    • 注:数据在dataset.py中处理。
  • 下载数据集,目录结构如下:
└─dataset
   ├─train                 # 训练数据集
   └─val                   # 评估数据集

特性

混合精度

采用混合精度 的训练方法,使用支持单精度和半精度数据来提高深度学习神经网络的训练速度,同时保持单精度训练所能达到的网络精度。混合精度训练提高计算速度、减少内存使用的同时,支持在特定硬件上训练更大的模型或实现更大批次的训练。

环境要求

脚本说明

脚本及样例代码

├── DDRNet
  ├── README_CN.md                        // DDRNet相关说明
  ├── ascend310_infer                     // Ascend310推理需要的文件
  ├── scripts
      ├──run_standalone_train_ascend.sh   // 单卡Ascend910训练脚本
      ├──run_distribute_train_ascend.sh   // 多卡Ascend910训练脚本
      ├──run_eval_ascend.sh               // 测试脚本 Ascend
      ├──run_standalone_train_gpu.sh      // 单卡GPU训练脚本
      ├──run_distribute_train_gpu.sh      // 多卡GPU训练脚本
      ├──run_eval_gpu.sh                  // 测试脚本 GPU
      └──run_infer_310.sh                 // 310推理脚本
  ├── src
      ├──configs                          // DDRNet的配置文件
      ├──data                             // 数据集配置文件
          ├──imagenet.py                  // imagenet配置文件
          ├──augment                      // 数据增强函数文件
          └──data_utils                   // modelarts运行时数据集复制函数文件
      ├──models                           // DDRNet定义文件
      ├──trainers                         // 自定义TrainOneStep文件
      ├──tools                            // 工具文件夹
          ├──callback.py                  // 自定义回调函数,训练结束测试
          ├──cell.py                      // 一些关于cell的通用工具函数
          ├──criterion.py                 // 关于损失函数的工具函数
          ├──get_misc.py                  // 一些其他的工具函数
          ├──optimizer.py                 // 关于优化器和参数的函数
          └──schedulers.py                // 学习率衰减的工具函数
  ├── train.py                            // 训练文件
  ├── eval.py                             // 评估文件
  ├── eval_onnx.py                        // ONNX评估文件
  ├── export.py                           // 导出模型文件
  ├── postprocess.py                      // 推理计算精度文件
  └──preprocess.py                       // 推理预处理图片文件

脚本参数

在config.py中可以同时配置训练参数和评估参数。

  • 配置DDRNet和ImageNet-1k数据集。

      # Architecture Top1-75.9%
      arch: DDRNet23                              # 模型结构
      # ===== Dataset ===== #
      data_url: ./data/imagenet                   # 数据集地址
      set: ImageNet                               # 数据集类别
      num_classes: 1000                           # 数据集种类数
      mix_up: 0.8                                 # MixUp数据增强参数
      cutmix: 1.0                                 # CutMix数据增强参数  
      color_jitter: 0.4                           # color参数
      auto_augment: rand-m9-mstd0.5-inc1          # auto_augment策略
      interpolation: bicubic                      # 图像缩放插值方法
      re_mode: pixel                              # 数据增强参数
      re_count: 1                                 # 数据增强参数
      mixup_prob: 1.                              # 数据增强参数
      switch_prob: 0.5                            # 数据增强参数
      mixup_mode: batch                           # 数据增强参数
      mixup_off_epoch: 0.                         # 使用多少轮mixup, 0为一直使用
      image_size: 224                             # 图像大小
      crop_pct: 0.875                             # 图像缩放比
      # ===== Learning Rate Policy ======== #
      optimizer: momentum                         # 优化器类别
      use_nesterov: True                          # 是否使用牛顿法收敛
      base_lr: 0.1                                # 基础学习率
      warmup_lr: 0.000001                         # 学习率热身初始学习率
      min_lr: 0.00001                             # 最小学习率
      lr_scheduler: cosine_lr                     # 学习率衰减策略
      warmup_length: 10                           # 学习率热身轮数
      lr_adjust: 30 # for multistep lr            # 多步学习率的衰减轮数
      # ===== Network training config ===== #
      amp_level: O2                               # 混合精度策略
      keep_bn_fp32: True                          # 保持bn为fp32
      beta: [ 0.9, 0.999 ]                        # 优化器的beta参数
      clip_global_norm_value: 5.                  # 全局梯度范数裁剪阈值
      clip_global_norm: True                      # 是否使用全局梯度裁剪
      is_dynamic_loss_scale: True                 # 是否使用动态损失缩放
      epochs: 300                                 # 训练轮数
      label_smoothing: 0.1                        # 标签平滑参数
      loss_scale: 1024                            # 损失缩放
      weight_decay: 0.0001                        # 权重衰减参数
      decay: 0.9 # for rmsprop                    # rmsprop的decay系数
      momentum: 0.9                               # 优化器动量
      batch_size: 512                             # 批次
      # ===== Hardware setup ===== #
      num_parallel_workers: 16                    # 数据预处理线程数
      device_target: Ascend                       # GPU或者Ascend
      # ===== Model config ===== #
      drop_path_rate: 0.1                         # drop_path的概率
    

通过官方网站安装MindSpore后,您可以按照如下步骤进行训练和评估:

训练和测试

在 Ascend 上运行

# 使用python启动单卡训练
python train.py --device_id 0 --device_target Ascend --ddr_config ./src/configs/ddrnet23_imagenet.yaml \
> train.log 2>&1 &

# 使用脚本启动单卡训练
bash ./scripts/run_standalone_train_ascend.sh [DEVICE_ID] [CONFIG_PATH]

# 使用脚本启动多卡训练
bash ./scripts/run_distribute_train_ascend.sh [RANK_TABLE_FILE] [CONFIG_PATH]

# 使用python启动单卡运行评估示例
python eval.py --device_id 0 --device_target Ascend --ddr_config ./src/configs/ddrnet23_imagenet.yaml \
--pretrained ./ckpt_0/DDRNet23.ckpt > ./eval.log 2>&1 &

# 使用脚本启动单卡运行评估示例
bash ./scripts/run_eval_ascend.sh [DEVICE_ID] [CONFIG_PATH] [CHECKPOINT_PATH]

# 运行推理示例
bash run_infer_310.sh [MINDIR_PATH] [DATASET_NAME(imagenet2012)] [DATASET_PATH] [DEVICE_ID(optional)]

对于分布式训练,需要提前创建JSON格式的hccl配置文件。

请遵循以下链接中的说明:

hccl工具

在 GPU 上运行

  bash ./scripts/run_standalone_train_gpu.sh [DEVICE_ID] [CONFIG_PATH]
  #OR
  bash ./scripts/run_distribute_train_gpu.sh [CONFIG_PATH]

  bash ./scripts/run_eval_gpu.sh [DEVICE_ID] [CONFIG_PATH] [CHECKPOINT_PATH]

推理过程

python export.py --pretrained [CKPT_FILE] --ddr_config [CONFIG_PATH] --device_target [DEVICE_TARGET]

导出的模型会以模型的结构名字命名并且保存在当前目录下

推理过程

推理前需参照 MindSpore C++推理部署指南 进行环境变量设置。

推理

在进行推理之前我们需要先导出模型。mindir可以在任意环境上导出,air模型只能在昇腾910环境上导出。以下展示了使用mindir模型执行推理的示例。

  • 在昇腾310上使用ImageNet-1k数据集进行推理

    推理的结果保存在scripts目录下,在acc.log日志文件中可以找到类似以下的结果。

    # Ascend310 inference
    bash run_infer_310.sh [MINDIR_PATH] [DATASET_NAME] [DATASET_PATH] [DEVICE_ID]
    Top1 acc: 0.76578
    Top5 acc: 0.9331
    

型号说明

性能

训练表现

ImageNet2012 上的 DDRNet

参数 GPU Ascend
模型版本 DDRNet-23 DDRNet-23
资源 GPU: 8xRTX3090 24G; CPU: Intel(R) Xeon(R) Gold 6226R; RAM: 252G Ascend 910
上传日期 2021-03-23 2021-12-04
MindSpore版本 1.6.0 1.3.0
数据集 ImageNet-1k train ImageNet-1k train
训练设置 ddrnet23_imagenet_gpu.yaml ddrnet23_imagenet_ascend.yaml
参数 batch_size=256, epoch=300 batch_size=512, epoch=300
优化器 Momentum Momentum
损失函数 SoftTargetCrossEntropy SoftTargetCrossEntropy
输出 ckpt file ckpt file
最终损失 2.44 -
速度 eight cards: mean 5000 ms/step eight cards: mean 940 ms/step
训练耗时 eight cards: 240 h eight cards: 35 h (run on ModelArts)

评价表现

ImageNet2012 上的 DDRNet

参数 GPU Ascend
模型版本 DDRNet-23 DDRNet-23
资源 GPU: 8xRTX3090 24G; CPU: Intel(R) Xeon(R) Gold 6226R; RAM: 252G Ascend 310
上传日期 2021-03-23 2021-12-04
MindSpore版本 1.6.0 1.3.0
数据集 ImageNet-1k val ImageNet-1k val
Eval 损失 1.2 1.313
分类准确率 eight cards: top1:76.6% top5:93.4% eight cards: top1:76.598% top5:93.312%

ONNX推理

  • ONNX的导出与推理

    ### 导出ONNX模型
    python export.py --pretrained /path/best.ckpt \
    --ddr_config ./src/configs/ddrnet23_imagenet.yaml \
    --device_target 'GPU'
    
    -`best.ckpt`ckpt文件路径
    -`ddr_config`模型文件配置
    -`device_target`使用GPU导出
    
    ### ONNX推理
    python eval_onnx.py --device_id 6 --ddr_config ./src/configs/ddrnet23_imagenet.yaml
    或者sh run_eval_onnx.sh [device_id] [ddr_config]
    
    

ModelZoo主页

请浏览官网主页

马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/mindspore/models.git
git@gitee.com:mindspore/models.git
mindspore
models
models
master

搜索帮助