Экспорт MNN для моделей YOLO26 и развертывание#
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, единственном семействе, в котором поставляются эти «головы».
Экспорт в 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). Заменяет устаревшие флаги half/int8. |
simplify | bool | True | Упрощает промежуточный граф ONNX с помощью onnxslim. |
opset | int | None | Указывает версию ONNX opset для промежуточного графа ONNX. Если не задано, используется последняя поддерживаемая версия. |
batch | int | 1 | Указывает размер пакета для пакетного инференса экспортированной модели или максимальное количество изображений, которые экспортированная модель будет обрабатывать одновременно в режиме predict. |
dynamic | bool | False | Включает динамические размеры входного изображения. Не может сочетаться с nms=True. |
nms | bool | False | Добавляет NMS для моделей детекции и позы. Не может сочетаться с dynamic=True. |
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] -> [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, выполни следующие шаги:
Экспорт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.Предсказание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 diskMNN универсальна и поддерживает различные платформы:
- Мобильные устройства: Android, iOS, Harmony.
- Встроенные системы и устройства IoT: Устройства вроде Raspberry Pi и NVIDIA Jetson.
- Десктопы и серверы: Linux, Windows и macOS.
Чтобы развернуть свои модели YOLO26 на мобильных устройствах:
- Сборка для Android: Следуй руководству MNN Android.
- Сборка для iOS: Следуй руководству MNN iOS.
- Сборка для Harmony: Следуй руководству MNN Harmony.