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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 03:15:05