iPhone X 真实深度图像分析和 CoreML

Posted

技术标签:

【中文标题】iPhone X 真实深度图像分析和 CoreML【英文标题】:IPhone X true depth image analysis and CoreML 【发布时间】:2018-04-15 19:17:03 【问题描述】:

我知道我的问题与编程本身没有直接关系,看起来更像是研究。但可能有人可以在这里提出建议。

我有一个应用程序的想法,当用户拍照时,应用程序将对其进行分析并剪切除所需对象(例如一块布料)之外的所有内容,并将其保存在单独的图像中。昨天这是一项非常艰巨的任务,因为开发人员应该创建非常好的神经网络并对其进行教育。但在苹果发布配备真景深摄像头的 iPhone X 之后,问题就解决了一半。据我了解,开发者可以更轻松地移除背景,因为 iPhone 会知道背景的位置。

所以只剩下几个问题了:

我。 iPhone X 用真深度相机拍摄的照片是什么格式的?是否有可能创建能够使用图片深度信息的神经网络?

二。我已经阅读了有关 CoreML 的内容,尝试了一些示例,但我仍然不清楚 - 在导入 CoreML 的外部神经网络方面如何实现以下行为:

    神经网络获取图像作为输入数据。

    NN 对其进行分析,在图像上找到所需的对象。

    NN 不仅返回确定的对象类型,还返回裁剪对象本身或应裁剪区域的坐标/像素数组。

    应用程序从 NN 获取所有必需的信息并执行必要的操作来裁剪图像并将其保存到另一个文件或其他文件中。

我们将不胜感激。

【问题讨论】:

但真深度摄像头仅在正面可用 哦……不知道怎么错过了……谢谢 【参考方案1】:

好吧,你的问题其实和编程直接相关:)

广告一,格式是HEIF,但是你通过ios API访问图像的数据(如果你开发一个iPhone应用程序),所以你很容易得到关于位图的信息CVPixelBuffer

广告二。 1. 神经网络获取图像作为输入数据。

如上所述,您想先获取位图,因此创建一个CVPixelBuffer。例如,看看这个post。然后你使用 CoreML API。您想使用MLFeatureProvider 协议。符合的对象是您将带有MLFeatureValue 的矢量数据放在您选择的键名下(例如“pixelData”)。

import CoreML

class YourImageFeatureProvider: MLFeatureProvider 

    let imageFeatureValue: MLFeatureValue
    var featureNames: Set<String> = []

    init(with imageFeatureValue: MLFeatureValue) 
        featureNames.insert("pixelData")
        self.imageFeatureValue = imageFeatureValue
    

    func featureValue(for featureName: String) -> MLFeatureValue? 
        guard featureName == "pixelData" else 
            return nil
        
        return imageFeatureValue
    

然后你像这样使用它,特征值将在MLFeatureValue 上使用initWithPixelBuffer 初始化器创建:

let imageFeatureValue = MLFeatureValue(pixelBuffer: yourPixelBuffer)
let featureProvider = YourImageFeatureProvider(imageFeatureValue: imageFeatureValue)

请记住在此操作之前裁剪/缩放图像,以便为您的网络提供适当大小的矢量。

    NN 对其进行分析,在图像上找到所需的对象。

在您的 CoreML 模型上使用 prediction 函数。

do 

    let outputFeatureProvider = try yourModel.prediction(from: featureProvider)

    //success! your output feature provider has your data
 catch 

    //your model failed to predict, check the error

    NN 不仅返回确定的对象类型,还返回裁剪的对象本身或应裁剪区域的坐标/像素数组。

这取决于您的型号以及您是否正确导入。根据您所做的假设,您可以通过检查返回的MLFeatureProvider 来访问输出数据(请记住,这是一个协议,因此您必须实现另一个类似于我在步骤 1 中为您制作的协议,例如YourOutputFeatureProvider)和那里有一个位图和 NN 吐出的其余数据。

    应用程序从 NN 获取所有必需的信息并执行必要的操作来裁剪图像并将其保存到另一个文件或其他文件中。

只需将步骤 1 反向,因此从 MLFeatureValue -> CVPixelBuffer -> UIImage。有很多关于这个的问题,所以我不会重复回答。

如果您是初学者,不要指望一夜之间就有结果,但路径就在这里。对于经验丰富的开发人员,我估计这项工作需要几个小时才能完成(加上模型学习时间并将其移植到 CoreML)。

除了 CoreML(也许您发现您的模型过于复杂,无法将其移植到 CoreML),请查看 Matthjis Hollemans' github(关于将模型移植到 iOS 的不同方式的非常好的资源)。他也在这附近,并且在这方面了解很多。

【讨论】:

你好。是的,我是初学者。非常感谢你!非常感谢您的解释!所以现在我不仅有了想法,而且有了一些听起来像是计划的东西。

以上是关于iPhone X 真实深度图像分析和 CoreML的主要内容,如果未能解决你的问题,请参考以下文章

对象检测 ARKit 与 CoreML

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

CoreML 图像模型只识别给定的数据集,如何包含外部数据?

在 macOS 中使用 Vision 和 CoreML 对图像进行分类

深度学习系列33:有标签的GAN:CGAN

在 Swift 中设置 CoreML 模型 - 图像分类器