NEURONOVÉ SÍTĚ


Umělá inteligence se učí na umělých datasetech

Umělá inteligence je široký pojem, jehož velkou podmnožinou jsou neuronové sítě.

Autor:Vratislav Beneš, Head of Engineering OptiSolutions

Umělé neuronové sítě se obdobně jako mozek učí podle pozorování vzorů. Člověk, když se učí číst, poznává  nejdříve tištěná písmena, později ta psaná vlastní rukou a nakonec dokáže číst i rukopis jiných lidí. S rozvojem počítačů nedělá problém přečíst mnoho různých fontů písem. Dá se tedy říct, že s čím více různými typy písem se ve svém životě potká, tím bohatší má znalosti. Ví, že množina znaků {A, A, a, a} vždy znamená písmeno A. Obdobně tomu je i u jiných informací, jako je poznávání předmětů, zvuků, činností. Mozek hledá, co mají dané informace společného pro každou kategorii, kterou chceme rozlišit. Abychom rozlišili jablko od broskve, tak potřebujeme znát nejenom barvu a tvar, ale i jaký je povrch slupky (hladký lesklý vs chlupatý a matný). A stejně tomu je i při učení neuronových sítí. V případě, že chceme, aby správně detekovaly (klasifikovaly) jednotlivé objekty, musíme jim při učení předložit mnoho různých vzorů pro každou detekovanou kategorii (třídu).

Trénování sítě pro vizuální inspekci

Abychom naučili neuronovou síť rozpoznávat vady výrobků, potřebujeme každou vadu označit a říct trénovacímu algoritmu, kde ji najde. Tomu se říká anotování. Jedná se o zdlouhavý proces náročný na preciznost analytika. Znamená to projít stovky, lépe tisíce snímků a v nich vyznačit, která část snímku přísluší k dané třídě. Je nutné mít na paměti, jak se značily ostatní snímky, aby v anotování byla zachována kontinuita. Projekt s několika sítěmi pokrývající desítky tříd často spotřebuje stovky člověkodnů na anotování. 

Ukázka anotování v LOTYLDA DL

V praxi ale nastává problém s tím, že některé vady jsou velmi vzácné a existuje velmi malý nebo někdy i žádný podklad, který by šel použít pro trénování. Často se stává, že některá vada je pouze v katalogu vad, který jasně definuje, co se musí detekovat. Co ale dělat v případě, že nemáme k dispozici vzorky pro všechny typy vad? Nebo nemáme dostatečné množství vzorků? Musíme je vygenerovat. Někdy lze uzpůsobit výrobní technologie tak, aby generovala vady, ale někdy to možné není. V tom případě použijeme 3D CAD. Výsledek ale musí být co nejvíce podobný reálu, takže vyžadujeme fotorealistický render.

Ukázka reálného dílu (vlevo) a syntetického (render z Blenderu)

Blender – dokonalý pomocník

Blender je Open Source nástroj pro 3D grafiku. Umožňuje modelovat scénu, vytvářet textury a z nich materiály a scénu renderovat. Klíčová je možnost vše ovládat python skripty. Blender poskytuje mocné nástroje na modifikaci textur nebo deformaci objektů pomocí jiných objektů. Lze generovat různé škrábance, praskliny, skvrny. Co je ale zásadní – umožňuje generovat anotace k jednotlivým objektům.

Ale tím nejdůležitějším prvkem je člověk. Následující ukázky jsou tvořeny nadaným studentem Bournemouth University, oboru Computer Technical Arts, Petrem Draveckým. Jeho bratr Andrej psal skritpty pro generování anotací, a také propojil Blender s naší platformou LOTYLDA DL.

Data pro navádění robota

Trénování navigace robota je v současné době velmi častá úloha. Potřebujeme nasimulovat 1000 různých situací, ve kterých se robot musí umět orientovat. To je v reálném světě velmi nákladné a časově náročné. Lepší je nechat takovou scénu vygenerovat počítač. Klasickou úlohou může být bin picking. 

V našem případě chceme natrénovat robota, aby uměl vyzvednout lahev z KLT boxu. Nejdříve je nutné naučit systém rozpoznávat jednotlivé lahve. Vzhledem k faktu, že jsou všechny červené, je problematické využít pouze RGB snímek. Leckdy je vidět pouze velká červená beztvará hmota. Použijeme-li ještě LiDAR, získáváme další rozměr – hloubku.

Ukázka reálných lahví a renderovaných

