Ultralytics YOLO27:

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

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'
Predict
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, которые среда выполнения MNN на CPU всё равно обрабатывает с точностью low по умолчанию, а не FP32. Заменяет устаревшие флаги half/int8.
simplifyboolTrueУпрощает промежуточный граф ONNX с помощью onnxslim.
opsetintNoneЗадает версию opset для промежуточного графа ONNX. Если параметр не задан, используется последняя поддерживаемая версия.
batchint1Задаёт размер пакета при инференсе экспортированной модели или максимальное количество изображений, которые экспортированная модель будет обрабатывать одновременно в режиме predict.
dynamicboolFalseВключает динамические размеры входного изображения. Нельзя использовать вместе с nms=True.
nmsbool, необязательноNoneВыбери сырой вывод (None, по умолчанию), встроенный NMS (True) или голову без NMS (False). Встроенный NMS поддерживает детектирование и позу с dynamic=False.
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] -> [x0, y0, x1, y1]
    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)
    # 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 обеспечивает отличную производительность в приложениях периферийного ИИ, что делает его идеальным для развёртывания моделей компьютерного зрения на устройствах с ограниченными ресурсами.

Дополнительные сведения об использовании см. в документации 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, используй функцию predict из класса YOLO.

    Predict
    from ultralytics import YOLO
    
    # Load the YOLO26 MNN model
    model = YOLO("yolo26n.mnn")
    
    # Run inference
    results = model("https://ultralytics.com/images/bus.jpg")
    
    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.

Комментарии