Obsah:
- Krok 1: Video
- Krok 2: Hardware
- Krok 3: Kus kódu
- Krok 4: Získávání obrázků
- Krok 5: Použité nástroje a jazyk
- Krok 6: Příprava datové sady na školení
- Krok 7: Neuronová síť
- Krok 8: Školení neuronové sítě
- Krok 9: Testování neuronové sítě
- Krok 10: Výsledek a další část…
- Krok 11: Detekce objektů
- Krok 12: Video
- Krok 13: Označování
- Krok 14: Označení GUI
- Krok 15: Potřebné knihovny
- Krok 16: Zbývající buňky
2025 Autor: John Day | [email protected]. Naposledy změněno: 2025-01-13 06:57
Před pár dny jsem si v posilovně poranil zápěstí pravé ruky. Poté pokaždé, když jsem použil počítačovou myš, způsobila mi to velkou bolest kvůli strmému úhlu zápěstí.
Tehdy mě napadlo „nebylo by skvělé, kdybychom mohli převést jakýkoli povrch na trackpad“a nevím proč, ale z nějakého důvodu jsem na ni myslel, film JE, nechám vás, lidi ven. Byla to vzrušující myšlenka, ale nevěděl jsem, jestli to dokážu, rozhodl jsem se to zkusit.
Tento článek zachycuje, co z toho vzešlo.
Než začneme, mám prohlášení-
"Na konci tohoto článku jsem nemohl převést žádný povrch na trackpad, ale moc jsem se toho nenaučil a do svého arzenálu jsem přidal velké nástroje." Doufám, že se to stane i tobě '
Začněme.
Krok 1: Video
Zde je malé 5minutové video pokrývající všechny kroky. Podívej se.
Krok 2: Hardware
Nastavil jsem malinový pi spolu s malinovým pi fotoaparátem ve výšce asi 45 cm. To nám dává monitorovací plochu asi 25 x 25 cm pod kamerou.
Fotoaparát Raspberry Pi a Raspberry Pi jsou snadno dostupné, stačí si jej vygooglit a měli byste najít místní obchod.
Podívejte se na tento odkaz nebo na jeden z mých seznamů skladeb Raspberry pi, abyste mohli spustit bezhlavé pi.
Po tomto nastavení potřebujeme kus kódu, který rozhodne, zda je v oblasti, kterou kamera monitoruje, ruka, a pokud ano, kde je.
Krok 3: Kus kódu
Kus kódu, který nám umožňuje rozhodnout, zda existuje oblast zájmu, používá něco, co se nazývá Neurální síť. Spadají do kategorie programování, kde nedefinujeme pravidla pro rozhodování, ale ukazujeme neuronové síti dostatek dat, aby sama určila pravidla.
V našem případě místo kódování toho, jak vypadá ruka, zobrazujeme obrázky neuronových sítí zachycené z malinového pi, které obsahují hand a které neobsahují hand. Tato fáze se nazývá trénink neuronové sítě a použité obrázky se nazývají trénovací datová sada.
Krok 4: Získávání obrázků
Dálkově jsem se přihlásil ke svému malinovému pi a zachytil spoustu obrázků pomocí následujícího příkazu.
sudo raspistill -w 640 -h 480 -rot 90 -t 250000 -t1 5000 -o frame%04d.jpg
Zachytil jsem 80 obrázků rukou a 80 obrázků, které neobsahují ruku. 160 obrázků nestačí na řádné vycvičení neuronové sítě, ale mělo by stačit na důkaz konceptu.
Kromě 160 snímků jsem zachytil dalších 20 snímků, abych otestoval naši síť, jakmile bude vycvičena.
Jakmile byla datová sada připravena, začal jsem psát kód pro neuronovou síť.
Krok 5: Použité nástroje a jazyk
Napsal jsem svou neuronovou síť do pythonové knihovny pro hluboké učení s názvem Keras a kód je napsán na jupyterovém notebooku z anakonda navigátoru.
Krok 6: Příprava datové sady na školení
Nejprve (obrázek č. 1) Zahrnul jsem všechny knihovny potřebné pro tento projekt, což zahrnuje PIL, matplotlib, numpy, os a Keras. Ve druhé buňce notebooku Python (obrázek č. 2) definuji cesty k datové sadě a vytisknu počet vzorků. Nyní musíme načíst všechny obrázky do numpy pole, proto ve třetí buňce (obrázek č. 2) jsem vytvořil numpy pole 82 (počet ručních vzorků) +75 (počet non hand vzorků) tj. 157x100x100x3. 157 je celkový počet obrázků, které mám, 100x100 je náš rozměr obrázku se změněnou velikostí a 3 je pro červené, zelené a modré barevné vrstvy v obrázku.
Do čtvrté a páté buňky načteme obrázky obsahující hand následované obrázky, které v numpy poli neobsahují ruku. V šesté buňce rozdělíme každou hodnotu o 255, a proto je omezující rozsah hodnot od 0 do 1. (Obrázek č. 3)
Omlouvám se, pokud připojené obrázky nejsou dost dobré. Zde je odkaz na úložiště GITHUB, kde se můžete podívat na kód. Nezapomeňte nahradit názvy cest adresářů vaší cestou:).
Pohybující se podél.
Dále musíme každý obrázek označit, takže vytvoříme jednorozměrné numpy pole o délce 157. Prvních 82 záznamů je nastaveno na 1 a zbývajících 75 záznamů je nastaveno na 0, což vyjadřuje, že prvních 82 snímků pochází z jedné třídy a zbývající jsou z jiné. (Obrázek č. 4)
Nyní vytvoříme neuronovou síť.
Krok 7: Neuronová síť
V deváté buňce definujeme naši neuronovou síť. Obsahuje tři opakování konvoluční vrstvy následované maxpoolovými vrstvami s 8, 12 a 16 konvolučními filtry. Následně máme dvě husté neurální sítě. Pro tento krok připojujeme dva obrázky. První je zachycení kódu, který vytváří neuronovou síť, a druhá je obrazová reprezentace neuronové sítě s anotovanými výstupními dimenzemi a operacemi.
Krok 8: Školení neuronové sítě
V desáté buňce nakonfigurujeme optimalizátor neurální sítě na „adam“a ztrátovou funkci na „binary_crossentropy“. Hrají hlavní roli v tom, jak se aktualizují váhy sítě. Nakonec, když spustíme jedenáctou buňku, začne trénovat neurální síť. Zatímco síť trénuje, podívejte se na ztrátovou funkci a ujistěte se, že klesá.
Krok 9: Testování neuronové sítě
Jakmile je neuronová síť vycvičena, musíme připravit sadu testovacích dat. Opakujeme postup provedený k přípravě tréninkové sady ve 3., 4., 5. a 6. buňce na testovacích datech a vytvoříme testovací sadu. Připravujeme také štítek pro testovací sadu, ale tentokrát na této sadě dat spouštíme model, abychom získali předpovědi a ne abychom trénovali.
Krok 10: Výsledek a další část…
Dostal jsem přesnost testu 88%, ale vezměte to se špetkou soli, protože datová sada používaná k trénování a testování tohoto modelu je velmi velmi velmi malá a neadekvátní k správnému trénování tohoto modelu.
Každopádně doufám, že se vám tento článek líbil. Můj záměr za tímto cvičením ještě není úplný a dávejte si pozor na 2. část. Nahrám to hned, jak to bude možné.
V další části budeme trénovat další neuronovou síť, která nám řekne polohu ruky na ručně detekovaném obrázku.
Všechny dotazy jsou vítány.
Pokud má někdo zájem o využití mé malé datové sady, dejte mi vědět v komentářích. Zpřístupním.
Děkuji za přečtení. Brzy se uvidíme s druhou částí do té doby, proč nevytvoříte a nevycvičíte neuronovou síť.
Upravit:- Další kroky jsou pro druhou část.
Krok 11: Detekce objektů
V předchozích krocích jsme vytvořili NN, která nám říká, zda testovací obrázek obsahuje ruku nebo ne. No a co dál? Pokud NN klasifikuje obrázek jako obsahující ruku, chtěli bychom znát polohu ruky. V literatuře o počítačovém vidění se tomu říká detekce objektů. Pojďme tedy vycvičit NN, která dělá přesně to samé.
Krok 12: Video
3minutové video s vysvětlením všech zbývajících kroků. Podívej se.
Krok 13: Označování
Pokud chcete, aby neurální síť vydávala polohu ruky, musíme ji trénovat takovým způsobem, tj. Na rozdíl od předchozí neuronové sítě, kde byl každý obrázek označen buď rukou, nebo bez ruky. Tentokrát budou mít všechny obrázky s rukou čtyři popisky odpovídající diagonálním souřadnicím ohraničujícího rámečku kolem ruky na tomto obrázku.
Připojený obrázek souboru CSV obsahuje popisek pro každý obrázek. Upozorňujeme, že souřadnice jsou normalizovány s rozměrem obrázku, tj. Pokud je horní souřadnice X na 320. pixelu v obrázku o šířce 640 pixelů, označíme jej jako 0,5.
Krok 14: Označení GUI
Možná se ptáte, jak se mi podařilo označit všech 82 obrázků, napsal jsem GUI v pythonu, které mi s tímto úkolem pomohlo. Jakmile je obrázek načten v GUI. Klikl jsem levým tlačítkem na horní souřadnici a pravým tlačítkem na dolní souřadnici pravděpodobného ohraničujícího rámečku kolem ruky. Tyto souřadnice se poté zapíší do souboru, po kterém kliknutím na tlačítko Další načtu další obrázek. Tento postup jsem zopakoval pro všech 82 vlakových a 4 testovací obrázky. Jakmile byly štítky připraveny, nastal čas školení.
Krok 15: Potřebné knihovny
Nejprve musíme načíst všechny potřebné knihovny. Který zahrnuje
- PIL pro manipulaci s obrázky,
- matplotlib pro vykreslování,
- numpy pro maticový provoz,
- os pro funkce závislé na operačním systému a
- keras pro neuronovou síť.
Krok 16: Zbývající buňky
Ve 2., 3., 4. a 5. buňce načteme obrázky do numpy pole a vytvoříme čtyřrozměrné pole ze souboru csv, které bude fungovat jako popisky. V buňce číslo 6 vytváříme naši neuronovou síť. Jeho architektura je identická s neuronovou sítí používanou pro klasifikaci s výjimkou dimenze výstupní vrstvy, která je 4 a ne 1. Další rozdíl pochází z použité ztrátové funkce, což je střední kvadratická chyba. V buňce číslo 8 začínáme trénovat naši neuronovou síť, jakmile jsme vyškolili, spustil jsem tento model na testovací sadě, abych získal předpovědi pro ohraničující rámeček na překrývajících se souřadnicích ohraničujícího rámečku vypadaly docela přesně.
Děkuji za přečtení.