2017-06-20 137 views
3

我正在理解CoreML。對於初學者模型,我已經下載了Yahoo's Open NSFW caffemodel。您給它一張圖片,它會給出一個概率分數(介於0和1之間)圖片包含不適合的內容。將Caffe模型轉換爲CoreML

使用coremltools,我已經將模型轉換爲.mlmodel並將它帶入我的應用程序。它出現在Xcode中,像這樣:

enter image description here

在我的應用程序,我可以順利過關的圖像,輸出顯示爲MLMultiArray。我遇到麻煩的是瞭解如何使用這個MLMultiArray來獲得我的概率分數。我的代碼是像這樣:

func testModel(image: CVPixelBuffer) throws { 

    let model = myModel() 
    let prediction = try model.prediction(data: image) 
    let output = prediction.prob // MLMultiArray 
    print(output[0]) // 0.9992402791976929 
    print(output[1]) // 0.0007597212097607553 
} 

作爲參考,CVPixelBuffer被調整到所需要的224x224,該模型問(我會得到與視覺打一次,我可以算出來)。

如果我提供了不同的圖像,我已經打印到控制檯的兩個索引確實發生了變化,但是他們的分數與我在Python中運行模型時得到的結果大不相同。在Python中進行測試時,傳遞給模型的圖像給出了0.16的輸出,而根據上面的示例,我的CoreML輸出與我期望看到的截然不同(和Python的雙輸出不同)。

需要更多的工作來獲得像我期待的結果?

+0

我不認爲你需要手動調整緩衝區大小。我認爲CoreML可以爲你處理 – Guig

+0

我相信在使用Vision時可能只是這種情況。如果只使用CoreML本身,我確實認爲緩衝區確實需要調整大小(我可以確認;如果我通過CVPixelBuffer而不調整大小,則會引發錯誤)。 – ZbadhabitZ

+0

對。除非您喜歡編寫,重寫和維護圖像處理代碼,否則使用Vision將圖像傳送到模型會簡單得多。 – rickster

回答

2

看起來你並沒有像模型期望的那樣轉換輸入圖像。
大多數caffe模型預計「平均減」圖像作爲輸入,這個模型也是如此。如果檢查提供Yahoo's Open NSFWclassify_nsfw.py)的Python代碼:

# Note that the parameters are hard-coded for best results 
caffe_transformer = caffe.io.Transformer({'data': nsfw_net.blobs['data'].data.shape}) 
caffe_transformer.set_transpose('data', (2, 0, 1)) # move image channels to outermost 
caffe_transformer.set_mean('data', np.array([104, 117, 123])) # subtract the dataset-mean value in each channel 
caffe_transformer.set_raw_scale('data', 255) # rescale from [0, 1] to [0, 255] 
caffe_transformer.set_channel_swap('data', (2, 1, 0)) # swap channels from RGB to BGR 

也有這樣的圖像是resized to 256x256 and then cropped to 224x224一種特定的方式。

要獲得完全相同的結果,您需要在兩個平臺上以完全相同的方式轉換輸入圖像。

請參閱this thread瞭解更多信息。

+0

這很有道理!我已經回顧了classify_nsfw.py文件,但希望Vision框架能爲我處理所有這些問題。當失敗時,我選擇使用CoreML,但沒有考慮調整圖像的需要。有時間瞭解如何完成所有這些轉換! – ZbadhabitZ

+2

@ZbadhabitZ - 除了Shai指出的內容之外,當生成你的mlmodel時,你可能想嘗試爲'caffe.convert()'設置'is_bgr = True',因爲大多數Caffe模型都使用BGR輸入。默認情況下,Core ML將轉換爲假設RGB輸入,並且我想象交換顏色通道會對尋找人體膚色的東西的準確性有很大的影響。 –

+0

@BradLarson非常感謝!我曾嘗試使用is_bgr標誌轉換模型與coremltools兩種方式,沒有區別。 Shai的迴應可能需要首先解決,然後我會再次使用is_bgr標記集來嘗試模型。感謝您的評論! – ZbadhabitZ