YOLO26モデルのMNNエクスポートとデプロイメント
MNN
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へのエクスポート:YOLO26モデルの変換
Ultralytics YOLOモデルをMNN形式に変換することで、モデルの互換性とデプロイの柔軟性を拡張できます。この変換により、モデルがモバイル環境や組み込み環境向けに最適化され、リソースが制限されたデバイスでも効率的なパフォーマンスが確保されます。
インストール
必要なパッケージをインストールするには、以下のコマンドを実行します:
# Install the required package for YOLO26 and MNN
pip install ultralytics
pip install MNN使用方法
すべてのUltralytics YOLO26モデルは、標準でエクスポートをサポートするように設計されており、好みのデプロイワークフローに簡単に統合できます。サポートされているエクスポート形式と構成オプションの全リストを確認して、アプリケーションに最適なセットアップを選択してください。
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.pt")
# Export the model to MNN format
model.export(format="mnn") # creates 'yolo26n.mnn'
# Load the exported MNN model
mnn_model = YOLO("yolo26n.mnn")
# Run inference
results = mnn_model("https://ultralytics.com/images/bus.jpg")エクスポート引数
| 引数 | タイプ | デフォルト | 説明 |
|---|---|---|---|
format | str | 'mnn' | エクスポートされたモデルのターゲットフォーマット。さまざまなデプロイ環境との互換性を定義します。 |
imgsz | int または tuple | 640 | モデル入力に希望する画像サイズ。正方形の画像の場合は整数、特定の寸法のタプル (height, width) で指定できます。 |
half | bool | False | FP16(半精度)量子化を有効にし、モデルサイズを削減し、サポートされているハードウェア上での推論を高速化する可能性があります。 |
int8 | bool | False | INT8量子化をアクティブにし、主にエッジデバイス向けに、精度の損失を最小限に抑えながらモデルをさらに圧縮し、推論を高速化します。 |
batch | int | 1 | エクスポートされたモデルのバッチ推論サイズ、または predict モードでモデルが同時に処理する画像の最大数を指定します。 |
device | str | None | エクスポートするデバイスを指定します:GPU (device=0)、CPU (device=cpu)、Appleシリコン用MPS (device=mps)。 |
エクスポートプロセスの詳細については、エクスポートに関するUltralyticsドキュメントページをご覧ください。
MNN専用推論
YOLO26の推論と前処理をMNNのみに依存する関数が実装されており、Python版とC++版の両方が提供されているため、あらゆるシナリオで簡単にデプロイできます。
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形式にエクスポートするにはどうすればよいですか?
Ultralytics YOLO26モデルをMNN形式にエクスポートするには、次の手順に従ってください。
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.pt")
# Export to MNN format
model.export(format="mnn") # creates 'yolo26n.mnn' with fp32 weight
model.export(format="mnn", half=True) # creates 'yolo26n.mnn' with fp16 weight
model.export(format="mnn", int8=True) # creates 'yolo26n.mnn' with int8 weight詳細なエクスポートオプションについては、ドキュメントのエクスポートページを確認してください。
エクスポートされたYOLO26 MNNモデルで予測を行うにはどうすればよいですか?
エクスポートされたYOLO26 MNNモデルで予測するには、YOLOクラスのpredict関数を使用します。
from ultralytics import YOLO
# Load the YOLO26 MNN model
model = YOLO("yolo26n.mnn")
# Export to MNN format
results = model("https://ultralytics.com/images/bus.jpg") # predict with `fp32`
results = model("https://ultralytics.com/images/bus.jpg", half=True) # predict with `fp16` if device support
for result in results:
result.show() # display to screen
result.save(filename="result.jpg") # save to diskMNNではどのプラットフォームがサポートされていますか?
MNNは汎用性が高く、さまざまなプラットフォームをサポートしています。
- モバイル: Android、iOS、Harmony。
- 組み込みシステムおよびIoTデバイス: Raspberry PiやNVIDIA Jetsonなどのデバイス。
- デスクトップおよびサーバー: Linux、Windows、およびmacOS。
モバイルデバイスにUltralytics YOLO26 MNNモデルをデプロイするにはどうすればよいですか?
YOLO26モデルをモバイルデバイスにデプロイするには、以下を行います。
- Android向けビルド: MNN Androidガイドに従ってください。
- iOS向けビルド: MNN iOSガイドに従ってください。
- Harmony向けビルド: MNN Harmonyガイドに従ってください。