Spisu treści:

Robot do rozpoznawania znaków drogowych Raspberry Pi 4: 6 kroków
Robot do rozpoznawania znaków drogowych Raspberry Pi 4: 6 kroków

Wideo: Robot do rozpoznawania znaków drogowych Raspberry Pi 4: 6 kroków

Wideo: Robot do rozpoznawania znaków drogowych Raspberry Pi 4: 6 kroków
Wideo: Donald Tusk: Majonez? Lepiej łączyć niż dzielić. 2024, Lipiec
Anonim
Robot do rozpoznawania znaków drogowych Raspberry Pi 4
Robot do rozpoznawania znaków drogowych Raspberry Pi 4

Ta instrukcja jest oparta na moim projekcie uniwersyteckim. Celem było stworzenie systemu, w którym sieć neuronowa analizuje obraz, a następnie w oparciu o rozpoznanie każe robotowi arduino poruszać się za pośrednictwem Ros.

Na przykład, jeśli zostanie rozpoznany znak skrętu w prawo, robot skręci w prawo, jeśli zostanie rozpoznany znak skrętu w lewo, robot skręci w lewo, jeśli żaden z tych znaków nie zostanie rozpoznany, robot będzie kontynuował ruch do przodu. Zestaw danych, który zostanie użyty, to oficjalne rozpoznawanie znaków drogowych z INI (2019) (Institut Fur Neuroinformatik). Ten zestaw danych ma 43 klasy, jednak potrzebne są tylko dwie; Foldery 00033 i 00034 w zbiorze danych to lewe i prawe znaki skrętu.

Krok 1: Wymagania

Wymagania
Wymagania
Wymagania
Wymagania
Wymagania
Wymagania

Wymagania dla tego projektu są następujące:

Robot arduino. (w zasadzie arduino uno, sterownik silnika i silniki) (nie potrzebne, jeśli nie używasz robota)

Malina pi 4.

Aparat pi.

Wymagane oprogramowanie:

Python 3.

Otwórz CV 4.

Przepływ tensorowy.

arduino IDE (nie jest potrzebne, jeśli nie używasz robota)

Ros (niepotrzebne, jeśli nie używasz robota)

