使用ARkit和CoreML的Vision框架

pyt*_*ang 13 computer-vision arkit coreml

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

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

此外,这将是很好有一个边框,一旦对象被识别一起在手势触摸添加一个AR对象的能力,但是这是有可能获得实实在在的项目下来后方可实施.

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

有任何想法吗?

ric*_*ter 49

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

几乎所有的作品都是为了你想要做的......你大多只需要将它们组合在一起.


ARFrame可以通过定期轮询ARSessionfor currentFrame或者将它们推送到会话代理来获取s .(如果你正在构建自己的渲染器,那就是ARSessionDelegate;如果你正在使用ARSCNView或者ARSKView,他们的委托回调引用了视图,那么你可以从那里回到会话以获得currentFrame导致回调的那个.)

ARFramecapturedImage以a的形式提供电流CVPixelBuffer.

您将图像传递给Vision以使用VNImageRequestHandlerVNSequenceRequestHandler类进行处理,两者都具有CVPixelBuffer将输入图像作为输入图像进行处理的方法.

您可以找到将图像传递到Vision + Core ML的通用代码,这些代码附加到Vision上的WWDC17会话,如果您观看该会话,则实时演示还包括将视图传递CVPixelBuffer给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社区.

  • 虽然我确实知道其中的一些信息,但以如此有凝聚力的方式将它们放在一起绝对令人耳目一新……哇,非常感谢您提供如此出色、详细的回复。我喜欢这样的答案,因为虽然每个人都喜欢细节和演练,但您提供的指南将使我忙于研究和实施一段时间。再次感谢@rickster (2认同)