如何计算不同形状(大)图像集的方差

xfyts7mz  于 2021-08-20  发布在  Java
关注(0)|答案(0)|浏览(142)

我的机器学习模型在coco数据集上运行得很好,但在从相机捕获的帧上运行得很差。因此,我试图将coco数据集的平均值和方差与摄像机捕获的帧进行比较,看看它们是否有很大差异(并最终尝试通过标准化摄像机帧来解决问题)。
但我在计算coco数据集的方差方面有点困难。它是17gb大,所以我不能一次加载所有图像,所以我尝试使用平方和方法:(解决方案来自这里,经过一些调整:用python计算图像数据集通道平均值和标准偏差的最快方法)从tqdm导入tqdm导入操作系统导入numpy作为np导入cv2

means = []
print("Means")

PATH = "./train2017/"

N = len(os.listdir(PATH))

for Nfile in tqdm(os.listdir(PATH)):
    img = cv2.imread(PATH+Nfile)
    val = np.reshape(img, -1)
    img_mean = np.mean(val)
    means.append(img_mean)
means= np.array(means)
mean = np.mean(means)
print(mean)

global_mean = mean #112.5834416723132

# Here variance is computed

# just get a per-pixel array with the vals for (x_i - mu)**2 / |x|

sums = 0

for Nfile in tqdm(os.listdir(PATH)):
    img = cv2.imread(PATH+Nfile)
    print(img.shape)
    sums = sums + ((img - global_mean)**2) / N
    print(sums.shape)

# Get mean of all per-pixel variances, and then take sqrt to get std

dataset_std = np.sqrt(np.mean(sums))

print(dataset_std)

但是,它失败了,因为coco数据集中的图像具有不同的形状,所以我在行中得到了广播错误:

sums = sums + ((img - global_mean)**2) / N

因为老 sums 具有第一个图像的形状,而 img 有一个不同的形状。
有没有人建议如何解决这个问题以保持数学上的正确性?

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题