7.1. Czym jest sieć neuronowa¶
Sieć neuronowa to algorytm, którego zachowanie jest wyuczone na podstawie przykładów, a nie zakodowane ręcznie. Ta sama architektura sieci, otrzymawszy milion obrazów twarzy, uczy się wykrywać twarze. Ta sama architektura, otrzymawszy milion obrazów dłoni, uczy się wykrywać dłonie. Ta sama architektura, otrzymawszy oznaczony etykietami zbiór obejmujący wiele kategorii obiektów, uczy się wykrywać je wszystkie naraz. Pomiędzy poszczególnymi celami zmieniają się jedynie wagi, a wagi te są wytwarzane przez zewnętrzny proces treningu, który porównuje predykcje sieci z oznaczonymi etykietami przykładami i koryguje wagi, aż zaczną do nich pasować.
7.1.1. Mechanizm¶
Sieć neuronowa to stos warstw. Każda warstwa mnoży wyjście poprzedniej warstwy przez macierz wag, dodaje wektor obciążenia (bias) i stosuje do wyniku funkcję nieliniową. Wyjście jednej warstwy jest wejściem następnej. Przechwycony obraz wchodzi na szczycie stosu, przepływa w dół przez dziesiątki lub setki warstw i wyłania się na dole jako tensor, którego wartości opisują, co znajdowało się na obrazie.
To, co robią wagi każdej warstwy, zależy od tego, na czym sieć była trenowana. Macierz wag wczesnej warstwy w sieci wizyjnej może reagować na krótką poziomą krawędź; nieco głębsza może reagować na narożnik; jeszcze głębsza może reagować na okrągły kształt oka; najgłębsze warstwy mogą reagować na układ całej twarzy. Nic z tego nie zostało napisane ręcznie. Proces treningu iterował po milionach oznaczonych etykietami przykładów, popychał wagi w dół funkcji straty, a hierarchia krawędź-następnie-narożnik-następnie-oko-następnie-twarz wyłoniła się z danych.
Mała sieć klasyfikacyjna jako stos warstw. Tensor wejściowy wchodzi na szczycie z kształtem przechwyconego obrazu i przepływa w dół przez warstwy, z których każda przekształca wymiary tensora. Tensor wyjściowy na dole ma jedną wartość na klasę. Sieci wykrywania i punktów kluczowych mają tę samą postać stosu warstw; zmienia się jedynie interpretacja tensora wyjściowego.¶
Architektura sieci – to, jak rozmieszczone są warstwy i które operacje je łączą – jest tym, co sieć może robić. Wagi są tym, czego sieć się nauczyła. Rolą kamery jest tu wczytanie pliku wag wytworzonego podczas treningu i wykonanie tej samej arytmetyki, którą wykonał trener, ale na przechwyconej ramce zamiast na zbiorze treningowym.
7.1.2. Co jest podawane na wejściu, a co wychodzi¶
Oba końce sieci są tensorami – wielowymiarowymi tablicami liczb, takim samym rodzajem obiektu, jaki przed chwilą wprowadził rozdział o numpy. Tensorem wejściowym dla sieci wizyjnej jest przechwycony obraz przekształcony do układu oczekiwanego przez sieć: zwykle 4-elementowy kształt (B, H, W, C), gdzie B to wymiar wsadu (batch) (zawsze 1 na kamerze, ponieważ jednorazowo przetwarzana jest jedna ramka), H i W to oczekiwana przez sieć wysokość i szerokość w pikselach, a C to liczba kanałów (3 dla sieci RGB, 1 dla skali szarości).
Tensor wyjściowy zależy od przeznaczenia sieci:
Sieć klasyfikacyjna wytwarza jednowymiarowy tensor wartości pewności, po jednej na klasę. Indeks największej wartości to przewidziana klasa. Wywodzący się z MobileNet detektor osób, który jest dostarczany na większości kamer, ma tę postać: dwie wartości, jedna dla „person”, druga dla „not person”.
Sieć wykrywania wytwarza dwuwymiarowy tensor, którego wartości opisują listę ramek ograniczających oraz prawdopodobieństwa klas. YOLOv8 ma tę postać: tensor
(84, N), w którym 4 z 84 wierszy to wartości regresji ramki, a pozostałe 80 to prawdopodobieństwa poszczególnych klas, powtórzone wNpozycjach kotwic.Sieć punktów kluczowych wytwarza tensor, którego wartości to pozycje pikseli nazwanych punktów charakterystycznych. Model MediaPipe face-landmarks ma tę postać: 468 punktów kluczowych na każdą wykrytą twarz.
Sieć segmentacji wytwarza dwuwymiarowy tensor, którego wartości to etykiety klas przypisane do poszczególnych pikseli – o tych samych wymiarach co wejście, z indeksem kategorii w każdej pozycji.
Sieć regresji wytwarza pojedynczą liczbę lub krótki wektor liczb – oszacowanie głębi, kąt, temperaturę.
Każda postać ma na kamerze własny post-processor, który konwertuje surowy tensor wyjściowy z powrotem na postać wyniku używaną przez resztę aplikacji – ramki ograniczające, listy punktów kluczowych, etykiety klas, oszacowania liczbowe. Post-processor to kod po stronie aplikacji, który zna układ wyjścia sieci; sama sieć jest tylko arytmetyką wytwarzającą tensor.
7.1.3. Dlaczego to działa na kamerze¶
Dwa elementy arytmetyki sprawiają, że jest to praktyczne dla układu klasy mikrokontrolera. Pierwszym jest kwantyzacja. Trening odbywa się w arytmetyce zmiennoprzecinkowej 32-bitowej; wnioskowanie może działać w arytmetyce całkowitoliczbowej 8-bitowej, niemal bez utraty dokładności w przypadku większości sieci. 8-bitowe wagi zajmują jedną czwartą pamięci i działają kilkukrotnie szybciej niż liczby zmiennoprzecinkowe 32-bitowe. Każdy model dostarczany z kamerą został już skwantyzowany poza nią.
Drugim jest przyspieszenie sprzętowe. Tę samą arytmetykę, którą procesor mikrokontrolera mozolnie wykonuje jedną instrukcję po drugiej, akcelerator sieci neuronowych przeprowadza setkami operacji naraz. Nowsze kamery (AE3 i N6) są wyposażone w dedykowaną jednostkę przetwarzania neuronowego (NPU) – akcelerator tensorów na układzie SoC – który model zajmujący sekundę na procesorze zamienia w taki, który działa w dziesiątkach milisekund. Rozdział o silnikach wnioskowania opisuje, jak wygląda rola kamery w tym procesie.
7.1.4. Co obejmuje ten rozdział¶
Trening nie jest zadaniem kamery. Wytrenowany model trafia na kamerę jako plik .tflite; kamera go wczytuje, przepuszcza przez niego każdą przechwyconą ramkę i dekoduje powstały tensor na wynik, na który aplikacja może zareagować. Wszystko, co następuje, dotyczy każdego z tych kroków:
wczytywania i inspekcji modelu;
partycji pamięci flash, w której znajdują się pliki modeli;
czterech etapów wywołania wnioskowania;
silników, które faktycznie wykonują arytmetykę;
oraz post-procesorów, które zamieniają tensor wyjściowy z powrotem na listę ramek, punktów kluczowych lub klas.
Detektory w rozdziale o obrazie były każdy zawężone do konkretnego celu. Te, które obejmuje reszta tego rozdziału, są zamiast tego trenowane z danych, przy czym ten sam silnik uruchamia dowolny model wczytany przez skrypt. Zmiana w przepływie pracy, która się z nimi pojawiła – algorytm specyficzny dla celu zastąpiony przez plik wag specyficzny dla celu – jest następną rzeczą, którą warto omówić.