5.34. Recapitulare¶
Modulul image este cel mai mare API pe care îl expune camera, iar capitolul tocmai a parcurs schița sa: cum este reprezentată o imagine în memorie, cum citește și scrie camera pixeli individuali, cum desenează în cadrele capturate, cum le transformă aritmetic și geometric, cum le clasifică pe baza pragului și le filtrează, cum extrage măsurători și detectări din ele, cum decodează simboluri tipărite din ele, cum compară o imagine cu alta și cum aduce și scoate rezultatele de pe cameră.
Setul de instrumente este larg în mod intenționat. O pipelină clasică de viziune artificială care rulează pe o cameră încorporată de mici dimensiuni își face cea mai mare parte a muncii înainte ca ceva să ajungă la un model de învățare automată, atunci când există unul – aplicarea pragului curăță intrarea, filtrele elimină zgomotul, regiunile restrâng căutarea, detectoarele de blob și de linii localizează candidații, scorul de similaritate decide dacă candidatul este interesant, iar stratul de I/O predă rezultatul oricărui sistem care rulează etapa următoare. Fiecare pagină din acest capitol a acoperit una dintre aceste operații; pipelina potrivită pentru orice aplicație dată este o secvență a acestora compusă în ordinea pe care o cere problema.
5.34.1. Tiparul de pipelină¶
Majoritatea aplicațiilor netriviale ale camerei urmează aceeași schiță. Capturați un cadru de la senzor. Preprocesați-l: convertiți formatele, egalizați histograma, estompați zgomotul. Localizați regiunile sau caracteristicile de interes: detectare de blob, detectare de linii, potrivire de șabloane, decodare de coduri. Analizați ce a fost găsit: măsurători geometrice, scor de similaritate, statistici. Decideți ce să faceți pe baza analizei: declanșați un GPIO, raportați o sarcină utilă, capturați-și-jurnalizați, predați cadrul unui model ML. Trimiteți decizia sau artefactul capturat: salvați, codificați, transmiteți, desenați înapoi în cadru pentru previzualizarea din IDE.
Nicio pagină din capitol nu a acoperit fiecare pas; capitolul a acoperit blocurile de construcție pe care le compune pipelina. Alegerea blocurilor de utilizat și în ce ordine este sarcina scriptului aplicației.
5.34.2. Unde duce capitolul¶
Modulul image se ocupă de imagini ca imagini – pixeli, regiuni, desenare, detectări. O bună parte din munca asupra datelor capturate nu se încadrează în acest cadru. Calcularea statisticilor pe un tablou numeric arbitrar, rularea aritmeticii vectorizate pe date brute de la senzor, aplicarea unei transformări matriceale personalizate care nu are în spate o metodă din modulul image, pregătirea datelor pentru un model de învățare automată care dorește o anumită dispunere a tensorilor – toate acestea sunt sarcini pentru o bibliotecă de tablouri numerice, nu pentru una de prelucrare a imaginilor.
Capitolul următor acoperă exact acest lucru. Modulul ulab.numpy furnizat împreună cu MicroPython pe cameră este un subset al NumPy, iar două punți îl conectează la modulul image: to_ndarray() copiază pixelii unui cadru într-un ndarray pentru lucrul numeric, iar constructorul Image acceptă un ndarray pentru a construi o imagine nouă din rezultat, gata de afișat, salvat sau readus în biblioteca image. Cele două module se compun – fiecare face ceea ce celălalt nu face, iar împreună acoperă lucrul numeric și de imagistică de care are nevoie o aplicație de viziune încorporată.