如何对图像进行无损压缩,以便存储它们以训练 CNN?

人工智能 深度学习 强化学习 卷积神经网络 张量流 麻木的
2021-10-20 11:19:25

我有一组图像,它们的尺寸非常大(1000x1000),因此不容易放入内存。我想压缩这些图像,这样几乎没有信息丢失。我希望将 CNN 用于强化学习任务,该任务涉及许多非常小的对象,这些对象在下采样时可能会消失。在不缩小/缩小图像并丢失 CNN 信息的情况下处理此问题的最佳方法是什么?

2个回答

您的输入图像大小和内存没有直接关系。在使用 CNN 时,有多个超参数会影响视频内存(如果您使用 GPU)或物理内存(如果您使用 CPU)。现在的所有框架都使用简化的数据加载器,例如在 Tensorflow 或 PyTorch 中,您需要编写一个数据加载器,它接受下面提到的多个超参数并将数据放入 VRAM/RAM 中,而这严格取决于您的批量大小 - VRAM 上占用的内存与批量大小直接相关。

无论您的图像大小如何,当您编写数据加载器时,您必须向数据加载器提及转换参数,在训练阶段,数据加载器会根据您的批量大小自动将所需图像加载到您的内存中提到过。正如您提到的图像压缩,这至少对于大多数通用用例来说是一个不相关的参数,最相关的超参数是

  1. 缩放
  2. 裁剪
  3. 随机翻转
  4. RGB 值的归一化
  5. 颜色抖动
  6. 填充
  7. 随机仿射

还有很多。

PyTorch 在数据加载器中提供了非常好的转换器,请检查https://pytorch.org/docs/stable/torchvision/transforms.html

对于 Tensorflow,请查看https://keras.io/preprocessing/image/

Tensorflow-Keras 提供了一个有效的数据转换器和加载器。文档位于 https://keras.io/preprocessing/image/. ImageDataGenerator 提供了多种可能的转换类型,并且还支持使用用户定义的预处理函数。ImageDataGenerator.flow_from_directory 的使用提供了一种从包含图像子目录(类)的目录中批量检索图像的方法。并调整图像大小。图像大小会影响结果。通常,图像越大,结果越好,但这受收益递减规律的影响(在某些时候,对准确性的影响变得微乎其微),而训练时间可能会变得很容易吸收。当你有像 1000 X 1000 这样的大图像时,图像中感兴趣的主题很小,比如 50 X 50,最好但最痛苦的方法是将图像裁剪为感兴趣的主题。不幸的是,这通常是一项耗时的苦差事,除非您能找到一些可以自动裁剪图像的程序。例如,有一些很好的程序可以自动裁剪人的图像,而裁剪后的图像主要是人脸。或者,像 cv2 这样的模块可以适应为某些图像提供这种能力。您选择的 batch_size 以及图像大小直接影响内存使用情况。如果您的图像很大并且您的 batch_size 太大,您将遇到“资源耗尽”错误。您可以减小批量大小,但这会延长训练时间。其他处理大图像的技术包括滑动窗口等方法。同样,这些将增加训练时间,因为您正在拍摄一张大图像并将其分解为一系列较小的图像,然后输入到网络中。我遵循的一般但可能有风险的规则是,如果我可以在调整大小的图像中明显看到感兴趣的主题,那么我假设网络也能够检测到它。可能不如使用完整图像准确,但应该像我们工程师所说的“足够好”