Skocz do zawartości
Elvis

Jak tanio rozpocząć przygodę z komputerowym rozpoznawaniem obrazu

Pomocna odpowiedź

Niedawno w moje ręce wpadł moduł OpenMV, który opisałem na forum w artykule: https://forbot.pl/blog/artykuly/recenzje/openmv-przetwarzanie-obrazu-na-stm32-id20572. Sam pomysł moim zdaniem jest świetny – opracowanie niewielkiego modułu, który pozwoli na łatwe i przyjemne rozpoczęcie zabawy z Computer Vision. Niestety OpenMV obaczone jest kilkoma wadami. Pierwsza to zaporowa wręcz cena (mnie płytka kosztowała około 500zł), druga wada to wybór zbyt słabego mikrokontrolera i za mało pamięci. W dyskusji która wywiązała się po opublikowaniu artykułu pojawiło się sporo opinii – między innymi taka, że podobny efekt można byłoby uzyskać taniej i być może lepiej. Postanowiłem to sprawdzić i zbudować podobne rozwiązanie, ale w oparciu o dostępne w sprzedaży moduły.

Wybór platformy

Moduł główny

Moim zdaniem STM32 jest o wiele za słaby do zadań takich jak przetwarzanie obrazu. Idealną platformą byłoby wykorzystanie układów Nvidii, np. Jetson TX2 ( https://www.forbot.pl/forum/topics73/nvidia-jetson-tx2-pierwsze-kilka-pierwszych-czynnosci-vt14277.htm?highlight=tx2 ), jednak jego cena jest nieco zaporowa. Postanowiłem więc wybrać jeden z najtańszych dostępnych modułów wyposażonych w mikroprocesor Cortex-A. Mój wybór padł na płytke Orange Pi Zero http://www.orangepi.org/orangepizero/ – jest dostępna w sklepie Kamami, cena brutto wynosi aktualnie 59,90 zł ( https://kamami.pl/komputery-orange-pi/563156-orange-pi-zero-256mb-ram-quad-core-h2.html?search_query=orange+pi+zero&results=5 ).

Parametry płytki:

• Procesor H2 ARM Cortex-A7, 4 rdzenie, taktowanie do 1.2GHz

• pamięć 256MB (dostępna jest nieco droższa wersja z 512MB)

• złącze USB oraz microUSB do zasilania

• gniazdo Ethernet

• gniazdo kart micro-SD

• moduł WiFi

Ponieważ wcześniej testowałem Nano-Pi i największą wadą układu było jego przegrzewanie, postanowiłem od razu kupić radiator – w cenie ok. 5zł.

Sam moduł nie wystarczy, konieczne było więc dołożenie kilku elementów. Przyznam, że wybierałem to co miałem „pod ręką”, więc większość można zastąpić tańszymi.

Karta pamięci

Tutaj wbrew pozorom kluczowa nie jest jej pojemność, ale prędkość. Najpierw próbowałem używać starej wysłużonej karty class 4, ale praca była wtedy koszmarem. Po zmianie na SanDisk Ultra 16GB (zapis do 80MB/s) wszystko zaczęło działać dużo szybciej. Wniosek – warto zainwestować w szybszą kartę, w końcu zawsze się do czegoś przyda. Inna sprawa, że koszt takiej karty to ok. 35zł, więc raczej nie tak dużo.

Kamera

Jestem wielkim miłośnikiem kamer dedykowanych (np. do Raspberry Pi, czy Banana Pi), niestety Orange Pi nie ma złącza kamery, zostaje więc użyć kamerki internetowej podłączanej do USB. Zaleta jest taka, że dostępne są bardzo tanie urządzenia (ceny zaczynają się od 15zł), ja wziąłem kamerkę która była pod ręką – Logitech C270.

Drobiazgi

Do kompletu potrzebne jest jeszcze kilka elementów. Konwerter USB-UART nie jest niezbędny, ale bardzo ułatwia uruchomienie modułu. O radiatorze już wspominałem, moim zdaniem nie należy na nim oszczędzać. Do tego przydadzą się jeszcze kabelki – USB oraz ethernet, wygodnie jest też mieć oddzielny zasilacz (wykorzystałem ładowarkę od smartfona).

Kosztorys

Większość elementów miałem już kupione, ale postanowiłem zrobić małe zestawienie kosztów. Wyszło ono następująco:

• Orange Pi Zero 256MB – 60 zł

• Kamera C270 – 90 zł

• Karta microSD – 35 zł

• Radiator – 5 zł

• Konwerter USB-UART – 30 zł

Razem: 220 zł

Wbrew pozorom jest to nadal droga konfiguracja. Szukając tańszych elementów, można byłoby się zmieścić w ok. 120 zł (tańsza kamera, konwerter i karta SD).

Nawet doliczając koszty przesyłki i jakiś niezbędny zapas, wydaje mi się że 150 zł (lub 250 zł w mojej konfiguracji) to koszt całego przedsięwzięcia. Porównanie z OpenMV wychodzi raczej na korzyść Orange Pi.

Oprogramowanie

W przypadku Orange Pi nie musimy właściwie nic pisać sami, mamy przecież Linux-a. Dostępne są różne dystrybucje, ale jak to zwykle z dalekowschodnimi producentami bywa pobranie systemu nie jest zbyt łatwe. Wybrałem więc inne rozwiązanie – zamiast polegać na producencie, można wykorzystac dystrybucję tworzoną niezależnie, np. Armbian ( https://www.armbian.com/orange-pi-zero/ ). Ostatnio mam coraz większy uraz do Ubuntu, więc pobrałem obraz Debian-a. Jest przygotowany dla Orange Pi Zero, więc wystarczy pobrać i nagrać na kartę.

Podłączamy konsolę przez konwerter USB-UART oraz umieszamy przygotowaną kartę SD w gnieździe modułu i uruchamiamy. Pierwszy start zajmuje parę chwil, musimy skonfigurować sieć, ale później wszystko po prostu działa.

Sieć

Na początek chciałem wykorzystać moduł WiFi. Niestety, możliwe że z powodu problemów z moją siecią, w każdym razie okazało się że wprawdzie działa, ale ma straszne opóźnienia. Stąd był mój wpis o kablu ethernetowym – jednak tradycyjne metody czasem sprawdzają się najlepiej. Mam teraz działające wifi, ale do programowania używam ethernetu. To jednak dużo szybsze rozwiązanie.

OpenCV

Armbian wspiera pakiety programów jak na porzadnego Debiana przystało. Możemy więc bez problemu zainstalować OpenCV, a do tego pełnego Python-a. Jedyny problem to brak ekranu. Postanowiłem więc przygotować coś na wzór OpenMV - obraz pobieram z kamery wykorzystując OpenCV, następnie przetwarzam, a wynik wysyłam starym dobrym protokołem TCP na komputer. Tutaj można obraz zapisać, albo wyświetlić podgląd.

Wbrew pozorom napisanie odpowiedniego skryptu nie jest tak trudne jak się wydaje. Biblioteki Python-a są ogromnym ułatwieniem, a chociaż nie uważam się za zaawansowanego programistę w tym języku, „działające” rozwiązanie napisałem w kilka chwil.

Uruchomienie

Na Orange Pi możemy pracować używając ssh lub portu szeregowego. Pewnie wiele innych opcji byłoby równie wygodnych (albo i wygodniejszych), ja na szybko uruchomiłem kilka sesji ssh, a na PC-cie serwer odbierający podgląd ekranu.

Teraz można pisać programy do przetwarzania obrazu.

Przetwarzanie obrazu

Miałem bardzo mało czasu, który mogłem poświęcić na ten projekt, więc na szybko wykorzystałem przykłady dostępne w sieci – wujek google podpowie jak z wykorzystywaniem OpenCV wyczarować prawdziwe cuda.

Pierwszy test to wykrywanie ruchu. Program jest prosty, dla porównania z OpenMV używam rozdzielczości 320x240. Wychodzi na to, że przetwarzanie takiego obrazu zajmuje ok. 20 ms. Co więcej wykorzystywany jest raptem jeden rdzeń. Mamy więc całkiem spory zapas mocy.

A jak to działa? Moim zdaniem całkiem fajnie 🙂

Podsumowanie

Do rozpoczęcia przygody z OpenCV wystarczy nam tylko komputer PC, jednak jeśli chcemy i lubimy rozwiązania wbudowane to do prostych zadań wystarczy nam relatywnie prosty moduł. Cena takiej opcji jest raczej niska, a jej największa wada to apetyt na prąd mikroprocesora H2. Jak widać płytka nieco się grzeje. Niedługo na forum pojawi się opis Raspberry Pi – ta platforma też może być wykorzystywana do przetwarzania obrazu, a przykładowo Raspberry Pi Zero jest znacznie mniej energochłonne niż Orange Pi Zero. W każdym razie mam nadzieję, że ten artykuł pokazał, że można nawet z niewielkim budżetem rozpocząć zabawę z przetwarzaniem obrazu.

Zalety

➕ dość spora moc obliczeniowa

➕ znacznie niższa cena niż OpenMV

➕ pełna wersja python-a, OpenCV i Linux-a

➕ małe wymiary i waga

➕ dużo gotowych programów i tutoriali

Wady

➖ większy pobór mocy i wydzielanie ciepła

➖ wymaga pewnej wiedzy o systemie Linux

Ostatnią wadę można byłoby zminimalizować przygotowując odpowiedni kurs – ale to pewnie będzie na Raspberry.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Kajam się niniejszym i chylę kapelusza -- bardzo ładny początek. Niestety, przyznasz chyba, że wykrywanie ruchu to nie jest zadanie wymagające dużej mocy obliczeniowej i da się zrobić nawet na kamerkach dla Arduino -- jest to raczej słabe w porównaniu do OpenMV wykrywającego na obrazie twarze i oczy, czy lokalizujące tagi AprilTags i czytające kody QR, nawet jeśli robi to w odcieniach szarości i niskiej rozdzielczości.

Oczywiście, rozumiem, że nie masz za bardzo czasu, żeby konstruować bardziej zaawansowane przykłady -- i to także pokazuje kolejną wadę tego rozwiązania -- wymaga ono dużo więcej pracy i wiedzy, nie tylko o Linuksie, ale także o tym jak działają te wszystkie algorytmy przetwarzania obrazu. Jasne, masz dużo szerszy wybór narzędzi w postaci gotowych bibliotek, ale nadal musisz je poskładać razem, żeby działały.

Nadal jestem ciekaw w którym momencie Orange Pi zabraknie jednak tej mocy obliczeniowej, która, mimo, że dużo większa niż w OpenMV, jest jednak dużo swobodniej marnotrawiona. Sam się zbieram od dłuższego czasu do spróbowania z Pi Zero i dedykowaną kamerą, być może uda mi się niedługo zrobić taki test.

Udostępnij ten post


Link to post
Share on other sites

Mały update - właśnie przetestowałem rozpoznawanie twarzy, przy rozdzielczości HQVGA wyniki obu płytek sa bardzo zbliżone. OrangePi przetwarzanie zajmuje ok. 100ms, OpenMV uzyskuje jakieś 6 FPS na M4 i 8-9 FPS na M7. Natomiast precyzja wykrycia twarzy jest widocznie lepsza na pełnym OpenCV. OpenMV właściwie co chwila gubi obiekt, najmniejsza zmiana sprawa, że wykrywa / nie wykrywa naprzemiennie.

Moim zdaniem w kwestii wydajności jest to właściwie remis, z tym że OrangePi wymaga więcej prądu, ale ma jeszcze 3 rdzenie w zapasie.

Udostępnij ten post


Link to post
Share on other sites

Dzięki za update!

Ja właśnie dostałem moje M7 i kabelek do kamery do Pi Zero, teraz tylko muszę znaleźć przejściówkę USB OTG i moge sam się zmierzyć z AprilTagami...

Udostępnij ten post


Link to post
Share on other sites

Ja mam M7 od kilku dni - ale szału nie robi. Jedyny plus, że wreszcie większość przykładów z IDE działa. Wiesz może jakie tagi to czyta? Bo kodów kreskowych nie chce.

Udostępnij ten post


Link to post
Share on other sites

A zakleiłeś sobie vie? Bo trochę przecieka światło do sensora (zobacz sobie obraz z zamkniętą klapką na soczewce...)

Udostępnij ten post


Link to post
Share on other sites

W końcu udało mi się zeskanować wielki kod na pudełku - musi być duży i idealnie płaski. Mój błąd, że oczekiwałem czegoś porównywalnego z normalnym czytnikiem - w każdym razie z butelki po piwie kodu nie czyta 🙂

Inna sprawa, że albo mi się wydaje albo M7 ma jeszcze bardziej zniekształcony obraz niż M4 - efekt rybiego oka jest po prostu straszny.

Udostępnij ten post


Link to post
Share on other sites

Dlatego te algorytmy mają korekcję na geometrię obiektywu.

Udostępnij ten post


Link to post
Share on other sites

Może... tylko chwilę popatrzyłem w źródła OpenMV i nie wyglądają na najlepiej napisane. W kwestii optymalizacji jeszcze się sporo muszą autorzy nauczyć.

Udostępnij ten post


Link to post
Share on other sites

Też interesuje się tą tematyką, pisząc programy w z użyciem OpenCV i mogę powiedzieć, że Raspberry Pi 3 nie wystarcza do bardziej złożonych obliczeń. W kole naukowym mamy projekt w pełni autonomicznej platformy latającej, która ma samodzielnie wylądować w wyznaczonym przez wskaźnik miejscu. No i opóźnienia w algorytmach, które sięgają 3s co jest bardzo dużym opóźnieniem.

Moim zdaniem najlepiej nadawałby się do tego celu Odroid XU4 który ma osiem rdzeni i wsparcie GLU który wspiera obliczenia na macierzach. Swoje niestety kosztuje ale hajs daje politechnika, różnica w szybkości obliczeń - kolosalna.

Udostępnij ten post


Link to post
Share on other sites

Prawda jest taka, że niezależnie od użytej platformy, zawsze możesz napisać program dla którego nie będzie ona wystarczająca. Wszystko zależy od tego co się robi i jak dobrze to jest napisane (i tu oczywiście dopracowane gotowe biblioteki często dają przewagę, bo już są zoptymalizowane).

Udostępnij ten post


Link to post
Share on other sites

Cóż, na ten moment potrzebowałbym jedynie jakiejś kamerki podłączonej do laptopa i przesyłania obrazu z kamery ( w trybie rzeczywistym) wraz z jakimś dłuższym kablem 2-3m o rozdzielczości powiedzmy kilka mpx, cena do 100zł. No i żeby mi współpracowała z OpenCV i Visual Studio

Może coś polecicie ?

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...