写点什么

【论文复现】Panoptic Deeplab(全景分割 PyTorch)

  • 2022-11-24
    中国香港
  • 本文字数:4061 字

    阅读完需:约 13 分钟

本文分享自华为云社区《Panoptic Deeplab(全景分割PyTorch)》,作者:HWCloudAI 。


这是发表于 CVPR 2020 的一篇论文的复现模型,B. Cheng et al, “Panoptic-DeepLab: A Simple, Strong, and Fast Baseline for Bottom-Up Panoptic Segmentation”, CVPR 2020,此模型在原论文的基础上,使用 HRNet 作为 backbone,得到了高于原论文的精度,PQ 达到了 63.7%,mIoU 达到了 80.3%,AP 达到了 37.3%。该算法会载入 Cityscapes 上的预训练模型(HRNet),我们提供了训练代码和可用于训练的模型,用于实际场景的微调训练。训练后生成的模型可直接在 ModelArts 平台部署成在线服务。


具体算法介绍:https://marketplace.huaweicloud.com/markets/aihub/modelhub/detail/?id=33d3239f-8f0b-4432-a842-f787662ed6a0


注意事项:


1.本案例使用框架:PyTorch1.4.0

2.本案例使用硬件:GPU: 1*NVIDIA-V100NV32(32GB) | CPU: 8 核 64GB

3.运行代码方法: 点击本页面顶部菜单栏的三角形运行按钮或按 Ctrl+Enter 键 运行每个方块中的代码

4.JupyterLab 的详细用法: 请参考《ModelAtrs JupyterLab使用指导》

5.碰到问题的解决办法**:** 请参考《ModelAtrs JupyterLab常见问题解决办法》

1.下载数据和代码


运行下面代码,进行数据和代码的下载


本案例使用 cityscapes 数据集。


import osimport moxing as mox# 数据代码下载mox.file.copy_parallel('s3://obs-aigallery-zc/algorithm/panoptic-deeplab','./panoptic-deeplab')
复制代码

2.模型训练

2.1 依赖库加载


#!/usr/bin/env python3# -*- coding: utf-8 -*-from __future__ import print_functionimport osroot_path = './panoptic-deeplab/'os.chdir(root_path)# 获取当前目录结构信息,以便进行代码调试print('os.getcwd():', os.getcwd())
import timeimport argparseimport timeimport datetimeimport mathimport sysimport shutilimport moxing as mox # ModelArts上专用的moxing模块,可用于与OBS的数据交互,API文档请查看:https://github.com/huaweicloud/ModelArts-Lab/tree/master/docs/moxing_api_doc
from PIL import ImageFileImageFile.LOAD_TRUNCATED_IMAGES = True
复制代码

2.2 训练参数设置


