Spisu treści:
- Krok 1: Wideo
- Krok 2: Sprzęt
- Krok 3: Fragment kodu
- Krok 4: Uzyskiwanie obrazów
- Krok 5: Narzędzia i używany język
- Krok 6: Przygotowanie zestawu danych do szkolenia
- Krok 7: Sieć neuronowa
- Krok 8: Trening sieci neuronowej
- Krok 9: Testowanie sieci neuronowej
- Krok 10: Wynik i następna część…
- Krok 11: Wykrywanie obiektów
- Krok 12: Wideo
- Krok 13: Etykietowanie
- Krok 14: Etykietowanie GUI
- Krok 15: Potrzebne biblioteki
- Krok 16: Pozostałe komórki
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-13 06:58
Kilka dni temu doznałem kontuzji nadgarstka prawej ręki na siłowni. Potem za każdym razem, gdy używałem myszy komputerowej, powodowało to wiele bólu z powodu dużego kąta nachylenia nadgarstka.
Wtedy dotarło do mnie „czy nie byłoby wspaniale, gdybyśmy mogli przekształcić dowolną powierzchnię w gładzik” i nie wiem dlaczego, ale z jakiegoś powodu pomyślałem o niej, o filmie ONA, pozwolę wam to rozgryźć na zewnątrz. To była ekscytująca myśl, ale nie wiedziałem, czy dam radę, postanowiłem spróbować.
Ten artykuł pokazuje, co z tego wyszło.
Zanim zaczniemy, mam zastrzeżenie-
Na końcu tego artykułu nie mogłem przekształcić żadnej powierzchni w gładzik, ale niewiele się nauczyłem i dodałem duże narzędzia do mojego arsenału. Mam nadzieję, że tobie też się przydarzy”
Zacznijmy.
Krok 1: Wideo
Oto mały 5-minutowy film obejmujący wszystkie kroki. Spójrz.
Krok 2: Sprzęt
Ustawiam raspberry pi wraz z kamerą raspberry pi na wysokości około 45 cm. Daje nam to obszar monitorowania około 25x25 cm pod kamerą.
Kamery Raspberry pi i raspberry pi są łatwo dostępne, wystarczy go wygooglować i powinieneś być w stanie znaleźć lokalny sklep.
Spójrz na ten link lub jedną z moich list odtwarzania Raspberry pi, aby uruchomić bezgłowe pi.
Po tej konfiguracji potrzebujemy fragmentu kodu, który określi, czy w obszarze, który monitoruje kamera, znajduje się ręka, a jeśli tak, to gdzie ona jest.
Krok 3: Fragment kodu
Fragment kodu, który pozwala nam zdecydować, czy istnieje ręka w obszarze zainteresowania, wykorzystuje coś, co nazywa się siecią neuronową. Należą do kategorii programowania, w której nie definiujemy reguł podejmowania decyzji, ale pokazujemy sieci neuronowej wystarczająco dużo danych, aby sama ustalała reguły.
W naszym przypadku zamiast kodować, jak wygląda ręka, pokazujemy obrazy sieci neuronowej przechwycone z raspberry pi, która zawiera rękę i która nie zawiera ręki. Ta faza nazywana jest uczeniem sieci neuronowych, a używane obrazy nazywane są uczącym zbiorem danych.
Krok 4: Uzyskiwanie obrazów
Zdalnie zalogowałem się do mojego raspberry pi i przechwyciłem kilka obrazów za pomocą następującego polecenia.
sudo raspistill -w 640 -h 480 -rot 90 -t 250000 -t1 5000 -o frame%04d.jpg
Zrobiłem 80 zdjęć ręką i 80 zdjęć, które nie zawierają ręki. 160 obrazów to za mało, aby prawidłowo wytrenować sieć neuronową, ale powinno wystarczyć do weryfikacji koncepcji.
Oprócz 160 obrazów, zrobiłem jeszcze 20 obrazów, aby przetestować naszą sieć po jej przeszkoleniu.
Gdy zestaw danych był gotowy, zacząłem pisać kod dla sieci neuronowej.
Krok 5: Narzędzia i używany język
Napisałem swoją sieć neuronową w bibliotece głębokiego uczenia Pythona o nazwie Keras, a kod pisałem na notatniku jupyter z anaconda navigator.
Krok 6: Przygotowanie zestawu danych do szkolenia
Najpierw (zdjęcie nr 1) zawarłem wszystkie biblioteki potrzebne do tego projektu, w tym PIL, matplotlib, numpy, os i Keras. W drugiej komórce notatnika Pythona (zdjęcie #2) określam ścieżki do zbioru danych i drukuję liczbę próbek. Teraz musimy załadować wszystkie obrazy do tablicy numpy, stąd w trzeciej komórce (Image #2) utworzyłem tablicę numpy 82 (liczba próbek z ręki) + 75 (liczba próbek innych niż ręcznie), tj. 157x100x100x3. 157 to całkowita liczba obrazów, które mam, 100x100 to nasz rozmiar obrazu o zmienionym rozmiarze, a 3 to warstwy koloru czerwonego, zielonego i niebieskiego w obrazie.
W czwartej i piątej komórce ładujemy obrazy zawierające hand, a następnie obrazy, które nie zawierają hand w tablicy numpy. W szóstej komórce dzielimy każdą wartość przez 255, co ogranicza zakres wartości od 0 do 1. (Zdjęcie #3)
Przepraszam, jeśli załączone obrazy nie są wystarczająco dobre. Oto link do repozytorium GITHUB, aby zapoznać się z kodem. Nie zapomnij zastąpić nazw ścieżek katalogów swoją ścieżką:).
Przeprowadzka.
Następnie musimy oznaczyć każdy obraz, więc tworzymy jednowymiarową tablicę numpy o długości 157. Pierwsze 82 wpisy są ustawione na 1, a pozostałe 75 wpisów jest ustawione na 0, przekazując sieć neuronową, że pierwsze 82 obrazy pochodzą z jednej klasy, a pozostałe z innej. (Obraz #4)
Teraz stwórzmy sieć neuronową.
Krok 7: Sieć neuronowa
W dziewiątej komórce definiujemy naszą sieć neuronową. Zawiera trzy powtórzenia warstwy splotu, a następnie warstwy maxpool z odpowiednio 8, 12 i 16 filtrami splotu. Dalej mamy dwie gęste sieci neuronowe. Dołączam dwa obrazy do tego kroku. Pierwszy to snap kodu, który tworzy sieć neuronową, a drugi to obrazowa reprezentacja sieci neuronowej z wymiarem wyjściowym i adnotacjami operacji.
Krok 8: Trening sieci neuronowej
W dziesiątej komórce konfigurujemy optymalizator sieci neuronowej na „adam”, a funkcję straty na „binary_crossentropy”. Odgrywają główną rolę w sposobie aktualizacji wag sieci. W końcu, kiedy uruchamiamy jedenastą komórkę, sieć neuronowa zaczyna trenować. Podczas gdy sieć trenuje, spójrz na funkcję straty i upewnij się, że maleje.
Krok 9: Testowanie sieci neuronowej
Po wytrenowaniu sieci neuronowej musimy przygotować zestaw danych testowych. Powtarzamy procedurę przygotowaną w celu przygotowania zestawu uczącego w 3, 4, 5 i 6 komórce na danych testowych w celu utworzenia zestawu testowego. Przygotowujemy również etykietę dla zestawu testowego, ale tym razem uruchamiamy model na tym zestawie danych, aby uzyskać prognozy, a nie trenować.
Krok 10: Wynik i następna część…
Uzyskałem dokładność testu na poziomie 88%, ale traktuj to z przymrużeniem oka, ponieważ zbiory danych używane do trenowania i testowania tego modelu są bardzo, bardzo małe i nieodpowiednie do prawidłowego trenowania tego modelu.
W każdym razie mam nadzieję, że podobał Ci się ten artykuł. Moja intencja stojąca za tym ćwiczeniem nie jest jeszcze kompletna i uważaj na drugą część. Wrzucę jak najszybciej.
W następnej części wytrenujemy kolejną sieć neuronową, która powie nam położenie ręki na obrazie wykrytym przez rękę.
Wszelkie zapytania są mile widziane.
Jeśli ktoś jest zainteresowany wykorzystaniem mojego małego zestawu danych, daj mi znać w komentarzach. Udostępnię to.
Dziękuje za przeczytanie. Do zobaczenia wkrótce z drugą częścią do tego czasu dlaczego nie stworzysz i nie wytrenujesz sieci neuronowej.
Edycja: - Kolejne kroki dotyczą drugiej części.
Krok 11: Wykrywanie obiektów
W poprzednich krokach stworzyliśmy NN, który mówi nam, czy obraz testowy zawiera rękę, czy nie. Co dalej? Jeśli NN zaklasyfikuje obraz jako zawierający rękę, chcielibyśmy wiedzieć, gdzie znajduje się ręka. W literaturze dotyczącej wizji komputerowych nazywa się to wykrywaniem obiektów. Więc nauczmy NN, który robi dokładnie to samo.
Krok 12: Wideo
3-minutowy film wyjaśniający wszystkie pozostałe kroki. Spójrz.
Krok 13: Etykietowanie
Jeśli chcesz, aby sieć neuronowa wyświetlała położenie ręki, musimy ją wyszkolić w taki sposób, tj. w przeciwieństwie do poprzedniej sieci neuronowej, w której każdy obraz został oznaczony jako z ręką lub bez ręki. Tym razem wszystkie obrazy z ręką będą miały cztery etykiety odpowiadające przekątnym współrzędnym obwiedni wokół ręki na tym obrazie.
Załączony obraz pliku csv zawiera etykietę dla każdego obrazu. Należy pamiętać, że współrzędne są znormalizowane z wymiarem obrazu, tj. jeśli górna współrzędna X jest na 320 pikselu w obrazie o szerokości 640 pikseli, oznaczymy ją jako 0,5.
Krok 14: Etykietowanie GUI
Możesz się zastanawiać, jak udało mi się oznaczyć wszystkie 82 obrazy, cóż, napisałem GUI w Pythonie, który pomógł mi w tym zadaniu. Po załadowaniu obrazu do GUI. Kliknąłem lewym przyciskiem na górną współrzędną, a prawym przyciskiem na dolną współrzędną prawdopodobnego pola ograniczającego wokół dłoni. Te współrzędne są następnie zapisywane do pliku, po czym klikam przycisk Dalej, aby załadować następny obraz. Powtórzyłem tę procedurę dla wszystkich 82 obrazów pociągów i 4 testowych. Gdy etykiety były gotowe, nadszedł czas szkolenia.
Krok 15: Potrzebne biblioteki
Najpierw musimy załadować wszystkie potrzebne biblioteki. Obejmujący
- PIL do manipulacji obrazem,
- matplotlib do kreślenia,
- numpy dla działania macierzy,
- os dla funkcji zależnych od systemu operacyjnego i
- Keras dla sieci neuronowych.
Krok 16: Pozostałe komórki
W 2., 3., 4. i 5. komórce ładujemy obrazy do tablicy numpy i tworzymy czterowymiarową tablicę z pliku csv, która będzie działać jako etykiety. W komórce numer 6 tworzymy naszą sieć neuronową. Jej architektura jest identyczna z siecią neuronową używaną do klasyfikacji, z wyjątkiem wymiaru warstwy wyjściowej, który wynosi 4, a nie 1. Kolejna różnica wynika z zastosowanej funkcji straty, którą jest błąd średniokwadratowy. W komórce numer 8 zaczynamy trenować naszą sieć neuronową. Po przeszkoleniu uruchomiłem ten model na zestawie testowym, aby uzyskać prognozy dla pola granicznego na nakładające się współrzędne pola granicznego, które wyglądały całkiem dokładnie.
Dziękuje za przeczytanie.