【问题标题】:What is the best way to compress my data in lmdb在 lmdb 中压缩数据的最佳方法是什么
【发布时间】:2017-08-30 00:04:48
【问题描述】:

我有一个大型数据集,这使我的 lmdb 变得庞大。对于 16.000 个样本,我的数据库已经是 20 GB。但我总共有 800.000 张图像,最终会产生大量数据。有没有办法压缩lmdb?还是使用 HDF5 文件更好?我想知道是否有人知道这个问题的最佳解决方案。

【问题讨论】:

  • 你用caffe的convert_imageset转换图片了吗?如果是,您是否使用了--encoded 参数?
  • 不,我正在使用我自己的 python 代码来执行此操作,因为我必须更改和重塑我的数据。 @Inman
  • 您将如何以编程方式对文件进行编码?我所做的是:vtxn.put('{:0>10d}'.format(in_idx), datum.SerializeToString())。但我认为不可能“压缩” SerializeToString() 方法? @Inman
  • 我认为您不需要压缩SerializeToString()。相反,您需要将数据设置为 jpg/png 数据并设置编码标志。详情见io.cpp
  • @Inman 恕我直言,您应该写下您的最后一条评论作为答案,这样我就可以感谢您的帮助!我想这就是我一直在寻找的答案!

标签: compression caffe hdf5 lmdb bigdata


【解决方案1】:

如果您查看io.cpp 中的ReadImageToDatum 函数,它可以将图像保持为压缩(jpg/png)格式或原始格式。要使用压缩格式,您可以使用cv::imencode 压缩加载的图像。现在您只需将数据设置为压缩数据并设置encoded 标志。然后您可以将数据存储在lmdb

【讨论】:

  • datum->set_encoded(true);github.com/BVLC/caffe/blob/master/src/caffe/util/io.cpp#L133中使用
  • 另一个不错的选择是使用 hdf5 文件,因为可以压缩它们。您认为更好的解决方案是什么?因为无论如何我都有图像,所以我认为将我的数据存储为 hdf5 文件可能会更好。 @英曼
  • @thigi 这完全取决于您的配置。没有 lmdb 与 hdf5 的基准。如果数据预取适合您,那么您可以使用任何方便的格式。
【解决方案2】:

有多种技术可以减小输入大小,但其中大部分取决于您的应用程序。例如,ILSVRC-2012 数据集图像可以调整到大约 256x256 像素,而不会对训练时间或模型精度产生不良影响。这将数据集从 240Gb 减少到 40Gb。您的数据集是否会因简单的“物理”压缩而失去保真度?您必须拥有多小的数据集?

恐怕我对 HDF5 文件的处理还不够充分,无法得出明智的意见。

【讨论】:

  • 我希望它尽可能小,创建速度尽可能快。所以,我可能必须在这两者之间找到最好的权衡。我正在尝试在您可以设置压缩参数的那一刻创建 HDF5 文件。然而,显然压缩越好,创建数据集的计算时间就越长。我有自己的 png 格式的数据集。我需要将它们存储在 lmdb 或 hdf5 或 caffe 接受的任何其他东西中。但我不能使用原始图片本身,因为我必须先处理它们。将 4GB 的原始图像传输到 lmdb @Prune 时会产生 20GB
  • 您忽略了我的第一个问题,并用无法衡量的“最佳权衡”替换了第二个问题。这让我没有什么可补充的了。
  • 好吧,我的数据集已经被压缩了。问题是如何存储压缩的数据集。当我使用 lmdb 时,我之前压缩的数据集变得更大,因为 lmdb 不使用任何类型的压缩。因此,我对你的问题有点困惑。 @Prune
  • 我对你的有点困惑:“有没有办法压缩 lmdb?”如果您知道 LMDB 没有被压缩,但您的数据已经被压缩......那就是我们失去联系的地方。
  • 当然,您可以 tar & 压缩 LMDB 目录——但它对图像文件没有多大作用;我得到大约 8-10% 的压缩率。这就是为什么我问您是否需要无损压缩;只需缩小到标准尺寸即可节省大量空间和时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多