Niezależnie od tego, jaki jest twój ulubiony pomysł na pytona (na Raspberry Pi używam Thonny'ego).

Aby skonfigurować OpenCV i Tensorflow, postępuj zgodnie z instrukcjami Adriana. Link:

Polecam zapoznać się z jak największą liczbą jego tutoriali, są one naprawdę interesujące i przydatne zarówno dla początkujących, jak i średniozaawansowanych.

Krok 2: Trening danych

Skrypt pociągu został zaprojektowany tak, aby uzyskać dostęp do zestawu danych, który kompiluje około 50 000 obrazów z 43 klas. Skrypt jest napisany w Pythonie, przy użyciu różnych bibliotek: os – służy do łączenia skryptu Pythona z odpowiednim katalogiem, w którym znajduje się zestaw danych. Matplotlib – służy do wyświetlania danych z modelu szkoleniowego. Tensorflow i keras – to biblioteki służące do tworzenia modelu sztucznej sieci neuronowej, służą do projektowania modelu. Numpy - ta biblioteka służy do przekształcania obrazów w tablicę, którą można następnie przepuścić przez model w celu pobrania prognozy.

Załączony skrypt to kod Pythona do tworzenia modelu z zestawu danych. Polega to na splotowym 2D z wejściem (5, 5) i aktywacji relu, a następnie łączeniem, gdy to zostanie zrobione, wejście przechodzi przez kolejny splot z wejściem (3, 3) z tą samą aktywacją i łączeniem. Dzieje się to po raz ostatni przed spłaszczeniem, a następnie gęstość jest stosowana do liczby klas, w tym przypadku 43.

Kolejnym krokiem było skompilowanie modelu. To jest część, która ustawia optymalizator, sgd był najbardziej odpowiedni, ponieważ był podobny do optymalizatora użytego w zadaniu 1. Sgd oznacza stochastyczny spadek gradientu. Również w kompilatorze należy ustawić stratę, wybór straty sparse_categorical_crossentropy jest najlepszym dopasowaniem, ponieważ kategorie są liczbami całkowitymi, a model wygeneruje prognozę dla każdej klasy jako wartość zmiennoprzecinkową między 0 a 1,1, co oznacza 100% dokładność.

Po zakończeniu kompilatora należy zastosować generator, aby model zaczął przetwarzać dane wejściowe obrazu. Generator składa się z wielu części: training_set – jest to łącze do zbioru danych używanego do treningu, steps_per_epoch – jest to liczba wymaganych kroków na epokę, epoki – tyle razy program będzie iterować przez pełny zestaw danych, validation_data – jest to łącze do zbioru danych użytego do walidacji, validation_steps – liczba kroków użytych do walidacji, walidacja ma miejsce na końcu każdej epoki.

Ogólnie rzecz biorąc, pełne czyszczenie całego zestawu danych musi być kompletne w każdej epoce. Dlatego na przykład zestaw danych składający się z 1024 obrazów będzie wymagał: Rozmiar wsadu = 32, Kroki na epokę = 32, Epoki = 1. Każdy krok obejmuje cały rozmiar wsadu, więc przy wielkości wsadu 32 kroki będą wynosić 32. Z drugiej strony strony, najlepiej jest mieć większy rozmiar partii niż liczba klas, ponieważ jeśli rozmiar partii jest mniejszy, to każdy krok nie może zawierać obrazu z każdej klasy.

Gdy model zakończy szkolenie, za pomocą matplotlib program utworzy wykres wyników, który pokazuje historię szkolenia od początku do końca. Wykres składa się z dokładności, dokładności walidacji, utraty i utraty walidacji, jest on podzielony na epoki, aby pokazać postęp treningu. Ostatnim etapem jest zapisanie modelu jako pliku.h5, do którego można później uzyskać dostęp w procesie predykcji. Zapisanie modelu oznacza, że za każdym razem, gdy uruchamiany jest program prognozowania, program szkoleniowy nie musi być uruchamiany ponownie. Program szkoleniowy może trwać do 10 minut na epokę na malinowym pi.

W załączeniu skrypt szkolenia:

Krok 3: Implementacja przewidywań kamery Pi

Następnym programem jest skrypt przewidywania i wydawcy.

Pierwszym etapem jest załadowanie modelu za pomocą model.load(). Drugim etapem jest iteracja ramek z kamery pi za pomocą opencv, a następnie zmiana rozmiaru ramki do takiego samego rozmiaru, jak rozmiary wejściowe używane na etapie uczenia, 32 x 32 piksele. Po wykonaniu tej czynności nowa ramka o zmienionym rozmiarze jest przepuszczana przez model za pomocą modelu.predict(), który wyprowadza macierz, każdy element macierzy jest liczbą zmiennoprzecinkową od 0 do 1, indeks elementu jest taki sam jak klasa, którą reprezentuje, stąd pierwszy element to klasa pierwsza, a liczba to przewidywanie pewności, że obraz pochodzi z tej klasy. Np.

UWAGA: Jeśli nie korzystasz ze strony robota. Po prostu usuń linie:

"importuj Rospy"

def mówca (kierunek):

wiadomość = ciąg ()

pub = rospy. Publisher('robot', String, queue_size=10)

rospy.init_node('talker', anonymous=True)

wiadomość = kierunek

rospy.loginfo(wiadomość)

pub.opublikuj(wiadomość)"

„mówca (kierunek)”

W załączniku znajduje się skrypt kamery Pi.

Krok 4: Robot Arduino

Ostatnim krokiem jest skrypt programu robota.

Jest to napisane w C++ i jest plikiem.ino dla arduino uno. Program wymaga biblioteki ros, którą można znaleźć w menedżerze bibliotek w ide. Po zaimportowaniu są pliki przykładowe, zdecydowałem się rozwinąć plik migania diody LED, ponieważ przyniosłoby to podobny cel do tego, czego potrzebowałem. Program kontynuuje pętlę aż do odłączenia zasilania, najpierw nasłuchuje tematu robota, kiedy przechwyci polecenie z tego tematu, będzie miał instrukcję if, aby zobaczyć, co mówi polecenie. Jeśli polecenie zostanie pozostawione, skrypt uruchomi metodę skrętu w lewo, jeśli polecenie ma rację, uruchomi metodę skrętu w prawo, a w przeciwnym razie uruchomi metodę naprzód. Te trzy metody są bardzo podobne do siebie, mówią cyfrowym pinom, aby były albo LOW (uziemienie), albo 100 (PWM), aby robot nie był zbyt szybki, mówiąc sterownikowi silnika, aby pozwolił tylko trochę napięcie wyjściowe. Kolejność tych wyjść powoduje, że robot skręca w lewo i w prawo lub porusza się do przodu, jest to spowodowane orientacją napięcia docierającego do silników.

W załączniku znajduje się skrypt.ino dla arduino.

Krok 5: Testowanie

Testowanie
Testowanie
Testowanie
Testowanie
Testowanie
Testowanie

Obrazy załączone więc projekt od początku do końca. Pierwszy obraz przedstawia proces szkolenia. Gdy to się skończy, pojawi się wydruk wykonanego modelu. Trzeci obraz przedstawia prognozę ze skryptu szkoleniowego. to jest ostatni etap skryptu szkoleniowego. Jeśli zajrzysz do folderu, w którym znajduje się skrypt szkoleniowy, sporządzono wykres i model. Wykres powinien wyglądać jak obrazek 4 tutaj, pokazuje historię treningu od początku do końca.

Ostateczny obraz jest podczas uruchamiania skryptu kamery pi, jest to strumień na żywo z kamery pi. prognoza jest wykonywana na każdej ramce i prognoza jest drukowana w terminalu. Ramka pokazuje, co widzi kamera.

W załączeniu mój raport uniwersytecki dotyczący tego projektu. Proszę przeczytać więcej szczegółów na temat projektu.

Krok 6: Wszystkie dodatkowe pliki

Wszystkie dodatkowe pliki
Wszystkie dodatkowe pliki

Niektóre z nich to pliki testowe, które stworzyłem po drodze.

Zalecana: