aneb trochu techničtější popis.

Celý provoz třídičky má 2 fáze – učení a vlastní provoz

Učení

Jádrem třídičky je neuronová síť naučená na rozpoznávání obrázků. Takže ze všeho nejdřív je potřeba takovou síť mít.

Při učení dostane neuronová síť hromadu obrázků. Ke každému obrázku má poznamenáno, co na něm je – ať barva, nebo „placka 1×1“. Počítač nejprve zkusí všechny obrázky určit a zjistí, jak dobře (nebo spíš špatně) mu to jde. Potom zkusí neuronovou síť trochu pozměnit a ověří, jestli to dopadlo lépe než před tím. Pokud ano, tak je to výborné, zkusíme to zase trochu zlepšit. Když to takhle děláme dostatečně dlouho, dostaneme síť, která dává slušné výsledky.

Než začne síť dávat nějaké rozumné výsledky, trvá to dost dlouho. Ale spoustu času si člověk může ušetřit, když vezme už existující síť a jen ji „doučí“. Já vycházím ze sítě ResNet34.

I tak trvá učení dlouho, pokud nemáte grafickou kartu NVidia. Já používám poměrně hodně starou – GeForce GTX 760. Na hraní her už to není, ale na neuronové sítě to ještě jakž takž jde. I tak trvá učení několik hodin.

Když máme naučeno, můžeme se dát do vlastního třídění.

Malá vsuvka – kulaté díly

Než nasypeme směs dílků do třídičky, zbavíme se dílků kulatých. Ty mají jednu ošklivou vlastnost – kutálejí se. Všude a pořád. Takže padají všude kolem, i do krabiček na vytříděné díly. To je ovšem na samostatný článek.

Více o vytřídění kulatých dílů

Třídění

Třídění probíhá v několika fázích. Nejprve nasype podavač dílky na pás. Ty projíždějí před kamerou, která průběžně posílá fotky na server. Ten fotky vyhodnocuje a pokud najde něco zajímavého, odešle pokyn pro jeden z motorů, aby dílek sešťouchl z pásu.

Protože mám aktuálně 4 servomotory (tj. mohu třídit do osmi přihrádek), je třeba třídit postupně. Nejprve hrubé roztřídění (kostky, placky, technic, figurky…), potom jemnější (placky podle velikosti apod.).

Podíváme se podrobněji na jednotlivé fáze.

Podavač a pás

Nejdřív je potřeba dostat dílky před kameru. K tomu slouží podavač.

násypka

Ač se to možná nezdá, jde o jednu z nejzáludnějších částí. Dílky je potřeba sypat na pás dost rychle (aby se třídička neflákala), ale zároveň v dostatečných odstupech, aby šťouchadla nesrážela víc dílů najednou.

Jakmile máme dílky na pásu, pokusíme se je srovnat do řady. Pokud jsou vedle sebe, mají tendenci jet spolu i ke kameře, což nechceme. K tomu slouží srovnávací lamely. Nefunguje to vždy, ale pomáhá to dostatečně.

Srovnávací lamely

Dílky jsou na pásu, ale pořád dost blízko u sebe. Takže je shodíme na další pás, který jede rychleji. Tím získáme dostatečné rozestupy.

Pás je jedna z částí, které nejsou LEGO. LEGO prostě vhodné pásy nevyrábí. Najít něco vhodného mi trvalo poměrně dlouho, zkoušel jsem leccos. Duše z různých kol, všemožné plátěné pruhy, duši z motorky… Nakonec jsem skončil u zdravotnických škrtidel.

Kamera

Dílky jsou na pásu, takže můžeme pořizovat obrázky.

O snímání obrázků se stará RaspberryPi se systémovou kamerou. Pro použití zrovna RaspberryPi byl jediný důvod – s Raspberry jsem si hrál v rámci měření hladiny vody v jímkách na dešťovku (i k tomu možná jednou něco napíšu). A když už jsem to měl doma…

Kamera

Kamera je umístěna v šedém uzavřeném boxu, aby nedocházelo k příliš velkému zkreslování barev. Dílky před ní postupně projíždějí. Pořizuje se zhruba 10 snímků za vteřinu. Snímky se opatří časovým razítkem a odesílají se serveru na vyhodnocení.

Vyhodnocení

Vyhodnocení provádí starší počítač s již zmíněnou NVidia kartou. Pro vlastní vyhodnocování se často grafická karta nepoužívá – na procesoru té postarší mašiny to trvá necelou vteřinu, což je pro běžné aplikace dostatečné. Já ale potřebuji zpracovat deset snímků za vteřinu, takže grafická karta potřeba je.

Nejprve se vyhodnotí prostřední pětadvacetina obrázku. Pokud neuronová síť vyhodnotí, že tam nic není, obrázek se zahodí a čeká se na další. To má jednoduchý důvod – pokud dílek zasahuje doprostřed obrázku, dá se předpokládat, že je na fotce celý, ne jenom růžek.

Pak vezmeme celý obrázek a provedeme vyhodnocení dvěma neuronovými sítěmi. Jedna rozpozná, co na obrázku je. Druhá řekne, KDE to na obrázku je. Z toho se spočítá, kdy bude (byl) dílek uprostřed obrázku. To je důležité – šťouchadla jsou užší, než je zorné pole kamery. Bez této korekce by mnohem častěji máchla do prázdna.

Klasifikaci převede podle mapovací tabulky na číslo krabičky, kam díl patří. Nakonec se výsledek a korigovaný čas odešle zpět na RaspberryPi.

Obrázeky s doplněnými klasifikacemi navíc streamuje, aby šly průběžně zobrazovat. Na příkladu je vidět správně určená kategorie „placka“, přesnější kategorie „placka 2×2 s výkusem“ a orámovaná poloha dílku.

Vyhodnocený dílek
Vyhodnocený dílek

Sešťouchnutí z pásu

Šťouchadla je asi zbytečné sáhodlouze popisovat, lepší bude obrázek:

Šťouchadlo

K Raspberry je připojena LEGO NXT kostka, která slouží jako controller pro servomotory. To je možná zbytečně komplikované, ale je to dáno snahou použít co nejméně neLEGO dílů.

Raspberry tedy přijme požadavek ze serveru na sešťouchnutí. Podle čísla krabičky určí příslušný motor a směr otáčení a spočítá potřebné zpoždění (tj. za jak dlouho díl dojede ke správnému šťouchadlu). Pak už jen čeká na vhodný okamžik a vydá NXT kostce příkaz k otočení motorem.

NXT kostky jsou aktuálně připojeny 2. Každá má své vlastní řídící Raspberry. Nepodařilo se mi totiž připojit dvě NXT na jednu USB sběrnici. Použít druhé Raspberry bylo jednodušší než hledat chybu v cizí, dávno opuštěné knihovně.

No, a to je celé…

Za zmínku ještě stojí, že k sešťouchnutí dojde pouze pokud si je neuronová síť dostatečně jistá – alespoň na 90%. Pokud tomu tak není, nechá raději dílek projet do neroztříděných. Ty pak znovu nasypu do násypky a celé to pokračuje znovu.