使用数据流进行图像预处理

时间:2018-11-20 15:12:01

标签: python image-processing google-cloud-dataflow apache-beam

任务:我要运行一个ETL作业,该作业将从GCS中提取TIFF图像,并使用OpenCV + Tesseract等开源计算机视觉工具将这些图像转换为文本,并最终加载数据导入BigQuery

问题:我试图使用Dataflow来执行ETL作业,因为我有数百万个图像(每个图像是一个单独的文件/ blob),并且想要扩展到数百台计算机。但是,我在使用Dataflow时遇到了一些问题,有关如何下载图像的最佳方法将在下面进行详细介绍。

问题:最终,我试图确定:

1)数据流是做到这一点的最佳解决方案吗?我考虑过的替代方法是在大型计算机上运行多线程作业。我还应该考虑其他选择吗?

2)如果数据流是最好的解决方案,那么我应该如何专门处理下载数百万个图像(以便可以通过转换来运行它们)?

技术挑战:

以下帖子Recommended solution建议在DoFn中使用beam.io.gcp.gcsio.GcsIO().open(filepath, 'r')从GCS下载图像。
我尝试使用beam.io.gcp.gcsio.GcsIO().open(filepath, 'r')走这条路,但是,打开图像时遇到问题。此处描述了该问题:IO.BufferReader issue

使用DirectRunner时,我可以使用此客户端api from google.cloud import storage下载图像文件,并且可以打开和预处理图像。但是,在使用数据流运行器时,我遇到了依赖问题,AttributeError: 'module' object has no attribute 'storage'

话虽这么说,如果Dataflow是最佳解决方案,那么下载和处理数百万张图像的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

您在做正确的思考。看来您遇到了两个问题:

  • 对于package-lock.json问题,您需要添加一个接口,以便您正确找到in the question后即可进入Tiff文件。

  • 似乎使用io.BufferedReader的问题在于在Dataflow环境中不存在依赖项。要添加此依赖性,请查看Beam文档中的Managing Python pipeline dependencies

主要思想是,您可以使用传入的google.cloud.storage文件来运行管道,列出要添加的所有其他依赖项。