Exportación a MNN para modelos YOLO26 y despliegue#
MNN#
MNN es un framework de aprendizaje profundo muy eficiente y ligero. Admite la inferencia y el entrenamiento de modelos de aprendizaje profundo, y ofrece un rendimiento líder del sector para la inferencia y el entrenamiento en el dispositivo. Actualmente, MNN se ha integrado en más de 30 aplicaciones de Alibaba Inc., como Taobao, Tmall, Youku, DingTalk, Xianyu, etc., y abarca más de 70 escenarios de uso, como retransmisiones en directo, captura de vídeos cortos, recomendaciones de búsqueda, búsqueda de productos por imagen, marketing interactivo, distribución de participaciones y control de riesgos de seguridad. Además, MNN también se utiliza en dispositivos integrados, como los de IoT.
Watch: How to Export Ultralytics YOLO26 to MNN Format | Speed up Inference on Mobile Devices📱
Tareas compatibles#
La exportación a MNN admite las siete tareas de Ultralytics. La segmentación semántica y la estimación de profundidad solo están disponibles con YOLO26, la única familia que incluye esas cabezas.
| Tarea | YOLOv8 | YOLO11 | YOLO26 |
|---|---|---|---|
| Detección | ✅ | ✅ | ✅ |
| Segmentación | ✅ | ✅ | ✅ |
| Semántica | ❌ | ❌ | ✅ |
| Profundidad | ❌ | ❌ | ✅ |
| Clasificación | ✅ | ✅ | ✅ |
| Pose | ✅ | ✅ | ✅ |
| OBB | ✅ | ✅ | ✅ |
Exportación a MNN: conversión de tu modelo YOLO26#
Puedes ampliar la compatibilidad de los modelos y la flexibilidad de despliegue convirtiendo los modelos de Ultralytics YOLO al formato MNN. Esta conversión optimiza tus modelos para entornos móviles e integrados, garantizando un rendimiento eficiente en dispositivos con recursos limitados.
Instalación#
Para instalar los paquetes necesarios, ejecuta:
# Install the required package for YOLO26 and MNN
pip install ultralytics
pip install MNNUso#
Todos los modelos Ultralytics YOLO26 están diseñados para admitir la exportación de forma nativa, lo que facilita su integración en tu flujo de trabajo de despliegue preferido. Puedes consultar la lista completa de formatos de exportación y opciones de configuración compatibles para elegir la configuración más adecuada para tu aplicación.
El formato MNN admite los modos de Exportación, Predicción y Validación. Exporta tu modelo y, después, carga el modelo exportado para ejecutar la inferencia o validar su precisión.
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")Argumentos de exportación#
| Argumento | Tipo | Predeterminado | Descripción |
|---|---|---|---|
format | str | 'mnn' | Formato de destino del modelo exportado, que define la compatibilidad con diversos entornos de despliegue. |
imgsz | int o tuple | 640 | Tamaño de imagen deseado para la entrada del modelo. Puede ser un entero para imágenes cuadradas o una tupla (height, width) para dimensiones específicas. |
quantize | int o str | None | Precisión de cuantización: 16 (FP16) o 8 (INT8) reducen los pesos exportados; 32/sin establecer exporta pesos FP32, que el runtime de CPU de MNN sigue calculando con su precisión predeterminada low en lugar de FP32. Sustituye a las marcas obsoletas half/int8. |
simplify | bool | True | Simplifica el grafo ONNX intermedio con onnxslim. |
opset | int | None | Especifica la versión del opset de ONNX para el grafo ONNX intermedio. Si no se establece, utiliza la última versión compatible. |
batch | int | 1 | Especifica el tamaño del lote de inferencia del modelo exportado o el número máximo de imágenes que el modelo exportado procesará simultáneamente en el modo predict. |
dynamic | bool | False | Activa dimensiones dinámicas para las imágenes de entrada. No se puede combinar con nms=True. |
nms | bool, opcional | None | Selecciona la salida en bruto (None, predeterminada), la NMS integrada (True) o la cabeza sin NMS (False). La NMS integrada admite detección y estimación de poses con dynamic=False. |
device | str | None | Especifica el dispositivo para la exportación: GPU (device=0), CPU (device=cpu) o MPS para Apple silicon (device=mps). |
Para obtener más información sobre el proceso de exportación, visita la página de la documentación de Ultralytics sobre exportación.
Inferencia exclusiva de MNN#
Se ha implementado una función que depende exclusivamente de MNN para la inferencia y el preprocesamiento de YOLO26, con versiones tanto en Python como en C++ para facilitar el despliegue en cualquier escenario.
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)Resumen#
En esta guía, te explicamos cómo exportar el modelo Ultralytics YOLO26 a MNN y utilizar MNN para la inferencia. El formato MNN ofrece un rendimiento excelente para aplicaciones de IA perimetral, por lo que es ideal para desplegar modelos de visión por ordenador en dispositivos con recursos limitados.
Para obtener más información sobre su uso, consulta la documentación de MNN.
Preguntas frecuentes#
Para exportar tu modelo Ultralytics YOLO26 al formato MNN, sigue estos pasos:
Exportarfrom 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 weightPara consultar las opciones de exportación detalladas, visita la página de Exportación de la documentación.
Para hacer predicciones con un modelo YOLO26 MNN exportado, utiliza la función
predictde la clase YOLO.Predecirfrom 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 es versátil y admite varias plataformas:
- Móviles: Android, iOS, Harmony.
- Sistemas integrados y dispositivos IoT: dispositivos como Raspberry Pi y NVIDIA Jetson.
- Ordenadores de sobremesa y servidores: Linux, Windows y macOS.
Para desplegar tus modelos YOLO26 en dispositivos móviles:
- Compilación para Android: sigue la guía de MNN para Android.
- Compilación para iOS: sigue la guía de MNN para iOS.
- Compilación para Harmony: sigue la guía de MNN para Harmony.