Dobry język do widzenia komputerowego?

28

Próbuję wdrożyć system pobierania obrazów oparty na treści, ale zanim to zrobię, chciałbym uzyskać przegląd niektórych języków programowania odpowiednich do tego zadania (posiadających dobrą bibliotekę i tym podobne).

Czy ktoś zna jakieś dobre języki i biblioteki do tego rodzaju zadań? Co z Pythonem lub Javą?

Najlepiej

jstr
źródło
Zakres jest projektem akademickim ;-) przepraszam, że tego nie powiedziałem!
jstr
1
Przez ~ 3 lata pracowałem w grupie ds. Wizji komputerowej przy uruchamianiu oprogramowania. Użyliśmy python + scipy / numpy do szybkiego prototypowania rzeczy oraz C ++ do kodu produkcyjnego. boost :: python otaperers for heavy C ++ pomógł w przenoszeniu. BLAS i LAPACK używane do ciężkich liczb.
wim
2
@ wim - Twój komentarz byłby świetną odpowiedzią, z nieco bardziej szczegółowymi informacjami na temat tego, dlaczego używałeś tych języków na różnych etapach rozwoju.
Mark Booth
1
Możesz użyć Matlab lub Octave do szybkiego prototypowania, a następnie przekonwertować na C ++ za pomocą zestawów narzędzi takich jak Armadillo (dla algebry liniowej) i MLPACK (dla uczenia maszynowego i rozpoznawania wzorców). Armadillo używa BLAS i LAPACK wewnętrznie (tak samo jak Matlab). Możesz także łączyć kod Matlab / Octave z kodem C ++ za pomocą interfejsu mex Armadillo.
mtall

Odpowiedzi:

35

Być może możesz bardziej szczegółowo określić zakres i skalę swojej pracy (projekt akademicki? Produkt komercyjny na komputery stacjonarne lub urządzenia mobilne? Projekt komercyjny oparty na Internecie?).

Niektóre rekomendacje i komentarze:

  • Matlab jest powszechny w świecie akademickim i całkiem dobry do szkicowania / sprawdzania poprawności pomysłów. Będziesz miał dostęp do dużej części kodu od innych badaczy (w CV i uczeniu maszynowym); prototypowanie i debugowanie będzie bardzo szybkie i łatwe, ale wszystko, co opracujesz w tym środowisku, będzie trudne do wprowadzenia do produkcji. W zależności od tego, co robi Twój kod, możesz mieć problemy z pamięcią / wydajnością (są sytuacje, w których nie możesz opisać tego, co chcesz zrobić w odniesieniu do prymitywów Matlaba i musisz zacząć zapętlać piksele, a Matlab jest językiem interpretowanym pomoc w tym kontekście). Interakcja z bazami danych, serwerami internetowymi itp. Nie jest łatwa, a czasem niemożliwa (nie dostaniesz programu Matlab, który mógłby zostać serwerem Thrift wywoływanym przez interfejs WWW). Kosztuje $$$.

  • C ++ jest używany w wielu systemach CV klasy produkcyjnej (wymyśl coś na skalę wyszukiwania obrazów Google lub Streetview lub wielu komercyjnych aplikacji do robotyki). Dobre biblioteki, takie jak OpenCV, doskonała wydajność, łatwe do wdrożenia w środowisku produkcyjnym. Jeśli potrzebujesz uczenia maszynowego, istnieje wiele bibliotek (LibSVM / SVMlight, Torch). Jeśli musisz skorzystać z kodu „zapętlaj wszystkie piksele”, będzie on działał dobrze. Łatwy w użyciu do kodowania systemów / warstw pamięci potrzebnych w systemie wyszukiwania na dużą skalę (np .: bardzo duża mapa hash na dysku do przechowywania odwróconych skrótów funkcji mapowania obrazów na obrazach). Rzeczy takie jak Thrift / Message Pack mogą zmienić Twój program do pobierania w serwer RPC, który można wywołać z poziomu interfejsu WWW. Jednak: niezbyt zwinny do prototypowania, dość okropny do testowania nowych pomysłów, wolniejszy czas rozwoju; i przekazanie w ręce niedoświadczonych programistów może mieć trudności ze śledzeniem wydajności i / lub problemami z niestabilnością.

  • Python jest w jakiś sposób pośrednikiem między nimi. Możesz go używać do obliczeń numerycznych w stylu Matlaba (z numpy i scipy) + mieć powiązania z bibliotekami takimi jak OpenCV. Możesz z nim robić systemy / struktury danych i uzyskać akceptowalną wydajność. Istnieje wiele pakietów uczenia maszynowego, choć mniej niż w Matlab lub C ++. O ile nie musisz używać kodu „zapętlaj wszystkie piksele”, będziesz w stanie kodować prawie wszystko, co mogłeś zrobić w C ++ ze współczynnikiem wydajności 1: 1,5 do 1: 3 i współczynnikiem 2: 1 do 10: 1 rozmiaru kodu źródłowego (dyskusyjny). Ale w zależności od powodzenia twojego projektu będzie moment, w którym wydajność będzie stanowić problem, a podczas przepisywania do C ++ nie będzie opcji.

fenenety
źródło
4
Ponadto Matlab ma bardzo silną dokumentację, w przeciwieństwie do Pythona.
Andrey Rubshtein
1
Co z C? To mój podstawowy język w razie wątpliwości.
Zetta Suro,
10

Zwłaszcza, że ​​twój projekt ma charakter akademicki, Mathematica to bardzo dobry i odpowiedni system oprogramowania. Mathematica 8 zawiera kompleksowy zestaw funkcji do przetwarzania obrazu, algebry liniowej, liczb, GPU itp. Jest to również system symboliczny, więc wiele razy mogę uzyskać rozwiązania w postaci zamkniętej dla równań --- całkiem przydatne do zadań z zakresu widzenia komputerowego. Mathematica może także komunikować się z kodem Python, C, C ++, Java, .NET, ....

Matthias Odisio
źródło
5

Jeśli jest to projekt akademicki, zdecydowanie powinieneś użyć Matlaba, a dokładniej Zestawu narzędzi do przetwarzania obrazu i Zestawu narzędzi systemu wizyjnego. Przetwarzanie i ocena algorytmów w Matlabie zajmie Ci rząd wielkości mniej czasu niż w C ++.

Nawet z interfejsem Python OpenCV jest znacznie trudniejszy w użyciu niż Matlab, a jeśli naprawdę musisz, możesz wywołać kod C lub C ++ z Matlaba przez mex.

Dima
źródło
4

Do systemu pobierania obrazów. Miałbyś kod po stronie klienta i serwera. Strona serwera może być w języku Python lub C / C ++. OpenCV jest tutaj najlepszym wyborem. Ma zarówno interfejsy Python, jak i C ++. Po stronie klienta myślę, że lepiej jest korzystać z Java.

nav
źródło
3

Najlepszym językiem do wizji komputerowej jest C ++. Chociaż jego główną wadą jest to, że trudniej jest osiągnąć to, czego chcesz. OpenCV jest najlepszą biblioteką do wizji komputerowej, ale możesz robić to samo, używając Matlaba lub Pythona.

Spójrz tutaj .

omg_img
źródło