PyTorch ResNet模型对OpenCV帧与PNG文件单图评估结果差异咨询
问题解答
(1)结果不一致的原因
OpenCV读取视频帧、图像的默认颜色通道顺序是BGR,而你训练模型时用PIL读取PNG文件的颜色通道顺序是RGB:
- 你调用
cv2.imwrite保存PNG文件时,OpenCV会自动将BGR通道转换为RGB顺序写入磁盘,所以后续用PIL读取保存的PNG得到的是和训练时一致的RGB格式图像,推理结果符合预期。 - 你直接对OpenCV读取的原始帧调用
Image.fromarray转换时,没有做通道顺序转换,相当于把BGR通道当成RGB喂给了模型,输入数据分布和训练时不一致,自然推理结果偏差很大。
(2)统一结果的修改方案
只需要在读取到OpenCV帧之后、转换为PIL格式之前,加上通道转换的步骤即可,修改后的推理部分代码如下:
# Read image cap = cv2.VideoCapture('eval.mp4') total_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT) cap.set(cv2.CAP_PROP_POS_FRAMES, 6840) ret, frame = cap.read() # 新增:将OpenCV默认的BGR通道转为RGB frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 如果需要保存正常颜色的PNG,需要把通道转回来再写文件 cv2.imwrite('eval_6840.png', cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)) png_file = 'eval_6840.png' # eval png 逻辑保持不变 png_image = Image.open(png_file) png_image = png_image.convert('RGB') png_image = data_transforms['val'](png_image) png_image = png_image.to(torch.float) png_image = torch.unsqueeze(png_image, 0) print(png_image.shape) output = model_ft(png_image) print(output) # eval frame 逻辑保持不变 vid_image = Image.fromarray(frame) vid_image = vid_image.convert('RGB') vid_image = data_transforms['val'](vid_image) vid_image = vid_image.to(torch.float) vid_image = torch.unsqueeze(vid_image, 0) print(vid_image.shape) output = model_ft(vid_image) print(output)
修改后两种方式的输入数据完全一致,推理结果也会对齐。
内容的提问来源于stack exchange,提问作者BeginnersMindTruly
相关产品推荐
相关产品推荐

