PIL Image resize()可导致模型训练和推理效果有一定差异
这些差异导致检测效果有差异,有时没注意这些细节可能一下想不到原因,由其是同一种算法C++的实现和PIL库的实现有差异时。然后对C++里改算法的实现需要和PIL的实现仔细核确保按位置计算得到的缩放结果值和PIL计算出来的值是非常接近的,像BICUBIC算法的实现,经常有差异。
·
mmcv之类框架在预处理进入模型之前的图像时最常用的办法是调用PIL库的Image类的方法做resize和crop之类的处理,通常简单写成这样:
img = Image.fromarray(np.uint8(imgs[i]), mode='RGB')
...
img = img.resize(resize_dims)
而Image.resize(size, resample=0, box=None)当resample没有指定参数值时,默认使用NEAREST算法生成缩放后的目标图片的像素值,而我们在对模型做工程化部署应用时对图像做resize预处理时采用的算法不一定是NEAREST算法,或者虽然采用的是NEAREST算法但是和PIL里的实现有差异,导致得到的缩放后的目标图像的像素值和PIL版的resize()得到的目标图像的像素值在一定区域有一定差异,例如,同一图像使用PIL的Image.resize()缩放并做归一化处理后的头部区域的部分数据:
-0.970545,-1.090419,-1.176043,-1.176043,-1.090419,-0.765048,-0.559551,-0.576676,-0.593801,-0.576676,-0.593801,-0.559551,-0.610926,-0.645175,-0.782173,-0.919171,-0.782173,-0.867797,-0.799298
-0.953421,-1.056169,-1.158918,-1.158918,-1.090419,-0.816423,-0.576676,-0.473928,-0.576676,-0.576676,-0.576676,-0.542427,-0.593801,-0.628050,-0.696549,-0.902046,-0.782173,-0.799298,-0.816423
-1.039044,-1.141793,-1.176043,-1.176043,-1.004795,-0.713674,-0.559551,-0.559551,-0.576676,-0.559551,-0.559551,-0.576676,-0.645175,-0.662300,-0.867797,-0.902046,-0.799298,-0.850672
而C++实现的缩放并归一化处理后的对应数据是:
-0.953421,-1.056169,-1.158918,-1.158918,-1.090419,-0.816423,-0.576676,-0.473928,-0.576676,-0.576676,-0.576676,-0.542427,-0.593801,-0.628050,-0.696549,-0.902046,-0.782173,-0.799298,-0.816423
-0.953421,-1.056169,-1.176043,-1.158918,-1.090419,-0.816423,-0.525302,-0.559551,-0.576676,-0.576676,-0.576676,-0.542427,-0.593801,-0.645175,-0.782173,-0.902046,-0.782173,-0.867797,-0.799298,
1.0561693,-1.158917,-1.193167,-1.158917,-0.970545,-0.713674,-0.576676,-0.559551,-0.576676,-0.559551,-0.593800,-0.593800,-0.645175,-0.662299,-0.833547,-0.902046,-0.799297,-0.884921,-0.696549
这些差异导致检测效果有差异,有时没注意这些细节可能一下想不到原因,由其是同一种算法C++的实现和PIL库的实现有差异时。为避免这样隐藏的问题,对python代码最好强制指定算法,例如:
img = img.resize(resize_dims, resample=Resampling.BILINEAR)
然后对C++里同一算法的实现需要和PIL的实现仔细核确保按位置计算得到的缩放结果值和PIL计算出来的值是非常接近的,像BICUBIC算法的实现,经常有差异。
更多推荐
所有评论(0)