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'
(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'
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-pythonVersion 4.10.0.84 also doesn't work and doesn't report any error messages
Use jpeg, not png
我猜测是因为png带alpha通道(rgba),通道数是4因此报错。换成jpg就没事了。
问题依旧存在,还是报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就没事了。
降级到 opencv-python==4.7.0.72, 升级到 4.10.84 不会报错但是没效果。
问题依旧存在,还是报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可以正常使用,希望对你有帮助。
问题依旧存在,还是报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可以正常使用,希望对你有帮助。
![]()
![]()
![]()
在点击生成后,进度条一直显示等待中,过了几分钟之后就自动结束了,没有图片生成,输出文件夹中没有文件。也没有任何错误信息,控制台也没有日志输出😂 估计只能等作者修好绝对路径这个问题了
降级到 opencv-python==4.7.0.72, 升级到 4.10.84 不会报错但是没效果。
版本换成4.7.0.723后,依旧报错,只是报错内容中的版本号从4.9变成了4.7。。。
问题依旧存在,还是报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可以正常使用,希望对你有帮助。
![]()
![]()
![]()
在点击生成后,进度条一直显示等待中,过了几分钟之后就自动结束了,没有图片生成,输出文件夹中没有文件。也没有任何错误信息,控制台也没有日志输出😂 估计只能等作者修好绝对路径这个问题了
降级到 opencv-python==4.7.0.72, 升级到 4.10.84 不会报错但是没效果。
版本换成4.7.0.723后,依旧报错,只是报错内容中的版本号从4.9变成了4.7。。。
我的OpenCV版本是4.10.0
版本升级为4.10.0.84之后还是老问题,啥都不显示就自动结束了,连日志都没有 当时是打算训练模型才打算用这个功能的,现在已经半退坑Stable-Diffusion了,暂时就这样吧......
版本升级为4.10.0.84之后还是老问题,啥都不显示就自动结束了,连日志都没有 当时是打算训练模型才打算用这个功能的,现在已经半退坑Stable-Diffusion了,暂时就这样吧......
我中秋刚接触,那时候训练的,的确也就那样。
感谢您提供这些额外的信息。既然您已经确认降级到 OpenCV 4.7.0.72 并且图片已经是 JPG 格式(3 通道),但问题仍然存在,我们需要更深入地排查这个问题。
进一步解决方案
1. 检查图像处理流程中的通道转换
即使您输入的是 JPG 图像,代码在处理过程中可能仍然会转换为 RGBA 格式。让我们检查并修改相关代码:
- 打开文件:
stable-diffusion-webui\modules\textual_inversion\autocrop.py - 找到
focal_point函数(大约在第 77 行) - 在调用
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 []
- 同样,在
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回复的操作,我根据回复修改了这几处代码,虽然后续还有几个建议,但我还没执行就解决了,因此就不把那些步骤粘贴上来了
