在Python中,我使用keras训练了一个图像分类模型,以接收作为[224,224,3]数组的输入并输出预测(1或0)。当我加载保存模型并将其加载到xcode时,它声明输入必须是MLMultiArray格式。
我有办法将UIImage转换为MLMultiArray格式吗?或者有没有办法让我更改我的keras模型以接受CVPixelBuffer类型对象作为输入。
答案 0 :(得分:10)
在Core ML转换脚本中,您可以提供参数image_input_names='data'
,其中data
是您输入的名称。
现在Core ML会将此输入视为图像(CVPixelBuffer
),而不是多数组。
答案 1 :(得分:5)
将caffe模型转换为MLModel
时,需要添加以下行:
image_input_names = 'data'
以我自己的传输脚本为例,脚本应该是这样的:
import coremltools
coreml_model = coremltools.converters.caffe.convert(('gender_net.caffemodel',
'deploy_gender.prototxt'),
image_input_names = 'data',
class_labels = 'genderLabel.txt')
coreml_model.save('GenderMLModel.mlmodel')
然后,您的MLModel
输入数据将为CVPixelBufferRef
而不是MLMultiArray
。将UIImage
转移到CVPixelBufferRef
会很容易。
答案 2 :(得分:2)
没试过这个,但这里是FOOD101样本的完成方式
func preprocess(image: UIImage) -> MLMultiArray? {
let size = CGSize(width: 299, height: 299)
guard let pixels = image.resize(to: size).pixelData()?.map({ (Double($0) / 255.0 - 0.5) * 2 }) else {
return nil
}
guard let array = try? MLMultiArray(shape: [3, 299, 299], dataType: .double) else {
return nil
}
let r = pixels.enumerated().filter { $0.offset % 4 == 0 }.map { $0.element }
let g = pixels.enumerated().filter { $0.offset % 4 == 1 }.map { $0.element }
let b = pixels.enumerated().filter { $0.offset % 4 == 2 }.map { $0.element }
let combination = r + g + b
for (index, element) in combination.enumerated() {
array[index] = NSNumber(value: element)
}
return array
}