7.1. Mi az a neurális hálózat¶
A neurális hálózat olyan algoritmus, amelynek viselkedését példákból tanulja, nem pedig kézzel programozzák be. Ugyanaz a hálózati architektúra egymillió arc képével betanítva megtanul arcokat észlelni. Ugyanaz az architektúra egymillió kéz képével betanítva megtanul kezeket észlelni. Ugyanaz az architektúra sokféle objektumkategóriát lefedő címkézett halmazzal betanítva megtanulja mindegyiket egyszerre észlelni. A célok között csak a súlyok változnak, a súlyokat pedig egy eszközön kívüli betanítási folyamat állítja elő, amely a hálózat előrejelzéseit címkézett példákkal veti össze, és addig módosítja a súlyokat, amíg azok meg nem egyeznek.
7.1.1. A működési elv¶
A neurális hálózat rétegek halmaza. Minden réteg megszorozza az előző réteg kimenetét egy súlyokból álló mátrixszal, hozzáad egy eltolásvektort, majd az eredményre egy nemlineáris függvényt alkalmaz. Az egyik réteg kimenete a következő réteg bemenete. Egy rögzített kép a halmaz tetején lép be, lefelé áramlik tíz vagy száz rétegen keresztül, és az alján egy olyan tenzorként bukkan elő, amelynek elemei azt írják le, mi volt a képen.
Az, hogy az egyes rétegek súlyai mit tesznek, attól függ, mire tanították be a hálózatot. Egy látórendszerben a korai réteg súlymátrixa például egy rövid vízszintes élre tüzelhet; egy kicsivel mélyebb réteg egy sarokra; egy még mélyebb egy kör alakú szemformára; a legmélyebb rétegek pedig egész arc elrendezésekre. Ezek közül semmit sem írtak meg kézzel. A betanítási folyamat sokmilliós címkézett példán iterált, a súlyokat egy veszteségfüggvény lejtőjén lefelé tolta, és az él–majd–sarok–majd–szem–majd–arc hierarchia magától kibontakozott az adatokból.
Egy kis osztályozó hálózat rétegek halmazaként. A bemeneti tenzor a tetején lép be a rögzített kép alakjával, és lefelé áramlik a rétegeken keresztül, amelyek mindegyike átalakítja a tenzor dimenzióit. Az alján lévő kimeneti tenzornak osztályonként egy eleme van. Az észlelő és kulcspont-hálózatok ugyanezt a rétegek halmaza formát követik; csak a kimeneti tenzor értelmezése változik.¶
A hálózat architektúrája – ahogyan a rétegek el vannak rendezve, és milyen műveletek kötik össze őket – határozza meg, mit képes a hálózat tenni. A súlyok azt jelentik, amit a hálózat megtanult. A kamera szerepe ebben az, hogy betöltse a betanítás során előállított súlyfájlt, és ugyanazt a számítást futtassa, amit a betanító futtatott, csak a betanítási halmaz helyett a rögzített képkockán.
7.1.2. Mi kerül be, mi jön ki¶
A hálózat mindkét vége tenzor – számok többdimenziós tömbje, ugyanaz a fajta objektum, amelyet a numpy fejezet épp most mutatott be. Egy látórendszer bemeneti tenzora a rögzített kép, átrendezve abba az elrendezésbe, amelyet a hálózat elvár: jellemzően egy (B, H, W, C) négyestagú alak, ahol B a köteg dimenziója (a kamerán mindig 1, mivel egyszerre egy képkockát dolgozunk fel), H és W a hálózat által elvárt képpontmagasság és -szélesség, C pedig a csatornák száma (3 egy RGB hálózatnál, 1 szürkeárnyalatosnál).
A kimeneti tenzor attól függ, mire való a hálózat:
Egy osztályozó hálózat egydimenziós megbízhatósági pontszámokból álló tenzort állít elő, osztályonként egyet. A legnagyobb pontszám indexe az előrejelzett osztály. A legtöbb kamerára telepített, MobileNet alapú személyészlelő ilyen formájú: két pontszám, egy a „személy”, egy a „nem személy” osztályhoz.
Egy észlelő hálózat kétdimenziós tenzort állít elő, amelynek elemei határoló dobozok listáját és osztályvalószínűségeket írnak le. A YOLOv8 ilyen formájú: egy
(84, N)tenzor, ahol a 84 sorból 4 doboz-regressziós érték, a másik 80 pedig osztályonkénti valószínűség,Nrögzítési pozíción át megismételve.Egy kulcspont hálózat olyan tenzort állít elő, amelynek elemei elnevezett tereppontok képpontpozíciói. A MediaPipe arc-tereppont modell ilyen formájú: észlelt arconként 468 kulcspont.
Egy szegmentáló hálózat kétdimenziós tenzort állít elő, amelynek elemei képpontonkénti osztálycímkék – ugyanazok a méretek, mint a bemenet, minden pozícióban egy kategóriaindexszel.
Egy regressziós hálózat egyetlen számot vagy egy rövid számvektort állít elő – egy mélységbecslést, egy szöget, egy hőmérsékletet.
Minden formának megvan a maga utófeldolgozója a kamerán, amely a nyers kimeneti tenzort visszaalakítja azzá az eredményformává, amelyet az alkalmazás többi része használ – határoló dobozokká, kulcspontlistákká, osztálycímkékké, numerikus becslésekké. Az utófeldolgozó alkalmazásoldali kód, amely ismeri a hálózat kimeneti elrendezését; maga a hálózat csak az a számítás, amely a tenzort előállítja.
7.1.3. Miért működik ez egy kamerán¶
Két számítási elem teszi ezt gyakorlatban kivitelezhetővé egy mikrokontroller osztályú alkatrész számára. Az első a kvantálás. A betanítás 32 bites lebegőpontos számokkal történik; a következtetés 8 bites egész számokkal futhat, a legtöbb hálózatnál szinte semmilyen pontosságvesztés nélkül. A nyolcbites súlyok a tárhely negyedét foglalják el, és többszörösen gyorsabban futnak, mint a 32 bites lebegőpontosak. A kamerára telepített minden modellt már eszközön kívül kvantáltak.
A második a hardveres gyorsítás. Ugyanazt a számítást, amelyet egy mikrokontroller CPU-ja utasításonként, egyesével végez el, egy neurális hálózati gyorsító több száz műveletet egyszerre futtatva végzi el. Az újabb kamerák (az AE3 és az N6) dedikált neurális feldolgozóegységgel (NPU) – egy tenzorgyorsítóval a SoC-n – rendelkeznek, amely egy olyan modellt, amelynek futtatása a CPU-n egy másodpercig tartott volna, néhány tíz ezredmásodperc alatt futóvá tesz. A Következtetési motorok fejezet azt tárgyalja, hogy ennek mi a kamera oldali része.
7.1.4. Mit tárgyal a fejezet¶
A betanítás nem a kamera feladata. Egy betanított modell .tflite fájlként érkezik a kamerára; a kamera betölti, minden rögzített képkockát átfuttat rajta, és a kapott tenzort olyan eredménnyé dekódolja, amelyre az alkalmazás reagálhat. Minden, ami ezután következik, ezekről a lépésekről szól:
egy modell betöltése és vizsgálata;
a flash partíció, ahol a modellfájlok találhatók;
egy következtetési hívás négy szakasza;
a motorok, amelyek ténylegesen elvégzik a számítást;
és az utófeldolgozók, amelyek egy kimeneti tenzort visszaalakítanak dobozok, kulcspontok vagy osztályok listájává.
A kép fejezetben szereplő észlelők mindegyike egy adott célra volt szabva. Azokat, amelyeket a fejezet többi része tárgyal, ehelyett adatokból tanítják be, ugyanazzal a motorral futtatva bármilyen modellt, amelyet a szkript betölt. A velük járó munkafolyamat-változás – egy célspecifikus algoritmust egy célspecifikus súlyfájl vált fel – a következő dolog, amelyet ki kell emelnünk.