关于OpenVino(C++)与 pytorch(python)预测类别结果相同,但是预测概率差别较大的问题原因追溯

一、存在问题

如题,本人用LeNet进行简单的图像分类,在pytorch下训练结束后,进行Infer实验。测试中有两张图像, 分别称为图1和图2吧,真实类别分别对应A和D。
图1 预测类别为A,概率0.455。预测结果正确。
图2 预测类别为D,概率0.264。预测结果正确。(概率虽然低但最大)

使用OpenVino进行**C++**部署,此时
图1 预测类别为A,概率0.271。预测结果正确。(概率虽然低但最大)
图2 预测类别为D,概率0.556。预测结果正确。

二、实验代码

那么,问题来了,为什么虽然预测结果正确,但是置信度差别这么大呢?
排查:
1.图像大小是否相同
实际图像进入后都缩放为(512X512)
2.图像读入时是否都是RGB,
由于PIL库图像读入都是RGB,毋庸置疑,但Opencv读入是BGR,所以需
要转换,代码中也进行了相应转换。
3.是否进行了相同尺度的归一化
在pytorch中 ToTensor()是进行归一化,即每个像素除以255。
然后三个通道分别进行均值为0.5, 方差为0.5的归一化。
那么 在C++中 也是进行了相应的操作。

#python图像预处理

    data_transform = transforms.Compose(
        [transforms.Resize((512, 512)),
        transforms.ToTensor(),
         transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
        ])
        .
        .
        .

        img = Image.open(img_path) #PIL读图

OpenVino C++部署

       cv::Mat src = cv::imread(img_path);
       .
       .
       .
		resize(src, blob_image, Size(512, 512));
		cvtColor(blob_image, blob_image, COLOR_BGR2RGB);
		blob_image.convertTo(blob_image, CV_32F, 1.0 / 255.0);
		blob_image = (blob_image - 0.5) / 0.5;

三、实验分析

通过上述操作理论是没问题的,那么问题出在了什么地方,于是检查了经过预处理后图像的灰度值是否相同。

为了方便检查,我们先看图像的第一个坐标和最后一个坐标的灰度。
不看不知道,一看吓一跳,

归一化后的像素值差别就已经产生了,于是我们往上一步一步查看,发现图像在进行resize后 就产生了较大的差异,例如
C++第1像素灰度(163,184,171)
python第1像素灰度(156,158,163)
于是乎,没有理由不怀疑是由于同一张图经过opencv读入 再resize后 与PIL库Open再进行resize 产生了差异。那么我们把读入的图提前resize为(512X512),再次检查预测结果,结果都为0.336。
哈哈 问题找到了。

四、总结

其实,如果忽略这个问题带来的影响,因为目前来看 并未影响到预测结果(只是影响到了预测概率)。但是从长远角度来考虑的话,假如 图像的目标都完全相同,只是目标的颜色不同,根据颜色分类的话,上述问题会不会对结果产生影响,暂时我无法定论。
所以,为了避免不必要的麻烦,所有样本预先进行resize后,再进行训练,以达到pytorch和openvino相同的预测结果(概率),避免后患。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值