带有 ARkit 和 CoreML 的视觉框架

Vision Framework with ARkit and CoreML

虽然我一直在研究最佳实践并为一个正在进行的项目试验多个选项(即 Vuforia 中的 Unity3D iOS 项目与本机集成,使用 AVFoundation 提取帧然后通过基于云的图像识别传递图像) ,我得出的结论是,我想使用 ARkit、Vision Framework 和 CoreML;让我解释一下。

我想知道如何捕获 ARFrames,使用 Vision Framework 来检测和跟踪使用 CoreML 模型的给定对象。

此外,一旦对象被识别并能够在手势触摸时添加 AR 对象,那么最好有一个边界框,但这可以在完成实体项目后实现。

这无疑是可行的,但我不确定如何通过 Vision 将 ARFrames 传递给 CoreML 进行处理。

有什么想法吗?

更新: Apple 现在有一个 sample code project 可以执行其中的一些步骤。继续阅读那些你仍然需要弄清楚自己的人......

几乎所有部件都可以满足您的需求...您只需将它们组合在一起即可。


你获得ARFrames either by periodically polling the ARSession for its currentFrame or by having them pushed to your session delegate. (If you're building your own renderer, that's ARSessionDelegate;如果您正在使用 ARSCNViewARSKView,它们的委托回调会引用视图,因此您可以从那里回到会话以获取导致回调的 currentFrame。 )

ARFrameCVPixelBuffer.

的形式提供当前 capturedImage

您将图像传递给 Vision for processing using either the VNImageRequestHandler or VNSequenceRequestHandler class,它们都有将 CVPixelBuffer 作为输入图像进行处理的方法。

您可以找到将图像传递到附加到 WWDC17 session on Vision 的 Vision + Core ML 的通用代码,如果您观看该会话,现场演示还包括将 CVPixelBuffer 传递到 Vision。 (他们在该演示中从 AVCapture 获取像素缓冲区,但如果您从 ARKit 获取缓冲区,则视觉部分是相同的。)


您可能遇到的一个症结是 identifying/locating 个对象。人们使用 Core ML + Vision 的大多数 "object recognition" 模型(包括 Apple 在其 ML developer page 上提供的预转换版本)是 scene classifiers.也就是说,他们看着一张图片说,"this is a picture of a (thing)," 不是像 "there is a (thing) in this picture, located at (bounding box)".

这样的东西

Vision 提供了简单的 API 来处理 classifiers — 你的请求的结果数组填充了 VNClassificationObservation 对象,告诉你场景是什么(或 "probably is",具有置信度)。

如果您找到或训练一个既能识别又能定位物体的模型 — 对于那部分,我必须强调,球在您手上 — 使用 Vision 将导致 VNCoreMLFeatureValueObservation 个对象。这些有点像任意键值对,因此如何从中识别对象取决于您如何构造和标记模型的输出。

如果你正在处理 Vision 已经知道如何识别的东西,而不是使用你自己的模型——比如人脸和 QR 码——你可以使用 Vision API.


如果在 2D 图像中定位一个对象后,您想要在 AR 中显示与其关联的 3D 内容(或显示 2D 内容,但使用 ARKit 将所述内容定位在 3D 中),您需要 hit test 那些 2D 图像点反对 3D 世界。

一旦你到达这一步,将 AR 内容与命中测试放在一起已经在其他地方很好地涵盖了,by Apple and the community