Экспорт моделей YOLO26 в MNN и развёртывание#
MNN#
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 — единственном семействе, поставляемом с такими головами.
| Задача | YOLOv8 | YOLO11 | YOLO26 |
|---|---|---|---|
| Детекция | ✅ | ✅ | ✅ |
| Сегментация | ✅ | ✅ | ✅ |
| Семантическая сегментация | ❌ | ❌ | ✅ |
| Оценка глубины | ❌ | ❌ | ✅ |
| Классификация | ✅ | ✅ | ✅ |
| Поза | ✅ | ✅ | ✅ |
| 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")Аргументы экспорта#
| Аргумент | Тип | По умолчанию | Описание |
|---|---|---|---|
format | str | 'mnn' | Целевой формат экспортированной модели, определяющий совместимость с различными средами развёртывания. |
imgsz | int или tuple | 640 | Требуемый размер изображения для входных данных модели. Может быть целым числом для квадратных изображений или кортежем (height, width) для указания конкретных размеров. |
quantize | int или str | None | Точность квантования: 16 (FP16) или 8 (INT8) уменьшают размер экспортированных весов; 32/не задано экспортирует веса FP32, которые среда выполнения MNN на CPU всё равно обрабатывает с точностью low по умолчанию, а не FP32. Заменяет устаревшие флаги half/int8. |
simplify | bool | True | Упрощает промежуточный граф ONNX с помощью onnxslim. |
opset | int | None | Задает версию opset для промежуточного графа ONNX. Если параметр не задан, используется последняя поддерживаемая версия. |
batch | int | 1 | Задаёт размер пакета при инференсе экспортированной модели или максимальное количество изображений, которые экспортированная модель будет обрабатывать одновременно в режиме predict. |
dynamic | bool | False | Включает динамические размеры входного изображения. Нельзя использовать вместе с nms=True. |
nms | bool, необязательно | None | Выбери сырой вывод (None, по умолчанию), встроенный NMS (True) или голову без NMS (False). Встроенный NMS поддерживает детектирование и позу с dynamic=False. |
device | str | None | Указывает устройство для экспорта: GPU (device=0), CPU (device=cpu), MPS для Apple silicon (device=mps). |
Подробнее о процессе экспорта см. на странице документации Ultralytics об экспорте.
Инференс только с MNN#
Реализована функция, которая использует исключительно MNN для инференса и предварительной обработки YOLO26, с версиями на Python и C++ для удобного развёртывания в любых сценариях.
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.Predictfrom 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 diskMNN универсален и поддерживает различные платформы:
- Мобильные устройства: Android, iOS, Harmony.
- Встраиваемые системы и устройства IoT: такие устройства, как Raspberry Pi и NVIDIA Jetson.
- Настольные компьютеры и серверы: Linux, Windows и macOS.
Чтобы развернуть модели YOLO26 на мобильных устройствах:
- Сборка для Android: следуй руководству MNN Android.
- Сборка для iOS: следуй руководству MNN iOS.
- Сборка для Harmony: следуй руководству MNN Harmony.