如何调整输入适配ResNet101?解决通道与尺寸不匹配问题
适配ResNet101输入的修改方案
你的问题核心是两处输入不匹配:
- ResNet101预训练模型默认要求3通道RGB输入,但你的输入是1通道灰度图
- 模型期望输入尺寸为229×229(从错误信息推断),但你的输入是48×48
修改步骤:
- 单通道转3通道:将灰度图复制3次,模拟RGB通道结构(ResNet第一层卷积核设计为接收3通道输入)
- 调整输入尺寸:把48×48的人脸区域resize到模型要求的229×229
- 补充batch维度:模型输入需要
[batch_size, channels, height, width]格式,需给张量添加batch维度
修改后的关键代码段:
if __name__ == "__main__": vid = cv2.VideoCapture(0) emotions = [] while vid.isOpened(): # 原代码中同时读取本地图片和摄像头帧,逻辑冲突,建议统一用摄像头帧 _, frame = vid.read() if not _: break # 基于摄像头帧生成灰度图,和人脸检测源保持一致 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(frame) for (x,y,w,h) in faces: # 修正宽度截取错误:原代码用x:x+h,应改为x:x+w roi_gray = gray[y:y+h, x:x+w] # 1. 调整尺寸到模型期望的229×229 resized = cv2.resize(roi_gray, (229, 229)) # 2. 单通道灰度图转3通道BGR格式 rgb_img = cv2.cvtColor(resized, cv2.COLOR_GRAY2BGR) # 3. 转张量并添加batch维度 img = img2tensor(rgb_img).unsqueeze(0) # 执行预测 prediction = predict(img)
额外说明:
- 若使用标准预训练ResNet101,通常输入尺寸为224×224,可根据你的模型配置调整resize参数
- 原代码中
roi_gray的宽度截取逻辑错误,会导致人脸区域变形,已修正为x:x+w - 原代码同时读取本地图片和摄像头帧,存在逻辑冲突,已调整为统一使用摄像头帧处理
内容的提问来源于stack exchange,提问作者Berkay Çamur
相关产品推荐
相关产品推荐

