Meet YOLO26: next-gen vision AI.

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

Link to this sectionMNN#

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📱

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

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

Link to this sectionУстановка#

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

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

Link to this sectionИспользование#

Все модели 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")

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

АргументТипПо умолчаниюОписание
formatstr'mnn'Целевой формат для экспортированной модели, определяющий совместимость с различными средами развертывания.
imgszint или tuple640Желаемый размер изображения для входных данных модели. Может быть целым числом для квадратных изображений или кортежем (height, width) для конкретных размеров.
quantizeint или strNoneТочность квантования: 16 (FP16), 8 (квантование весов INT8) или 32/не задано (FP32). Заменяет устаревшие флаги half/int8.
batchint1Задает размер пакета (batch) для вывода экспортированной модели или максимальное количество изображений, которые модель будет обрабатывать одновременно в режиме predict.
devicestrNoneУказывает устройство для экспорта: GPU (device=0), CPU (device=cpu), MPS для Apple silicon (device=mps).

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

Link to this sectionВывод только через 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)

Link to this sectionРезюме#

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

Для получения дополнительной информации обратись к документации MNN.

Link to this sectionFAQ#

Link to this sectionКак мне экспортировать модели 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 в документации.

Link to this sectionКак мне выполнить предсказание с экспортированной моделью 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

Link to this sectionКакие платформы поддерживаются для MNN?#

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

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

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

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

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

Комментарии