Spisu treści:
- Krok 1: Wyjaśnienie architektury modelu wykrywania obiektów
- Krok 2: Przygotuj środowisko
- Krok 3: Trenuj model wykrywania obiektów za pomocą Keras
- Krok 4: Konwertuj go na format.kmodel
- Krok 5: Uruchom na oprogramowaniu układowym Micropython
- Krok 6: Podsumowanie
Wideo: Wykrywanie obiektów za pomocą płyt Sipeed MaiX (Kendryte K210): 6 kroków
2024 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2024-01-30 11:27
W ramach kontynuacji mojego poprzedniego artykułu o rozpoznawaniu obrazu z płytami Sipeed MaiX postanowiłem napisać kolejny tutorial, skupiający się na wykrywaniu obiektów. Ostatnio pojawiło się trochę interesującego sprzętu z chipem Kendryte K210, w tym Seeed AI Hat for Edge Computing, M5StickV stosu M5 i HuskyLens firmy DFRobot (chociaż ten ma własne oprogramowanie układowe i jest bardziej przeznaczony dla zupełnie początkujących). Ze względu na niską cenę Kendryte K210 spodobał się osobom, które chcą wzbogacić swoje projekty o wizję komputerową. Ale jak zwykle w przypadku chińskich produktów sprzętowych, brakuje wsparcia technicznego i jest to coś, co staram się poprawić za pomocą moich artykułów i filmów. Pamiętaj jednak, że nie jestem członkiem zespołu programistów Kendryte ani Sipeed i nie mogę odpowiedzieć na wszystkie pytania związane z ich produktem.
Mając to na uwadze, zacznijmy! Zaczniemy od krótkiego (i uproszczonego) omówienia działania modeli CNN rozpoznawania obiektów.
AKTUALIZACJA MAJ 2020: Widząc, jak mój artykuł i wideo na temat wykrywania obiektów z płytami K210 są nadal bardzo popularne i wśród najlepszych wyników na YouTube i Google, postanowiłem zaktualizować artykuł, aby zawierał informacje o aXeleRate, frameworku opartym na Keras dla AI na Krawędź rozwijam. aXeleRate zasadniczo opiera się na zbiorze skryptów, których używałem do trenowania modeli rozpoznawania obrazów/wykrywania obiektów - połączonych w jeden framework i zoptymalizowany pod kątem przepływu pracy w Google Colab. Jest wygodniejszy w użyciu i bardziej aktualny.
W przypadku starej wersji artykułu, nadal możesz ją zobaczyć na steemit.com.
Krok 1: Wyjaśnienie architektury modelu wykrywania obiektów
Modele rozpoznawania obrazów (lub klasyfikacji obrazów) przyjmują cały obraz jako dane wejściowe i wyprowadzają listę prawdopodobieństw dla każdej klasy, którą próbujemy rozpoznać. Jest to bardzo przydatne, jeśli interesujący nas obiekt zajmuje dużą część obrazu i nie zależy nam zbytnio na jego lokalizacji. Ale co, jeśli nasz projekt (powiedzmy, kamera śledząca twarz) wymaga od nas nie tylko znajomości rodzaju obiektu na obrazie, ale także jego współrzędnych. A co z projektem wymagającym wykrywania wielu obiektów (np. do liczenia)?
Tutaj przydają się modele wykrywania obiektów. W tym artykule będziemy używać architektury YOLO (patrzysz tylko raz) i skupimy się na wyjaśnieniu wewnętrznej mechaniki tej konkretnej architektury.
Próbujemy określić, jakie obiekty są na zdjęciu i jakie są ich współrzędne. Ponieważ uczenie maszynowe nie jest magią ani „maszyną myślącą”, a jedynie algorytmem, który wykorzystuje statystyki do optymalizacji funkcji (sieci neuronowej) w celu lepszego rozwiązania konkretnego problemu. Musimy sparafrazować ten problem, aby uczynić go bardziej „możliwym do optymalizacji”. Naiwnym podejściem byłoby tutaj zastosowanie algorytmu minimalizującego stratę (różnicę) między jego przewidywaniem a poprawnymi współrzędnymi obiektu. Działałoby to całkiem nieźle, o ile na obrazie mamy tylko jeden obiekt. W przypadku wielu obiektów stosujemy inne podejście - dodajemy siatkę i sprawiamy, że nasza sieć przewiduje obecność (lub brak) obiektu (obiektów) w każdej siatce. Brzmi świetnie, ale nadal pozostawia zbyt wiele niepewności dla sieci - jak wyprowadzić prognozę i co zrobić, gdy w jednej komórce siatki znajduje się wiele obiektów z centrum? Musimy dodać jeszcze jedno ograniczenie - tzw. kotwice. Kotwice są początkowymi rozmiarami (szerokość, wysokość), z których niektóre (najbliższe rozmiarowi obiektu) zostaną przeskalowane do rozmiaru obiektu - przy użyciu niektórych danych wyjściowych z sieci neuronowej (końcowa mapa cech).
Oto widok najwyższego poziomu tego, co się dzieje, gdy sieć neuronowa architektury YOLO wykrywa obiekt na obrazie. Zgodnie z cechami wykrytymi przez sieć ekstraktorów cech, dla każdej komórki siatki tworzony jest zestaw predykcji, który obejmuje przesunięcie kotwic, prawdopodobieństwo kotwicy i klasę kotwicy. Następnie odrzucamy przewidywania z małym prawdopodobieństwem i voila!
Krok 2: Przygotuj środowisko
aXeleRate jest oparty na wspaniałym projekcie penny4860, wykrywaczu cyfr SVHN yolo-v2. aXeleRate przenosi tę implementację detektora YOLO w Keras na wyższy poziom i wykorzystuje wygodny system konfiguracji do przeprowadzania szkolenia i konwersji sieci rozpoznawania/wykrywania obiektów i segmentacji obrazu z różnymi backendami.
To są dwa sposoby wykorzystania aXeleRate: uruchomienie lokalnie na komputerze z systemem Ubuntu lub w Google Colab. Aby uruchomić w Google Colab, spójrz na ten przykład:
Notatnik Colab do wykrywania obiektów PASCAL-VOC
Szkolenie modelu lokalnie i eksportowanie go do użycia z akceleracją sprzętową jest teraz znacznie łatwiejsze. Gorąco polecam zainstalowanie wszystkich niezbędnych zależności w środowisku Anaconda, aby oddzielić projekt od innych i uniknąć konfliktów.
Pobierz instalator tutaj.
Po zakończeniu instalacji utwórz nowe środowisko:
conda create -n yolo python=3.7
Aktywujmy nowe środowisko
conda aktywuj yolo
Prefiks przed powłoką bash pojawi się z nazwą środowiska, wskazując, że pracujesz teraz w tym środowisku.
Zainstaluj aXeleRate na lokalnym komputerze za pomocą
pip zainstaluj git+https://github.com/AIWintermuteAI/aXeleRate
Następnie uruchom to, aby pobrać skrypty potrzebne do szkolenia i wnioskowania:
klon git
Szybkie testy możesz uruchomić za pomocą testing_training.py w folderze aXeleRate. Uruchomi szkolenie i wnioskowanie dla każdego typu modelu, zapisze i przekonwertuje wytrenowane modele. Ponieważ jest to szkolenie tylko dla 5 epok, a zbiór danych jest bardzo mały, nie będziesz w stanie uzyskać przydatnych modeli, ale ten skrypt jest przeznaczony tylko do sprawdzania braku błędów.
Krok 3: Trenuj model wykrywania obiektów za pomocą Keras
Teraz możemy uruchomić skrypt szkoleniowy z plikiem konfiguracyjnym. Ponieważ implementacja detektora obiektów YOLO w Keras jest dość skomplikowana, zamiast wyjaśniać każdy istotny fragment kodu, wyjaśnię, jak skonfigurować szkolenie, a także opiszę odpowiednie moduły, na wypadek, gdybyś sam chciał wprowadzić w nich jakieś zmiany.
Zacznijmy od przykładu zabawki i wytrenujmy wykrywacz szopów. W folderze /config znajduje się plik konfiguracyjny, raccoon_detector.json. Jako architekturę wybieramy MobileNet7_5 (gdzie 7_5 jest parametrem alfa oryginalnej implementacji Mobilenet, kontroluje szerokość sieci) oraz 224x224 jako rozmiar wejściowy. Przyjrzyjmy się najważniejszym parametrom w konfiguracji:
Typ to model frontend - Classifier, Detector lub SegnetArchitecture to model backend (ekstraktor funkcji)
- Full Yolo - Tiny Yolo - MobileNet1_0 - MobileNet7_5 - MobileNet5_0 - MobileNet2_5 - SqueezeNet - VGG16 - ResNet50
Więcej informacji na temat kotwic można znaleźć tutaj
Etykiety to etykiety obecne w Twoim zbiorze danych. WAŻNE: Proszę wymienić wszystkie etykiety obecne w zbiorze danych.
skala_obiektu określa, jak bardzo należy ukarać błędne przewidywanie ufności predyktorów obiektów
no_object_scale określa, jak bardzo należy ukarać błędne przewidywanie ufności predyktorów nieobiektowych
coord_scale określa wysokość kary za błędne prognozy pozycji i rozmiaru (x, y, w, h)
class_scale określa, ile ukarać złego przewidywania klasy
augumentacja - powiększanie obrazu, zmiana rozmiaru, przesuwanie i rozmycie obrazu w celu uniknięcia przeładowania i większej różnorodności w zbiorze danych.
train_times, validation_times - ile razy powtórzyć zbiór danych. Przydatne, jeśli masz agumentację
włączony
first_trainable_layer - pozwala zamrozić niektóre warstwy, jeśli korzystasz z przeszkolonej sieci obiektów
Teraz musimy pobrać zbiór danych, który udostępniłem na moim Dysku Google (oryginalny zbiór danych), który jest zbiorem danych do wykrywania szopów, zawierającym 150 zdjęć z adnotacjami.
Upewnij się, że odpowiednio zmieniłeś linie w pliku konfiguracyjnym (train_image_folder, train_annot_folder), a następnie rozpocznij szkolenie za pomocą następującego polecenia:
python axelerate/train.py -c configs/raccoon_detector.json
train.py odczytuje konfigurację z pliku.json i trenuje model za pomocą skryptu axelerate/networks/yolo/yolo_frontend.py. yolo/backend/loss.py to miejsce, w którym zaimplementowana jest niestandardowa funkcja utraty, a yolo/backend/network.py to miejsce, w którym tworzony jest model (łączone warstwy wejściowe, ekstraktor funkcji i wykrywania). axelerate/networks/common_utils/fit.py to skrypt implementujący proces uczenia, a axelerate/networks/common_utils/feature.py zawiera ekstraktory cech. Jeśli zamierzasz używać wytrenowanego modelu z chipem K210 i oprogramowaniem układowym Micropython, ze względu na ograniczenia pamięci możesz wybrać między MobileNet (2_5, 5_0 i 7_5) a TinyYolo, ale zauważyłem, że MobileNet zapewnia lepszą dokładność wykrywania.
Ponieważ jest to zabawkowy przykład i zawiera tylko 150 obrazów szopów, proces uczenia powinien przebiegać dość szybko, nawet bez GPU, chociaż dokładność będzie daleka od gwiazd. Na potrzeby projektu związanego z pracą przeszkoliłem wykrywacz znaków drogowych i wykrywacz liczb, oba zestawy danych zawierały ponad kilka tysięcy przykładów szkoleniowych.
Krok 4: Konwertuj go na format.kmodel
Dzięki aXeleRate konwersja modeli odbywa się automatycznie – to chyba największa różnica w stosunku do starej wersji skryptów szkoleniowych! Dodatkowo otrzymujesz pliki modeli i wykres treningowy zapisane w folderze projektu. Odkryłem również, że dokładność walidacji czasami nie daje oszacowania rzeczywistej wydajności modelu do wykrywania obiektów i dlatego dodałem mAP jako metrykę walidacji dla modeli wykrywania obiektów. Więcej o MAP możesz przeczytać tutaj.
Jeśli mAP, średnia precyzja (nasza metryka walidacyjna) nie poprawia się przez 20 epok, trening zostanie przedwcześnie przerwany. Za każdym razem, gdy mapowanie ulega poprawie, model jest zapisywany w folderze projektu. Po zakończeniu szkolenia aXeleRate automatycznie konwertuje najlepszy model do określonych formatów - od teraz możesz wybrać "tflite", "k210" lub "edgetpu".
Przejdźmy do ostatniego kroku, faktycznie uruchamiając nasz model na sprzęcie Sipeed!
Krok 5: Uruchom na oprogramowaniu układowym Micropython
Możliwe jest uruchomienie wnioskowania z naszym modelem wykrywania obiektów za pomocą kodu C, ale dla wygody zamiast tego użyjemy oprogramowania Micropython i MaixPy IDE.
Pobierz MaixPy IDE stąd i firmware micropython stąd. Możesz użyć skryptu python kflash.py, aby nagrać oprogramowanie lub pobrać osobne narzędzie flashowania GUI tutaj.
Skopiuj model.kmodel do katalogu głównego karty SD i włóż kartę SD do Sipeed Maix Bit (lub innego urządzenia K210). Alternatywnie możesz nagrać.kmodel do pamięci flash urządzenia. Mój przykładowy skrypt odczytuje.kmodel z pamięci flash. Jeśli używasz karty SD, zmień tę linię
zadanie = kpu.load(0x20000)
do
zadanie = kpu.load("/sd/model.kmodel")
Otwórz MaixPy IDE i naciśnij przycisk łączenia. Otwórz skrypt raccoon_detector.py z folderu example_scripts/k210/detector i naciśnij przycisk Start. Powinieneś widzieć transmisję na żywo z kamery z ramkami ograniczającymi wokół… cóż, szopy pracze. Możesz zwiększyć dokładność modelu, podając więcej przykładów uczących, ale pamiętaj, że jest to dość mały model (1,9 M) i będzie miał problemy z wykrywaniem małych obiektów (ze względu na niską rozdzielczość).
Jednym z pytań, które otrzymałem w komentarzach do mojego poprzedniego artykułu na temat rozpoznawania obrazu, jest to, jak przesłać wyniki detekcji przez UART/I2C do innego urządzenia podłączonego do płytek rozwojowych Sipeed. W moim repozytorium github będzie można znaleźć kolejny przykładowy skrypt, raccoon_detector_uart.py, który (zgadliście) wykrywa szopy pracze i wysyła współrzędne pól ograniczających przez UART. Należy pamiętać, że piny używane do komunikacji UART różnią się w zależności od płytek, należy to sprawdzić w dokumentacji.
Krok 6: Podsumowanie
Kendryte K210 to solidny chip do wizji komputerowej, elastyczny, aczkolwiek z ograniczoną ilością pamięci. Do tej pory w moich samouczkach omówiliśmy używanie go do rozpoznawania niestandardowych obiektów, wykrywania niestandardowych obiektów i uruchamiania niektórych zadań widzenia komputerowego opartych na OpenMV. Wiem na pewno, że nadaje się również do rozpoznawania twarzy i przy pewnym majsterkowaniu powinno być możliwe wykrywanie pozy i segmentacja obrazu (można użyć aXeleRate do trenowania modelu segmentacji semantycznej, ale nie zaimplementowałem jeszcze wnioskowania z K210). Nie krępuj się rzucić okiem na problemy z repozytorium aXeleRate i zrobić PR, jeśli uważasz, że są jakieś ulepszenia, które możesz wnieść!
Oto kilka artykułów, których użyłem podczas pisania tego samouczka. Zajrzyj, jeśli chcesz dowiedzieć się więcej o wykrywaniu obiektów za pomocą sieci neuronowych:
Wykrywacze obiektów z obramowaniem: zrozumienie YOLO, patrzysz tylko raz
Zrozumienie YOLO (więcej matematyki)
Delikatny przewodnik po tym, jak lokalizacja obiektów YOLO działa z Keras (część 2)
Wykrywanie obiektów w czasie rzeczywistym za pomocą YOLO, YOLOv2 i teraz YOLOv3
Mam nadzieję, że wykorzystasz wiedzę, którą posiadasz, aby zbudować niesamowite projekty z widzeniem maszynowym! Możesz kupić płyty Sipeed tutaj, są to jedne z najtańszych opcji dostępnych dla ML w systemach wbudowanych.
Dodaj mnie na LinkedIn, jeśli masz jakieś pytania i zasubskrybuj mój kanał na YouTube, aby otrzymywać powiadomienia o ciekawszych projektach związanych z uczeniem maszynowym i robotyką.
Zalecana:
Wykrywanie obiektów Raspberry Pi: 7 kroków
Raspberry Pi Object Detection: Ten przewodnik zawiera instrukcje krok po kroku dotyczące konfiguracji interfejsu API wykrywania obiektów TensorFlow na Raspberry Pi. Wykonując kroki opisane w tym przewodniku, będziesz mógł używać swojego Raspberry Pi do wykrywania obiektów na żywo wideo z P
Śledzenie obiektów w oparciu o wykrywanie kolorów: 10 kroków
Śledzenie obiektów w oparciu o wykrywanie kolorów: historia Zrobiłem ten projekt, aby nauczyć się przetwarzania obrazu za pomocą Raspberry PI i otwartego CV. Aby uatrakcyjnić ten projekt użyłem dwóch silników SG90 Servo i zamontowałem na nim kamerę. Jeden silnik służy do poruszania się w poziomie, a drugi do poruszania się w pionie
RASPBERRY PI Pi WYKRYWANIE OBIEKTÓW Z WIELOMA KAMERAMI: 3 kroki
RASPBERRY PI Pi WYKRYWANIE OBIEKTÓW Z WIELOMA KAMERAMI: Intro będzie krótkie, ponieważ sam tytuł sugeruje, jaki jest główny cel instrukcji. W tej instrukcji krok po kroku wyjaśnię, jak podłączyć wiele kamer, takich jak kamera 1-pi i co najmniej jedna kamera USB lub 2 kamery USB
Analizator wzorców ruchu wykorzystujący wykrywanie obiektów na żywo: 11 kroków (ze zdjęciami)
Analizator wzorców ruchu wykorzystujący wykrywanie obiektów na żywo: W dzisiejszym świecie sygnalizacja świetlna jest niezbędna dla bezpiecznej drogi. Jednak wiele razy sygnalizacja świetlna może być denerwująca w sytuacjach, gdy ktoś zbliża się do światła, gdy zmienia ono kolor na czerwony. To marnuje czas, zwłaszcza jeśli światło jest pr
Wizualne wykrywanie obiektów za pomocą kamery (TfCD): 15 kroków (ze zdjęciami)
Wykrywanie obiektów wizualnych za pomocą kamery (TfCD): Usługi kognitywne, które mogą rozpoznawać emocje, twarze ludzi lub proste przedmioty, są obecnie wciąż na wczesnym etapie rozwoju, ale wraz z uczeniem maszynowym ta technologia jest coraz bardziej rozwijana. Możemy spodziewać się, że więcej tej magii zobaczymy w