如何从转成CoreML模型的YOLOv5中提取iOS应用可用的边界框坐标?
解决CoreML模型导出及检测结果解析问题
一、正确导出带后处理的CoreML模型
你当前导出的模型仅输出原始检测张量,未包含非极大值抑制(NMS)等后处理步骤,因此无法直接得到结构化的边界框、置信度结果。需要修改导出命令,让模型内置后处理逻辑:
!python export.py --weights /content/drive/MyDrive/best.pt --include coreml --nms --coreml-metadata
--nms:启用内置NMS后处理,模型直接输出过滤后的有效检测框--coreml-metadata:添加CoreML所需的元数据,确保输出结果的结构可被正确识别
如果是YOLOv5版本,命令逻辑一致,若遇到输入尺寸问题,可额外添加--img-size 640 640指定固定输入尺寸。
二、解析CoreML模型的预测结果
导出后的模型会输出结构化的检测结果,而非原始张量。以下是Python环境下的解析示例:
import coremltools as ct import cv2 import numpy as np # 1. 加载CoreML模型 model = ct.models.MLModel("best.mlmodel") # 2. 预处理输入图像(需与YOLO训练时的预处理逻辑一致) img = cv2.imread("test_image.jpg") img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转换为RGB格式 img = cv2.resize(img, (640, 640)) # 调整为模型输入尺寸 img = img.astype(np.float32) / 255.0 # 归一化(根据训练配置调整) # 若模型输入为CHW格式,需转置:img = img.transpose(2, 0, 1)[np.newaxis, ...] # 3. 执行预测 input_dict = {"image": img} predictions = model.predict(input_dict) # 4. 提取检测结果 # 输出键通常为'detections',每个元素对应一个检测框,结构为[xmin, ymin, xmax, ymax, confidence, class_idx] for det in predictions["detections"]: xmin, ymin, xmax, ymax = det[:4] confidence = det[4] class_idx = int(det[5]) # 替换为你的类别映射表 class_names = ["class1", "class2", "class3"] class_name = class_names[class_idx] print(f"类别: {class_name}, 置信度: {confidence:.2f}, 边界框: [{xmin:.2f}, {ymin:.2f}, {xmax:.2f}, {ymax:.2f}]")
关键注意事项
- 输入图像的预处理必须与训练阶段完全匹配,包括尺寸、归一化方式、通道顺序
- 不同YOLO版本导出的CoreML模型输出键可能略有差异,若
detections不存在,可查看模型的输出描述(用model.spec.description查看) - 若需在iOS端使用该模型,Xcode会自动识别检测框结构,可直接通过CoreML框架获取结构化的检测结果
内容的提问来源于stack exchange,提问作者Dhiman Das
相关产品推荐
相关产品推荐

