VGG16实时人脸识别报错:无法将数组重塑为(1,224,224,3)
错误分析与解决方法
核心错误原因
- 尺寸不匹配:你将裁剪后的人脸resize为
(244,244),但后续reshape却指定(224,224),计算可知244×244×3=178608,正好是错误提示中的数组大小,两者尺寸必须完全统一。 - 重复扩展维度:先通过
reshape(1, 224, 224, 3)得到4维数组(批量数+宽+高+通道),之后又调用np.expand_dims,导致维度变为5维,与模型输入要求不符。 - 颜色空间与预处理缺失:OpenCV读取的帧是BGR格式,而VGG16训练时用的是RGB,且需要标准化预处理,你直接转换格式未做这步,会影响预测准确性。
- 预测结果索引错误:6分类模型的输出
pred形状为(1,6),pred[1][1]会直接索引越界,应使用pred[0][1]访问第一个样本的第二个类别概率。
修复后的完整代码
from PIL import Image from tensorflow.keras.applications.vgg16 import preprocess_input import cv2 from keras.models import load_model import numpy as np # 加载模型和人脸分类器 model = load_model('FAceRec.h5', compile=False) face_cas = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') def face_extr(img): faces = face_cas.detectMultiScale(img, 1.3, 5) # 修正空人脸判断逻辑(适配numpy新版本) if len(faces) == 0: return None # 仅处理第一个检测到的人脸(避免多脸覆盖) x, y, w, h = faces[0] cv2.rectangle(img, (x,y), (x+w, y+h), (0,255,255), 2) cropped_face = img[y:y+h, x:x+w] return cropped_face # 摄像头实时检测 video_cap = cv2.VideoCapture(0) # 统一输入尺寸(必须与训练模型时的输入尺寸完全一致,如训练用244则改为244) INPUT_SIZE = 224 while True: _, frame = video_cap.read() face = face_extr(frame) if isinstance(face, np.ndarray): # 1. 统一resize到模型要求的尺寸 face = cv2.resize(face, (INPUT_SIZE, INPUT_SIZE)) # 2. 转换颜色空间:BGR转RGB face_rgb = cv2.cvtColor(face, cv2.COLOR_BGR2RGB) # 3. 扩展维度为批量输入格式(1, INPUT_SIZE, INPUT_SIZE, 3) img_array = np.expand_dims(face_rgb, axis=0) # 4. 执行VGG16要求的输入预处理 img_array = preprocess_input(img_array) # 模型预测 pred = model.predict(img_array) print(pred) name = "No Matching" # 修正索引:取第一个样本的第二个类别概率(假设Suhail对应类别索引1) if pred[0][1] > 0.5: name = "Suhail" cv2.putText(frame, name, (50,50), cv2.FONT_HERSHEY_COMPLEX, 1, (0,255,0), 2) else: cv2.putText(frame, "No Matching Face", (50,50), cv2.FONT_HERSHEY_COMPLEX, 1, (0,255,0), 2) cv2.imshow('Result', frame) k = cv2.waitKey(1) if k == ord('q'): break video_cap.release() cv2.destroyAllWindows()
关键修改说明
- 统一输入尺寸:定义
INPUT_SIZE变量,确保resize尺寸与训练模型时的输入完全一致。 - 修正空人脸判断:替换原失效的判断逻辑,适配numpy新版本。
- 颜色空间转换:将OpenCV的BGR格式转为VGG16要求的RGB格式。
- 正确扩展维度:仅调用一次
np.expand_dims生成符合要求的批量输入数组。 - 添加标准化预处理:调用
preprocess_input对齐训练时的输入处理逻辑。 - 修复索引错误:使用正确的索引访问预测结果,避免越界。
内容的提问来源于stack exchange,提问作者Suhail Razeeth
相关产品推荐
相关产品推荐

