首页 文章

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

提问于
浏览
1

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

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

3 回答

  • 9

    在Core ML转换脚本中,您可以提供参数 image_input_names='data' ,其中 data 是输入的名称 .

    现在,Core ML将此输入视为图像( CVPixelBuffer ),而不是多阵列 .

  • 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 将是一件容易的事 .

  • 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

相关问题