OpenMV Cam umożliwia szybkie zaimplementowanie uczenia maszynowego do procesów wykrywania obiektów
Przekazane przez: Północnoamerykańscy redaktorzy DigiKey
2020-02-25
Zastosowanie uczenia maszynowego (ML) do wykrywania i klasyfikacji obiektów staje się pilną potrzebą w przemyśle systemów wbudowanych - szczególnie w Internecie rzeczy (IoT), systemach bezpieczeństwa, zaawansowanych systemach wspomagania kierowcy (ADAS) czy systemach opartych na automatyce przemysłowej. Wykrywanie obiektów jest złożonym procesem, a uczenie maszynowe (ML) jest stosunkowo nową dziedziną, więc tworzenie zastosowań wykrywających obiekty i wykorzystujących ML może być trudne i kłopotliwe.
Sukces technologii wykrywania obiektów zwykle wymagał od programisty nauczenia się nowej platformy takiej jak OpenCV i zakupu sprzętu wartego tysiące dolarów. W związku z tym tradycyjne podejście do wykrywania obiektów i systemów wizyjnych jest nie tylko czasochłonne, ale również kosztowne.
Jeśli inżynier chce użyć uczenia maszynowego (ML) w zastosowaniach wykrywania obiektów i systemach wizyjnych i nie chce opanowywać ML do perfekcji lub wydawać fortuny na sprzęt, idealnym, innowacyjnym rozwiązaniem będzie oparty na Pythonie moduł kamery OpenMV H7 firmy SparkFun Electronics. Moduł ten został zaprojektowany tak, by przypominać tani układ do wykrywania i przetwarzania obrazu w stylu platformy Arduino. Moduł jako taki i ekosystem oprogramowania stanowią unikalne, interesujące i tanie rozwiązanie umożliwiające łatwe wykrywanie i klasyfikowanie obiektów z użyciem uczenia maszynowego.
Niniejszy artykuł ma na celu przedstawienie modułu kamery OpenMV H7 i pokazuje jak deweloperzy mogą zacząć stosować uczenie maszynowe w wykrywaniu obiektów przy pomocy zbioru obrazów widzenia komputerowego CIFAR-10.
Moduł kamery OpenMV H7
Dzięki bogatym w funkcje bibliotekom oprogramowania, moduł kamery OpenMV H7 stanowi dla programisty ogromną pomoc w szybkim tworzeniu zastosowań uczenia maszynowego. Na przykład, deweloperzy mogą używać kamery OpenMV do wykrywania twarzy i oczu, a nawet do precyzyjnego śledzenia źrenic. Można ją wykorzystać do stworzenia kleksów lub markerów, które umożliwiają śledzenie kolorów. Istnieją również przykłady wykorzystania uczenia maszynowego do wykrywania i śledzenia niestandardowych obiektów.
Moduł kamery OpenMV H7 to pojedyncza zintegrowana płytka rozwojowa zawierająca wszystkie elementy sprzętu niezbędne do wykrywania i klasyfikacji obiektów w oparciu o uczenie maszynowe, której koszt jest o wiele niższy od tradycyjnych systemów widzenia maszynowego. Moduł jest dość mały, mierzy zaledwie . 3,6 x 4,5cm i zawiera:
- Wysokiej klasy mikrokontroler
- Zintegrowany, wymienny moduł kamery
- Złącze baterii
- Złącze USB micro
- Trójkolorową lampkę LED
- Gniazdo microSD (obsługa kart do 64 gigabajtów)
- Wejście-wyjście (I/O) rozszerzeń
Ilustracja 1: moduł kamery OpenMV H7 jest w pełni zintegrowany ze wszystkimi komponentami niezbędnymi do szybkiego opracowania i wdrożenia zastosowań widzenia maszynowego z wykorzystaniem uczenia maszynowego. (Źródło ilustracji: SparkFun Electronics)
Wejście-wyjście rozszerzeń daje deweloperom możliwość korzystania z szeregu funkcji peryferyjnych mikrokontrolera (ilustracja 2). Funkcje te obejmują interfejsy komunikacyjne, takie jak:
- UART
- SPI
- I2C
- CAN
Wejście-wyjście rozszerzeń obejmuje również kanały sterowania i kanały danych do uruchamiania serwomechanizmów, generowania sygnałów przez przetwornik cyfrowo-analogowy (DAC) lub odczytu wartości z czujników przez przetwornik analogowo-cyfrowy (ADC). Wejścia-wyjścia rozszerzeń sprawiają, że moduł OpenMV jest niezwykle ciekawym rozwiązaniem w zastosowaniach wizyjnych w ramach automatyki domowej, sterowania robotami, automatyki przemysłowej, wykrywania i śledzenia obiektów w przestrzeni.
Ilustracja 2: moduł kamery OpenMV H7 jest wyposażony w wiele wtyków wejścia-wyjścia z możliwością rozszerzenia. Wtyki te można wykorzystać do sterowania serwomechanizmami czy czujnikami próbki lub do komunikacji z modułem Wi-Fi w celu utworzenia urządzenia IoT. (Źródło ilustracji: SparkFun)
Wbudowany mikrokontroler STM32F765VIT6 firmy STMicroelectronics, zawiera procesor Arm Cortex-M7 na płytce LQFP na 100 wtyków. Procesor pracuje z prędkością 216MHz (megaherców) i posiada 2MB (megabajty) pamięci flash oraz 512kB (kilobajtów) pamięci RAM. Procesor jest niezwykle wydajny i dobrze dopasowany do aplikacji widzenia maszynowego dzięki jednostce zmiennoprzecinkowej (FPU) podwójnej precyzji i pełnym instrukcjom procesora DSP. Mikrokontroler zawiera również sprzętowy enkoder JPEG, który może przyspieszyć aplikacje obrazowania. Ogólny schemat blokowy dla mikrokontrolera STM32F765VIT6 przedstawiono na ilustracji 3.
Ilustracja 3: mikrokontroler STM32F765VIT zawiera 2MB pamięci flash i 512kB pamięci RAM oraz urządzenia peryferyjne, takie jak sprzętowy enkoder JPEG i instrukcje procesora DSP, co sprawia, że doskonale nadaje się ono do aplikacji widzenia maszynowego. (Źródło obrazu: STMicroelectronics)
Moduł kamery OpenMV H7 jest wyjątkowy, ponieważ obsługuje kilka różnych modułów kamery. Na przykład, jeśli deweloper nie chce używać wbudowanej kamery, która ma rozdzielczość 640 x 480, może przełączyć się na moduł obsługujący sensor obrazu MT9V034 firmy ON Semiconductor. MT9V034 to cyfrowa matryca CMOS w standardzie VGA o szerokości 1/3 cala z aktywnymi pikselami, wyposażona w migawkę globalną oraz tryb HDR (high dynamic range). Sensor ma rozdzielczość obrazu 752 x 480 i jest przeznaczony do pracy w szerokim zakresie temperatur od -30˚C do +70˚C. ON Semiconductor oferuje również płytkę rozwojową dla tego sensora obrazu - model MT9V034C12STCH-GEVB (ilustracja 4).
Ilustracja 4: MT9V034C12STCH-GEVB jest płytką rozwojową dla sensora obrazu MT9V034, zawierającą wbudowany obiektyw, przyśpieszający proces rozwoju i prób. (Źródło ilustracji: ON Semiconductor)
Opracowywanie pierwszej aplikacji wykrywania obiektów
Opracowywanie aplikacji dla modułu kamery OpenMV H7 przebiega w środowisku IDE OpenMV, które zapewnia interfejs Python do opracowywania aplikacji (ilustracja 5). W przypadku języka Python nie ma potrzeby znajomości języka programowania niskiego poziomu. Nie dość, że skrypt napisano w języku Python, to jeszcze moduł kamery OpenMV H7 natywnie uruchamia MicroPython. Umożliwia to deweloperom łatwe rozpoczęcie pisania aplikacji widzenia maszynowego i uruchomienie procesów wnioskowania uczenia maszynowego przy minimalnym wysiłku.
Ilustracja 5: środowisko IDE OpenMV oferuje interfejs oparty na języku Python, który umożliwia tworzenie kodu aplikacji dla modułu kamery OpenMV H7. Następnie aplikacja jest wysyłana w formie skryptu do modułu kamery, w którym działa MicroPython. (Źródło ilustracji: Beningo Embedded Group)
Jedną z pierwszych rzeczy, które deweloper robi po skonfigurowaniu jest uruchomienie podstawowego hello_world.py, który zawiera kod pokazany na listingu 1. Skrypt Python pokazuje deweloperowi, jak włączyć kamerę OpenMV i robić zdjęcia w sposób ciągły. Pozwala to deweloperowi na uzyskanie obrazu na żywo i zmierzenie częstotliwości klatek. Po podłączeniu do komputera PC częstotliwość klatek może się wahać od 25 klatek na sekundę (fps) do około 60fps. Aplikacja jest uruchamiana poprzez podłączenie kamery OpenMV do środowiska IDE OpenMV za pomocą przycisku Connect w lewym dolnym rogu ekranu, a następnie kliknięcie zielonego przycisku uruchamiania.
Skopiuj # Hello World Example # # Witaj w IDE OpenMV! Kliknij zielony przycisk strzałki uruchamiania poniżej, aby uruchomić skrypt!
import sensor, image, time sensor.reset() # Zresetuj i uruchom matrycę.
sensor.set_pixformat(sensor.RGB565) # Ustaw format pikseli na RGB565 (lub GRAYSCALE) sensor.set_framesize(sensor.QVGA) # Ustaw rozdzielczość na QVGA (320x240) sensor.skip_frames(time = 2000) # Poczekaj na zastosowanie ustawień.
clock = time.clock() # Stwórz zegar do śledzenia FPS.
while(True): clock.tick() # Zaktualizuj zegar liczący FPS.
img = sensor.snapshot() # Zrób zdjęcie i zwróć obraz.
print(clock.fps()) # Uwaga: OpenMV Cam działa o połowę wolniej po podłączeniu # do IDE. Po rozłączeniu FPS powinno wzrosnąć.
Listing 1: aplikacja OpenMV IDE hello_world.py umożliwia modułowi kamery OpenMV dostarczanie obrazu na żywo. (Źródło kodu: OpenMV)
Aby przeprowadzić pierwszy test wykrywania i klasyfikacji obiektów, sieć uczenia maszynowego musi zostać przeszkolona w zakresie klas obiektów, które chcemy rozpoznawać. Powszechnie stosowanym zbiorem danych obrazów używanym do szkolenia modeli wykrywania obiektów i sprawdzania, jak dobrze działają, jest zbiór CIFAR-10. Zbiór danych CIFAR-10 składa się z 60000 obrazów zawierających kolorowe obrazy w rozmiarze 32 x 32 dla następujących 10 różnych klas obrazów:
- Samolot
- Samochód
- Ptak
- Kot
- Jeleń
- Pies
- Żaba
- Koń
- Statek
- Ciężarówka
Artykuł ten nie ma na celu opisania procesu, który jest wykorzystywany do szkolenia modelu i przekształcenia go w model wnioskujący, który można uruchomić w kamerze OpenMV. Możliwe jest uruchomienie sieci przeszkolonej przez CIFAR-10 bez konieczności tworzenia modelu: środowisko IDE OpenMV zawiera już wyszkolony przez CIFAR-10 model, który wystarczy załadować do kamery.
Aby go wykorzystać, należy podłączyć kamerę OpenMV do komputera PC i środowiska IDE OpenMV. Z poziomu środowiska IDE OpenMV wybierz tools -> machine learning -> CNN Network Library. Otworzy się okno z folderem modeli OpenMV qtcreator. Dostępne są dwie opcje:
- cmsisnn
- tensorflow
Wybierz opcję cmsisnn, następnie przejdź do folderu cifar10, kliknij plik cifar10.network i otwórz go. Otworzy się kolejne okno. Okno to służy do zapisania wyszkolonego pliku sieci w kamerze OpenMV. Następnie użytkownik może wybrać pamięć masową, która pojawi się wraz z kamerą, w celu zapisania sieci.
Po zapisaniu sieci, załaduj przykład do uczenia maszynowego CIFAR-10, wybierając File -> Examples -> 25-Machine-Learning -> nn_cifar10_search_whole_window.py. Dzięki temu załadujesz przykładowy skrypt, przedstawiony poniżej (listing 2).
Skopiuj # Przykład CIFAR-10 Search Whole Window # # CIFAR jest splotową siecią neuronową (CNN), której zadaniem jest sklasyfikowanie pola widzenia na kilka # różnych typów obiektów i która pracuje na danych wideo RGB.
# # W tym przykładzie przesuwamy okno detektora LeNet nad obrazem i otrzymujemy listę aktywnych punktów, # w których może znajdować się jakiś obiekt. Należy pamiętać, że korzystanie z CNN z przesuwającym się oknem jest niezwykle kosztowne # obliczeniowo, więc przy szczegółowym wyszukiwaniu nie należy oczekiwać, że CNN przedstawi dane w czasie rzeczywistym.
import sensor, image, timeos, nn sensor.reset() # Zresetuj i uruchom sensor.
sensor.set_pixformat(sensor.RGB565) # Ustaw format pikseli na RGB565 (lub GRAYSCALE) sensor.set_framesize(sensor.QVGA) # Ustaw rozdzielczość na QVGA (320x240) sensor.set_windowing((128, 128)) # Ustaw okno 128x128.
sensor.skip_frames(time=750) # Nie pozwól, by funkcja automatycznego wzmocnienia działała zbyt długo.
sensor.set_auto_gain(False) # Wyłącz funkcję automatycznego wzmocnienia.
sensor.set_auto_gain(False) # Wyłącz funkcję automatycznego wzmocnienia.
# Załaduj sieć cifar10 (Możesz ją uzyskać ze środowiska IDE OpenMV).
net = nn.load('/cifar10.network') # Szybsza, mniejsza, mniej dokładna.
# net = nn.load('/cifar10_fast.network') etykiety = ['samolot', 'samochód', 'ptak', 'kot', 'jeleń', 'pies', 'żaba', 'koń', 'statek', 'ciężarówka'] clock = time.clock() while(True): clock.tick() img = sensor.snapshot() # net.search() przeszuka obszar zainteresowania (ROI) na obrazie pod kątem sieci (lub cały obraz jeśli ROI nie został # określony). W każdym miejscu na obrazie, jeśli wyjście sieci neuronowej odpowiada klasyfikacji i jest wyższe niż # próg, do listy obiektów zostanie dodana lokalizacja i etykieta, a następnie zostaną one zwrócone. Przy każdej skali # okno wykrywania jest przesuwane w obrębie ROI za pomocą x_overlap (0-1) oraz y_overlap (0-1).
# Jeśli ustawisz nakładanie (overlap) na 0,5, wówczas każde okno wykrywania będzie nakładać się na poprzednie w 50%. Uwaga # im większa wartość nakładania, tym ZNACZNIE większe obciążenie obliczeniowe. Na koniec, aby dopasować mult-scale po # przesunięciu sieci w wymiarach x/y, okno detekcji zmniejszy się o scale_mul (0-1) # do min_scale (0-1). Na przykład, jeśli scale_mul wynosi 0,5, to okno wykrywania zmniejszy się o 50%.
# Zauważ, że na niższej skali jest jeszcze więcej obszaru do przeszukania, jeśli x_overlap i y_overlap mają niskie wartości...
# contrast_threshold umożliwia pominięcie działania CNN w płaskich obszarach.
for obj in net.search(img, threshold=0.6, min_scale=0.5, scale_mul=0.5, \ x_overlap=0.5, y_overlap=0.5, contrast_threshold=0.5): print("Detected %s - Confidence %f%%" % (labels[obj.index()], obj.value())) img.draw_rectangle(obj.rect(), color=(255, 0, 0)) print(clock.fps())
Listing 2: przykładowa aplikacja IDE OpenMV nn_cifar10_search_whole_window.py jest używana do klasyfikacji obrazów i zapewnia pomiar poziomu ufności dla klasyfikacji. (Źródło kodu: OpenMV)
Testowa aplikacja może zostać uruchomiona zgodnie ze skryptem hello_world.py. W tym celu połącz środowisko IDE OpenMV z modułem klikając przycisk „Connect” w lewym dolnym rogu, a następnie przycisk „Run”. W tym momencie kamera uruchomi skrypt i spróbuje sklasyfikować obrazy, które widzi. Okno terminala pokazuje, czy obraz został sklasyfikowany, czy nie oraz jaki jest poziom ufności wyniku.
W tym momencie, deweloper musi tylko przedstawić różne obiekty, które znajdują się w zbiorze danych CIFAR-10 i pozwolić kamerze je sklasyfikować. Dla celów niniejszego artykułu, kamerze pokazano zdjęcie kota (ilustracja 6) oraz samolotu (ilustracja 7). Trudno to dostrzec na ilustracji, ale poziom ufności wyniósł około 70%. Poziom ufności może być niski ze względu na różnice pomiędzy obrazami wykorzystywanymi do szkolenia, a obrazami testowymi, warunki oświetleniowe i inne czynniki. Wyższy poziom ufności można z pewnością osiągnąć dzięki dodatkowemu szkoleniu i lepszej kontroli nad środowiskiem kamery.
Ilustracja 6: środowisko IDE OpenMV z uruchomioną siecią CNN pracującą na zbiorze danych CIFAR-10 - kamera ma za zadanie rozpoznać kota. (Źródło ilustracji: Beningo Embedded Group)
Ilustracja 7: środowisko IDE OpenMV z uruchomioną siecią CNN pracującą na zbiorze danych CIFAR-10 - kamera ma za zadanie rozpoznać samolot. (Źródło ilustracji: Beningo Embedded Group)
Rozszerzenie możliwości modułu OpenMV H7
Istnieje wiele możliwości rozbudowy modułu OpenMV w celu użycia go z innymi modułami kamery i z prawie nieograniczoną liczbą sensorów zewnętrznych.
Choć moduł OpenMV posiada możliwość rozszerzenia wejść-wyjść, warto czasem użyć zewnętrznej płytki rozszerzeń w celu zapewnienia dodatkowego dostępu do zasilania, masy i sygnałów komunikacyjnych. Jedną z przydatnych płytek rozszerzeń dla modułu OpenMV M7 jest DFR0578 Gravity Expansion Shield firmy DFRobot (ilustracja 8). Na ilustracji widać, że moduł Gravity zapewnia dostęp do znacznie większej liczby wtyków zasilania i masy. Rozszerza on nawet dodatkowe linie I2C i zapewnia dodatkowe opcje zasilania modułu. Dzięki temu znacznie łatwiej jest podłączyć zewnętrzne sensory i moduły bez konieczności stosowania płytki prototypowej lub łączenia przewodów.
Ilustracja 8: płytka rozszerzeń Gravity firmy DFRobot dla modułu OpenMV cam M7 zapewnia kilka dodatkowych, łatwo dostępnych gniazd, ułatwiających szybkie tworzenie prototypów. (Źródło ilustracji: DFRobot)
Oprócz płytki Gravity, kolejną ciekawą płytką rozszerzeń przydatną dla deweloperów, jest DFR0498 FireBeetle Covers - Camera & Audio Media Board firmy DFRobot (ilustracja 9). Moduł rozwojowy FireBeetle zawiera:
- Interfejs do podłączania kodeków IIS
- Moduł kamery
- Słuchawki
- Mikrofon
Istnieje wiele innych płytek rozszerzeń które mogą być podłączone do modułu kamery OpenMV H7 w zależności od zastosowania końcowego.
Ilustracja 9: płytka FireBeetle DFR0498 firmy DFRobot zawiera rozszerzenia dla urządzeń multimedialnych takich jak mikrofon. (Źródło ilustracji: DFRobot)
Wskazówki i porady ułatwiające pracę z modułem OpenMV
Rozpoczęcie pracy z modułem kamery OpenMV H7 nie jest trudne, ale po drodze napotkamy wiele niuansów i będziemy musieli podjąć wiele decyzji, których powinniśmy być świadomi jako deweloperzy pracujący z nim po raz pierwszy. Oto kilka „wskazówek i porad” ułatwiających rozpoczęcie pracy z modułem:
- Jeśli pierwszy raz używasz modułu, upewnij się, że ostrość została ustawiona zgodnie z procedurą opisaną w dokumentacji modułu OpenMV.
- W menu Files -> Examples znajdziesz kilkadziesiąt przykładów, począwszy od sposobu wykrywania koloru, a na rozpoznawaniu twarzy skończywszy.
- Aby dodać łączność z Internetem, rozważ zastosowanie płytki Wi-Fi. Płytka Wi-Fi może być włączana automatycznie po uruchomieniu w środowisku IDE OpenMV w menu Tools -> OpenMV Cam Settings.
- Rozważ zastosowanie TensorFlow Lite do wyszkolenia modelu uczenia maszynowego dla interesujących Cię obiektów.
Deweloperzy, którzy zastosują się do powyższych wskazówek i porad, przekonają się, że mogą zaoszczędzić sporo czasu i frustracji podczas pierwszej pracy z modułem kamery OpenMV H7.
Podsumowanie
Jak wykazano, moduł kamery OpenMV H7 wyjątkowo przydaje się w pomocy deweloperom, którzy szybko chcą rozpocząć stosowanie uczenia maszynowego do wykrywania obiektów i powiązanych z tą technologią zastosowań. Dostępne są tam nie tylko przykładowe aplikacje, które deweloperzy mogą wykorzystać do przyspieszenia projektowania, ale także liczne opcje rozszerzeń dla kamer i sensorów. Aby zacząć, deweloperzy muszą tylko wiedzieć jak napisać kilka linijek kodu w języku Python - i już po kilku godzinach mogą mieć działającą aplikację, w zależności od jej złożoności.
Disclaimer: The opinions, beliefs, and viewpoints expressed by the various authors and/or forum participants on this website do not necessarily reflect the opinions, beliefs, and viewpoints of DigiKey or official policies of DigiKey.




