好吧,你的问题其实和编程直接相关:)
广告一,格式是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 的不同方式的非常好的资源)。他也在这附近,并且在这方面了解很多。