- 请先查阅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')
即可得到推理结果: