7.16. Sammanfattning

Kapitlet gick igenom de delar av ml som en OpenMV-applikation använder när ett inferenssteg ingår i flödet:

  • Begrepp – vad ett neuronnät är i aritmetiska termer (en stapel av träningsbara operatorer som mappar en tensor till en tensor), vad maskininlärning förändrade jämfört med klassisk bildbehandling (den människoskrivna sammanfattningsalgoritmen är borta och har ersatts av vikter som lärts in från etiketterad data), och hello-demot som körde en ansiktsdetektor på en handfull rader Python.

  • ml-modulenml.Model-objektet och dess egenskaper för att inspektera in- och uttensorer, de modellfilssökvägar det accepterar, och var dessa filer finns: en skrivskyddad ROMFS-partition för körning direkt från flashminne, eller valfritt annat MicroPython-filsystem när modellen kan kopieras in i RAM vid inläsningstillfället.

  • Inferensflödet – de tre steg predict() kör i sekvens (förbehandling, motorutskick, efterbehandling), Normalization-handtaget i steg ett, efterbehandlarhandtaget i steg tre, och den kvantiseringsaritmetik som knyter de heltalstensorer kameran kör tillbaka till de reellvärda tal som nätverket tränades mot.

  • Inferensmotorer – TFLM (operatortolken som de flesta kameror kör), CMSIS-NN (SIMD-kärnbiblioteket under den på Cortex-M), och NPU:erna (Arms Ethos-U55 på AE3 i kombination med Vela-offlinekompilatorn, ST:s Neural-ART på N6 i kombination med STAI och STEdgeAI). Motorn är fast bestämd av kameran; skriptet väljer den inte.

  • Avkodning av utdata – efterbehandlarna som omvandlar råa uttensorer till rutor, nyckelpunkter eller listor per klass, NMS-klassen som slår samman överlappande kandidater, YOLOv8-genomgången som visar hur man håller avkodningen snabb genom att tröskla innan dekvantisering, och protokollet för att skriva en egen avkodare när katalogen inte täcker en modell.

7.16.1. Vad som nu finns inom räckhåll

Tre saker som kapitlet förbereder för:

  • Läsa in en tränad modell och köra den. Allt i /rom/ fungerar utan ytterligare förberedelser; allt som tillhandahålls externt som en kompatibel .tflite fungerar efter att offlineverktyget för målkameran (Vela för AE3, STEdgeAI för N6) har producerat rätt layout.

  • Avkoda valfri uttensor. När arkitekturen finns i katalogen är rätt efterbehandlare mekanisk: YoloV8 för en YOLOv8-modell, BlazeFace för BlazeFace, och så vidare. När den inte gör det täcker writing-your-own-protokollet kontraktet och YOLOv8-genomgången är den renaste referensen att kopiera från.

  • Resonera om prestanda. En modell som kör i 30 FPS på en NPU kan köra i 3 FPS på en Cortex-M7; förhållandet beror på hur stor del av nätverket kameran kan lyfta av CPU:n. Kvantisering, ROMFS-placering, NPU-kompilering och måltmotorns operatortäckning är de fyra spakarna, och kapitlet behandlade var och en av dem.

7.16.2. ML samverkar med resten av kameran

En inferens körs sällan isolerat. image-modulen fångar och förbehandlar bildrutan, ml-modulen kör nätverket, och ulab.numpy sköter det numeriska arbete som ingen av sidorna har ett inbyggt stöd för. Ett typiskt detekteringsskript kombinerar alla tre: fånga med csi, justera eventuellt bildrutan med image, kör predict(), efterbehandla resultatet med rätt modul ur ml.postprocessing, och ta till ulab.numpy för eventuell egen matematik som applikationen vill lägga ovanpå de rutor efterbehandlaren returnerade. De tre modulerna delar samma minnesmodell; gränserna mellan dem är nollkopierande där det är möjligt.