# Contents - [FCN 介绍](#FCN-介绍) - [模型架构](#模型架构) - [数据集](#数据集) - [环境要求](#环境要求) - [快速开始](#快速开始) - [脚本介绍](#脚本介绍) - [脚本以及简单代码](#脚本以及简单代码) - [脚本参数](#脚本参数) - [训练步骤](#训练步骤) - [训练](#训练) - [评估步骤](#评估步骤) - [评估](#评估) - [模型介绍](#模型介绍) - [性能](#性能) - [评估性能](#评估性能) - [如何使用](#如何使用) - [教程](#教程) - [随机事件介绍](#随机事件介绍) - [ModelZoo 主页](#ModelZoo-主页) # [FCN 介绍](#contents) 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. # [模型架构](#contents) FCN-8s使用丢弃全连接操作的VGG16作为编码部分,并分别融合VGG16中第3,4,5个池化层特征,最后使用stride=8的反卷积获得分割图像。 # [数据集](#contents) Dataset used: [PASCAL VOC 2012]() [SBD]() # [环境要求](#contents) - 硬件(Ascend/GPU) - 需要准备具有Ascend或GPU处理能力的硬件环境. 如需使用Ascend,可以发送 [application form](https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/file/other/Ascend%20Model%20Zoo%E4%BD%93%E9%AA%8C%E8%B5%84%E6%BA%90%E7%94%B3%E8%AF%B7%E8%A1%A8.docx) 到ascend@huawei.com。一旦批准,你就可以使用此资源 - 框架 - [MindSpore](https://www.mindspore.cn/install/en) - 如需获取更多信息,请查看如下链接: - [MindSpore Tutorials](https://www.mindspore.cn/tutorial/training/en/master/index.html) - [MindSpore Python API](https://www.mindspore.cn/doc/api_python/en/master/index.html) # [快速开始](#contents) 在通过官方网站安装MindSpore之后,你可以通过如下步骤开始训练以及评估: - running on Ascend with default parameters ```python # run training example python train.py --device_id device_id # run evaluation example with default parameters python eval.py --device_id device_id ``` # [脚本介绍](#contents) ## [脚本以及简单代码](#contents) ```python ├── model_zoo ├── README.md // descriptions about all the models ├── FCN8s ├── README.md // descriptions about FCN ├── scripts ├── run_train.sh ├── run_eval.sh ├── 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 ├── train.py // training script ├── eval.py // evaluation script ``` ## [脚本参数](#contents) 训练以及评估的参数可以在config.py中设置 - config for FCN8s ```python # dataset 'data_file': '/data/workspace/mindspore_dataset/FCN/FCN/dataset/MINDRECORED_NAME.mindrecord', # path and name of one mindrecord file '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': '/data/workspace/mindspore_dataset/FCN/FCN/model/0-150_5004.ckpt', 'ckpt_pre_trained': '/data/workspace/mindspore_dataset/FCN/FCN/model_new/FCN8s-500_82.ckpt', # train 'save_steps': 330, 'keep_checkpoint_max': 500, 'train_dir': '/data/workspace/mindspore_dataset/FCN/FCN/model_new/', ``` 如需获取更多信息,请查看`config.py`. ## [生成数据步骤](#contents) ### 训练数据 - build mindrecord training data ```python 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_png,img目录下存放训练图像,cls_png目录下存放标签mask图像, data_lst: 存放训练样本的名称列表文档,每行一个样本。 dst_path: 生成mindrecord数据的目标位置 ``` ## [训练步骤](#contents) ### 训练 - running on Ascend with default parameters ```python python train.py --device_id device_id ``` 训练时,训练过程中的epch和step以及此时的loss和精确度会呈现在终端上: ```python epoch: * step: **, loss is **** ... ``` 此模型的checkpoint会在默认路径下存储 ## [评估步骤](#contents) ### 评估 - 在Ascend上使用PASCAL VOC 2012 验证集进行评估 在使用命令运行前,请检查用于评估的checkpoint的路径。请设置路径为到checkpoint的绝对路径,如 "/data/workspace/mindspore_dataset/FCN/FCN/model_new/FCN8s-500_82.ckpt"。 ```python python eval.py ``` 以上的python命令会在终端上运行,你可以在终端上查看此次评估的结果。测试集的精确度会以如下方式呈现: ```python mean IoU 0.6467 ``` # [模型介绍](#contents) ## [性能](#contents) ### 评估性能 #### FCN8s on PASCAL VOC 2012 | Parameters | Ascend | -------------------------- | ----------------------------------------------------------- | Model Version | FCN-8s | Resource | Ascend 910 ;CPU 2.60GHz,192cores;Memory,755G | uploaded Date | 12/30/2020 (month/day/year) | MindSpore Version | 1.1.0-alpha | Dataset | PASCAL VOC 2012 and SBD | Training Parameters | epoch=500, steps=330, batch_size = 32, lr=0.015 | Optimizer | Momentum | Loss Function | Softmax Cross Entropy | outputs | probability | Loss | 0.038 | Speed | 1pc: 564.652 ms/step; | Scripts | [FCN script](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/FCN8s) ### Inference Performance #### FCN8s on PASCAL VOC | Parameters | Ascend | ------------------- | --------------------------- | Model Version | FCN-8s | Resource | Ascend 910 | Uploaded Date | 10/29/2020 (month/day/year) | MindSpore Version | 1.1.0-alpha | Dataset | PASCAL VOC 2012 | batch_size | 16 | outputs | probability | mean IoU | 64.67 ## [如何使用](#contents) ### 教程 如果你需要在不同硬件平台(如GPU,Ascend 910 或者 Ascend 310)使用训练好的模型,你可以参考这个 [Link](https://www.mindspore.cn/tutorial/training/en/master/advanced_use/migrate_3rd_scripts.html)。以下是一个简单例子的步骤介绍: - 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.train_dir, config=config_ck) cbs.append(ckpoint_cb) model.train(cfg.train_epochs, dataset, callbacks=cbs) # [随机事件介绍](#contents) 我们在train.py中设置了随机种子 # [ModelZoo 主页](#contents) 请查看官方网站 [homepage](https://gitee.com/mindspore/mindspore/tree/master/model_zoo).