如何在训练 CNN 期间删除重复项?

Posted

技术标签:

【中文标题】如何在训练 CNN 期间删除重复项?【英文标题】:How to remove duplicate items during training CNN? 【发布时间】:2019-10-27 01:57:41 【问题描述】:

我正在使用 CNN 解决图像分类问题。我有一个包含重复图像的图像数据集。当我用这些数据训练 CNN 时,它已经过拟合了。因此,我需要删除那些重复项。

【问题讨论】:

如果这是一个小数据集,您可以使用手动复制的图像删除。如果只有少量重复且大量图像,则不会真正影响您的学习算法。在训练你的卷积网络之前,必须删除重复的图像。如果有数千张图像,并且您找不到带有 ID 或名称的重复图像,您可以使用欧几里德距离将给定的目标图像与所有其他图像进行比较,并删除欧几里德距离 = 0 的图像。这可能需要很多计算资源,也许你可以找到更有效的方法来做到这一点 【参考方案1】:

我们松散地称为重复的东西对于算法来说很难辨别。 您的副本可以是:

    完全重复 近乎精确的重复。 (图像等的小幅编辑) 感知重复(相同的内容,但不同的视图、相机等)

No1 和 2 更容易解决。 No 3. 非常主观,仍然是一个研究课题。 我可以为 No1 和 2 提供解决方案。 两种解决方案都使用了优秀的图像哈希库:https://github.com/JohannesBuchner/imagehash

    完全重复 可以使用感知散列测量找到精确的重复项。 phash 库在这方面做得很好。我经常用它来清洁 训练数据。 用法(来自 github 站点)很简单:
from PIL import Image
import imagehash

# image_fns : List of training image files
img_hashes = 

for img_fn in sorted(image_fns):
    hash = imagehash.average_hash(Image.open(image_fn))
    if hash in img_hashes:
        print( ' duplicate of '.format(image_fn, img_hashes[hash]) )
    else:
        img_hashes[hash] = image_fn
    近乎精确的重复 在这种情况下,您必须设置一个阈值并比较散列值与它们之间的距离 其他。这必须通过对图片内容的反复试验来完成。
from PIL import Image
import imagehash

# image_fns : List of training image files
img_hashes = 
epsilon = 50

for img_fn1, img_fn2 in zip(image_fns, image_fns[::-1]):
    if image_fn1 == image_fn2:
        continue

    hash1 = imagehash.average_hash(Image.open(image_fn1))
    hash2 = imagehash.average_hash(Image.open(image_fn2))
    if hash1 - hash2 < epsilon:
        print( ' is near duplicate of '.format(image_fn1, image_fn2) )

【讨论】:

【参考方案2】:

@nav 的解决方案非常适合查找近乎精确的重复项和精确的重复项。 由于您的用例是训练神经网络,而相似的图像会导致您的评估过度拟合,因此删除任何类型的相似性可能更明智。

我找这个项目做图像去重https://github.com/idealo/imagededup

并且在项目中使用 CNN 算法,您可以删除感知重复的情况(这也可以删除接近精确和精确的重复)

【讨论】:

以上是关于如何在训练 CNN 期间删除重复项?的主要内容,如果未能解决你的问题,请参考以下文章

删除没有主键的重复项

Bigquery:检查流期间的重复项

如何删除已经在list中的重复项

如何使用“唯一”从向量中删除重复项?

如何删除这些重复项?

如何在不使用 JCL 中的 XSUM 的情况下从输入文件中删除重复项并将重复项写入文件? [关闭]