将UIImage转换为适用于Keras模型的MLMultiArray

时间:2017-06-13 19:19:58

标签: ios xcode uiimage keras coreml

在Python中,我使用keras训练了一个图像分类模型,以接收作为[224,224,3]数组的输入并输出预测(1或0)。当我加载保存模型并将其加载到xcode时,它声明输入必须是MLMultiArray格式。

我有办法将UIImage转换为MLMultiArray格式吗?或者有没有办法让我更改我的keras模型以接受CVPixelBuffer类型对象作为输入。

3 个答案:

答案 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
    }

https://github.com/ph1ps/Food101-CoreML