带有 ARkit 和 CoreML 的视觉框架

Posted

技术标签:

【中文标题】带有 ARkit 和 CoreML 的视觉框架【英文标题】:Vision Framework with ARkit and CoreML 【发布时间】:2017-12-12 02:05:49 【问题描述】:

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

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

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

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

有什么想法吗?

【问题讨论】:

从基础开始。哦,了解您必须使用 Xcode 9 和 iOS 11。现在,通过“基础”,我的意思是了解每个部分 不是。 Vision 将是***别 - 它可以跟踪和使用 CoreML 模型。但是您知道如何训练模型吗?如果不是,则先学习 ML,然后然后学习如何将经过训练的模型导入 CoreML。我不会讨论 ARKit(抱歉,这对于我的利基来说太宽泛了——你确定你的需要它吗?)但如果你想直接解决 CoreML,你需要了解 CVPixelBuffer 是什么。祝你好运! 感谢您的回复;是的,我同时使用 Xcode 9 和 iOS 11。我可以训练模型,因为这就是我真正开始编程的方式(python 中的 NLP),我可以将模型转换并插入到 Xcode 中。除此之外,我暂时可以使用一些预训练模型来测试应用程序的功能。我无法理解提取 ARframe 并使用 CoreML 模型将其通过 Vision 的方法。目前还没有任何深入的文档,并且很好奇是否有人可以提供见解@dfd @pythlang 您好,感谢您发布这个问题。我的目标和你一样。您是否达到了您在此处提出的要求? @jegadeesh 是的,实际上我做到了!下面的答案结合更多的独立研究、反复试验和长时间的工作证明是值得的。 太棒了!干得好伙计。@pythlang 【参考方案1】:

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

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


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

ARFrameCVPixelBuffer 的形式提供当前的capturedImage

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

如果您想要执行使用单个图像的请求,您可以使用图像请求处理程序 — 例如 finding rectangles 或 QR codes 或 faces 或 using a Core ML model to identify the image。李> 您使用序列请求处理程序来执行涉及分析多个图像之间更改的请求,例如tracking an object's movement after you've identified it。

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


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

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

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

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


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

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

【讨论】:

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

以上是关于带有 ARkit 和 CoreML 的视觉框架的主要内容,如果未能解决你的问题,请参考以下文章

视觉框架坐标系如何转化为ARKit?

找到正确的方法来增加用户脚上的鞋子

使用 ARKit 和 CoreML 从远距离检测物体

结合 CoreML 和 ARKit

结合 CoreML 对象检测和 ARKit 2D 图像检测

对象检测 ARKit 与 CoreML