ショートカット

モデルデプロイ

MMDetection を含む OpenMMLab コードベースのデプロイは、MMDeploy でサポートされています。MMDetection の最新のデプロイガイドは、こちらにあります。

このチュートリアルは次のように構成されています

インストール

ガイドに従って mmdet をインストールしてください。次に、このガイドに従って、ソースから mmdeploy をインストールします。

注記

mmdeploy のプリビルドパッケージをインストールする場合は、'git clone https://github.com/open-mmlab/mmdeploy.git --depth=1' でリポジトリをクローンして、デプロイ構成ファイルも取得してください。

モデルの変換

mmdetection と mmdeploy のリポジトリが同じディレクトリにあり、作業ディレクトリが mmdetection のルートパスであると仮定します。

Faster R-CNN モデルを例に挙げます。そのチェックポイントを ここからダウンロードし、次のようにして onnx モデルに変換できます

from mmdeploy.apis import torch2onnx
from mmdeploy.backend.sdk.export_info import export2SDK

img = 'demo/demo.jpg'
work_dir = 'mmdeploy_models/mmdet/onnx'
save_file = 'end2end.onnx'
deploy_cfg = '../mmdeploy/configs/mmdet/detection/detection_onnxruntime_dynamic.py'
model_cfg = 'configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py'
model_checkpoint = 'faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'
device = 'cpu'

# 1. convert model to onnx
torch2onnx(img, work_dir, save_file, deploy_cfg, model_cfg,
           model_checkpoint, device)

# 2. extract pipeline info for inference by MMDeploy SDK
export2SDK(deploy_cfg, model_cfg, work_dir, pth=model_checkpoint,
           device=device)

モデル変換中に正しいデプロイ構成を指定することが重要です。MMDeploy は、mmdetection でサポートされているすべてのバックエンドの組み込みデプロイ構成 ファイルを既に提供しており、その構成ファイルパスは次のパターンに従います

{task}/{task}_{backend}-{precision}_{static | dynamic}_{shape}.py
  • {task}: mmdetection のタスク。

    それらは 2 つあります。1 つは detection で、もう 1 つはインスタンスセグメンテーションを示す instance-seg です。

    RetinaNetFaster R-CNNDETR などの mmdet モデルは、detection タスクに属します。一方、Mask R-CNN は、instance-seg モデルの 1 つです。

    検出モデルを変換する場合は、必ず detection/detection_*.py デプロイ構成ファイルを使用し、インスタンスセグメンテーションモデルをデプロイする場合は、instance-seg/instance-seg_*.py を使用してください。

  • {backend}: 推論バックエンド (onnxruntime、tensorrt、pplnn、ncnn、openvino、coreml など)。

  • {precision}: fp16、int8。空の場合、fp32 を意味します。

  • {static | dynamic}: 静的形状または動的形状

  • {shape}: モデルの入力形状または形状範囲

したがって、上記の例では、Faster R-CNNdetection_tensorrt-fp16_dynamic-320x320-1344x1344.py で tensorrt-fp16 モデルに変換することもできます。

ヒント

mmdet モデルを tensorrt モデルに変換する場合は、–device を「cuda」に設定する必要があります

モデルの仕様

モデル推論の章に進む前に、モデル推論にとって非常に重要な変換されたモデル構造について詳しく知っておきましょう。

変換されたモデルは、前の例の mmdeploy_models/mmdet/onnx のような作業ディレクトリにあります。これには次が含まれます

mmdeploy_models/mmdet/onnx
├── deploy.json
├── detail.json
├── end2end.onnx
└── pipeline.json

ここで、

  • end2end.onnx: ONNX Runtime で推論できるバックエンドモデル

  • xxx.json: mmdeploy SDK に必要な情報

パッケージ全体 mmdeploy_models/mmdet/onnx は、mmdeploy SDK モデルとして定義されます。つまり、mmdeploy SDK モデルには、バックエンドモデルと推論メタ情報の両方が含まれます。

モデル推論

バックエンドモデル推論

以前に変換した end2end.onnx モデルを例に挙げると、次のコードを使用してモデルを推論し、結果を視覚化できます。

from mmdeploy.apis.utils import build_task_processor
from mmdeploy.utils import get_input_shape, load_config
import torch

deploy_cfg = '../mmdeploy/configs/mmdet/detection/detection_onnxruntime_dynamic.py'
model_cfg = 'configs/faster_rcnn/faster-rcnn_r50_fpn_1x_coco.py'
device = 'cpu'
backend_model = ['mmdeploy_models/mmdet/onnx/end2end.onnx']
image = 'demo/demo.jpg'

# 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_detection.png')

SDK モデル推論

次のように SDK モデル推論を実行することもできます。

from mmdeploy_python import Detector
import cv2

img = cv2.imread('demo/demo.jpg')

# create a detector
detector = Detector(model_path='mmdeploy_models/mmdet/onnx',
                    device_name='cpu', device_id=0)
# perform inference
bboxes, labels, masks = detector(img)

# visualize inference result
indices = [i for i in range(len(bboxes))]
for index, bbox, label_id in zip(indices, bboxes, labels):
    [left, top, right, bottom], score = bbox[0:4].astype(int), bbox[4]
    if score < 0.3:
        continue

    cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0))

cv2.imwrite('output_detection.png', img)

mmdeploy SDK は、Python API に加えて、C、C++、C#、Java など、その他の FFI (Foreign Function Interface) も提供します。デモからそれらの使用法を学ぶことができます。

サポートされているモデル

サポートされているモデルのリストについては、こちらを参照してください。