parser = argparse.ArgumentParser(description='Panoptic Deeplab')parser.add_argument('--training_dataset', default='/home/ma-user/work/panoptic-deeplab/', help='Training dataset directory')  # 在ModelArts中创建算法时,必须进行输入路径映射配置,输入映射路径的前缀必须是/home/work/modelarts/inputs/,作用是在启动训练时,将OBS的数据拷贝到这个本地路径中供本地代码使用。parser.add_argument('--train_url', default='./output', help='the path to save training outputs')  # 在ModelArts中创建训练作业时,必须指定OBS上的一个训练输出位置,训练结束时,会将输出映射路径拷贝到该位置parser.add_argument('--num_gpus',  default=1, type=int, help='num of GPUs to train')parser.add_argument('--eval', default='False', help='whether to eval')parser.add_argument('--load_weight', default='trained_model/model/model_final.pth',type=str)  # obs路径 断点模型 pth文件 如果是评估 则是相对于src的路径parser.add_argument('--iteration', default=100, type=int)parser.add_argument('--learning_rate', default=0.001, type=float)parser.add_argument('--ims_per_batch', default=8, type=int)args, unknown = parser.parse_known_args()  # 必须将parse_args改成parse_known_args,因为在ModelArts训练作业中运行时平台会传入一个额外的init_method的参数
# dirfname = os.getcwd()project_dir = os.path.join(fname, "panoptic-deeplab")detectron2_dir = os.path.join(fname, "detectron2-0.3+cu102-cp36-cp36m-linux_x86_64.whl")panopticapi_dir = os.path.join(fname, "panopticapi-0.1-py3-none-any.whl")cityscapesscripts_dir = os.path.join(fname, "cityscapesScripts-2.1.7-py3-none-any.whl")requirements_dir = os.path.join(project_dir, "requirements.txt") output_dir = "/home/work/modelarts/outputs/train_output"
# config stringsevalpath = ''MAX_ITER = 'SOLVER.MAX_ITER ' + str(args.iteration+90000)BASE_LR = 'SOLVER.BASE_LR ' + str(args.learning_rate)IMS_PER_BATCH = 'SOLVER.IMS_PER_BATCH ' + str(args.ims_per_batch)
SCRIPT_PATH = os.path.join(project_dir, "tools_d2/train_panoptic_deeplab.py") CONFIG_PATH = os.path.join(fname, "configs/config.yaml")
CONFIG_CMD = '--config-file ' + CONFIG_PATHEVAL_CMD = ''GPU_CMD = ''OPTS_CMD = MAX_ITER + ' ' + BASE_LR + ' ' + IMS_PER_BATCHRESUME_CMD = ''
#functions
def merge_cmd(scirpt_path, config_cmd, gpu_cmd, eval_cmd, resume_cmd, opts_cmd): return "python " + scirpt_path + " "+ config_cmd + " " + gpu_cmd + " " + eval_cmd + " " + resume_cmd + " " + OPTS_CMD
if args.eval == 'True': assert args.load_weight, 'load_weight empty when trying to evaluate' # 如果评估时为空,则报错 if args.load_weight != 'trained_model/model/model_final.pth': #将model拷贝到本地,并获取模型路径 modelpath, modelname = os.path.split(args.load_weight) mox.file.copy_parallel(args.load_weight, os.path.join(fname, modelname)) evalpath = os.path.join(fname,modelname) else: evalpath = os.path.join(fname,'trained_model/model/model_final.pth') EVAL_CMD = '--eval-only MODEL.WEIGHTS ' + evalpathelse: GPU_CMD = '--num-gpus ' + str(args.num_gpus) if args.load_weight: RESUME_CMD = '--resume' if args.load_weight != 'trained_model/model/model_final.pth': modelpath, modelname = os.path.split(args.load_weight) mox.file.copy_parallel(args.load_weight, os.path.join('/cache',modelname)) with open('/cache/last_checkpoint','w') as f: #创建last_checkpoint文件 f.write(modelname) f.close() else: os.system('cp ' + os.path.join(fname, 'trained_model/model/model_final.pth') + ' /cache/model_final.pth') with open('/cache/last_checkpoint','w') as f: #创建last_checkpoint文件 f.write('model_final.pth') f.close()
os.environ['DETECTRON2_DATASETS'] = args.training_dataset #添加数据库路径环境变量cmd = merge_cmd(SCRIPT_PATH, CONFIG_CMD, GPU_CMD, EVAL_CMD, RESUME_CMD, OPTS_CMD)# os.system('mkdir -p ' + args.train_url)print('*********Train Information*********')print('Run Command: ' + cmd)print('Num of GPUs: ' + str(args.num_gpus))print('Evaluation: ' + args.eval)if args.load_weight: print('Load Weight: ' + args.load_weight)else: print('Load Weight: None (train from scratch)')print('Iteration: ' + str(args.iteration))print('Learning Rate: ' + str(args.learning_rate))print('Images Per Batch: ' + str(args.ims_per_batch))
复制代码

2.3 安装依赖库


安装依赖库需要几分钟,请耐心等待


def install_dependecies(r,d, p, c):    os.system('pip uninstall pytorch> out1.txt')    os.system('pip install  torch==1.7.0> out2.txt')    os.system('pip install --upgrade pip')    os.system('pip install --upgrade numpy')    os.system('pip install torchvision==1.7.0> out3.txt')    os.system('pip install pydot')    os.system('pip install --upgrade pycocotools')    os.system('pip install tensorboard')    os.system('pip install -r ' + r + ' --ignore-installed PyYAML')     os.system('pip install ' + d)     os.system('pip install ' + p)    os.system('pip install ' + c)    os.system('pip install pyyaml ==5.1.0')# 安装依赖print('*********Installing Dependencies*********')install_dependecies(requirements_dir,detectron2_dir, panopticapi_dir, cityscapesscripts_dir)
复制代码


*********Installing Dependencies*********
复制代码

2.4 开始训练


print('*********Training Begin*********')print(cmd)start = time.time()ret = os.system(cmd+ " >out.txt")if ret == 0:    print("success")else:    print('fail')        end_time=time.time()print('done')print(end_time-start)if args.eval == 'False':    os.system('mv /cache/model_final.pth ' + os.path.join(fname, 'output/model_final.pth')) #/cache模型移动到输出文件夹
if os.path.exists(os.path.join(fname, 'pred_results')): os.system('mv ' + os.path.join(fname, 'pred_results') + ' ' + args.train_url)
复制代码


训练完成之后,可以在 out.txt 中看运行日志在./panoptic-deeplab/output/pred_results/文件目录下,有该模型全景分割,实例分割,语义分割的评估结果

3.模型测试

3.1 加载测试函数


from test import *
复制代码

3.2 开始预测


if __name__ == '__main__':    img_path = r'/home/ma-user/work/panoptic-deeplab/cityscapes/leftImg8bit/val/frankfurt/frankfurt_000000_003920_leftImg8bit.png'  # TODO 修改测试图片路径    model_path = r'/home/ma-user/work/panoptic-deeplab/output/model_final.pth'  # TODO 修改模型路径
my_model = ModelClass(model_path) result = my_model.predict(img_path) print(result)
复制代码



点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
【论文复现】Panoptic Deeplab(全景分割PyTorch)_人工智能_华为云开发者联盟_InfoQ写作社区