передача набора изображений в качестве входных данных для mapreduce - PullRequest
0 голосов
/ 12 января 2012

У меня есть система, где я получаю изображения (JPG) из какого-то модуля.Я получаю изображения для 10 объектов (1000 изображений для одного объекта) за один раз (всего 10000 изображений за один раз).Мне нужно немного обработать эти изображения с помощью кластера Hadoop.

Мне интересно, как мне поступить в этом направлении.Как то, как я должен формировать вход.Я хотел бы обработать один объект (и его изображения = 1000) полностью в одном картографе или редукторе.Например: первый объект в первом преобразователе, второй объект во втором преобразователе и т. Д.

Некоторые из подходов, которые приходят мне в голову: 1. Для каждого объекта создайте каталог и поместите в него все его изображения.Затем tar сожмите каталог, и это будет одним входом для одного преобразователя.

  1. Сделайте то же самое, что упомянуто выше, но просто скопируйте файл (не сжимайте).Реализуйте интерфейс InputFormat и сделайте так, чтобы isSplittable () возвращало false.

  2. Создание файла последовательности для каждого объекта.Sequensfile будет содержать пару ключ-значение для каждого изображения объекта.Здесь я не уверен, как сказать MapReduce передать файл последовательности одному мапперу.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2017

ОБРАБОТКА ИЗОБРАЖЕНИЙ В HADOOP С ИСПОЛЬЗОВАНИЕМ MAPREDUCE Hipi:

Hipi - это интерфейс обработки изображений Hadoop. Это обеспечивает набор инструментов и Inputformat для обработки большого количества изображений с использованием Hadoops Distributes File System (HDFS) и Mapreduce.

УЧАСТКИ ШАГИ:

В хипи весь процесс можно разделить на 2 части.

1) Преобразование всех изображений в общий файл (HIPI Image Bundle).

2) Обработка созданного объемного файла изображения с использованием форматов ввода изображений HIPI. Отбор (класс обрезки) используется для фильтрации изображений с низкой четкостью или дефектами

ВОПРОСЫ С ХИПИ:

Чтобы смоделировать сценарий массовой обработки изображений, я использовал Java-программу для создания нескольких копий одного и того же изображения с разными именами в одном каталоге. затем с помощью утилиты HIPI я преобразовал все изображения в общий файл (известный как HIP-файл в HIPI).

Чтобы проверить, все ли изображения присутствуют в массовом файле, я сделал обратный процесс (преобразовал файл HIP в несколько изображений). Есть также другая утилита, которая делает то же самое. Но я не вернул все изображения и обнаружил, что с помощью HIPI я теряю некоторые изображения.

Я не смог продолжить работу с моим POC, используя HIPI, и подумал о создании новой инфраструктуры для обработки объемных изображений с помощью mapreduce.

НОВАЯ РАМКА ОБРАБОТКИ ИЗОБРАЖЕНИЙ:

Чтобы избежать появления нескольких карт (каждая на файл), мы должны делать то же самое, что и HIPI, то есть конвертировать все изображения в один файл пакета.

Этот пакетный файл предоставляется в качестве входных данных для map-Reduce. Формат ввода изображения анализирует файл пакета и создает объект буферизованного изображения, соответствующий каждому изображению.

ФОРМАТ ВВОДА ИЗОБРАЖЕНИЯ-ВАЖНЫЕ КЛАССЫ:

Image Combiner:

Объединяет несколько изображений в один пакетный файл.

ImageInputFormat:

Возвращает ImageRecordRreader и управляет разбиениями

ImageRecordReader: Управляйте чтением каждого сплита. Выполните начальный поиск указателя файла на начало каждого разбиения. Метод nextKeyValue () считывает каждое изображение из разбиения и преобразует его в BufferedImage. BufferedImageWritable:

Так как классы значений ключа карты Reduce должны быть сериализуемым типом, доступным для записи, мы не можем сохранять BufferedImage непосредственно как значение в методе карты. Это класс-оболочка, который содержит в себе BufferedImage.

BufferedImageWritable { BufferedImage 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 (в режиме карты или уменьшения), вам, возможно, придется реализовать все эти методы. В write () вам может понадобиться написать логику для хранения изображения, как мы использовали для записи изображений при создании файла с массовыми данными. ReadFiled () должен содержать противоположную логику write (). Функция CompareTo () не нуждается в реализации, поскольку мы никогда не сохраняем это изображение в качестве ключа в map-Reduce (CompareTo () вызывается во время сортировки карты-Reduce).

Поскольку вы получаете изображение в виде BufferedImages (распространенного Java-класса для обработки изображений), большинство операций с ним легко выполнить. Но в случае HIPI изображение доступно в значении карты как класс FloatImage Hipi, и вы можете испытывать трудности при выполнении манипуляций поверх него.

Я успешно внедрил программу распознавания лиц, используя этот пользовательский формат ввода и OpenCV.

Код, который я использовал для разработки того же самого, скоро будет опубликован на GitHub

http://worldofbigdata -inaction.blogspot.in / 2017/02 / обработка-изображения-в-Hadoop-using.html

0 голосов
/ 12 января 2012

Здесь я не уверен, как сказать MapReduce, чтобы он передавал файл последовательности только одному мапперу.

FileInputFormat # isSplitable ваш друг здесь для всех файловформаты ввода.SequenceFileInputFormat расширяет FileInputFormat.

...