- 请先查阅MMSegmentation 模型部署文档。
- 本教程所用 mmsegmentation 版本: v1.1.2
- 本教程所用 NVIDIA Jetson 设备: NVIDIA Jetson AGX Orin 64G
1 配置 mmsegmentation
- 根据安装和验证文档,完成开发 mmsegmentation 所需的
pytorch、mmcv、mmengine等环境依赖安装。 - 从 GitHub 使用 git clone 命令完成 mmsegmentation 下载。网络不好的同学,可通过 MMSeg GitHub 页面进行 zip 的下载。
git clone https://github.com/open-mmlab/mmsegmentation.git
- 使用
pip install -v -e.命令动态安装 mmsegmentation 。提示成功安装后,可通过cd mmsegmentation pip install -v -e .
pip list命令查看到 mmsegmentation 已通过本地安装方式安装到了您的环境中。
- 本教程使用遥感图像语义分割数据集 potsdam 作为示例。
- 根据 potsdam 数据准备文档,进行数据集下载及 MMSeg 格式的准备。
- 数据集介绍: potsdam 数据集是以德国一个典型的历史城市 Potsdam 命名的,该城市有着大建筑群、狭窄的街道和密集的建筑结构。 potsdam 数据集包含 38 幅 6000x6000 像素的图像,空间分辨率为 5cm,数据集的示例如下图:

这里以 deeplabv3plus_r101-d8_4xb4-80k_potsdam-512x512.py 配置文件举例,在 configs 页面下载权重文件,

