You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 21:18:17