2014-04-14 24 views
6

Jestem nowy w hadoop i mam zamiar opracować aplikację, która przetwarza wiele obrazów za pomocą hadoop i pokazuje użytkownikom wyniki na żywo, podczas gdy obliczenia są w toku. Podstawowym podejściem jest rozprowadzanie plików wykonywalnych i wiązek obrazów oraz gromadzenie wyników.Przetwarzanie obrazów za pomocą hadoopu

Czy mogę uzyskać interaktywne wyniki podczas trwania procesu obliczeniowego?

Czy są jakieś inne alternatywy niż transmisje z mrożonego mleka, w takim przypadku użycia?

Jak mogę przekazać pliki wykonywalne z obrazami? Nie mogę znaleźć żadnych innych przykładów niż karmienie go stdin.

+0

Strumieniowanie w Hadoop (aka MR) ma naturę wsadową. Musisz szukać struktur, które mogą przetwarzać dane w czasie rzeczywistym (np. Storm/Samza/Spark) i mogą również obsługiwać przetwarzanie danych binarnych. –

Odpowiedz

2

do przetwarzania obrazów na Hadoop najlepszy sposób zorganizować obliczenia byłyby:

  1. obrazy są przechowywane w pliku sekwencji. Key - nazwa obrazu lub jego ID, Value - image dane binarne. W ten sposób otrzymasz pojedynczy plik ze wszystkimi obrazami, które musisz przetworzyć. Jeśli masz dynamicznie dodawane obrazy do swojego systemu, rozważ agregowanie ich w plikach z codziennymi sekwencjami. Nie sądzę, że powinieneś użyć dowolnej kompresji dla tego pliku sekwencji, ponieważ ogólne algorytmy kompresji nie działają dobrze z obrazami. Przetwarzaj obrazy. Tutaj masz wiele opcji do wyboru. Najpierw należy użyć Hadoop MapReduce i napisać program w Javie, tak jak w Javie, można odczytać plik sekwencji i bezpośrednio uzyskać "wartość" z niego na każdym kroku mapy, gdzie "wartość" jest danymi pliku binarnego. Biorąc to pod uwagę, możesz uruchomić dowolną logikę przetwarzania. Druga opcja to Hadoop Streaming. Ogranicza to, że wszystkie dane trafiają na standardowe wejście aplikacji, a wynik jest odczytywany ze standardowego wyjścia. Ale możesz to przezwyciężyć, pisząc własny InputFormat w Javie, który serializuje dane binarne obrazu z pliku sekwencji jako ciąg Base64 i przekazuje go do twojej ogólnej aplikacji. Trzecią opcją byłoby użycie Sparka do przetwarzania tych danych, ale znowu jesteś ograniczony w wybranych językach programowania: Scala, Java lub Python.
  2. Hadoop został opracowany w celu uproszczenia przetwarzania wsadowego w dużej ilości danych. Spark jest niezbędny - jest to narzędzie wsadowe. Oznacza to, że nie można uzyskać żadnego wyniku przed przetworzeniem wszystkich danych. Spark Streaming to trochę inny przypadek - pracujesz z mikro-partiami od 1 do 10 sekund i przetwarzasz każdą z nich osobno, więc ogólnie możesz sprawić, żeby działała w twoim przypadku.

Nie znam całego twojego przypadku, ale jednym z możliwych rozwiązań jest użycie Kafka + Spark Streaming. Twoja aplikacja powinna umieścić obrazy w formacie binarnym w kolejce Kafka, podczas gdy Spark będzie je przetwarzał i przetwarzał w mikropartiach w klastrze, aktualizując użytkowników za pomocą jakiegoś trzeciego komponentu (przynajmniej umieszczając status przetwarzania obrazu w Kafce dla innej aplikacji aby go przetworzyć)

Ale w ogóle, przez Ciebie informacje nie są kompletne polecić dobrą architekturę dla konkretnego przypadku

0

Jak 0x0FFF mówi w innym odpowiedź na pytanie nie przewidzianych wystarczającą ilość informacji, aby polecić odpowiednią architekturę . Chociaż to pytanie jest stare, właśnie dodałem swoje badania, które zrobiłem na ten temat, aby pomóc każdemu w ich badaniach.

Spark to świetny sposób na przetwarzanie w systemach rozproszonych. Ale nie ma silnej społeczności pracującej nad OpenCV. Storm to kolejny darmowy i open source rozproszony system obliczeń w czasie rzeczywistym. Storm ułatwia niezawodne przetwarzanie nieograniczonych strumieni danych, wykonując w czasie rzeczywistym przetwarzanie, które Hadoop wykonał dla przetwarzania wsadowego.

StormCV to rozszerzenie Apache Storm zaprojektowane specjalnie w celu wspierania rozwoju rozproszonych rurociągów komputerowo-wzrokowych. StormCV umożliwia wykorzystanie Storm do przetwarzania wideo poprzez dodanie specyficznych operacji komputerowych (CV) i modelu danych. Platforma wykorzystuje otwarte CV do większości operacji CV i stosunkowo łatwo jest używać tej biblioteki do innych funkcji.

Istnieje kilka przykładów wykorzystania burzy z OpenCV. Istnieją przykłady na ich oficjalnej stronie git hub. Możesz rzucić okiem na ten przykład wykrywania twarzy i spróbować wykonać wykrywanie przez człowieka - https://github.com/sensorstorm/StormCV/blob/master/stormcv-examples/src/nl/tno/stormcv/example/E2_FacedetectionTopology.java.

0

Można faktycznie utworzyć niestandardową logikę przy użyciu frameworka Hadoop Storm. Możesz łatwo zintegrować dowolną funkcjonalność jakiejś konkretnej biblioteki Computer Vision i rozprowadzić ją przez rygle tego frameworka. Poza tym Storm ma świetne rozszerzenie zwane serwerem DRPC, które pozwala na używanie logiki jako prostych wywołań RPC. Prosty przykład tego, jak można przetwarzać pliki wideo za pomocą Storma przy użyciu wykrywania twarzy OpenCV w moim artykule Consuming OpenCV through Hadoop Storm DRPC Server from .NET