7.16. Összegzés

Ez a fejezet végigvette a ml azon részeit, amelyekhez egy OpenMV alkalmazás nyúl, amikor egy következtetési lépés is része a folyamatnak:

  • Fogalmak – mi egy neurális hálózat aritmetikai értelemben (betanítható operátorok halmaza, amely egy tenzort egy tenzorra képez le), mit változtatott meg a gépi tanulás a klasszikus képfeldolgozáshoz képest (az ember által írt összegző algoritmus eltűnt, helyét a címkézett adatokból tanult súlyok vették át), valamint a hello demó, amely néhány sornyi Python kóddal futtatott egy arcészlelőt.

  • Az ml modul – az ml.Model objektum és a bemeneti és kimeneti tenzorok vizsgálatára szolgáló tulajdonságai, az általa elfogadott modellfájl-útvonalak, és hogy hol találhatók ezek a fájlok: vagy egy csak olvasható ROMFS partíción a flash memóriából való közvetlen futtatáshoz, vagy bármely más MicroPython fájlrendszeren, amikor a modell betöltéskor a RAM-ba másolható.

  • A következtetési folyamat – a három szakasz, amelyet a predict() egymás után futtat (előfeldolgozás, motor diszpécselés, utófeldolgozás), az első szakaszhoz tartozó Normalization kezelő, a harmadik szakaszhoz tartozó utófeldolgozó kezelő, valamint a kvantálási aritmetika, amely a kamera által futtatott egész számú tenzorokat összeköti azokkal a valós értékű számokkal, amelyekre a hálózatot betanították.

  • Következtetési motorok – TFLM (az operátor-értelmező, amelyet a legtöbb kamera futtat), CMSIS-NN (az alatta lévő SIMD kernelkönyvtár Cortex-M-en), és az NPU-k (az Arm Ethos-U55 az AE3-on a Vela offline fordítóval párosítva, az ST Neural-ART az N6-on az STAI és az STEdgeAI mellett). A motort a kamera rögzíti; a szkript nem választhatja ki.

  • A kimenet dekódolása – az utófeldolgozók, amelyek a nyers kimeneti tenzorokat dobozokká, kulcspontokká vagy osztályonkénti listákká alakítják, az NMS osztály, amely összevonja az átfedő jelölteket, a YOLOv8 áttekintés, amely megmutatja, hogyan tartható gyorsan a dekódolás azzal, hogy a küszöbölést a dekvantálás előtt végezzük el, valamint az egyéni dekódoló írásának protokollja, amikor a katalógus nem fed le egy modellt.

7.16.1. Mi érhető el mostantól

Három dolog, amelyre a fejezet felkészít:

  • Egy betanított modell betöltése és futtatása. Bármi, ami a /rom/ mappában van, további előkészítés nélkül működik; bármi, ami külsőleg kompatibilis .tflite formátumban van megadva, azután működik, hogy a célkamerához tartozó offline eszköz (Vela az AE3-hoz, STEdgeAI az N6-hoz) létrehozta a megfelelő elrendezést.

  • Bármely kimeneti tenzor dekódolása. Ha az architektúra szerepel a katalógusban, a megfelelő utófeldolgozó kiválasztása mechanikus: YoloV8 egy YOLOv8 modellhez, BlazeFace a BlazeFace-hez, és így tovább. Ha nincs benne, a writing-your-own protokoll lefedi a szerződést, a YOLOv8 áttekintés pedig a legtisztább referencia, amelyből másolni lehet.

  • Teljesítménnyel kapcsolatos érvelés. Egy modell, amely 30 FPS-sel fut egy NPU-n, 3 FPS-sel futhat egy Cortex-M7-en; az arány attól függ, mekkora részét tudja a kamera levenni a hálózatnak a CPU-ról. A kvantálás, a ROMFS-be helyezés, az NPU-fordítás és a célmotor operátor-lefedettsége a négy kar, és a fejezet mindegyiket lefedte.

7.16.2. Az ML a kamera többi részével együtt működik

Egy következtetés ritkán fut elszigetelten. Az image modul rögzíti és előfeldolgozza a képkockát, az ml modul futtatja a hálózatot, az ulab.numpy pedig elvégzi azt a numerikus munkát, amelyhez egyik oldalnak sincs beépített eszköze. Egy tipikus észlelési szkript mindhármat kombinálja: rögzítés a csi segítségével, opcionálisan a képkocka módosítása az image modullal, a predict() futtatása, az eredmény utófeldolgozása a megfelelő modullal az ml.postprocessing közül, és az ulab.numpy használata bármilyen egyéni matematikához, amelyet az alkalmazás az utófeldolgozó által visszaadott dobozok tetejére szeretne. A három modul ugyanazt a memóriamodellt használja; a köztük lévő határok ahol csak lehetséges, másolásmentesek.