将 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的主要内容,如果未能解决你的问题,请参考以下文章

将 keras 模型转换为核心 ml 模型时出错

无法将 Keras 模型转换为 tflite

如何将 Turi Create 创建的 CoreML 模型转换为 Keras?

将 Keras 模型转换为 C++ [关闭]

如何将暗网 yolo 模型转换为 keras?

将 TensorFlow 模型转换为 Keras hdf5