Ultralytics YOLO27:

YOLO26モデルのMNNエクスポートとデプロイ#

MNN#

MNN mobile neural network inference framework

MNNは、非常に効率的で軽量なディープラーニングフレームワークです。ディープラーニングモデルの推論とトレーニングをサポートし、デバイス上での推論とトレーニングにおいて業界最高水準のパフォーマンスを実現します。現在、MNNはAlibaba IncのTaobao、Tmall、Youku、DingTalk、Xianyuなど、30を超えるアプリに統合されており、ライブ配信、ショート動画撮影、検索レコメンド、画像による商品検索、インタラクティブマーケティング、株式配分、セキュリティリスク管理など、70を超える利用シナリオをカバーしています。さらに、MNNはIoTなどの組み込みデバイスでも使用されています。



Watch: How to Export Ultralytics YOLO26 to MNN Format | Speed up Inference on Mobile Devices📱

サポートされるタスク#

MNNエクスポートは、Ultralyticsの7つすべてのタスクをサポートします。セマンティックセグメンテーションと深度推定は、これらのヘッドを搭載して出荷される唯一のファミリーであるYOLO26でのみ利用できます。

タスクYOLOv8YOLO11YOLO26
検出
セグメンテーション
セマンティック
深度
分類
ポーズ
OBB

MNNへのエクスポート: YOLO26モデルの変換#

Ultralytics YOLOモデルをMNN形式に変換することで、モデルの互換性とデプロイの柔軟性を高めることができます。この変換により、モデルがモバイル環境や組み込み環境向けに最適化され、リソースに制約のあるデバイスでも効率的なパフォーマンスを発揮できます。

インストール#

必要なパッケージをインストールするには、次を実行します。

インストール
# Install the required package for YOLO26 and MNN
pip install ultralytics
pip install MNN

使用方法#

すべてのUltralytics YOLO26モデルは、すぐにエクスポートできるよう設計されているため、任意のデプロイワークフローに簡単に統合できます。アプリケーションに最適な設定を選択するには、サポートされているエクスポート形式と設定オプションの全一覧を確認してください。

MNN形式は、ExportPredictValidateモードをサポートします。モデルをエクスポートしてから、エクスポートしたモデルを読み込み、推論を実行するか精度を検証してください。

エクスポート
from ultralytics import YOLO

# Load a YOLO26 model
model = YOLO("yolo26n.pt")

# Export the model to MNN format
model.export(format="mnn")  # creates 'yolo26n.mnn'
推論
from ultralytics import YOLO

# Load the exported MNN model
model = YOLO("yolo26n.mnn")

# Run inference
results = model("https://ultralytics.com/images/bus.jpg")
検証
from ultralytics import YOLO

# Load the exported MNN model
model = YOLO("yolo26n.mnn")

# Validate accuracy on the COCO8 dataset
metrics = model.val(data="coco8.yaml")

エクスポート引数#

引数デフォルト説明
formatstr'mnn'エクスポートされたモデルの対象形式で、さまざまなデプロイ環境との互換性を定義します。
imgszintまたはtuple640モデル入力に使用する画像サイズです。正方形画像の場合は整数、特定の寸法の場合はタプル(height, width)を指定できます。
quantizeintまたはstrNone量子化精度: 16 (FP16)または8 (INT8)を指定すると、エクスポートされる重みが削減されます。32/未指定の場合はFP32の重みがエクスポートされますが、MNNのCPUランタイムではFP32ではなく、デフォルトのlow精度で計算されます。非推奨となったhalf/int8フラグの代わりに使用します。
simplifyboolTrueonnxslimを使用して中間ONNXグラフを簡略化します。
opsetintNone中間ONNXグラフのONNX opsetバージョンを指定します。設定しない場合は、サポートされている最新バージョンが使用されます。
batchint1エクスポートするモデルのバッチ推論サイズ、またはpredictモードでエクスポート済みモデルが同時に処理する画像の最大数を指定します。
dynamicboolFalse入力画像のサイズを動的にできるようにします。nms=Trueとは併用できません。
nmsbool、オプションNone生出力(None、デフォルト)、組み込みNMS(True)、またはNMSフリーヘッド(False)を選択します。組み込みNMSは、dynamic=Falseを使用した検出とポーズ推定をサポートしています。
devicestrNoneエクスポートに使用するデバイスを指定します。GPU(device=0)、CPU(device=cpu)、Appleシリコン向けMPS(device=mps)を指定できます。

エクスポートプロセスの詳細については、エクスポートに関するUltralyticsドキュメントページをご覧ください。

MNNのみを使用した推論#

YOLO26の推論と前処理をMNNだけで実行する関数を実装しています。あらゆるシナリオで簡単にデプロイできるよう、Python版とC++版の両方を提供しています。

MNN
import argparse

import MNN
import MNN.cv as cv2
import MNN.numpy as np

