将一组图像作为输入传递给mapreduce



我有一个从某个模块获取图像(jpg)的系统。我一次得到10个对象的图像(单个对象1000个图像)(一次总共10000个图像)。我需要使用Hadoop集群对这些图像进行一些处理。

我不知道该怎么办。比如我应该如何形成输入。我想在一个映射器或还原器中完全处理一个对象(及其图像=1000)。例如:第一个映射器中的第一个对象,第二个映射器等中的第二个对象。

我想到的一些方法是:1.为每个对象创建一个目录,并将其所有图像放置在该目录中。然后tar,压缩目录,这将作为单个映射器的一个输入。

  1. 按照上面提到的方法做同样的事情,但只是对文件进行tar(不要压缩)。实现InputFormat接口并使"isSplitable()"返回false。

  2. 为每个对象创建sequencefile。Sequencesfile将为每个对象图像包含一个键值对。在这里,我不知道如何告诉MapReduce只给一个映射器一个sequencefile。

在这里,我不知道如何告诉MapReduce只给一个映射器一个sequencefile。

FileInputFormat#isSplitable是您所有文件输入格式的朋友。SequenceFileInputFormat扩展了FileInputFormat。

在HADOOP中使用MAPREDUCE处理图像HIPI:

Hipi是Hadoop图像处理接口。这提供了一组工具和Inputformat来使用Hadoops分布式文件系统(HDFS)和Mapreduce处理大量图像。

STPES参与:

在hipi中,整个过程可以分为两部分。

1) 将所有图像转换为大容量文件(HIPI图像捆绑包)。

2) 使用HIPI的图像输入格式处理创建的图像批量文件。剔除(剔除类)用于滤除清晰度低或有缺陷的图像

HIPI:的问题

为了模拟我的批量图像处理场景,我使用一个java程序在一个目录中创建具有不同名称的同一图像的多个副本。然后通过使用HIPI的实用程序,我将所有图像转换为一个大容量文件(在HIPI中称为HIP文件)。

为了检查批量文件中是否存在所有图像,我进行了相反的处理(将HIP文件转换为多个图像)。还有另一个实用程序可以做到这一点。但我并没有得到所有的图像,并发现使用HIPI我丢失了一些图像。

我无法使用HIPI继续我的POC,并考虑创建一个新的框架来使用mapreduce处理批量图像。

一种新的图像处理框架:

为了避免生成多个映射(每个文件都有),我们必须像HIPI一样,将所有图像转换为一个捆绑文件。

该捆绑文件作为映射reduce的输入。图像输入格式解析捆绑文件并创建与每个图像相对应的缓冲图像对象。

图像输入格式重要类:

图像组合器:

将多个图像合并到一个捆绑文件中。

图像输入格式:

返回ImageRecordRreader,并管理拆分

ImageRecordReader:管理阅读每个拆分。对指向每次拆分开始处的文件指针执行初始查找。nextKeyValue()方法从分割中读取每个Image并转换为BufferedImage。BufferedImageWritable:

由于map reduce的键值类应该是可写的可序列化类型,因此我们不能在map方法中直接将BufferedImage保留为值。这是一个包装类,它只包含BufferedImage

BufferedImageWritable{缓冲图像img;

         @Override
          public void readFields(DataInput arg0) throws IOException {
          }
         @Override
          public void write(DataOutput arg0) throws IOException {
          }
          @Override
           public int compareTo(byte[] o) {
                 return 0;
          }

}

没有实现readFiled()、write()、compareTo()方法,因为在我的场景中,我不想将图像存储回HDFS。

如果您想在HDFS(in map或reduce)中写回任何图像,您可能必须实现所有这些方法。在write()中,您可能需要编写存储图像的逻辑,就像我们在创建大容量文件时编写图像一样。readFiled()应该包含与write()相反的逻辑。compareTo()不需要实现,因为我们从不将此图像作为map reduce中的键(compareTo)是在map reduce的排序过程中调用的)。

由于您将图像作为BufferedImages(一个用于图像处理的通用java类)获取,因此很容易在其上轻松地执行大多数操作。但在HIPI的情况下,图像在map的值中可用作为HIPI的FloatImage类,您可能会觉得在其上执行操作很困难。

我已经使用这个自定义输入格式和OpenCV成功地实现了人脸检测程序。

我用来开发的代码很快就会在GitHub 上共享

http://worldofbigdata-inaction.blogspot.in/2017/02/processing-images-in-hadoop-using.html

相关内容

  • 没有找到相关文章

最新更新