问题描述
在用skimage的函数计算两张图片的SSIM时:
from skimage.metrics import structural_similarity as SSIM
我想在模型训练过程中计算验证集GT和pre图片的SSIM,对输入SSIM函数的图像shape已转换为(B,H,W,C) :
SSIM((data_val[1].numpy().transpose(0, 2, 3, 1)*255).astype(np.uint8),
(pred_rgb.detach().cpu().numpy().transpose(0, 2, 3, 1)*255).astype(np.uint8), multichannel=True))
此时已经设置 multichannel=True ,但是在验证集evaluation的过程中依旧报错:
ValueError: win_size exceeds image extent. If the input is a multichannel (color) image, set multichannel=True.
出现原因
进到structural_similarity 源码,发现win_size默认大小为7:
if win_size is None:
if gaussian_weights:
r = int(truncate * sigma + 0.5)
win_size = 2 * r + 1
else:
win_size = 7
win_size大小要大于图片的shape,否则的话就会raise ValueError:
if np.any((np.asarray(im1.shape) - win_size) < 0):
raise ValueError(
"win_size exceeds image extent. If the input is a multichannel "
"(color) image, set multichannel=True.")
本人验证集50张图片,batch size=16 ,在计算SSIM时传进去的数组尺寸为(B,H,W,C) ,即使再设置multichannel=True 后也需要im.shape>win_size ,因此当验证集按照bs=16,取到最后一个batch时输入尺寸为(2,H,W,C) ,此时B<win_size 如果像我这样按照一个batch去计算SSIM,当出现一个batch中数量小于win_size时则会出现上诉错误!
解决方法
- 按照单张图去计算SSIM,此时注意输进去的图片去掉batch这个维度,应为
(H,W,C) 。 - 取batch时确保每一个batch数都大于
win_size (默认为7)。 - 更改
win_size 大小,此做法并不推荐,因为要是和别的文章中数值进行比较,win_size大小不一样应该会对结果有一定影响,还是默认大小比较好,不过我没做实验,不知道此影响多大。
欢迎讨论与补充。
|