5.34. Sammanfattning¶
Bildmodulen är det största API:et som kameran exponerar, och kapitlet har just gått igenom dess huvuddrag: hur en bild representeras i minnet, hur kameran läser och skriver enskilda pixlar, hur den ritar in i fångade bildrutor, hur den transformerar dem aritmetiskt och geometriskt, hur den tröskelklassificerar och filtrerar dem, hur den extraherar mätvärden och detekteringar ur dem, hur den avkodar tryckta symboler ur dem, hur den jämför en bild mot en annan, och hur den får resultaten på och av kameran.
Verktygslådan är bred med flit. En klassisk pipeline för datorseende som körs på en liten inbäddad kamera utför det mesta av sitt arbete innan något når en maskininlärningsmodell, när det finns en sådan – tröskling rensar upp indata, filter brusreducerar, regioner avgränsar sökningen, blob- och linjedetektorer lokaliserar kandidater, likhetspoängsättning avgör om kandidaten är intressant, och I/O-lagret lämnar över resultatet till vad som än kör nästa steg. Varje sida i detta kapitel täckte en av dessa operationer; den rätta pipelinen för en given applikation är en sekvens av dem komponerade i den ordning problemet kräver.
5.34.1. Pipeline-mönstret¶
De flesta icke-triviala kameraapplikationer följer samma huvuddrag. Fånga en bildruta från sensorn. Förbehandla den: konvertera format, utjämna histogrammet, sudda bort brus. Lokalisera regionerna eller särdragen av intresse: blobdetektering, linjedetektering, mallmatchning, kodavkodning. Analysera vad som hittades: geometriska mätningar, likhetspoängsättning, statistik. Besluta vad som ska göras baserat på analysen: utlös en GPIO, rapportera en nyttolast, fånga-och-logga, lämna bildrutan till en ML-modell. Mata ut beslutet eller den fångade artefakten: spara, koda, skicka, rita tillbaka in i bildrutan för IDE-förhandsgranskningen.
Ingen enskild kapitelsida täckte varje steg; kapitlet täckte de byggstenar som pipelinen komponerar. Att välja vilka block som ska användas och i vilken ordning är applikationsskriptets uppgift.
5.34.2. Vart kapitlet leder¶
Bildmodulen hanterar bilder som bilder – pixlar, regioner, ritning, detekteringar. Mycket arbete på fångade data passar inte in i den ramen. Att beräkna statistik över en godtycklig numerisk array, att köra vektoriserad aritmetik på rå sensordata, att tillämpa en anpassad matristransform som inte har en bildmodulmetod bakom sig, att förbereda data för en maskininlärningsmodell som vill ha en specifik tensorlayout – alla dessa är uppgifter för ett numeriskt array-bibliotek, inte ett bildbehandlande.
Nästa kapitel täcker precis det. Modulen ulab.numpy som medföljer MicroPython på kameran är en delmängd av NumPy, och två broar förbinder den med bildmodulen: to_ndarray() kopierar en bildrutas pixlar till en ndarray för numeriskt arbete, och konstruktorn Image accepterar en ndarray för att bygga en ny bild från resultatet, redo att visas, sparas eller matas tillbaka in i bildbiblioteket. De två modulerna komponeras – var och en gör det den andra inte gör, och tillsammans täcker de det numeriska och bildmässiga arbete som en applikation för inbäddat seende behöver.