当前位置 博文首页 > 不太冷的莱昂的博客:图像分割中数据集处理resize的大坑!!!

    不太冷的莱昂的博客:图像分割中数据集处理resize的大坑!!!

    作者:[db:作者] 时间:2021-09-02 16:29

    最近在做语义分割,处理完数据集后训练时总是报“label out of bound”,当把Mean_IOU这个指标去掉之后能正常训练但是训练损失一直为nan,在经过一系列的检查后确定自己的代码没有问题,把目光聚焦到数据集上,终于在经过一天的搜索后,偶然看到一篇博客有类似的问题,作者指出关注一下数据集resize的时候使用的插值方式。我在处理数据集的时候只用了pillow这个处理库(这里多提一句,我们在处理图像的时候尽可能的从头至尾采用一种图像处理模块,要么全部OpenCv,要么就是Pillow或者matplotlib,最好不要打开图像用OpenCv,crop图像又用Pillow之类的操作,会出现一些意想不到的错误。)。继续接着上面讲,我在resize图像的时候简单看了一下Pillow包里面的resize函数的参数,插值方式有以下四种

    PIL.Image.NEAREST
    PIL.Image.BILINEAR
    PIL.Image.BICUBIC
    PIL.Image.ANTIALIAS

    ?

    其中Image.ANTIALIAS这个重采样方法的介绍是得到的图像质量是最高的,最近邻居插值质量最低,所以我没多想就用了前一种,悲剧就出现在这里,当我将插值方法改为默认,即最近邻居插值,这时候训练完全正常,至于为什么不同的插值方法会结果不一样,跟插值算法实现的细节有关,例如最近邻插值就是把变换后的图像中的原像素点最近像素的灰度值赋给原像素点的方法,因此不管是缩小还是放大图像都不会产生新的像素值,而双线性插值等有一个像素相加再相除的操作,这有可能导致不属于label中的像素值出现,例如标签中本来只有0和5两种像素,使用了双线性插值后得到了新的像素2,但是分割类别设定的是2,这显然会导致训练时报错。

    ?

    cs