def inference(model, img, precision, backend, thread):
    config = {}
    config["precision"] = precision
    config["backend"] = backend
    config["numThread"] = thread
    rt = MNN.nn.create_runtime_manager((config,))
    # net = MNN.nn.load_module_from_file(model, ['images'], ['output0'], runtime_manager=rt)
    net = MNN.nn.load_module_from_file(model, [], [], runtime_manager=rt)
    original_image = cv2.imread(img)
    ih, iw, _ = original_image.shape
    length = max((ih, iw))
    scale = length / 640
    image = np.pad(original_image, [[0, length - ih], [0, length - iw], [0, 0]], "constant")
    image = cv2.resize(
        image, (640, 640), 0.0, 0.0, cv2.INTER_LINEAR, -1, [0.0, 0.0, 0.0], [1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0]
    )
    image = image[..., ::-1]  # BGR to RGB
    input_var = image[None]
    input_var = MNN.expr.convert(input_var, MNN.expr.NC4HW4)
    output_var = net.forward(input_var)
    output_var = MNN.expr.convert(output_var, MNN.expr.NCHW)
    output_var = output_var.squeeze()
    # output_var shape: [84, 8400]; 84 means: [cx, cy, w, h, prob * 80]
    cx = output_var[0]
    cy = output_var[1]
    w = output_var[2]
    h = output_var[3]
    probs = output_var[4:]
    # [cx, cy, w, h] -> [y0, x0, y1, x1]
    x0 = cx - w * 0.5
    y0 = cy - h * 0.5
    x1 = cx + w * 0.5
    y1 = cy + h * 0.5
    boxes = np.stack([x0, y0, x1, y1], axis=1)
    # ensure ratio is within the valid range [0.0, 1.0]
    boxes = np.clip(boxes, 0, 1)
    # get max prob and idx
    scores = np.max(probs, 0)
    class_ids = np.argmax(probs, 0)
    result_ids = MNN.expr.nms(boxes, scores, 100, 0.45, 0.25)
    print(result_ids.shape)
    # nms result box, score, ids
    result_boxes = boxes[result_ids]
    result_scores = scores[result_ids]
    result_class_ids = class_ids[result_ids]
    for i in range(len(result_boxes)):
        x0, y0, x1, y1 = result_boxes[i].read_as_tuple()
        y0 = int(y0 * scale)
        y1 = int(y1 * scale)
        x0 = int(x0 * scale)
        x1 = int(x1 * scale)
        # clamp to the original image size to handle cases where padding was applied
        x1 = min(iw, x1)
        y1 = min(ih, y1)
        print(result_class_ids[i])
        cv2.rectangle(original_image, (x0, y0), (x1, y1), (0, 0, 255), 2)
    cv2.imwrite("res.jpg", original_image)

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--model", type=str, required=True, help="the yolo26 model path")
    parser.add_argument("--img", type=str, required=True, help="the input image path")
    parser.add_argument("--precision", type=str, default="normal", help="inference precision: normal, low, high, lowBF")
    parser.add_argument(
        "--backend",
        type=str,
        default="CPU",
        help="inference backend: CPU, OPENCL, OPENGL, NN, VULKAN, METAL, TRT, CUDA, HIAI",
    )
    parser.add_argument("--thread", type=int, default=4, help="inference using thread: int")
    args = parser.parse_args()
    inference(args.model, args.img, args.precision, args.backend, args.thread)

まとめ#

このガイドでは、Ultralytics YOLO26モデルをMNNにエクスポートし、MNNを使用して推論する方法を紹介します。MNN形式はエッジAIアプリケーションで優れたパフォーマンスを発揮するため、リソースに制約のあるデバイスへのコンピュータビジョンモデルのデプロイに適しています。

詳しい使用方法については、MNNドキュメントを参照してください。

FAQ#

  • Ultralytics YOLO26モデルをMNN形式にエクスポートするには、次の手順に従ってください。

    エクスポート
    from ultralytics import YOLO
    
    # Load a YOLO26 model
    model = YOLO("yolo26n.pt")
    
    # Export to MNN format
    model.export(format="mnn")  # creates 'yolo26n.mnn' with fp32 weight
    model.export(format="mnn", quantize=16)  # creates 'yolo26n.mnn' with fp16 weight
    model.export(format="mnn", quantize=8)  # creates 'yolo26n.mnn' with int8 weight

    詳しいエクスポートオプションについては、ドキュメントのExportページを確認してください。

  • エクスポートしたYOLO26 MNNモデルで予測するには、YOLOクラスのpredict関数を使用します。

    推論
    from ultralytics import YOLO
    
    # Load the YOLO26 MNN model
    model = YOLO("yolo26n.mnn")
    
    # Run inference
    results = model("https://ultralytics.com/images/bus.jpg")
    
    for result in results:
        result.show()  # display to screen
        result.save(filename="result.jpg")  # save to disk
  • MNNは汎用性が高く、さまざまなプラットフォームをサポートしています。

    • モバイル: Android、iOS、Harmony。
    • 組み込みシステムとIoTデバイス: Raspberry PiやNVIDIA Jetsonなどのデバイス。
    • デスクトップとサーバー: Linux、Windows、macOS。
  • YOLO26モデルをモバイルデバイスにデプロイするには、次の手順に従ってください。

    1. Android向けにビルド: MNN Androidガイドに従ってください。
    2. iOS向けにビルド: MNN iOSガイドに従ってください。
    3. Harmony向けにビルド: MNN Harmonyガイドに従ってください。

コメント