IPhone X真深度图像分析和CoreML

DJ-*_*ock 2 neural-network ios coreml iphone-x

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

我对app有一个想法,当用户拍照并且应用程序将分析它并剪切除了所需对象(例如一块布料)之外的每一个并且将其保存在单独的图像中.昨天这是一项非常艰巨的任务,因为开发人员应该创建相当好的神经网络并对其进行教育.但在苹果发布具有真正深度相机的iPhone X之后,一半的问题都可以解决.根据我的理解,开发人员可以更轻松地删除背景,因为iPhone将知道背景的位置.

所以只留下几个问题:

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

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

  1. 神经网络将图像作为输入数据.

  2. NN分析它,在图像上找到所需的对象.

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

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

任何建议将被认真考虑.

Wla*_*ala 6

好的,你的问题实际上与编程直接相关:)

广告I.格式为HEIF,但您可以通过iOS API访问图像数据(如果您开发iPhone应用程序),因此您可以轻松获取有关位图的信息CVPixelBuffer.

广告II.神经网络将图像作为输入数据.

如上所述,您希望首先获取位图,因此请创建一个CVPixelBuffer.以这篇文章为例.然后使用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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

let imageFeatureValue = MLFeatureValue(pixelBuffer: yourPixelBuffer)
let featureProvider = YourImageFeatureProvider(imageFeatureValue: imageFeatureValue)
Run Code Online (Sandbox Code Playgroud)

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

  1. NN分析它,在图像上找到所需的对象.

prediction在CoreML模型上使用函数.

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
}
Run Code Online (Sandbox Code Playgroud)
  1. NN不仅返回确定的对象类型,还返回裁剪对象本身或应裁剪区域的坐标/像素数组.

这取决于您的型号以及是否正确导入.在你做的假设下,你通过检查返回来访问输出数据MLFeatureProvider(记住这是一个协议,所以你必须实现另一个类似于我在步骤1中为你做的那个,就像那样YourOutputFeatureProvider)并且你有一个位图和NN吐出的其余数据.

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

只需反向步骤1,所以从MLFeatureValue- > CVPixelBuffer- > UIImage.关于这一点有很多问题所以我不会重复答案.

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

除了CoreML(也许你发现你的模型过于复杂并且无法将它移植到CoreML),请查看Matthjis Hollemansgithub(非常好的资源,可以将模型移植到iOS上).他也在这里,在这个主题上知道很多.