Exportation MNN pour les modèles et le déploiement YOLO26
MNN
MNN est un framework de deep learning hautement efficace et léger. Il prend en charge l'inférence et l'entraînement de modèles de deep learning et offre des performances de pointe pour l'inférence et l'entraînement sur appareil. Actuellement, MNN est intégré dans plus de 30 applications d'Alibaba Inc, telles que Taobao, Tmall, Youku, DingTalk, Xianyu, etc., couvrant plus de 70 scénarios d'utilisation comme la diffusion en direct, la capture de courtes vidéos, la recommandation de recherche, la recherche de produits par image, le marketing interactif, la distribution d'actions et le contrôle des risques de sécurité. De plus, MNN est également utilisé sur des appareils embarqués, comme l'IoT.
Watch: How to Export Ultralytics YOLO26 to MNN Format | Speed up Inference on Mobile Devices📱
Exporter vers MNN : Conversion de ton modèle YOLO26
Tu peux étendre la compatibilité des modèles et la flexibilité de déploiement en convertissant les modèles Ultralytics YOLO au format MNN. Cette conversion optimise tes modèles pour les environnements mobiles et embarqués, garantissant des performances efficaces sur des appareils aux ressources limitées.
Installation
Pour installer les packages requis, exécute :
# Install the required package for YOLO26 and MNN
pip install ultralytics
pip install MNNUtilisation
Tous les modèles Ultralytics YOLO26 sont conçus pour prendre en charge l'exportation dès la sortie de la boîte, ce qui facilite leur intégration dans ton flux de déploiement préféré. Tu peux consulter la liste complète des formats d'exportation pris en charge et des options de configuration pour choisir la meilleure configuration pour ton application.
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.pt")
# Export the model to MNN format
model.export(format="mnn") # creates 'yolo26n.mnn'
# Load the exported MNN model
mnn_model = YOLO("yolo26n.mnn")
# Run inference
results = mnn_model("https://ultralytics.com/images/bus.jpg")Arguments d'exportation
| Argument | Type | Défaut | Description |
|---|---|---|---|
format | str | 'mnn' | Format cible pour le modèle exporté, définissant la compatibilité avec divers environnements de déploiement. |
imgsz | int ou tuple | 640 | Taille d'image souhaitée pour l'entrée du modèle. Peut être un entier pour des images carrées ou un tuple (height, width) pour des dimensions spécifiques. |
half | bool | False | Active la quantification FP16 (demi-précision), réduisant la taille du modèle et accélérant potentiellement l'inférence sur le matériel pris en charge. |
int8 | bool | False | Active la quantification INT8, compressant davantage le modèle et accélérant l'inférence avec une perte de accuracy minimale, principalement pour les appareils en périphérie. |
batch | int | 1 | Spécifie la taille d'inférence par lot du modèle exporté ou le nombre maximal d'images que le modèle traitera simultanément en mode predict. |
device | str | None | Spécifie l'appareil pour l'exportation : GPU (device=0), CPU (device=cpu), MPS pour Apple silicon (device=mps). |
Pour plus de détails sur le processus d'exportation, visite la page de documentation Ultralytics sur l'exportation.
Inférence uniquement MNN
Une fonction qui repose uniquement sur MNN pour l'inférence et le prétraitement YOLO26 est implémentée, fournissant à la fois des versions Python et C++ pour un déploiement facile dans n'importe quel scénario.
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)Résumé
Dans ce guide, nous te présentons comment exporter le modèle Ultralytics YOLO26 vers MNN et comment utiliser MNN pour l'inférence. Le format MNN offre d'excellentes performances pour les applications d'edge AI, ce qui le rend idéal pour le déploiement de modèles de vision par ordinateur sur des appareils aux ressources limitées.
Pour plus d'informations sur l'utilisation, veuillez te référer à la documentation MNN.
FAQ
Comment exporter des modèles Ultralytics YOLO26 au format MNN ?
Pour exporter ton modèle Ultralytics YOLO26 au format MNN, suis ces étapes :
from ultralytics import YOLO
# Load the YOLO26 model
model = YOLO("yolo26n.pt")
# Export to MNN format
model.export(format="mnn") # creates 'yolo26n.mnn' with fp32 weight
model.export(format="mnn", half=True) # creates 'yolo26n.mnn' with fp16 weight
model.export(format="mnn", int8=True) # creates 'yolo26n.mnn' with int8 weightPour des options d'exportation détaillées, consulte la page Export dans la documentation.
Comment faire des prédictions avec un modèle YOLO26 exporté en MNN ?
Pour faire des prédictions avec un modèle YOLO26 exporté en MNN, utilise la fonction predict de la classe YOLO.
from ultralytics import YOLO
# Load the YOLO26 MNN model
model = YOLO("yolo26n.mnn")
# Export to MNN format
results = model("https://ultralytics.com/images/bus.jpg") # predict with `fp32`
results = model("https://ultralytics.com/images/bus.jpg", half=True) # predict with `fp16` if device support
for result in results:
result.show() # display to screen
result.save(filename="result.jpg") # save to diskQuelles plateformes sont prises en charge pour MNN ?
MNN est polyvalent et prend en charge diverses plateformes :
- Mobile : Android, iOS, Harmony.
- Systèmes embarqués et appareils IoT : Appareils comme Raspberry Pi et NVIDIA Jetson.
- Bureau et serveurs : Linux, Windows et macOS.
Comment puis-je déployer des modèles Ultralytics YOLO26 MNN sur des appareils mobiles ?
Pour déployer tes modèles YOLO26 sur des appareils mobiles :
- Compiler pour Android : Suis le guide MNN Android.
- Compiler pour iOS : Suis le guide MNN iOS.
- Compiler pour Harmony : Suis le guide MNN Harmony.