opencv-python icon indicating copy to clipboard operation
opencv-python copied to clipboard

error: OpenCV(4.9.0) D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\layers\convolution_layer.cpp:396: error: (-2:Unspecified error) Number of input channels should be multiple of 3 but got 4 in function 'cv::dnn::ConvolutionLayerImpl::getMemoryShapes'

Open XZHStudio opened this issue 1 year ago • 10 comments

(Translated using DeepL)

Expected behaviour

Normal output.

Actual behaviour

After Auto Focus Cropping is enabled Click the "Generate" button error: OpenCV(4.9.0) D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\layers\convolution_layer.cpp:396: error: (-2:Unspecified error) Number of input channels should be multiple of 3 but got 4 in function 'cv::dnn::ConvolutionLayerImpl::getMemoryShapes' image

Steps to reproduce

  • Windows 10
  • x86
  • 4.9.0.80
Issue submission checklist
  • [√] This is not a generic OpenCV usage question (looking for help for coding, other usage questions, homework etc.)
  • [ √] I have read the README of this repository and understand that this repository provides only an automated build toolchain for OpenCV Python packages (there is no actual OpenCV code here)
  • [?] The issue is related to the build scripts in this repository, to the pre-built binaries or is a feature request (such as "please enable this additional dependency")
  • [×] I'm using the latest version of opencv-python Version 4.10.0.84 also doesn't work and doesn't report any error messages

XZHStudio avatar Jul 03 '24 13:07 XZHStudio

Use jpeg, not png

kevinstrax avatar Sep 16 '24 10:09 kevinstrax

我猜测是因为png带alpha通道(rgba),通道数是4因此报错。换成jpg就没事了。

kevinstrax avatar Sep 30 '24 13:09 kevinstrax

问题依旧存在,还是报error: OpenCV(4.9.0) D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\layers\convolution_layer.cpp:396: error: (-2:Unspecified error) Number of input channels should be multiple of 3 but got 4 in function 'cv::dnn::ConvolutionLayerImpl::getMemoryShapes'错误,但是只要把“自动面部焦点剪裁”关掉就能正常出图

我猜测是因为png带alpha通道(rgba),通道数是4因此报错。换成jpg就没事了。

XZHStudio avatar Sep 30 '24 13:09 XZHStudio

降级到 opencv-python==4.7.0.72, 升级到 4.10.84 不会报错但是没效果。

puppet-king avatar Sep 30 '24 13:09 puppet-king

问题依旧存在,还是报error: OpenCV(4.9.0) D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\layers\convolution_layer.cpp:396: error: (-2:Unspecified error) Number of input channels should be multiple of 3 but got 4 in function 'cv::dnn::ConvolutionLayerImpl::getMemoryShapes'错误,但是只要把“自动面部焦点剪裁”关掉就能正常出图

我猜测是因为png带alpha通道(rgba),通道数是4因此报错。换成jpg就没事了。

我试了下,使用第一项Single Image的确不行。我是使用Batch from Directory并使用jpg可以正常使用,希望对你有帮助。 image image image image

kevinstrax avatar Sep 30 '24 13:09 kevinstrax

问题依旧存在,还是报error: OpenCV(4.9.0) D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\layers\convolution_layer.cpp:396: error: (-2:Unspecified error) Number of input channels should be multiple of 3 but got 4 in function 'cv::dnn::ConvolutionLayerImpl::getMemoryShapes'错误,但是只要把“自动面部焦点剪裁”关掉就能正常出图

我猜测是因为png带alpha通道(rgba),通道数是4因此报错。换成jpg就没事了。

我试了下,使用第一项Single Image的确不行。我是使用Batch from Directory并使用jpg可以正常使用,希望对你有帮助。 image image image image

在点击生成后,进度条一直显示等待中,过了几分钟之后就自动结束了,没有图片生成,输出文件夹中没有文件。也没有任何错误信息,控制台也没有日志输出😂 估计只能等作者修好绝对路径这个问题了

降级到 opencv-python==4.7.0.72, 升级到 4.10.84 不会报错但是没效果。

版本换成4.7.0.723后,依旧报错,只是报错内容中的版本号从4.9变成了4.7。。。

