使用ARkit和CoreML的视觉框架

17

在进行一个项目(即Unity3D iOS项目,在Vuforia中进行本地集成,使用AVFoundation提取帧,然后通过基于云的图像识别处理图像)的最佳实践研究和尝试多种选项时,我得出了结论,我想使用ARkit、Vision Framework和CoreML;让我解释一下。

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

此外,一旦识别出对象,能够使用手势触摸添加AR对象并具有边界框将是很好的,但这是在确保稳定项目后需要实现的东西。

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

有什么想法吗?


从基础开始。哦,还有要明白你必须使用Xcode 9和iOS 11。现在,所谓的“基础”是指学习每个部分的不是。Vision将是最高级别 - 它可以跟踪和使用CoreML模型。但是你知道如何训练模型吗?如果不知道,那么先学习ML,然后再学习如何将训练好的模型导入到CoreML中。我不会涉及ARKit(抱歉,这对于我的专业领域来说太广泛了 - 你确定它对你有用吗?),但如果你想直接处理CoreML,你需要了解什么是CVPixelBuffer。祝你好运! - user7014451
感谢您的回复;是的,我正在使用Xcode 9和iOS 11。我可以训练模型,因为这实际上是我开始编程的方式(使用Python进行NLP),并且我可以将模型转换并插入到Xcode中。除此之外,还有预先训练好的模型可供我用来测试应用程序的功能。我在理解提取ARframe并通过Vision使用CoreML模型的方法方面遇到了困难。目前没有深入的文档,想知道是否有人能够提供见解。@dfd - pythlang
1
@pythlang 你好,感谢您发布这个问题。我和你有相同的目标。你在这里问的问题解决了吗? - jegadeesh
1
@jegadeesh 是的,实际上我做到了!下面的答案再加上更多的独立研究、试错和长时间的努力证明是值得的。 - pythlang
1
太棒了!干得好,伙计。@pythlang - jegadeesh
显示剩余2条评论
1个回答

55
更新:苹果现在有一个示例代码项目,可以完成其中的一些步骤。继续阅读需要自己解决的部分...
几乎所有你想要做的东西都已经存在了... 你只需要把它们组合起来就行了。
你可以通过定期轮询ARSessioncurrentFrame或者让它们推送到你的会话代理来获取ARFrame。(如果你正在构建自己的渲染器,那就是ARSessionDelegate; 如果你正在使用ARSCNViewARSKView,它们的委托回调是指向视图的,所以你可以从那里返回到会话并获取导致回调的currentFrame。)

ARFrameCVPixelBuffer的形式提供当前capturedImage
你可以使用VNImageRequestHandlerVNSequenceRequestHandler类中的方法,将图像传递给Vision进行处理。这两个类都有一个接受CVPixelBuffer作为输入图像进行处理的方法。请注意,内容保留了HTML标签。
  • 如果您想执行一个使用单个图像的请求,例如查找矩形QR码人脸, 或者使用Core ML模型识别图像, 您可以使用图像请求处理程序。
  • 如果要执行涉及分析多个图像之间变化的请求,例如在识别对象后跟踪其移动, 可以使用序列请求处理程序。
你可以在WWDC17 Vision会议中找到将图像传递给Vision + Core ML的通用代码。如果您观看该会议,现场演示还包括将CVPixelBuffer传递给Vision。(在该演示中,他们从AVCapture获取像素缓冲区,但如果您从ARKit获取缓冲区,则Vision部分相同。)
您可能会遇到的一个难点是识别/定位对象。大多数人使用 Core ML + Vision 的“对象识别”模型(包括 Apple 在其ML 开发者页面上提供的预转换版本)都是场景分类器。也就是说,它们查看一张图片并说:“这是一张(物品)的图片”,而不是像“这张图片中有一个(物品),位于(边界框)”这样的内容。
Vision 提供了易于处理分类器的 API — 您的请求结果数组将填充 VNClassificationObservation 对象,告诉您场景是什么(或者带有置信度评分的“可能是”)。
如果您发现或训练了一个既能识别又能定位物体的模型——这一部分我必须强调,这取决于您——使用Vision将会产生VNCoreMLFeatureValueObservation对象。这些对象有点像任意键值对,因此如何从中识别一个对象取决于您如何构建和标记模型的输出。
如果您正在处理的是Vision已经知道如何识别的内容,而不是使用自己的模型——比如脸部和QR码——则可以使用Vision的API获取这些内容在图像帧中的位置。
如果您想在AR中显示与2D图像相关联的3D内容(或者显示2D内容,但将其放置在3D中使用ARKit),则需要对这些2D图像点进行命中测试以便显示3D内容。一旦到达此步骤,使用命中测试放置AR内容已经在Apple社区等其他地方有了很好的涵盖。

2
虽然我已经知道其中一些信息,但以如此协调的方式将它们整合起来绝对是令人耳目一新的。所以...哇,非常感谢您提供如此出色、详细的回复。我喜欢这样的答案,因为虽然每个人都喜欢详细的步骤说明,但您提供的指南将让我忙于研究和实施一段时间。再次感谢@rickster。 - pythlang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接