mindspore/model_zoo/official/cv/FCN8s
caojian05 ecaa0cdaa8 FCN8s pretrain can use model zoo vgg trained checkpoint 2021-06-17 10:27:26 +08:00
..
ascend310_infer ascend310 inference for fcn8s 2021-06-09 19:07:57 +08:00
scripts fcn8s support gpu 2021-06-15 18:38:49 +08:00
src change shell scripts and modify eval.py and train.py 2021-05-19 16:42:57 +08:00
README.md fcn8s support gpu 2021-06-15 18:38:49 +08:00
default_config.yaml ascend310 inference for fcn8s 2021-06-09 19:07:57 +08:00
eval.py change shell scripts and modify eval.py and train.py 2021-05-19 16:42:57 +08:00
export.py ascend310 inference for fcn8s 2021-06-09 19:07:57 +08:00
gpu_default_config.yaml fcn8s support gpu 2021-06-15 18:38:49 +08:00
postprocess.py ascend310 inference for fcn8s 2021-06-09 19:07:57 +08:00
train.py FCN8s pretrain can use model zoo vgg trained checkpoint 2021-06-17 10:27:26 +08:00

README.md

Contents

FCN 介绍

FCN主要用用于图像分割领域是一种端到端的分割方法。FCN丢弃了全连接层使得其能够处理任意大小的图像且减少了模型的参数量提高了模型的分割速度。FCN在编码部分使用了VGG的结构在解码部分中使用反卷积/上采样操作恢复图像的分辨率。FCN-8s最后使用8倍的反卷积/上采样操作将输出分割图恢复到与输入图像相同大小。

[Paper]: Long, Jonathan, Evan Shelhamer, and Trevor Darrell. "Fully convolutional networks for semantic segmentation." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015.

模型架构

FCN-8s使用丢弃全连接操作的VGG16作为编码部分并分别融合VGG16中第3,4,5个池化层特征最后使用stride=8的反卷积获得分割图像。

数据集

Dataset used:

PASCAL VOC 2012

SBD

环境要求

快速开始

在通过官方网站安装MindSpore之后你可以通过如下步骤开始训练以及评估

  • running on Ascend with default parameters

    # Ascend单卡训练示例
    python train.py --device_id device_id
    
    # Ascend评估示例
    python eval.py --device_id device_id
    
  • running on GPU with gpu default parameters

    # GPU单卡训练示例
    python train.py  \
    --config_path=gpu_default_config.yaml  \
    --device_target=GPU
    
    # GPU多卡训练示例
    export RANK_SIZE=8
    mpirun --allow-run-as-root -n $RANK_SIZE --output-filename log_output --merge-stderr-to-stdout  \
    python train.py  \
    --config_path=gpu_default_config.yaml \
    --device_target=GPU
    
    # GPU评估示例
    python eval.py  \
    --config_path=gpu_default_config.yaml  \
    --device_target=GPU
    

脚本介绍

脚本以及简单代码

├── model_zoo
    ├── README.md                     // descriptions about all the models
    ├── FCN8s
        ├── README.md                 // descriptions about FCN
        ├── ascend310_infer           // 实现310推理源代码
        ├── scripts
            ├── run_train.sh
            ├── run_standalone_train.sh
            ├── run_standalone_train_gpu.sh             // train in gpu with single device
            ├── run_distribute_train_gpu.sh             // train in gpu with multi device
            ├── run_eval.sh
            ├── run_infer_310.sh         // Ascend推理shell脚本
            ├── build_data.sh
        ├── src
           ├──data
               ├──build_seg_data.py       // creating dataset
               ├──dataset.py          // loading dataset
           ├──nets
               ├──FCN8s.py            // FCN-8s architecture
           ├──loss
               ├──loss.py            // loss function
           ├──utils
               ├──lr_scheduler.py            // getting learning_rateFCN-8s
           ├──model_utils
               ├──config.py                     // getting config parameters
               ├──device_adapter.py            // getting device info
               ├──local_adapter.py            // getting device info
               ├──moxing_adapter.py          // Decorator
        ├── default_config.yaml               // Ascend parameters config
        ├── gpu_default_config.yaml           // GPU parameters config
        ├── train.py                 // training script
        ├── postprogress.py          // 310推理后处理脚本
        ├── export.py                // 将checkpoint文件导出到air/mindir
        ├── eval.py                  //  evaluation script

