我制作了以下 python 层并将其添加到 LeNet 架构中。但是在构建模型时会出错。我将使用 Numpy 应用我的 Python 层,但是当我使用 OpenCV 时会出现错误。
下面我从日志文件中添加我的代码和相应的错误。
导入简历2
进口咖啡
随机导入
def doEqualizeHist(img):
img = img.astype(np.uint8)
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
返回 cv2.equalizeHist(img)
类 EqualizeLayer(caffe.Layer):
def 设置(自我,底部,顶部):
assert len(bottom) == 1, '需要一个 layer.bottom'
assert bottom[0].data.ndim >= 3, '需要图像数据'
断言 len(top) == 1, '需要一个 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 错误: cvtColor 中的断言失败 (scn == 3 || scn == 4),文件/build/opencv-SviWsf/opencv-2.4.9.1+dfsg/modules/imgproc/src/color.cpp,第 3737 行
回溯(最近一次通话最后):
文件“/var/lib/digits/jobs/20170812-064148-f44d/digits_python_layers.py”,第 27 行,向前
top[0].data[ii, :, :, :] = doEqualizeHist(imin).transpose(2, 0, 1)
doEqualizeHist 中的文件“/var/lib/digits/jobs/20170812-064148-f44d/digits_python_layers.py”,第 8 行
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 ||函数 cvtColor 中的 scn == 4
最佳答案
为了将来引用,OpenCV 中的“断言失败”错误消息意味着您将无效数据传递给函数。在这种情况下,失败的断言是 scn == 3 || scn == 4
.要确切了解这意味着什么,您可以查看断言失败的源文件:modules/impgproc/src/color.cpp
并检查它发生的函数:cvtColor
在第 3737 行。查看变量 scn
代表。
在您的情况下,问题在于您正在转换 img
转换为单 channel 格式,然后尝试将其从 RGB 转换为灰度。该转换首先断言输入是 3 或 4 channel 格式。事实并非如此断言失败。
关于python - OpenCV python 层不适用于 caffe/digits 框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45651030/