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, единственном семействе, в котором поставляются эти «головы».

Экспорт в 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Задает размер пакета (batch) для вывода экспортированной модели или максимальное количество изображений, которые модель будет обрабатывать одновременно в режиме 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?#

Чтобы экспортировать свою модель 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?#

Чтобы выполнить предсказание с экспортированной моделью 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?#

MNN универсальна и поддерживает различные платформы:

  • Мобильные устройства: Android, iOS, Harmony.
  • Встроенные системы и устройства IoT: такие устройства, как Raspberry Pi и NVIDIA Jetson.
  • Десктопы и серверы: Linux, Windows и macOS.

Как я могу развернуть модели Ultralytics YOLO26 MNN на мобильных устройствах?#

Чтобы развернуть свои модели YOLO26 на мобильных устройствах:

  1. Сборка для Android: следуй руководству MNN Android.
  2. Сборка для iOS: следуй руководству MNN iOS.
  3. Сборка для Harmony: следуй руководству MNN Harmony.

Комментарии