脚本参数

训练以及评估的参数可以在default_config.yaml中设置

  • config for FCN8s

       # dataset
      'data_file': '/data/workspace/mindspore_dataset/FCN/FCN/dataset/MINDRECORED_NAME.mindrecord', # path and name of one mindrecord file
      'train_batch_size': 32,
      'crop_size': 512,
      'image_mean': [103.53, 116.28, 123.675],
      'image_std': [57.375, 57.120, 58.395],
      'min_scale': 0.5,
      'max_scale': 2.0,
      'ignore_label': 255,
      'num_classes': 21,
    
      # optimizer
      'train_epochs': 500,
      'base_lr': 0.015,
      'loss_scale': 1024.0,
    
      # model
      'model': 'FCN8s',
      'ckpt_vgg16': '',
      'ckpt_pre_trained': '',
    
      # train
      'save_steps': 330,
      'keep_checkpoint_max': 5,
      'ckpt_dir': './ckpt',
    

如需获取更多信息Ascend请查看default_config.yaml, GPU请查看gpu_default_config.yaml.

生成数据步骤

训练数据

  • build mindrecord training data

    sh build_data.sh
    or
    python src/data/build_seg_data.py  --data_root=/home/sun/data/Mindspore/benchmark_RELEASE/dataset  \
                                       --data_lst=/home/sun/data/Mindspore/benchmark_RELEASE/dataset/trainaug.txt  \
                                       --dst_path=dataset/MINDRECORED_NAME.mindrecord  \
                                       --num_shards=1  \
                                       --shuffle=True
    data_root: 训练数据集的总目录包含两个子目录img和cls_pngimg目录下存放训练图像cls_png目录下存放标签mask图像
    data_lst: 存放训练样本的名称列表文档每行一个样本
    dst_path: 生成mindrecord数据的目标位置
    

训练步骤

训练

  • running on Ascend with default parameters

    # Ascend单卡训练示例
    python train.py --device_id device_id
    or
    sh scripts/run_standalone_train.sh [DEVICE_ID]
    
    #Ascend八卡并行训练
    sh scripts/run_train.sh [DEVICE_NUM] rank_table.json
    
  • running on GPU with gpu default parameters

    # GPU单卡训练示例
    python train.py  \
    --config_path=gpu_default_config.yaml  \
    --device_target=GPU
    or
    sh scripts/run_standalone_train_gpu.sh DEVICE_ID
    
    # GPU八卡训练示例
    export RANK_SIZE=8
    mpirun --allow-run-as-root -n $RANK_SIZE --output-filename log_output --merge-stderr-to-stdout  \
    python train.py  \
    --config_path=gpu_default_config.yaml \
    --device_target=GPU
    or
    sh run_distribute_train_gpu.sh [RANK_SIZE] [TRAIN_DATA_DIR]
    
    # GPU评估示例
    python eval.py  \
    --config_path=gpu_default_config.yaml \
    --device_target=GPU
    

    训练时训练过程中的epch和step以及此时的loss和精确度会呈现log.txt中:

    epoch: * step: **, loss is ****
    ...
    

    此模型的checkpoint会在默认路径下存储

  • 如果要在modelarts上进行模型的训练可以参考modelarts的官方指导文档 开始进行模型的训练和推理,具体操作如下:

#  在ModelArts上使用分布式训练示例:
#  数据集存放方式

#  ├── VOC2012                                                     # dir
#    ├── VOCdevkit                                                 # VOCdevkit dir
#      ├── Please refer to VOCdevkit structure  
#    ├── benchmark_RELEASE                                         # benchmark_RELEASE dir
#      ├── Please refer to benchmark_RELEASE structure
#    ├── backbone                                                  # backbone dir
#      ├── vgg_predtrained.ckpt
#    ├── predtrained                                               # predtrained dir
#      ├── FCN8s_1-133_300.ckpt
#    ├── checkpoint                                                # checkpoint dir
#      ├── FCN8s_1-133_300.ckpt
#    ├── vocaug_mindrecords                                        # train dataset dir
#      ├── voctrain.mindrecords0
#      ├── voctrain.mindrecords0.db
#      ├── voctrain.mindrecords1
#      ├── voctrain.mindrecords1.db
#      ├── voctrain.mindrecords2
#      ├── voctrain.mindrecords2.db
#      ├── voctrain.mindrecords3
#      ├── voctrain.mindrecords3.db
#      ├── voctrain.mindrecords4
#      ├── voctrain.mindrecords4.db
#      ├── voctrain.mindrecords5
#      ├── voctrain.mindrecords5.db
#      ├── voctrain.mindrecords6
#      ├── voctrain.mindrecords6.db
#      ├── voctrain.mindrecords7
#      ├── voctrain.mindrecords7.db