XZHStudio avatar Sep 30 '24 14:09 XZHStudio

问题依旧存在,还是报error: OpenCV(4.9.0) D:\a\opencv-python\opencv-python\opencv\modules\dnn\src\layers\convolution_layer.cpp:396: error: (-2:Unspecified error) Number of input channels should be multiple of 3 but got 4 in function 'cv::dnn::ConvolutionLayerImpl::getMemoryShapes'错误,但是只要把“自动面部焦点剪裁”关掉就能正常出图

我猜测是因为png带alpha通道(rgba),通道数是4因此报错。换成jpg就没事了。

我试了下,使用第一项Single Image的确不行。我是使用Batch from Directory并使用jpg可以正常使用,希望对你有帮助。 image image image image

在点击生成后,进度条一直显示等待中,过了几分钟之后就自动结束了,没有图片生成,输出文件夹中没有文件。也没有任何错误信息,控制台也没有日志输出😂 估计只能等作者修好绝对路径这个问题了

降级到 opencv-python==4.7.0.72, 升级到 4.10.84 不会报错但是没效果。

版本换成4.7.0.723后,依旧报错,只是报错内容中的版本号从4.9变成了4.7。。。

我的OpenCV版本是4.10.0

kevinstrax avatar Sep 30 '24 14:09 kevinstrax

版本升级为4.10.0.84之后还是老问题,啥都不显示就自动结束了,连日志都没有 当时是打算训练模型才打算用这个功能的,现在已经半退坑Stable-Diffusion了,暂时就这样吧......

XZHStudio avatar Sep 30 '24 14:09 XZHStudio

版本升级为4.10.0.84之后还是老问题,啥都不显示就自动结束了,连日志都没有 当时是打算训练模型才打算用这个功能的,现在已经半退坑Stable-Diffusion了,暂时就这样吧......

我中秋刚接触,那时候训练的,的确也就那样。

kevinstrax avatar Sep 30 '24 14:09 kevinstrax

感谢您提供这些额外的信息。既然您已经确认降级到 OpenCV 4.7.0.72 并且图片已经是 JPG 格式(3 通道),但问题仍然存在,我们需要更深入地排查这个问题。

进一步解决方案

1. 检查图像处理流程中的通道转换

即使您输入的是 JPG 图像,代码在处理过程中可能仍然会转换为 RGBA 格式。让我们检查并修改相关代码:

  1. 打开文件:stable-diffusion-webui\modules\textual_inversion\autocrop.py
  2. 找到 focal_point 函数(大约在第 77 行)
  3. 在调用 image_face_points(im, settings) 之前,添加代码确保图像是 RGB 模式:
# 确保图像是 RGB 模式
if im.mode != 'RGB':
    im = im.convert('RGB')
face_points = image_face_points(im, settings) if settings.face_points_weight > 0 else []
  1. 同样,在 image_face_points 函数中(大约在第 152 行),在调用 detector.detect(np.array(im)) 之前添加:
# 确保图像是 RGB 模式
if im.mode != 'RGB':
    im = im.convert('RGB')
faces = detector.detect(np.array(im))

2. 检查 OpenCV 的 DNN 模块配置

错误可能源于 OpenCV 的 DNN 模块期望特定的输入格式。让我们尝试明确指定输入格式:

image_face_points 函数中,修改检测器的调用方式:

# 修改前
faces = detector.detect(np.array(im))

# 修改后
# 确保图像是 RGB 并转换为 numpy 数组
if im.mode != 'RGB':
    im = im.convert('RGB')
img_np = np.array(im)

# 如果使用的是基于Caffe的模型,可能需要调整均值和平缩放
# blob = cv2.dnn.blobFromImage(img_np, scalefactor=1.0, size=(300, 300), mean=(104, 117, 123))
# detector.setInput(blob)
# faces = detector.forward()

# 或者直接使用原代码但确保格式正确
faces = detector.detect(img_np)

我也是5080显卡遇到了这个问题,以上是使用deepseek回复的操作,我根据回复修改了这几处代码,虽然后续还有几个建议,但我还没执行就解决了,因此就不把那些步骤粘贴上来了

Image

xu87334001-code avatar Sep 19 '25 06:09 xu87334001-code