IPhone X真实深度图像分析与CoreML
IPhone X true depth image analysis and CoreML
我明白我的问题与编程本身没有直接关系,看起来更像是研究。但也许有人可以在这里提供建议。
我对应用程序有一个想法,当用户拍摄照片时,应用程序会分析它并裁剪除所需对象(例如一块布)之外的所有内容,并将其保存在单独的图像中。昨天这是一项非常艰巨的任务,因为开发人员应该创建非常好的神经网络并对其进行培训。但是苹果发布了iPhone X with true depth camera之后,一半的问题就可以解决了。据我了解,开发人员可以更轻松地删除背景,因为 iPhone 会知道背景的位置。
所以只剩下几个问题了:
我。 iPhone X 用真深度相机拍摄的照片是什么格式?是否可以创建能够使用图片深度信息的神经网络?
二.我已经阅读了 CoreML,尝试了一些示例,但我仍然不清楚 - 如何根据导入到 CoreML 的外部神经网络实现以下行为:
神经网络获取图像作为输入数据。
NN对其进行分析,在图像上找到所需的对象。
NN returns 不仅确定了对象的类型,还确定了裁剪对象本身或应裁剪区域的 coordinates/pixels 数组。
应用程序从 NN 获取所有必需的信息并执行必要的操作以裁剪图像并将其保存到另一个文件或其他文件。
如有任何建议,我们将不胜感激。
好的,你的问题其实和编程直接相关:)
Ad I.格式是HEIF,但是你通过iOS API访问图像数据(如果你开发一个iPhone应用程序),所以你很容易得到关于位图的信息 CVPixelBuffer
.
广告二。
1. 神经网络获取图像作为输入数据。
如上所述,你想先得到你的位图,所以创建一个CVPixelBuffer
。在您选择的键名下查看此 for example. Then you use CoreML API. You want to use MLFeatureProvider protocol. An object which conforms to is where you put your vector data with 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)
请记住在此操作之前 crop/scale 图像,以便为您的网络提供适当大小的向量。
- 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 returns 不仅确定了对象的类型,还确定了裁剪对象本身或应裁剪区域的 coordinates/pixels 数组。
这取决于您的型号以及您是否正确导入了它。在你所做的假设下,你通过检查返回的 MLFeatureProvider
来访问输出数据(记住这是一个协议,所以你必须实现另一个类似于我在步骤 1 中为你所做的,smth 就像 YourOutputFeatureProvider
) 然后你有一个位图和你的 NN 吐出的其余数据。
- 应用程序从 NN 获取所有必需的信息并执行必要的操作以裁剪图像并将其保存到另一个文件或其他文件。
只需将步骤 1 反转,因此从 MLFeatureValue
-> CVPixelBuffer
-> UIImage
。 SO 上有很多关于这个的问题所以我不会重复答案。
如果你是初学者,不要指望一蹴而就,但路径就在这里。对于有经验的开发人员,我估计这项工作需要几个小时才能完成(加上模型学习时间并将其移植到 CoreML)。
除了 CoreML(也许您发现您的模型过于复杂,无法将其移植到 CoreML)之外,请查看 Matthjis Hollemans' github(关于将模型移植到 [=63 的不同方式的非常好的资源=]).他也在这附近,在这方面知道很多。
我明白我的问题与编程本身没有直接关系,看起来更像是研究。但也许有人可以在这里提供建议。
我对应用程序有一个想法,当用户拍摄照片时,应用程序会分析它并裁剪除所需对象(例如一块布)之外的所有内容,并将其保存在单独的图像中。昨天这是一项非常艰巨的任务,因为开发人员应该创建非常好的神经网络并对其进行培训。但是苹果发布了iPhone X with true depth camera之后,一半的问题就可以解决了。据我了解,开发人员可以更轻松地删除背景,因为 iPhone 会知道背景的位置。
所以只剩下几个问题了:
我。 iPhone X 用真深度相机拍摄的照片是什么格式?是否可以创建能够使用图片深度信息的神经网络?
二.我已经阅读了 CoreML,尝试了一些示例,但我仍然不清楚 - 如何根据导入到 CoreML 的外部神经网络实现以下行为:
神经网络获取图像作为输入数据。
NN对其进行分析,在图像上找到所需的对象。
NN returns 不仅确定了对象的类型,还确定了裁剪对象本身或应裁剪区域的 coordinates/pixels 数组。
应用程序从 NN 获取所有必需的信息并执行必要的操作以裁剪图像并将其保存到另一个文件或其他文件。
如有任何建议,我们将不胜感激。
好的,你的问题其实和编程直接相关:)
Ad I.格式是HEIF,但是你通过iOS API访问图像数据(如果你开发一个iPhone应用程序),所以你很容易得到关于位图的信息 CVPixelBuffer
.
广告二。 1. 神经网络获取图像作为输入数据。
如上所述,你想先得到你的位图,所以创建一个CVPixelBuffer
。在您选择的键名下查看此
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)
请记住在此操作之前 crop/scale 图像,以便为您的网络提供适当大小的向量。
- 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 returns 不仅确定了对象的类型,还确定了裁剪对象本身或应裁剪区域的 coordinates/pixels 数组。
这取决于您的型号以及您是否正确导入了它。在你所做的假设下,你通过检查返回的 MLFeatureProvider
来访问输出数据(记住这是一个协议,所以你必须实现另一个类似于我在步骤 1 中为你所做的,smth 就像 YourOutputFeatureProvider
) 然后你有一个位图和你的 NN 吐出的其余数据。
- 应用程序从 NN 获取所有必需的信息并执行必要的操作以裁剪图像并将其保存到另一个文件或其他文件。
只需将步骤 1 反转,因此从 MLFeatureValue
-> CVPixelBuffer
-> UIImage
。 SO 上有很多关于这个的问题所以我不会重复答案。
如果你是初学者,不要指望一蹴而就,但路径就在这里。对于有经验的开发人员,我估计这项工作需要几个小时才能完成(加上模型学习时间并将其移植到 CoreML)。
除了 CoreML(也许您发现您的模型过于复杂,无法将其移植到 CoreML)之外,请查看 Matthjis Hollemans' github(关于将模型移植到 [=63 的不同方式的非常好的资源=]).他也在这附近,在这方面知道很多。