# (1) 选择a(修改yaml文件参数)或者b(ModelArts创建训练作业修改参数)其中一种方式
#       a. 设置 "enable_modelarts=True"
#          设置 "ckpt_dir=/cache/train/outputs_FCN8s/"
#          设置 "ckpt_vgg16=/cache/data/backbone/vgg_predtrain file"  如果没有预训练 ckpt_vgg16=""
#          设置 "ckpt_pre_trained=/cache/data/predtrained/pred file" 如果无需继续训练 ckpt_pre_trained=""
#          设置 "data_file=/cache/data/vocaug_mindrecords/voctrain.mindrecords0"

#       b. 增加 "enable_modelarts=True" 参数在modearts的界面上
#          在modelarts的界面上设置方法a所需要的参数
#          注意:路径参数不需要加引号

# (2)设置网络配置文件的路径 "_config_path=/The path of config in default_config.yaml/"
# (3) 在modelarts的界面上设置代码的路径 "/path/FCN8s"
# (4) 在modelarts的界面上设置模型的启动文件 "train.py"
# (5) 在modelarts的界面上设置模型的数据路径 ".../VOC2012"(选择VOC2012文件夹路径)
# 模型的输出路径"Output file path" 和模型的日志路径 "Job log path"
# (6) 开始模型的训练

# 在modelarts上使用模型推理的示例
# (1) 把训练好的模型地方到桶的对应位置
# (2) 选择a或者b其中一种方式
#       a. 设置 "enable_modelarts=True"
#          设置 "data_root=/cache/data/VOCdevkit/VOC2012/"
#          设置 "data_lst=./ImageSets/Segmentation/val.txt"
#          设置 "ckpt_file=/cache/data/checkpoint/ckpt file name"

#       b. 增加 "enable_modelarts=True" 参数在modearts的界面上
#          在modelarts的界面上设置方法a所需要的参数
#          注意:路径参数不需要加引号

# (3) 设置网络配置文件的路径 "_config_path=/The path of config in default_config.yaml/"
# (4) 在modelarts的界面上设置代码的路径 "/path/FCN8s"
# (5) 在modelarts的界面上设置模型的启动文件 "eval.py"
# (6) 在modelarts的界面上设置模型的数据路径 ".../VOC2012"(选择VOC2012文件夹路径) ,
# 模型的输出路径"Output file path" 和模型的日志路径 "Job log path"
# (7) 开始模型的推理

评估步骤

评估

  • 在Ascend或GPU上使用PASCAL VOC 2012 验证集进行评估

    在使用命令运行前请检查用于评估的checkpoint的路径。请设置路径为到checkpoint的绝对路径如 "/data/workspace/mindspore_dataset/FCN/FCN/model_new/FCN8s-500_82.ckpt"。

  • eval on Ascend

    python eval.py
    
    sh scripts/run_eval.sh DATA_ROOT DATA_LST CKPT_PATH
    

    以上的python命令会在终端上运行你可以在终端上查看此次评估的结果。测试集的精确度会以类似如下方式呈现

    mean IoU  0.6467
    

导出过程

导出

在导出之前需要修改default_config.yaml配置文件中的ckpt_file配置项file_name和file_format配置项根据情况修改.

python export.py

推理过程

推理

在还行推理之前我们需要先导出模型。Air模型只能在昇腾910环境上导出mindir可以在任意环境上导出。batch_size只支持1。

# Ascend310 inference
bash run_infer_310.sh [MINDIR_PATH] [DATA_LIST_FILE] [IMAGE_PATH] [MASK_PATH] [DEVICE_ID]

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

mean IoU  0.0.64519877
  • eval on GPU

    python eval.py  \
    --config_path=gpu_default_config.yaml  \
    --device_target=GPU
    

    以上的python命令会在终端上运行你可以在终端上查看此次评估的结果。测试集的精确度会以类似如下方式呈现

    mean IoU  0.6472
    

模型介绍

性能

评估性能

FCN8s on PASCAL VOC 2012

