虽然我一直在研究最佳实践并为正在进行的项目(即Vuforia中的Unity3D iOS项目进行原生集成,使用AVFoundation提取帧然后通过基于 Cloud 的图像识别传递图像)试验多个选项,但我得出的结论是想使用ARkit,Vision Framework和CoreML;让我解释 .
我想知道我将如何捕获ARFrames,使用Vision Framework来使用CoreML模型检测和跟踪给定对象 .
另外,一旦识别了对象并且能够在手势触摸时添加AR对象,就可以拥有边界框,但这可以在获得实体项目之后实现 .
毫无疑问这是可能的,但我不确定如何通过Vision将ARFrame传递给CoreML进行处理 .
有任何想法吗?
1 回答
Update: Apple现在有sample code project执行其中一些步骤 . 继续阅读那些你仍需要弄清楚自己的人......
几乎所有的作品都是为了你想做的......你大多只需要把它们组合在一起 .
您可以通过定期轮询
ARSession
获取currentFrame或将它们推送到您的会话代理来获取ARFrame . (如果你're building your own renderer, that' s ARSessionDelegate;如果你正在使用ARSCNView
或ARSKView
,他们的委托回调引用视图,那么你可以从那里回到会话以获得导致回调的currentFrame
. )ARFrame
以CVPixelBuffer
的形式提供当前capturedImage .您将图像传递给Vision以使用VNImageRequestHandler或VNSequenceRequestHandler类进行处理,这两个类都具有将
CVPixelBuffer
作为输入图像进行处理的方法 .如果要执行使用单个图像的请求,则使用图像请求处理程序 - 如查找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的通用代码,如果您观看该会话,则实时演示还包括将
CVPixelBuffer
传递给Vision . (他们在该演示中从AVCapture获取像素缓冲区,但如果您从ARKit获取缓冲区,则Vision部分是相同的 . )您可能会遇到的一个问题是识别/定位对象 . 人们使用Core ML Vision的大多数模型(包括那些Apple在其ML developer page上提供预转换版本的模型)都是场景分类器 . 也就是说,他们看一个图像并说,“这是一个(东西)的图片," not something like "在这张图片中有一个(东西),位于(边界框)” .
Vision为处理分类器提供了简单的API - 您的请求的结果数组填充了VNClassificationObservation对象,告诉您场景是什么(或"probably is",具有置信度等级) .
如果你发现或训练一个既能识别和定位物体的模型 - 对于那部分,我必须强调,球在你的球场 - 使用Vision与它会产生VNCoreMLFeatureValueObservation物体 . 这些类似于任意键值对,因此您从这些键中确定对象的确切方式取决于您如何构建和标记模型的输出 .
如果你正在处理Vision已经知道如何识别的东西,而不是使用你自己的模型 - 像面部和QR码这样的东西 - 你可以使用Vision的API获取图像框架中的那些位置 .
如果在2D图像中定位对象后,您希望在AR中显示与其关联的3D内容(或显示2D内容,但所述内容使用ARKit定位在3D中),则需要hit test这些2D图像点对抗3D世界 .
一旦你完成这一步,将AR内容与命中测试放在一起已经很好地涵盖了其他地方,包括by Apple和the community .