YOLO26 Modelleri ve Dağıtımı için MNN Dışa Aktarma#
MNN#
MNN, son derece verimli ve hafif bir derin öğrenme çerçevesidir. Derin öğrenme modellerinin çıkarımını ve eğitimini destekler; cihaz üstü çıkarım ve eğitimde sektör lideri performansa sahiptir. Halihazırda MNN; canlı yayın, kısa video çekimi, arama önerisi, görselle ürün arama, etkileşimli pazarlama, hak dağıtımı, güvenlik risk kontrolü gibi 70'ten fazla kullanım senaryosunu kapsayacak şekilde Taobao, Tmall, Youku, DingTalk, Xianyu gibi Alibaba Inc.'in 30'dan fazla uygulamasında entegre edilmiştir. Buna ek olarak MNN, Nesnelerin İnterneti (IoT) gibi gömülü cihazlarda da kullanılmaktadır.
Watch: How to Export Ultralytics YOLO26 to MNN Format | Speed up Inference on Mobile Devices📱
Desteklenen Görevler#
MNN dışa aktarımı, yedi Ultralytics görevini de destekler. Anlamsal bölütleme ve derinlik tahmini, yalnızca bu kafaları barındıran tek aile olan YOLO26 ile kullanılabilir.
| Görev | YOLOv8 | YOLO11 | YOLO26 |
|---|---|---|---|
| Algıla | ✅ | ✅ | ✅ |
| Segmentlere Ayır | ✅ | ✅ | ✅ |
| Anlamsal | ❌ | ❌ | ✅ |
| Derinlik | ❌ | ❌ | ✅ |
| Sınıflandır | ✅ | ✅ | ✅ |
| Poz | ✅ | ✅ | ✅ |
| OBB | ✅ | ✅ | ✅ |
MNN'ye Dışa Aktarma: YOLO26 Modelini Dönüştürme#
Ultralytics YOLO modellerini MNN formatına dönüştürerek model uyumluluğunu ve dağıtım esnekliğini artırabilirsin. Bu dönüştürme, modellerini mobil ve gömülü ortamlar için optimize ederek kaynak kısıtlı cihazlarda verimli performans sağlar.
Kurulum#
Gerekli paketleri kurmak için şunu çalıştır:
# Install the required package for YOLO26 and MNN
pip install ultralytics
pip install MNNKullanım#
Tüm Ultralytics YOLO26 modelleri, kutudan çıktığı gibi dışa aktarmayı destekleyecek şekilde tasarlanmıştır; bu da bunları tercih ettiğin dağıtım iş akışına entegre etmeni kolaylaştırır. Uygulaman için en iyi kurulumu seçmek üzere desteklenen dışa aktarım formatlarının ve yapılandırma seçeneklerinin tam listesini görüntüleyebilirsin.
MNN formatı Export, Predict ve Validate modlarını destekler. Modelini dışa aktar, ardından çıkarım çalıştırmak veya doğruluğunu test etmek için dışa aktarılan modeli yükle.
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")Dışa Aktarma Argümanları#
| Argüman | Tip | Varsayılan | Açıklama |
|---|---|---|---|
format | str | 'mnn' | Çeşitli dağıtım ortamlarıyla uyumluluğu tanımlayan, dışa aktarılan model için hedef format. |
imgsz | int veya tuple | 640 | Model girişi için istenen görüntü boyutu. Kare görüntüler için bir tamsayı veya belirli boyutlar için bir (height, width) demeti (tuple) olabilir. |
quantize | int veya str | None | Niceleme hassasiyeti: 16 (FP16), 8 (INT8 ağırlık nicelemesi) veya 32/ayarlanmamış (FP32). Kullanımdan kaldırılan half/int8 bayraklarının yerini alır. |
simplify | bool | True | Ara ONNX grafiğini onnxslim ile basitleştirir. |
opset | int | None | Ara ONNX grafiği için ONNX opset sürümünü belirtir. Ayarlanmazsa, desteklenen en son sürümü kullanır. |
batch | int | 1 | Dışa aktarılan modelin toplu çıkarım boyutunu veya dışa aktarılan modelin predict modunda aynı anda işleyeceği maksimum görüntü sayısını belirtir. |
dynamic | bool | False | Dinamik giriş resmi boyutlarını etkinleştirir. nms=True ile birleştirilemez. |
nms | bool | False | Nesne tespiti ve poz modelleri için NMS ekler. dynamic=True ile birleştirilemez. |
device | str | None | Dışa aktarma için cihazı belirtir: GPU (device=0), CPU (device=cpu), Apple silikon için MPS (device=mps). |
Dışa aktarım süreci hakkında daha fazla ayrıntı için Ultralytics documentation page on exporting sayfasını ziyaret edin.
Sadece MNN ile Çıkarım#
YOLO26 çıkarımı ve ön işlemesi için yalnızca MNN'ye dayanan bir işlev uygulanmıştır; herhangi bir senaryoda kolay dağıtım için hem Python hem de C++ sürümleri sunulmaktadır.
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)Özet#
Bu kılavuzda, Ultralytics YOLO26 modelini MNN formatına nasıl dışa aktaracağını ve çıkarım için MNN'yi nasıl kullanacağını tanıtıyoruz. MNN formatı, edge AI uygulamaları için mükemmel performans sunarak bilgisayarlı görü modellerini kaynak kısıtlı cihazlarda dağıtmak için ideal hale getirir.
Daha fazla kullanım için lütfen MNN documentation sayfasına göz at.
SSS#
Ultralytics YOLO26 modelini MNN formatına dışa aktarmak için şu adımları izle:
Dışa Aktar (Export)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 weightAyrıntılı dışa aktarma seçenekleri için belgelerdeki Export sayfasına göz at.
Dışa aktarılmış bir YOLO26 MNN modeliyle tahmin yapmak için YOLO sınıfındaki
predictfonksiyonunu kullan.Tahmin Et (Predict)from ultralytics import YOLO # Load the YOLO26 MNN model model = YOLO("yolo26n.mnn") # Run inference results = model("https://ultralytics.com/images/bus.jpg") # predict with `fp32` results = model("https://ultralytics.com/images/bus.jpg", quantize=16) # predict with `fp16` if device support for result in results: result.show() # display to screen result.save(filename="result.jpg") # save to diskMNN çok yönlüdür ve çeşitli platformları destekler:
- Mobil: Android, iOS, Harmony.
- Gömülü Sistemler ve IoT Cihazları: Raspberry Pi ve NVIDIA Jetson gibi cihazlar.
- Masaüstü ve Sunucular: Linux, Windows ve macOS.
YOLO26 modellerini Mobil cihazlarda dağıtmak için:
- Android için Derleme: MNN Android kılavuzunu takip et.
- iOS için Derleme: MNN iOS kılavuzunu takip et.
- Harmony için Derleme: MNN Harmony kılavuzunu takip et.