Parameters Ascend GPU
Model Version FCN-8s FCN-8s
Resource Ascend 910; CPU 2.60GHz, 192cores; Memory 755G; OS Euler2.8 NV SMX2 V100-32G
uploaded Date 12/30/2020 (month/day/year) 06/11/2021 (month/day/year)
MindSpore Version 1.1.0-alpha 1.2.0
Dataset PASCAL VOC 2012 and SBD PASCAL VOC 2012 and SBD
Training Parameters epoch=500, steps=330, batch_size = 32, lr=0.015 epoch=500, steps=330, batch_size = 8, lr=0.005
Optimizer Momentum Momentum
Loss Function Softmax Cross Entropy Softmax Cross Entropy
outputs probability probability
Loss 0.038 0.036
Speed 1pc: 564.652 ms/step; 1pc: 455.460 ms/step;
Scripts FCN script

Inference Performance

FCN8s on PASCAL VOC

Parameters Ascend GPU
Model Version FCN-8s FCN-8s
Resource Ascend 910; OS Euler2.8 NV SMX2 V100-32G
Uploaded Date 10/29/2020 (month/day/year) 06/11/2021 (month/day/year)
MindSpore Version 1.1.0-alpha 1.2.0
Dataset PASCAL VOC 2012 PASCAL VOC 2012
batch_size 16 16
outputs probability probability
mean IoU 64.67 64.72

如何使用

教程

如果你需要在不同硬件平台如GPUAscend 910 或者 Ascend 310使用训练好的模型你可以参考这个 Link。以下是一个简单例子的步骤介绍:

  • Running on Ascend

    # Set context
    context.set_context(mode=context.GRAPH_MODE, device_target=args_opt.device_target, save_graphs=False)
    context.set_auto_parallel_context(device_num=device_num,parallel_mode=ParallelMode.DATA_PARALLEL)
    init()
    
    # Load dataset
    dataset = data_generator.SegDataset(image_mean=cfg.image_mean,
                                        image_std=cfg.image_std,
                                        data_file=cfg.data_file,
                                        batch_size=cfg.batch_size,
                                        crop_size=cfg.crop_size,
                                        max_scale=cfg.max_scale,
                                        min_scale=cfg.min_scale,
                                        ignore_label=cfg.ignore_label,
                                        num_classes=cfg.num_classes,
                                        num_readers=2,
                                        num_parallel_calls=4,
                                        shard_id=args.rank,
                                        shard_num=args.group_size)
    dataset = dataset.get_dataset(repeat=1)
    
    # Define model
    net = FCN8s(n_class=cfg.num_classes)
    loss_ = loss.SoftmaxCrossEntropyLoss(cfg.num_classes, cfg.ignore_label)
    
    # optimizer
    iters_per_epoch = dataset.get_dataset_size()
    total_train_steps = iters_per_epoch * cfg.train_epochs
    
    lr_scheduler = CosineAnnealingLR(cfg.base_lr,
                                     cfg.train_epochs,
                                     iters_per_epoch,
                                     cfg.train_epochs,
                                     warmup_epochs=0,
                                     eta_min=0)
    lr = Tensor(lr_scheduler.get_lr())
    
    # loss scale
    manager_loss_scale = FixedLossScaleManager(cfg.loss_scale, drop_overflow_update=False)
    
    optimizer = nn.Momentum(params=net.trainable_params(), learning_rate=lr, momentum=0.9, weight_decay=0.0001,
                            loss_scale=cfg.loss_scale)
    
    model = Model(net, loss_fn=loss_, loss_scale_manager=manager_loss_scale, optimizer=optimizer, amp_level="O3")
    
    # callback for saving ckpts
    time_cb = TimeMonitor(data_size=iters_per_epoch)
    loss_cb = LossMonitor()
    cbs = [time_cb, loss_cb]
    
    if args.rank == 0:
        config_ck = CheckpointConfig(save_checkpoint_steps=cfg.save_steps,
                                     keep_checkpoint_max=cfg.keep_checkpoint_max)
        ckpoint_cb = ModelCheckpoint(prefix=cfg.model, directory=cfg.ckpt_dir, config=config_ck)
        cbs.append(ckpoint_cb)
    
    model.train(cfg.train_epochs, dataset, callbacks=cbs)
    
    

随机事件介绍

我们在train.py中设置了随机种子

ModelZoo 主页

请查看官方网站 homepage.