在Python中,我使用keras训练了一个图像分类模型,以接收作为[224,224,3]数组的输入并输出预测(1或0) . 当我加载保存模型并将其加载到xcode时,它声明输入必须是MLMultiArray格式 .
有没有办法让我将UIImage转换为MLMultiArray格式?或者有没有办法让我改变我的keras模型接受CVPixelBuffer类型对象作为输入 .
在Core ML转换脚本中,您可以提供参数 image_input_names='data' ,其中 data 是输入的名称 .
image_input_names='data'
data
现在,Core ML将此输入视为图像( CVPixelBuffer ),而不是多阵列 .
CVPixelBuffer
将caffe模型转换为 MLModel 时,需要添加以下行:
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 将是一件容易的事 .
CVPixelBufferRef
MLMultiArray
UIImage
没试过这个,但这里是它为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 }
https://github.com/ph1ps/Food101-CoreML
3 回答
在Core ML转换脚本中,您可以提供参数
image_input_names='data'
,其中data
是输入的名称 .现在,Core ML将此输入视为图像(
CVPixelBuffer
),而不是多阵列 .将caffe模型转换为
MLModel
时,需要添加以下行:以我自己的传输脚本为例,脚本应该是这样的:
然后你的
MLModel
的输入数据将是CVPixelBufferRef
而不是MLMultiArray
. 将UIImage
转移到CVPixelBufferRef
将是一件容易的事 .没试过这个,但这里是它为FOOD101样本做了多少
https://github.com/ph1ps/Food101-CoreML