2017-08-12 51 views
0

我做了下面的python層並將它添加到LeNet架構中。但是在構建模型時會出現錯誤。我要使用Numpy來應用我的Python圖層,但是當我使用OpenCV時,會出現錯誤。 以下我從日誌文件中添加我的代碼和相應的錯誤。OpenCV python層不能與caffe/digits框架一起工作

 
import cv2 
import caffe 
import random

def doEqualizeHist(img): img = img.astype(np.uint8) img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) return cv2.equalizeHist(img)

class EqualizeLayer(caffe.Layer): def setup(self, bottom, top): assert len(bottom) == 1, 'requires a single layer.bottom' assert bottom[0].data.ndim >= 3, 'requires image data' assert len(top) == 1, 'requires a single layer.top'

def reshape(self, bottom, top): # Copy shape from bottom top[0].reshape(*bottom[0].data.shape) def forward(self, bottom, top): # Copy all of the data top[0].data[...] = bottom[0].data[...] for ii in xrange(0, top[0].data.shape[0]): imin = top[0].data[ii, :, :, :].transpose(1, 2, 0) top[0].data[ii, :, :, :] = doEqualizeHist(imin).transpose(2, 0, 1) def backward(self, top, propagate_down, bottom): pass

錯誤消息:0812 06:41:53.452097 14355 net.cpp:723]將忽略源層列車數據 OpenCV的錯誤:斷言失敗(SCN == 3 || SCN == 4)在cvtColor中,文件/build/opencv-SviWsf/opencv-2.4.9.1+dfsg/modules/imgproc/src/color.cpp,第3737行 回溯(最近調用最後一次): 文件「/ var/lib /數字/作業/ 20170812-064148-f44d/digits_python_layers.py「,第27行,轉發 top [0] .data [ii,:,:,:] = doEqualizeHist(imin).transpose(2,0,1) 文件「/ var/lib/digits/jobs/20170812-0641 48-f44d/digits_python_layers.py「,第8行,在doEqualizeHist img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) cv2.error:/build/opencv-SviWsf/opencv-2.4.9.1+dfsg/modules/imgproc /src/color.cpp:3737:錯誤:(-215)scn == 3 || scn == 4函數cvtColor

+1

爲什麼不做一些調試,並且可能在傳入導致錯誤的語句之前檢查'img'? –

+0

我嘗試了獨立的Python代碼,然後運行正常,但在Caffe模型運行期間導致錯誤。現在,我試圖使用skimage而不是OpenCV,然後運行正常。我知道這不是一個解決方案,而是一種解決方法。 –

回答

1

爲了將來的參考,OpenCV中的「斷言失敗」錯誤消息意味着您將無效數據傳遞給函數。在這種情況下,失敗的斷言是scn == 3 || scn == 4。要確切知道這意味着什麼,可以查看斷言失敗的源文件:modules/impgproc/src/color.cpp並檢查它發生的功能:cvtColor在3737行。查看變量scn代表的內容。

在你的情況,問題是你正在轉換img爲單通道格式,然後試圖將其從RGB轉換爲灰度。該轉換首先聲明輸入是3或4通道格式。並非如此斷言失敗。

+0

這有助於我的感謝 –

相關問題