Exportação MNN para modelos YOLO26 e implementação#
MNN#
MNN é uma estrutura de aprendizagem profunda altamente eficiente e leve. É compatível com inferência e treino de modelos de aprendizagem profunda e oferece um desempenho líder do setor para inferência e treino no dispositivo. Atualmente, o MNN foi integrado em mais de 30 aplicações da Alibaba Inc., como Taobao, Tmall, Youku, DingTalk, Xianyu, entre outras, abrangendo mais de 70 cenários de utilização, como transmissões em direto, captura de vídeos curtos, recomendações de pesquisa, pesquisa de produtos por imagem, marketing interativo, distribuição de participações e controlo de riscos de segurança. Além disso, o MNN também é utilizado em dispositivos incorporados, como dispositivos IoT.
Watch: How to Export Ultralytics YOLO26 to MNN Format | Speed up Inference on Mobile Devices📱
Tarefas suportadas#
A exportação MNN é compatível com todas as sete tarefas da Ultralytics. A segmentação semântica e a estimativa de profundidade estão disponíveis apenas com YOLO26, a única família que inclui essas cabeças.
| Tarefa | YOLOv8 | YOLO11 | YOLO26 |
|---|---|---|---|
| Detetar | ✅ | ✅ | ✅ |
| Segmentar | ✅ | ✅ | ✅ |
| Semântica | ❌ | ❌ | ✅ |
| Profundidade | ❌ | ❌ | ✅ |
| Classificar | ✅ | ✅ | ✅ |
| Pose | ✅ | ✅ | ✅ |
| OBB | ✅ | ✅ | ✅ |
Exportar para MNN: converter o teu modelo YOLO26#
Podes expandir a compatibilidade e a flexibilidade de implementação do modelo convertendo modelos Ultralytics YOLO para o formato MNN. Esta conversão otimiza os teus modelos para ambientes móveis e incorporados, garantindo um desempenho eficiente em dispositivos com recursos limitados.
Instalação#
Para instalares os pacotes necessários, executa:
# Install the required package for YOLO26 and MNN
pip install ultralytics
pip install MNNUtilização#
Todos os modelos Ultralytics YOLO26 foram concebidos para suportar a exportação imediatamente, facilitando a sua integração no teu fluxo de trabalho de implementação preferido. Podes consultar a lista completa de formatos de exportação e opções de configuração compatíveis para escolher a melhor configuração para a tua aplicação.
O formato MNN é compatível com os modos Exportar, Prever e Validar. Exporta o teu modelo e, em seguida, carrega o modelo exportado para executar a inferência ou validar a sua precisão.
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 Exportação#
| Argumento | Tipo | Predefinição | Descrição |
|---|---|---|---|
format | str | 'mnn' | Formato de destino do modelo exportado, que define a compatibilidade com vários ambientes de implementação. |
imgsz | int ou tuple | 640 | Tamanho de imagem pretendido para a entrada do modelo. Pode ser um número inteiro para imagens quadradas ou um tuplo (height, width) para dimensões específicas. |
quantize | int ou str | None | Precisão da quantização: 16 (FP16) ou 8 (INT8) reduzem os pesos exportados; 32/não definido exporta pesos FP32, que o runtime de CPU do MNN ainda calcula na sua precisão predefinida low, em vez de FP32. Substitui os sinalizadores obsoletos half/int8. |
simplify | bool | True | Simplifica o grafo ONNX intermédio com onnxslim. |
opset | int | None | Especifica a versão do opset ONNX para o grafo ONNX intermédio. Se não for definida, utiliza a versão mais recente suportada. |
batch | int | 1 | Especifica o tamanho do lote de inferência do modelo exportado ou o número máximo de imagens que o modelo exportado processará em simultâneo no modo predict. |
dynamic | bool | False | Ativa dimensões dinâmicas da imagem de entrada. Não pode ser combinado com nms=True. |
nms | bool, opcional | None | Seleciona a saída em bruto (None, predefinição), o NMS incorporado (True) ou a cabeça sem NMS (False). O NMS incorporado suporta deteção e pose com dynamic=False. |
device | str | None | Especifica o dispositivo para a exportação: GPU (device=0), CPU (device=cpu), MPS para Apple Silicon (device=mps). |
Para obter mais detalhes sobre o processo de exportação, visita a página da documentação da Ultralytics sobre exportação.
Inferência exclusiva do MNN#
Foi implementada uma função que depende exclusivamente do MNN para a inferência e o pré-processamento do YOLO26, disponibilizando versões Python e C++ para uma implementação fácil em qualquer cenário.
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)Resumo#
Neste guia, apresentamos como exportar o modelo Ultralytics YOLO26 para MNN e utilizar o MNN para inferência. O formato MNN oferece um desempenho excelente para aplicações de IA na periferia, sendo ideal para implementar modelos de visão computacional em dispositivos com recursos limitados.
Para obter mais informações sobre a utilização, consulta a documentação do MNN.
Perguntas frequentes#
Para exportar o teu modelo Ultralytics YOLO26 para o formato MNN, segue estes passos:
Exportaçãofrom 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 obter opções detalhadas de exportação, consulta a página Exportar na documentação.
Para fazer previsões com um modelo YOLO26 MNN exportado, utiliza a função
predictda classe YOLO.Previsãofrom 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 diskO MNN é versátil e é compatível com várias plataformas:
- Dispositivos móveis: Android, iOS, Harmony.
- Sistemas incorporados e dispositivos IoT: dispositivos como o Raspberry Pi e o NVIDIA Jetson.
- Computadores e servidores: Linux, Windows e macOS.
Para implementar os teus modelos YOLO26 em dispositivos móveis:
- Compilar para Android: segue o guia MNN Android.
- Compilar para iOS: segue o guia MNN iOS.
- Compilar para Harmony: segue o guia MNN Harmony.