2017-06-13 59 views
1

在Python中,我訓練了一個包含keras的圖像分類模型,以接收[224,224,3]數組的輸入並輸出一個預測(1或0)。當我加載保存模型並將其加載到xcode中時,它指出輸入必須是MLMultiArray格式。將UIImage轉換爲用於Keras的MLMultiArray模型

有沒有辦法讓我把UIImage轉換成MLMultiArray格式?或者有沒有辦法讓我改變我的keras模型來接受CVPixelBuffer類型的對象作爲輸入。

+0

你能分享你用來做這個的代碼嗎? –

回答

8

在您的核心ML轉換腳本中,您可以提供參數image_input_names='data',其中data是您輸入的名稱。

現在Core ML將把這個輸入視爲一個圖像(CVPixelBuffer)而不是多數組。

+2

一旦你的模型配置爲接受圖像,你不需要重新格式化你的圖像,並手動將它們轉換爲CVPixelBuffer - 新的視覺框架[爲你做到這一點](https://stackoverflow.com/q/44400741/957768)。 – rickster

+0

是的,通過Vision來做事絕對是最簡單的方法。 –

+1

我也一樣。但是這並沒有解決我的問題。請看這個鏈接:https://forums.developer.apple.com/message/242517#242517 –

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

+0

啊,這是行不通的。我是那個的作者,我之所以沒有像Matthijs那樣做的唯一原因是因爲我需要一些預處理。除了我的其他所有模型,我除以255和減去的部分都是錯誤的。爲了讓其他人從這張地圖上移除這些計算。 – phipsG

1

做當你轉換朱古力模型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。轉移UIImageCVPixelBufferRef將是一件容易的事情。