15

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

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

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

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

有任何想法吗?

4

1 回答 1

53

更新: Apple 现在有一个示例代码项目,可以执行其中的一些步骤。继续阅读那些你仍然需要弄清楚自己的人......

几乎所有的部分都可以用来做你想做的事情……你大部分时候只需要把它们放在一起。


ARFrame可以通过定期轮询 s或将它们推送给您的会话委托来ARSession获得s。currentFrame(如果您正在构建自己的渲染器,那就是ARSessionDelegate; 如果您正在使用ARSCNViewor ARSKView,它们的委托回调引用视图,因此您可以从那里返回到会话以获取currentFrame导致回调的。)

ARFramecapturedImage以 a 的形式提供电流CVPixelBuffer

您可以使用或类将图像传递给Vision进行处理,这两种方法都有将 a作为输入图像进行处理的方法。VNImageRequestHandlerVNSequenceRequestHandlerCVPixelBuffer

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


您可能遇到的一个症结是识别/定位对象。人们与 Core ML + Vision 一起使用的大多数“对象识别”模型(包括 Apple 在其ML 开发人员页面上提供的预转换版本)都是场景分类器。也就是说,他们看着一张图片说,“这是一张(东西)的图片”,而不是像“这张图片中有一个(东西),位于(边界框) ”。

Vision 为处理分类器提供了简单的 API——您的请求的结果数组中填充了VNClassificationObservation对象,这些对象告诉您场景是什么(或“可能是”,带有置信度)。

如果你找到或训练了一个模型,它既能识别又能定位物体——我必须强调,球在你的球场上——使用 Vision 会产生VNCoreMLFeatureValueObservation物体。这些有点像任意键值对,因此您如何从中识别对象取决于您如何构建和标记模型的输出。

如果您正在处理 Vision 已经知道如何识别的东西,而不是使用您自己的模型(例如人脸和 QR 码),您可以使用 Vision 的 API 获取图像框架中的位置。


如果在 2D 图像中定位对象后,您想在 AR 中显示与其关联的 3D 内容(或显示 2D 内容,但使用 ARKit 将所述内容定位在 3D 中),您需要针对这些 2D 图像点进行测试3D世界。

一旦你到了这一步,将 AR 内容与命中测试放在一起,Apple社区都已经在其他地方很好地覆盖了。

于 2017-07-07T18:23:00.140 回答