使用hadoop处理图像

时间:2014-04-14 10:23:48

标签: image-processing hadoop mapreduce hdfs hadoop-streaming

我是hadoop的新手,我将开发一个应用程序,使用hadoop处理多个图像并向用户显示实时结果,同时计算正在进行中。基本方法是分发可执行文件和一堆图像并收集结果。

我可以在计算过程中以交互方式获得结果吗?

对于这种用例,还有除hadoop流媒体之外的其他选择吗?

如何通过图片提供可执行文件?除了用stdin喂它之外,我找不到任何其他例子。

3 个答案:

答案 0 :(得分:2)

为了处理Hadoop上的图像,组织计算的最佳方法是:

  1. 将图像存储在序列文件中。键 - 图像名称或其ID,值 - 图像二进制数据。这样,您将拥有一个包含您需要处理的所有图像的文件。如果您有动态添加到系统的图像,请考虑在每日序列文件中聚合它们。我不认为您应该对此序列文件使用任何压缩,因为通用压缩算法不适用于图像
  2. 处理图像。在这里,您有多种选择可供选择。首先是使用Hadoop MapReduce并使用Java编写Java程序,您将能够读取序列文件,并在每个映射步骤中直接从中获取“值”,其中“值”是二进制文件数据。鉴于此,您可以运行任何处理逻辑。第二个选项是Hadoop Streaming。它有一个限制,即所有数据都转到应用程序的stdin,结果从stdout读取。但是你可以通过在Java中编写自己的InputFormat来解决这个问题,它将序列文件中的图像二进制数据序列化为Base64字符串并将其传递给通用应用程序。第三种选择是使用Spark来处理这些数据,但你再次受限于编程语言选择:Scala,Java或Python。
  3. 开发Hadoop是为了简化对大量数据的批处理。 Spark本质上是相似的 - 它是一个批处理工具。这意味着在处理完所有数据之前,您无法获得任何结果。 Spark Streaming是一个不同的案例 - 你可以使用1-10秒的微批处理,并分别处理它们,所以通常你可以使它适用于你的情况。
  4. 我不知道你的完整案例,但一种可能的解决方案是使用Kafka + Spark Streaming。您的应用程序应将图像以二进制格式放入Kafka队列,而Spark将在群集上以微批量消费和处理它们,通过某些第三个组件更新用户(至少将图像处理状态放入Kafka以用于另一个应用程序)处理它)

    但总的来说,您提供的信息并不完整,无法为您的具体案例推荐一个好的架构

答案 1 :(得分:0)

正如0x0FFF在另一个答案中所说,问题没有提供足够的细节来推荐一个合适的架构。虽然这个问题已经很久了,但我只是在研究中加入了我在这个主题上所做的研究,以便它可以帮助任何人进行研究。

Spark是在分布式系统上进行处理的好方法。但它并没有一个强大的社区致力于OpenCV。 Storm是另一个Apache的免费开源分布式实时计算系统。 Storm可以轻松可靠地处理无限数据流,实现Hadoop为批处理所做的实时处理。

StormCV是Apache Storm的扩展,专门用于支持分布式计算机视觉管道的开发。 StormCV通过添加计算机视觉(CV)特定操作和数据模型,可以将Storm用于视频处理。该平台使用Open CV进行大多数CV操作,并且将此库用于其他功能相对容易。

有一些使用OpenCV风暴的例子。他们的官方git中心页面上有一些例子。您可能希望查看此人脸检测示例并尝试进行人体检测 - https://github.com/sensorstorm/StormCV/blob/master/stormcv-examples/src/nl/tno/stormcv/example/E2_FacedetectionTopology.java

答案 2 :(得分:0)

您实际上可以使用Hadoop Storm框架创建自定义逻辑。您可以轻松集成某些特定计算机视觉库的任何功能,并将其分配到此框架的各个部分。除了Storm有一个很好的扩展名为DRPC服务器,它允许你将你的逻辑用作简单的RPC调用。您可以在我的文章Consuming OpenCV through Hadoop Storm DRPC Server from .NET

中找到一个简单的示例,说明如何通过Storm使用OpenCV人脸检测来处理视频文件