Ultralytics YOLO27:

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

MNN#

MNN mobile neural network inference framework

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



Смотри: Как экспортировать Ultralytics YOLO26 в формат MNN | Ускорение инференса на мобильных устройствах📱

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

Экспорт 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 поддерживает режимы экспорта, предсказания и валидации. Экспортируй модель, а затем загрузи её, чтобы выполнить инференс или проверить точность.

Экспорт
from ultralytics import YOLO

# Загрузи модель YOLO26
model = YOLO("yolo26n.pt")

# Экспорт модели в формат MNN
model.export(format="mnn")  # создаёт файл 'yolo26n.mnn'
Предсказание
from ultralytics import YOLO

# Загрузка экспортированной модели MNN
model = YOLO("yolo26n.mnn")

# Выполнить инференс
results = model("https://ultralytics.com/images/bus.jpg")
Проверка
from ultralytics import YOLO

# Загрузка экспортированной модели MNN
model = YOLO("yolo26n.mnn")

# Проверить точность на наборе данных COCO8
metrics = model.val(data="coco8.yaml")

Аргументы экспорта#

АргументТипПо умолчаниюОписание
formatstr'mnn'Целевой формат экспортируемой модели, определяющий совместимость с различными средами развертывания.
imgszint или tuple640Заданный размер изображения на входе модели. Можно указать целое число для квадратных изображений или кортеж (height, width) для конкретных размеров.
quantizeint или strNoneТочность квантования: 16 (FP16) или 8 (INT8) уменьшают размер экспортированных весов; при значении 32 или без заданного значения экспортируются веса FP32, но MNNBackend от Ultralytics всё равно выполняет инференс с точностью low, а не FP32. Заменяет устаревшие флаги half/int8.
simplifyboolTrueУпрощает промежуточный граф ONNX с помощью onnxslim.
opsetintNoneЗадает версию opset ONNX для промежуточного графа 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#

Реализована функция, которая использует для инференса YOLO26 и предобработки только MNN; доступны версии на 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 в 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: [84, 8400]; 84 означает: [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)
    # получение максимальной вероятности и индекса
    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_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)
        # ограничение размеров исходного изображения для обработки случаев с добавлением отступов
        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
    
    # Загрузи модель YOLO26
    model = YOLO("yolo26n.pt")
    
    # Экспорт в формат MNN
    model.export(format="mnn")  # создаёт 'yolo26n.mnn' с весами fp32
    model.export(format="mnn", quantize=16)  # создаёт 'yolo26n.mnn' с весами fp16
    model.export(format="mnn", quantize=8)  # создаёт 'yolo26n.mnn' с весами int8

    Подробные параметры экспорта смотри на странице «Экспорт» в документации.

  • Чтобы выполнять предсказания с экспортированной моделью YOLO26 MNN, используй функцию predict класса YOLO.

    Предсказание
    from ultralytics import YOLO
    
    # Загрузка модели YOLO26 MNN
    model = YOLO("yolo26n.mnn")
    
    # Выполнить инференс
    results = model("https://ultralytics.com/images/bus.jpg")
    
    for result in results:
        result.show()  # отобразить на экране
        result.save(filename="result.jpg")  # сохранить на диск
  • 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.

Комментарии