如何在Xcode中使用自训练YOLO OBB模型并规避MultiArray输出
解决YOLOv8-OBB转CoreML输出结构化数据的问题
一、重新导出正确格式的CoreML模型
你之前的导出命令缺少关键参数,导致CoreML模型没有生成结构化输出。使用Ultralytics官方导出工具时,需要明确指定OBB任务类型和自定义类别名,让导出器正确映射输出结构:
from ultralytics import YOLO # 加载你训练好的OBB模型 model = YOLO('path/to/your/trained-model.pt') # 导出配置:明确OBB任务、指定类别名、启用NMS model.export( format='coreml', imgsz=640, nms=True, int8=True, task='obb', # 必须指定为obb,避免自动识别为普通检测任务 class_names=['你的自定义标签名'], # 替换成你的单标签名称 coreml_package=False # 导出为单个.mlmodel文件,更适配Xcode预览 )
二、为什么之前的导出是MultiArray?
OBB模型的输出结构和普通YOLO检测不同(包含旋转框的角度/顶点信息),如果不指定task='obb'和class_names,Ultralytics导出器会默认输出原始预测张量(MultiArray),而不是结构化的检测结果。加上这两个参数后,导出器会自动将输出映射为CoreML的MLRotatedObjectDetectionFeature,包含置信度、类别标签、旋转框坐标等结构化字段。
三、Xcode预览与iOS端使用
- 将导出的
.mlmodel文件拖入Xcode项目,勾选"Copy items if needed"。 - 点击模型文件,Xcode会自动生成对应的模型类,此时预览功能应该能正常工作:上传测试图片即可看到带旋转框的检测结果。
- 在iOS代码中调用模型时,输出会包含一个
detections数组,每个元素包含:confidence: 检测置信度(Float类型)classLabel: 你的自定义类别名(String类型)rotatedBoundingBox: 旋转框信息(包含中心坐标、宽度、高度、旋转角度)
四、关于你尝试的coremltools转换错误
你用ct.convert直接转换Keras模型的方法不适用,因为YOLOv8-OBB不是原生Keras模型,Ultralytics的导出工具已经针对CoreML做了OBB任务的适配,无需额外用coremltools二次转换,直接用官方导出命令即可解决问题。
如果导出后仍然是MultiArray,先去掉int8=True导出float32模型测试,确认输出结构正常后再添加量化参数——部分情况下int8量化可能会影响导出器的结构映射,需要确保训练数据集的标签格式完全符合Ultralytics OBB要求(标签格式为x1,y1,x2,y2,x3,y3,x4,y4,class_id)。
内容的提问来源于stack exchange,提问作者user29544379
相关产品推荐
相关产品推荐

