训练输入为(48,48,3)的CNN模型调用OpenCV实时推理shape不兼容如何解决
问题修复方案
错误原因
- 你为了执行人脸检测,将摄像头读取的原始三通道BGR帧转换为了单通道灰度图,后续提取的人脸ROI也为单通道数据。单通道4848的数组总元素仅为
48*48=2304,而4848*3的三通道数组需要48*48*3=6912个元素,元素总数不匹配所以无法直接reshape,同时也和模型要求的三通道输入不匹配。 - 你代码中添加batch维度后又错误地用reshape删除了batch维度,也会导致输入格式不符合模型要求。
修复方案(二选一即可)
方案1:直接从原始彩色帧提取ROI(推荐)
该方案保留原始图像的三通道信息,匹配模型输入要求,修改点如下:
# 原有代码提取灰度ROI的部分替换为以下内容 for (x,y,w,h) in faces: cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2) # 从原始彩色帧提取ROI,而非灰度图 roi_color = frame[y:y+h, x:x+w] roi_color = cv2.resize(roi_color, (48,48), interpolation=cv2.INTER_AREA) if np.sum([roi_color])!=0: roi = roi_color.astype('float')/255.0 roi = img_to_array(roi) # 若训练模型时用的是RGB格式输入,需要加这一行转换OpenCV默认的BGR格式 # roi = cv2.cvtColor(roi, cv2.COLOR_BGR2RGB) roi = np.expand_dims(roi, axis=0) # 删除原来错误的reshape(48,48,3)操作 preds=classifier.predict(roi)[0] # 后续代码保持原有逻辑不变
方案2:将单通道灰度ROI转换为三通道
如果不想修改人脸检测后的ROI提取逻辑,可以直接将单通道灰度图转换为三通道(三个通道数值一致),修改点如下:
for (x,y,w,h) in faces: cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2) roi_gray=gray[y:y+h,x:x+w] roi_gray=cv2.resize(roi_gray,(48,48),interpolation=cv2.INTER_AREA) if np.sum([roi_gray])!=0: roi=roi_gray.astype('float')/255.0 # 单通道转三通道 roi = cv2.cvtColor(roi, cv2.COLOR_GRAY2BGR) roi = img_to_array(roi) roi = np.expand_dims(roi, axis=0) # 删除原来错误的reshape(48,48,3)操作 preds=classifier.predict(roi)[0] # 后续代码保持原有逻辑不变
内容的提问来源于stack exchange,提问作者Carlos Berrocal
相关产品推荐
相关产品推荐

