在Python中,我訓練了一個包含keras的圖像分類模型,以接收[224,224,3]數組的輸入並輸出一個預測(1或0)。當我加載保存模型並將其加載到xcode中時,它指出輸入必須是MLMultiArray格式。將UIImage轉換爲用於Keras的MLMultiArray模型
有沒有辦法讓我把UIImage轉換成MLMultiArray格式?或者有沒有辦法讓我改變我的keras模型來接受CVPixelBuffer類型的對象作爲輸入。
在Python中,我訓練了一個包含keras的圖像分類模型,以接收[224,224,3]數組的輸入並輸出一個預測(1或0)。當我加載保存模型並將其加載到xcode中時,它指出輸入必須是MLMultiArray格式。將UIImage轉換爲用於Keras的MLMultiArray模型
有沒有辦法讓我把UIImage轉換成MLMultiArray格式?或者有沒有辦法讓我改變我的keras模型來接受CVPixelBuffer類型的對象作爲輸入。
在您的核心ML轉換腳本中,您可以提供參數image_input_names='data'
,其中data
是您輸入的名稱。
現在Core ML將把這個輸入視爲一個圖像(CVPixelBuffer
)而不是多數組。
一旦你的模型配置爲接受圖像,你不需要重新格式化你的圖像,並手動將它們轉換爲CVPixelBuffer - 新的視覺框架[爲你做到這一點](https://stackoverflow.com/q/44400741/957768)。 – rickster
是的,通過Vision來做事絕對是最簡單的方法。 –
我也一樣。但是這並沒有解決我的問題。請看這個鏈接:https://forums.developer.apple.com/message/242517#242517 –
如何其對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
}
啊,這是行不通的。我是那個的作者,我之所以沒有像Matthijs那樣做的唯一原因是因爲我需要一些預處理。除了我的其他所有模型,我除以255和減去的部分都是錯誤的。爲了讓其他人從這張地圖上移除這些計算。 – phipsG
做當你轉換朱古力模型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
將是一件容易的事情。
你能分享你用來做這個的代碼嗎? –