YOLO26 Modelleri ve Dağıtımı için MNN Dışa Aktarımı

MNN

MNN mobile neural network inference framework

MNN, oldukça verimli ve hafif bir derin öğrenme çerçevesidir. Derin öğrenme modellerinin çıkarımını ve eğitimini destekler; cihaz üzerinde çıkarım ve eğitim için sektör lideri bir performansa sahiptir. MNN şu anda Taobao, Tmall, Youku, DingTalk, Xianyu gibi 30'dan fazla Alibaba Inc uygulamasına entegre edilmiştir ve canlı yayın, kısa video çekimi, arama önerileri, görselle ürün arama, etkileşimli pazarlama, öz sermaye dağıtımı, güvenlik riski kontrolü gibi 70'ten fazla kullanım senaryosunu kapsamaktadır. Ayrıca MNN, 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📱

MNN'e Dışa Aktarım: 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üşüm, modellerini mobil ve gömülü ortamlar için optimize ederek kaynak kısıtlı cihazlarda verimli performans sağlar.

Kurulum

Gerekli paketleri yüklemek için şunu çalıştır:

Kurulum
# Install the required package for YOLO26 and MNN
pip install ultralytics
pip install MNN

Kullanım

Tüm Ultralytics YOLO26 modelleri, kutudan çıktığı gibi dışa aktarımı destekleyecek şekilde tasarlanmıştır; bu sayede onları tercih ettiğin dağıtım iş akışına kolayca entegre edebilirsin. Uygulaman için en iyi kurulumu seçmek amacıyla desteklenen dışa aktarım formatlarının ve yapılandırma seçeneklerinin tam listesine göz atabilirsin.

Kullanım
  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")

Dışa Aktarma Argümanları

ArgümanTürVarsayılanAçıklama
formatstr'mnn'Çeşitli dağıtım ortamlarıyla uyumluluğu tanımlayan, dışa aktarılan model için hedef format.
imgszint veya tuple640Desired image size for the model input. Can be an integer for square images or a tuple (height, width) for specific dimensions.
halfboolFalseFP16 (yarım hassasiyet) nicelemeyi etkinleştirerek model boyutunu küçültür ve desteklenen donanımlarda çıkarım hızını potansiyel olarak artırır.
int8boolFalseINT8 nicelemeyi etkinleştirerek modeli daha da sıkıştırır ve minimum doğruluk kaybıyla, öncelikle uç cihazlar için çıkarımı hızlandırır.
batchint1Modelin dışa aktarılan toplu çıkarım boyutunu veya dışa aktarılan modelin predict modunda eşzamanlı olarak işleyeceği maksimum görüntü sayısını belirtir.
devicestrNoneDışa aktarma için cihazı belirtir: GPU (device=0), CPU (device=cpu), Apple silikon için MPS (device=mps).

Dışa aktarma süreci hakkında daha fazla ayrıntı için dışa aktarma ile ilgili Ultralytics dokümantasyon sayfasını ziyaret et.

Sadece MNN ile Çıkarım

YOLO26 çıkarımı ve ön işleme için tamamen MNN'e dayanan bir fonksiyon uygulanmıştır; bu, her türlü senaryoda kolay dağıtım için hem Python hem de C++ sürümleri sunar.

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)

Özet

Bu kılavuzda, Ultralytics YOLO26 modelinin MNN'e nasıl dışa aktarılacağını ve çıkarım için MNN'in nasıl kullanılacağını tanıtıyoruz. MNN formatı, edge AI uygulamaları için mükemmel bir performans sağlayarak bilgisayarlı görü modellerini kaynak kısıtlı cihazlarda dağıtmak için ideal hale getirir.

Daha fazla kullanım bilgisi için lütfen MNN belgelerine başvur.

SSS

Ultralytics YOLO26 modellerini MNN formatına nasıl dışa aktarırım?

Ultralytics YOLO26 modelini MNN formatına dışa aktarmak için şu adımları izle:

Dışa Aktar (Export)
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

Ayrıntılı dışa aktarım seçenekleri için belgelerdeki Dışa Aktarım (Export) sayfasına göz at.

Dışa aktarılmış bir YOLO26 MNN modeliyle nasıl tahmin yaparım?

Dışa aktarılmış bir YOLO26 MNN modeliyle tahmin yapmak için, YOLO sınıfından predict fonksiyonunu kullan.

Tahmin
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 disk

MNN için hangi platformlar destekleniyor?

MNN ç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.

Ultralytics YOLO26 MNN modellerini Mobil Cihazlarda nasıl dağıtabilirim?

YOLO26 modellerini Mobil cihazlarda dağıtmak için:

  1. Android için Oluştur: MNN Android kılavuzunu izle.
  2. iOS için Oluştur: MNN iOS kılavuzunu izle.
  3. Harmony için Oluştur: MNN Harmony kılavuzunu izle.

Yorumlar