Abychom v tomto případě získali potřebnou variabilitu, byly u lahví definovány fyzikální vlastnosti (hmotnost, pružnost, rozměry) a lahve byly před každým renderem vhozeny do bedny s náhodnou iniciální rotací. Na počítači s kartou RTX 3090 pak trval výpočet renderu 4s, což znamená, že dataset o velikosti 10 000 snímků byl vytvořen za 11h. Oproti tomu manuální označení jednoho snímku s 5 lahvemi trvá 2 min. A o snímání ani nemluvě. Jednoznačně je to úspora k nezaplacení…

Ukázka trénovacích dat pro navigaci robota vlevo RGB, vpravo depth mapa

Modifikování povrchů

V projektu pro monitorování vitality nosníku jsme potřebovali síť naučit rozpoznávat únavové trhliny v hliníku. V reálném světě taková trhlina dlouho neexistuje, jelikož je poškozený nosník neprodleně nahrazen novým. Musíme si tedy pomoci umělými daty.

K vytvoření parametricky modifikovatelné textury můžeme využít procedurálních textur. Ty na rozdíl od běžných nejsou vytvářeny umělecky, ale programově. Barva každého pixelu nevychází z fotky nebo kresleného obrázku, ale je výsledkem nějaké matematické funkce. Generování textur pro syntetické datasety využívá procedurální textury na to, aby každý objekt rozpoznalo, i když se jeho textura vždy trochu liší. V Blenderu se tohoto dociluje tak, že se vrství na sebe různé procedurální Noise (šum) textury. V případě nosníku je základní texturou barva kovu, na kterou jsou vrstvené různé fleky, škrábance a jiné povrchové vady.

Ukázka nosníku (vlevo) a detailu trhliny

Vedle trhlin bylo dalším úkolem monitorovat povolení šroubů a určit stupeň tohoto povolení. Existovala varianta vzít gola sadu a jít povolovat a následně utahovat šrouby (několik typů) nebo si je opět vygenerovat a anotovat. Stejně jako v předchozím případě se využívá generátoru náhodných čísel, kdy před každým renderováním je vygenerována rotace matice a její výška vůči nosníku. A k tomu samozřejmě i příslušná anotace.

Vyrendrované snímky s anotacemi (červená – závit pod matkou, fialová – nedotažená matka, oranžová – chybějící matka, modrá – limitně utažená matka, zelená – závit nad matkou)

Na ukázce je i patrná změna povrchu

Generování povrchových vad v objektech

Poslední ukázka je z projektu řešícího detekci poškození povrchů obráběných dílů. V praxi existuje velmi malé množství vzorků s vadami. Vzhledem k velikosti vady a její variabilitě byl vytvořen model celé optické soustavy a generovány všechny vady definované katalogem vad. Pro modifikování tělesa byla použita metoda tzv. Geometry Nodes. Její parametry jsou opět modifikovány pomocí generátoru náhodných čísel. V tomto projektu nestačí anotace formou bounding boxu, ale je nutný polygon ohraničující danou vadu.

Ukázka scény v Blenderu
Výsledek

Úspěšnost při střetu s reálným světem

Natrénovaná síť na datasetech tvořených pouze z fotorealistických renderů má velmi dobré výsledky. U zmiňované úlohy s nosníky a šrouby se úspěšnost pohybuje okolo 95 %. U obráběného dílu je kolem 98 %. Zvýšit úspěšnost sítě lze i rozšířením syntetických datasetů o reálné snímky (existují-li). Již 5 % reálných dat má signifikantní dopad na úspěšnost rozpoznání sítě.

Simulace testeru aneb jak si vše vyzkoušet nanečisto

Syntetické datasety výrazně urychlují trénování neuronových sítí. Výsledek je silně závislý na kvalitě 3D scény. Z našich testů jednoznačně vyplývá nutnost využívat fotorealistický render. Perfektní model lze také využít pro návrh celé optické soustavy (testery, navigace robota apod.). Znalostí používaných kamer, objektivů a světel lze docílit stejných podmínek jako v reálném prostředí. Máme-li i přesný 3D model testovaných objektů, vzniká tak digitální dvojče, ve kterém si můžeme dopředu odzkoušet různá nastavení, typy kamer a objektivů.

Před vlastní stavbou stroje pak můžeme mít k dispozici nejen odzkoušenou soustavu, ale rovnou i natrénované neuronové sítě. To vše výrazně zkracuje realizační dobu projektů.