YOLO Vision 2026:

Экспорт MNN для моделей YOLO26 и развертывание#

MNN#

MNN mobile neural network inference framework

MNN — это высокоэффективный и легкий фреймворк глубокого обучения. Он поддерживает вывод и обучение моделей глубокого обучения и обладает ведущей в отрасли производительностью для вывода и обучения на устройствах. На данный момент MNN интегрирован более чем в 30 приложений Alibaba Inc, таких как Taobao, Tmall, Youku, DingTalk, Xianyu и др., охватывая более 70 сценариев использования, таких как прямые трансляции, съемка коротких видео, поисковые рекомендации, поиск товаров по изображению, интерактивный маркетинг, распределение бонусов, контроль рисков безопасности. Кроме того, MNN используется на встраиваемых устройствах, таких как IoT.



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

Поддерживаемые задачи#

Экспорт в MNN поддерживает все семь задач Ultralytics. Семантическая сегментация и оценка глубины доступны только в YOLO26, единственном семействе, в котором поставляются эти «головы».

ЗадачаYOLOv8YOLO11YOLO26
Detect
Segment
Semantic
Depth
Classify
Pose
OBB

Экспорт в MNN: преобразование твоей модели YOLO26#

Ты можешь расширить совместимость моделей и гибкость развертывания, конвертируя модели Ultralytics YOLO в формат MNN. Эта конвертация оптимизирует твои модели для мобильных и встраиваемых сред, обеспечивая эффективную производительность на устройствах с ограниченными ресурсами.

Установка#

Чтобы установить необходимые пакеты, выполни:

Установка
# Install the required package for YOLO26 and MNN
pip install ultralytics
pip install MNN

Использование#

Все модели Ultralytics YOLO26 поддерживают экспорт из коробки, что позволяет легко интегрировать их в твой привычный рабочий процесс развертывания. Ты можешь посмотреть полный список поддерживаемых форматов экспорта и параметров конфигурации, чтобы выбрать оптимальную настройку для своего приложения.

Формат MNN поддерживает режимы Export, Predict и Validate. Экспортируй свою модель, затем загрузи экспортированную модель для запуска инференса или проверки ее точности.

Экспорт
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). Заменяет устаревшие флаги half/int8.
simplifyboolTrueУпрощает промежуточный граф ONNX с помощью onnxslim.
opsetintNoneУказывает версию ONNX opset для промежуточного графа ONNX. Если не задано, используется последняя поддерживаемая версия.
batchint1Указывает размер пакета для пакетного инференса экспортированной модели или максимальное количество изображений, которые экспортированная модель будет обрабатывать одновременно в режиме predict.
dynamicboolFalseВключает динамические размеры входного изображения. Не может сочетаться с nms=True.
nmsboolFalseДобавляет NMS для моделей детекции и позы. Не может сочетаться с dynamic=True.
devicestrNoneУказывает устройство для экспорта: GPU (device=0), CPU (device=cpu), MPS для Apple silicon (device=mps).

Дополнительную информацию о процессе экспорта см. на странице документации Ultralytics по экспорту.

Вывод только через MNN#

Реализована функция, полагающаяся исключительно на MNN для вывода и предварительной обработки YOLO26, предоставляя версии как для 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 обеспечивает отличную производительность для приложений edge 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, используй функцию predict из класса YOLO.

    Предсказание
    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 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.

Комментарии