我使用 yolov8x 在 Ultralytics Hub 上训练了一个图像模型。然后我通过在 Linux 机器上运行
best.mlpackage
将此模型转换为 yolo export model={model_url} format=coreml nms=true
文件,然后将其传输到 MacBook Air m2。
当我在 XCode 项目上使用此模型时,有一个预览选项卡,我可以在其中上传照片,并且该模型也按预期运行。
在同一台 Mac 上运行的 Swift 游乐场中,当我跑步时
guard let imageUrl = Bundle.main.url(forResource: "test_image", withExtension: "jpg") else { return }
guard let output = try? best().prediction(input: bestInput.init(imageAt: imageUrl, iouThreshold: 0.45, confidenceThreshold: 0.25)) else { return }
print(output.confidence)
它生成与预览选项卡相同数量的对象检测 (15),这也是预期的。
但是,当我在 iOS 设备上运行相同的代码时(我在 iPhone 和 iPad 上都尝试过),预测完全是无稽之谈,它在任意位置检测到 115 个对象,但没有一个是正确的。
起初我认为这可能是 iOS 的一个问题,但当我使用模拟器而不是实际设备时,该模型也可以工作。我也在 iOS 17 和 18 上尝试过。
如果我使用
VNImageRequestHandler
而不是 model.prediction
,结果仍然是一样的。
我尝试的最后一件事是将模型的计算单元更改为仅使用 cpu。与使用神经引擎相比,这改变了结果,但它仍然是乱码。
还有一个可能有用的信息,Ultralytics 有一个 iOS 应用程序,您可以将在集线器中训练的模型加载到您的 iPhone,并运行实时检测。该模型在他们的应用程序中表现也很疯狂,即使在浏览器中查看模型页面时它工作得很好,所以我确信这与 iOS 运行这些模型的方式有关。
谁能帮我解决这个问题?
我也面临着同样的问题。我只用一个类训练了 YOLO11 模型。该模型在训练、验证和测试过程中表现良好。
验证运行/检测/训练/权重/best.pt... Ultralytics 8.3.49 🚀 Python-3.9.6 torch-2.2.2 CPU (Intel Core(TM) i3-8100B 3.60GHz) YOLO11n总结(融合):238层,2,582,347个参数,0个梯度,6.3 GFLOPs 类图像实例框(P R mAP50 mAP50-95):100%|██████████| 3/3 [00:09<00:00, 3.29s/it] all 79 1229 0.955 0.908 0.971 0.861 Speed: 3.1ms preprocess, 111.1ms inference, 0.0ms loss, 0.8ms postprocess per image
如果使用 format=coreml 和 nms=true 导出模型,则会生成 .mlpackage 文件。在 Xcode 中,这允许预览正确分析图像并检测对象。但是,当使用类中的 model.prediction(input: input) 或使用 VNCoreMLRequest(model: YOLOModel) 时,它不起作用。
要解决此问题,您需要使用 format=mlmodel 和 coremltools==6.2 导出模型。这确保了与这两种方法的兼容性,并且一切都按预期工作,它与这两种方法一起工作