将 UIImage 转换为 Keras 模型的 MLMultiArray
Posted
技术标签:
【中文标题】将 UIImage 转换为 Keras 模型的 MLMultiArray【英文标题】:Converting UIImage to MLMultiArray for Keras Model 【发布时间】:2017-11-15 17:25:40 【问题描述】:在 Python 中,我使用 keras 训练了一个图像分类模型,以接收作为 [224, 224, 3] 数组的输入并输出预测(1 或 0)。当我加载保存模型并将其加载到 xcode 中时,它指出输入必须是 MLMultiArray 格式。
有没有办法将 UIImage 转换为 MLMultiArray 格式?或者有没有办法让我改变我的 keras 模型以接受 CVPixelBuffer 类型的对象作为输入。
【问题讨论】:
你能分享你用来做这个的代码吗? 【参考方案1】:在您的 Core ML 转换脚本中,您可以提供参数 image_input_names='data'
,其中 data
是您输入的名称。
现在 Core ML 会将此输入视为图像 (CVPixelBuffer
) 而不是多数组。
【讨论】:
一旦您将模型配置为接受图像,您就无需重新格式化图像并将其手动转换为 CVPixelBuffer — 新的 Vision 框架 does that for you。 是的,通过 Vision 绝对是最简单的做事方式。 我也试过了。但这并没有解决我的问题。请看这个链接:forums.developer.apple.com/message/242517#242517【参考方案2】:当你将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
将是一件容易的事。
【讨论】:
请注意,image_input_names='data' 仅在您的输入真正被称为“数据”时才有效。如果您没有重命名您的输入,那么它可能被称为“input_1”或“input__0”。【参考方案3】:没有尝试过,但这是 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
【讨论】:
啊,这行不通。我是这本书的作者,我没有像 Matthijs 那样做的唯一原因是因为我需要一些预处理。我除以 255 并减去等的部分对于除我之外的所有其他模型都是错误的。为了使其适用于其他人,请从该地图中删除这些计算。以上是关于将 UIImage 转换为 Keras 模型的 MLMultiArray的主要内容,如果未能解决你的问题,请参考以下文章