4 通过 OpenMMLab deployee 以交互式方式进行模型转换及测速
在该部分中,OpenMMLab 官网提供了模型转换及模型测速的交互界面,无需任何代码,即可通过选择对应选项完成模型 ONNX 格式xxxx.onnx 和 TensorRT .engine格式的转换。
如您的自定义 config 文件中有相对引用关系,如:
# xxxx.py
_base_ = [
'../_base_/models/deeplabv3plus_r50-d8.py',
'../_base_/datasets/potsdam.py',
'../_base_/default_runtime.py',
'../_base_/schedules/schedule_80k.py'
]您可以使用以下代码消除相对引用关系,以生成完整的 config 文件。
import mmengine
mmengine.Config.fromfile("configs/deeplabv3plus/deeplabv3plus_r101-d8_4xb4-80k_potsdam-512x512.py").dump("My_config.py")使用上述代码后,您能够看到,在My_config.py包含着完整的配置文件,无相对引用。这时,上传模型 config 至网页内对应处。
按照下图提示及自己的需求,创建转换任务并提交。
在完成模型转换后可通过模型测速界面,完成在真实设备上的模型测速。
测速完成后,可在页面生成完整的测速报告。查看测速报告示例
该部分可以通过 mmdeploy 库对 mmseg 训练好的模型进行推理格式的转换。这里给出一个示例,具体文档可见 mmdeploy 模型转换文档。
在您安装 mmsegmentation 库的虚拟环境下,通过 git clone命令从 GitHub 克隆 mmdeploy
如您的 config 中含有相对引用,仍需进行消除,如4.1 模型转换所述, 进入 mmdeploy 文件夹,执行以下命令,即可完成模型转换。
python tools/deploy.py \
configs/mmseg/segmentation_onnxruntime_static-512x512.py \
../atl_config.py \
../deeplabv3plus_r18-d8_512x512_80k_potsdam_20211219_020601-75fd5bc3.pth \
../2_13_1024_5488_1536_6000.png \
--work-dir ../atl_models \
--device cpu \
--show \
--dump-info# 使用方法
python ./tools/deploy.py \
${部署配置文件路径} \
${模型配置文件路径} \
${模型权重路径} \
${输入图像路径} \
--work-dir ${用来保存日志和模型文件路径} \
--device ${cpu/cuda:0} \
--show \ # 是否显示检测的结果
--dump-info # 是否输出 SDK 信息
执行成功后,您将能够看到以下提示,即为转换成功。
10/08 17:40:44 - mmengine - INFO - visualize pytorch model success.
10/08 17:40:44 - mmengine - INFO - All process success.参考如何在 Jetson 模组上安装 MMDeploy文档,完成在 Jetson 上的环境准备工作。 注:安装 Pytorch,可查阅 NVIDIA Jetson Pytorch 安装文档安装最新的 Pytorch。
conda create -n {您虚拟环境的名字} python={python版本}注意:这里不要安装最新的 pytorch 2.0,因为 pyTorch 1.11 是最后一个使用 USE_DISTRIBUTED 构建的wheel,否则会在用mmdeploy进行模型转换的时候提示AttributeError: module 'torch.distributed' has no attribute 'ReduceOp'的错误。参考以下链接:https://forums.developer.nvidia.com/t/module-torch-distributed-has-no-attribute-reduceop/256581/6
下载torch-1.11.0-cp38-cp38-linux_aarch64.whl并安装
pip install torch-1.11.0-cp38-cp38-linux_aarch64.whl执行以上命令后,您将能看到以下提示,即为安装成功。
Processing ./torch-1.11.0-cp38-cp38-linux_aarch64.whl
Requirement already satisfied: typing-extensions in /home/sirs/miniconda3/envs/openmmlab/lib/python3.8/site-packages (from torch==1.11.0) (4.7.1)
Installing collected packages: torch
Successfully installed torch-1.11.0请参考配置 TensorRT。 JetPack SDK 自带 TensorRT。 但是为了能够在 Conda 环境中成功导入,我们需要将 TensorRT 拷贝进先前创建的 Conda 环境中。
export PYTHON_VERSION=`python3 --version | cut -d' ' -f 2 | cut -d'.' -f1,2`
cp -r /usr/lib/python${PYTHON_VERSION}/dist-packages/tensorrt* ~/miniconda/envs/{您的虚拟环境名字}/lib/python${PYTHON_VERSION}/site-packages/通过mim install mmcv或从源码对其进行编译。
pip install openmim
mim install mmcv或者从源码对其进行编译。
sudo apt-get install -y libssl-dev
git clone https://github.com/open-mmlab/mmcv.git
cd mmcv
pip install -e .注:pytorch版本发生变动后,需要重新编译mmcv。
注:以下方式二选一
- conda
conda install -c conda-forge onnx
- pip
python3 -m pip install onnx
根据网页 ONNX Runtime 选择合适的ONNX Runtime版本进行下载安装。 示例:
# Install pip wheel
$ pip3 install onnxruntime_gpu-1.10.0-cp38-cp38-linux_aarch64.whl
同4.1 模型转换相同,在 Jetson 平台下进入安装好的虚拟环境,以及mmdeploy 目录,进行模型ONNX转换。
python tools/deploy.py \
configs/mmseg/segmentation_onnxruntime_static-512x512.py \
../atl_config.py \
../deeplabv3plus_r18-d8_512x512_80k_potsdam_20211219_020601-75fd5bc3.pth \
../2_13_3584_2560_4096_3072.png \
--work-dir ../atl_models \
--device cpu \
--show \
--dump-info
注: 如果报错提示内容:
AttributeError: module 'torch.distributed' has no attribute 'ReduceOp'
可参考以下链接进行解决:https://forums.developer.nvidia.com/t/module-torch-distributed-has-no-attribute-reduceop/256581/6,即安装 pytorch 1.11.0 版本。
转换成功后,您将会看到如下信息以及包含 ONNX 模型的文件夹:
10/09 19:58:22 - mmengine - INFO - visualize pytorch model success.
10/09 19:58:22 - mmengine - INFO - All process success.更换部署trt配置文件,进行 TensorRT 模型转换。
python tools/deploy.py \
configs/mmseg/segmentation_tensorrt_static-512x512.py \
../atl_config.py \
../deeplabv3plus_r18-d8_512x512_80k_potsdam_20211219_020601-75fd5bc3.pth \
../2_13_3584_2560_4096_3072.png \
--work-dir ../atl_trt_models \
--device cuda:0 \
--show \
--dump-info
转换成功后您将看到以下信息及 TensorRT 模型文件夹:
10/09 20:15:50 - mmengine - INFO - visualize pytorch model success.
10/09 20:15:50 - mmengine - INFO - All process success.执行以下命令完成模型测速,详细内容请查看 profiler
python tools/profiler.py \
${DEPLOY_CFG} \
${MODEL_CFG} \
${IMAGE_DIR} \
--model ${MODEL} \
--device ${DEVICE} \
--shape ${SHAPE} \
--num-iter ${NUM_ITER} \
--warmup ${WARMUP} \
--cfg-options ${CFG_OPTIONS} \
--batch-size ${BATCH_SIZE} \
--img-ext ${IMG_EXT}示例:
python tools/profiler.py \
configs/mmseg/segmentation_tensorrt_static-512x512.py \
../atl_config.py \
../atl_demo_img \
--model /home/sirs/AI-Tianlong/OpenMMLab/atl_trt_models/end2end.engine \
--device cuda:0 \
--shape 512x512 \
--num-iter 100测速结果
根据6.2.2中生成的TensorRT模型文件夹,进行模型推理。
from mmdeploy.apis.utils import build_task_processor
from mmdeploy.utils import get_input_shape, load_config
import torch
deploy_cfg='./mmdeploy/configs/mmseg/segmentation_tensorrt_static-512x512.py'
model_cfg='./atl_config.py'
device='cuda:0'
backend_model = ['./atl_trt_models/end2end.engine']
image = './atl_demo_img/2_13_2048_1024_2560_1536.png'
# read deploy_cfg and model_cfg
deploy_cfg, model_cfg = load_config(deploy_cfg, model_cfg)
# build task and backend model
task_processor = build_task_processor(model_cfg, deploy_cfg, device)
model = task_processor.build_backend_model(backend_model)
# process input image
input_shape = get_input_shape(deploy_cfg)
model_inputs, _ = task_processor.create_input(image, input_shape)
# do model inference
with torch.no_grad():
result = model.test_step(model_inputs)
# visualize results
task_processor.visualize(
image=image,
model=model,
result=result[0],
window_name='visualize',
output_file='./output_segmentation.png')即可得到推理结果:










