7.1. Ce este o rețea neuronală

O rețea neuronală este un algoritm al cărui comportament este învățat din exemple, nu codat manual. Aceeași arhitectură de rețea, primind un milion de imagini cu fețe, învață să detecteze fețe. Aceeași arhitectură, primind un milion de imagini cu mâini, învață să detecteze mâini. Aceeași arhitectură, primind un set etichetat care acoperă numeroase categorii de obiecte, învață să le detecteze pe toate deodată. Doar ponderile se schimbă de la o țintă la alta, iar ponderile sunt produse de un proces de antrenare desfășurat în afara plăcii, care urmărește predicțiile rețelei comparativ cu exemplele etichetate și ajustează ponderile până când acestea se potrivesc.

7.1.1. Mecanismul

O rețea neuronală este o stivă de straturi. Fiecare strat înmulțește ieșirea stratului anterior cu o matrice de ponderi, adaugă un vector de polarizare și aplică o funcție neliniară asupra rezultatului. Ieșirea unui strat este intrarea următorului. O imagine captată intră în partea de sus a stivei, curge în jos prin zeci sau sute de straturi și iese în partea de jos ca un tensor ale cărui valori descriu ce se afla în imagine.

Ceea ce fac ponderile fiecărui strat depinde de ceea ce a fost antrenată rețeaua. O matrice de ponderi dintr-un strat timpuriu al unei rețele de viziune ar putea reacționa la o muchie orizontală scurtă; una puțin mai adâncă ar putea reacționa la un colț; una și mai adâncă ar putea reacționa la o formă circulară de ochi; cele mai adânci straturi ar putea reacționa la configurații întregi de fețe. Nimic din toate acestea nu a fost scris manual. Procesul de antrenare a iterat peste milioane de exemple etichetate, a împins ponderile în josul unei funcții de pierdere, iar ierarhia muchie-apoi-colț-apoi-ochi-apoi-față a rezultat din date.

O stivă verticală de nouă casete etichetate care reprezintă straturile unei rețele mici de clasificare. Caseta de sus este etichetată "Input image" cu o formă de tensor de (192, 192, 3). O săgeată coboară către o casetă "Conv + ReLU" cu forma (96, 96, 32). O altă săgeată duce către o a doua casetă "Conv + ReLU" cu forma (48, 48, 64). Urmează o casetă "MaxPool" cu forma (24, 24, 64). Urmează încă două casete "Conv + ReLU" cu formele (12, 12, 128) și (6, 6, 256). O casetă "Global average pool" are forma (256,). O casetă "Fully connected" are forma (1000,). Caseta de jos este etichetată "Class scores" cu forma (1000,). Fluxul tensorului este de sus în jos.

O rețea mică de clasificare sub forma unei stive de straturi. Tensorul de intrare intră în partea de sus cu forma imaginii captate și curge în jos prin straturi, fiecare dintre acestea transformând dimensiunile tensorului. Tensorul de ieșire de la bază are câte o valoare pentru fiecare clasă. Rețelele de detectare și de puncte-cheie au aceeași formă de stivă de straturi; se schimbă doar interpretarea tensorului de ieșire.

Arhitectura rețelei – modul în care sunt aranjate straturile, ce operații le conectează – reprezintă ceea ce rețeaua poate face. Ponderile reprezintă ceea ce rețeaua a învățat. Partea care îi revine camerei este să încarce fișierul de ponderi produs prin antrenare și să ruleze aceeași aritmetică pe care a rulat-o antrenorul, dar pe cadrul captat în loc de setul de antrenare.

7.1.2. Ce intră, ce iese

Ambele capete ale rețelei sunt tensori – tablouri multidimensionale de numere, același tip de obiect pe care capitolul despre numpy tocmai l-a introdus. Tensorul de intrare pentru o rețea de viziune este imaginea captată rearanjată în structura pe care o așteaptă rețeaua: de regulă o formă de 4-tuplu (B, H, W, C) unde B este dimensiunea lotului (întotdeauna 1 pe cameră, deoarece se procesează câte un cadru pe rând), H și W sunt înălțimea și lățimea în pixeli pe care le așteaptă rețeaua, iar C este numărul de canale (3 pentru o rețea RGB, 1 pentru tonuri de gri).

Tensorul de ieșire depinde de scopul rețelei:

  • O rețea de clasificare produce un tensor unidimensional de scoruri de încredere, câte unul pentru fiecare clasă. Indexul celui mai mare scor este clasa prezisă. Detectorul de persoane derivat din MobileNet care vine preinstalat pe majoritatea camerelor are această formă: două scoruri, unul pentru „person”, unul pentru „not person”.

  • O rețea de detectare produce un tensor bidimensional ale cărui valori descriu o listă de casete de încadrare plus probabilități de clasă. YOLOv8 are această formă: un tensor (84, N) în care 4 dintre cele 84 de rânduri sunt valori de regresie a casetei, iar celelalte 80 sunt probabilități pe clasă, repetate pentru N poziții de ancorare.

  • O rețea de puncte-cheie produce un tensor ale cărui valori sunt pozițiile în pixeli ale unor repere denumite. Modelul MediaPipe de repere faciale are această formă: 468 de puncte-cheie pentru fiecare față detectată.

  • O rețea de segmentare produce un tensor bidimensional ale cărui valori sunt etichete de clasă pentru fiecare pixel – aceleași dimensiuni ca intrarea, cu un index de categorie la fiecare poziție.

  • O rețea de regresie produce un singur număr sau un vector scurt de numere – o estimare de adâncime, un unghi, o temperatură.

Fiecare formă are propriul post-procesor pe cameră, care convertește tensorul de ieșire brut înapoi în forma de rezultat pe care o folosește restul aplicației – casete de încadrare, liste de puncte-cheie, etichete de clasă, estimări numerice. Post-procesorul este cod aflat de partea aplicației, care cunoaște structura de ieșire a rețelei; rețeaua în sine este doar aritmetica ce produce tensorul.

7.1.3. De ce funcționează acest lucru pe o cameră

Două elemente de aritmetică fac acest lucru practic pentru o componentă de clasa microcontrolerelor. Primul este cuantizarea. Antrenarea se desfășoară în aritmetică în virgulă mobilă pe 32 de biți; inferența poate rula în aritmetică pe numere întregi de 8 biți cu pierderi de acuratețe aproape nule pentru majoritatea rețelelor. Ponderile pe 8 biți ocupă un sfert din spațiul de stocare și rulează de câteva ori mai rapid decât numerele în virgulă mobilă pe 32 de biți. Fiecare model cu care vine camera a fost deja cuantizat în afara plăcii.

Al doilea este accelerarea hardware. Aceeași aritmetică pe care procesorul unui microcontroler o parcurge anevoios, câte o instrucțiune pe rând, un accelerator de rețele neuronale o rulează în sute de operații deodată. Camerele mai noi (AE3 și N6) dispun de o unitate de procesare neuronală (NPU) dedicată – un accelerator de tensori pe SoC – care transformă un model ce ar fi durat o secundă pe procesor într-unul care rulează în zeci de milisecunde. Capitolul despre motoarele de inferență acoperă cum arată partea care îi revine camerei.

7.1.4. Ce acoperă capitolul

Antrenarea nu este sarcina camerei. Un model antrenat ajunge pe cameră sub forma unui fișier .tflite; camera îl încarcă, rulează fiecare cadru captat prin el și decodează tensorul rezultat într-un rezultat asupra căruia aplicația poate acționa. Tot ce urmează se referă la fiecare dintre acești pași:

  • încărcarea și inspectarea unui model;

  • partiția de memorie flash unde se află fișierele de model;

  • cele patru etape ale unui apel de inferență;

  • motoarele care efectuează efectiv aritmetica;

  • și post-procesoarele care transformă un tensor de ieșire înapoi într-o listă de casete, puncte-cheie sau clase.

Detectoarele din capitolul despre imagine au fost fiecare delimitate la o anumită țintă. Cele pe care le acoperă restul acestui capitol sunt antrenate în schimb din date, același motor rulând orice model încarcă scriptul. Schimbarea fluxului de lucru care a venit odată cu ele – un algoritm specific unei ținte înlocuit de un fișier de ponderi specific unei ținte – este următorul lucru de evidențiat.