【问题标题】:How to convert lmdb file to PySpark Image DataFrame?如何将 lmdb 文件转换为 PySpark Image DataFrame?
【发布时间】:2022-02-13 18:48:16
【问题描述】:

我有一个 lmdb 文件,其值包含二进制字符串格式的 jpeg 图像数据。我想将所有图像保存到一个文件夹并创建一个 PySpark DataFrame 来进行我的分析。我这样做是因为我想使用这些数据在 TensorFlow 上训练一个 Mask RCNN 模型。

我有两个问题:

  • 这是个好主意吗? (我正在考虑这样做,因为这样我就可以进行分布式训练和推理。)
  • 我该怎么做?

我可以实现这一点的一种方法:将图像一张一张地保存到一个文件夹中,然后将该文件夹作为 PySpark Image DataFrame 读取。

import io
from PIL import Image

for key, value in lmdb_data:
    with io.BytesIO(value ) as f:
        image = Image.open(f)
        # The image is of class JpegImageFile 
        image.load()
        image.save(f"/tmp/lmdb_images/{key}.{image.format.lower()}")

df = spark.read.format("image").load("/tmp/lmdb_images/")
df.display()  

还有其他更高效/优雅的方法吗?

【问题讨论】:

    标签: python pyspark python-imaging-library databricks lmdb


    【解决方案1】:

    我只能评论 PIL 方面的事情,因为我不使用 PySpark

    如果您的 lmbd 数据已经是 JPEG 编码的图像,则将其解码为 PIL Image 然后将其重新编码回 JPEG 以将其保存到磁盘是没有意义的。您不妨将已经拥有的 JPEG 写入磁盘。未经测试,但它看起来像:

    for key, value in lmdb_data:
        with open(f"/tmp/...", "wb") as f:
           f.write(value)
    

    【讨论】:

    • 将 lmdb 数据转换为图像文件是个好主意吗?这太花时间了。提取约 400k 图像需要 11 个小时。您能否分享一些关于如何考虑这些决定的见解。
    • 对不起,我不是问这个问题的人,现在你提到有 400,000 张图像,这与你原来的问题有些不同。我想您可以使用ThreadPoolExecutor 将图像列表映射到线程,但这可能需要您的磁盘子系统非常高效。我认为您最好提出一个新问题并提及图像的数量和您的顾虑。
    猜你喜欢
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多