目前我在玩一些机器学习算法,我有两组图像(训练集和验证集),它们存储在np.ndarray中。图像是灰度的,大小为28×28。我大约有200000张训练图像和大约20000张验证图像。我知道我的数据集不是理想的,并且:- 在每个数据集中可能有相同或几乎相同的图像- 验证集和训练集之间可能存在重叠
直觉告诉我,训练集和验证集中存在相同或相似的图像可能会影响我的机器学习算法的性能,因此我决定尝试清理我的数据集。
我可以轻松地通过合并两个数据集,并使用哈希(例如使用md5哈希,逐步构建一个md5哈希字典,并仅将那些md5哈希在哈希字典中不存在的图像复制到新的ndarray中)来清理数据集,从而删除相同的图像。
但是!我不确定如何在存在另一张图像几乎与其他图像相同的情况下删除其中一张图像。例如,当28×28像素中只有几个像素值不同时。有什么想法可以提出有效的图像间距离度量方法吗?这里的有效也意味着它最好能相对快速地工作,因为我不确定像素级比较是否是一个好主意。此外,如果有人能提供任何见解,关于通过移除相似的图像来清理数据集是否有实际的好处,那将非常有用?
回答:
您可以通过以下方式找到两张图像在RGB空间中的距离总和:
(((a - b)**2).sum(axis=2)**0.5).sum()
但是您必须非常小心,因为实际上非常相似的两张图像之间可能会有很大的差异(即其中
b = numpy.roll(a, 1, axis=0)
神经网络可能是一种有效的方法来确定图像之间的相似性!但是您是用原始图像训练您的系统吗?通常,最好按照@sascha的建议进行一些感知风格的预处理(当我最近研究这个问题时,我最终做了亮度->边缘->H.O.G.处理,并且发现使用纯numpy比scikit-image更快 https://github.com/paddywwoof/Machine-Learning/blob/master/image_processor.py),显然您应该在预处理之后测试结果之间的距离。