随机裁剪数据增强卷积神经网络

2024-04-25 23:39:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在训练一个卷积神经网络,但数据集相对较小。所以我正在实现技术来增强它。现在这是我第一次研究一个核心的计算机视觉问题,所以我对它还比较陌生。为了增强,我读了很多技巧,其中一个在论文中被提到的是随机裁剪。现在我正在尝试实现它,我已经搜索了很多关于这项技术的内容,但是找不到合适的解释。所以有几个问题:

随机裁剪实际上是如何帮助数据增长的?python中是否有隐式实现随机裁剪的库(例如OpenCV、PIL、scikit image、scipy)?如果没有,我应该如何实施?


Tags: 数据image内容核心技巧pil计算机神经网络
2条回答

要回答“如何实现裁剪”问题,您可能需要探索https://github.com/aleju/imgaug。有一个Crop增强程序可以让您进行随机裁剪。还有很多其他有趣的增强器。

在我看来,随机裁剪有助于数据增长的原因是,在保留图像语义的同时(除非您选择了一个非常糟糕的裁剪,但我们假设您设置了随机裁剪,以便这是非常低的概率),您在conv网中获得的激活值是不同的。因此,实际上我们的conv网络学习将更广泛的空间激活统计信息与某个类标签相关联,因此通过随机裁剪进行数据增强有助于提高我们的特征检测器在conv网络中的鲁棒性。同样地,随机裁剪会产生不同的中间激活值,并产生不同的前向传递,因此它就像一个“新的训练点”

这也不是小事。看看最近关于神经网络中的对抗性例子的研究(相对于AlexNet的大小来说比较浅)。当我们通过一个顶部带有softmax分类器的神经网络时,从语义上看大致相同的图像,我们可以得到完全不同的类概率。因此,从语义的角度来看,细微的变化最终会使不同的转发通过conv网。有关详细信息,请参见Intriguing properties of neural networks

为了回答你问题的最后一部分:我通常只做我自己的随机裁剪脚本。假设我的图像是(3256256)(3个RGB通道,256x256空间大小),你可以通过随机选择一个有效的角点来编码一个循环,这个循环将对你的图像进行224x224次随机裁剪。所以我通常会计算一个有效的角点数组,如果我想随机抽取10个角点,我会从这个集合中随机抽取10个不同的角点,比如我选择(x0,y0)作为我的左上角点,我会选择裁剪X[x0:x0+224,y0:y0+224],就像这样。我个人喜欢从一组预先计算好的有效角点中随机选择,而不是一次随机选择一个角点,因为这样我保证不会得到重复的作物,尽管在现实中,这可能是低概率的。

相关问题 更多 >