5.34. Riepilogo¶
Il modulo image è la più grande API esposta dalla cam, e questo capitolo ne ha appena coperto i tratti essenziali: come un’immagine è rappresentata in memoria, come la camera legge e scrive i singoli pixel, come disegna nei frame acquisiti, come li trasforma aritmeticamente e geometricamente, come li classifica per soglia e li filtra, come ne estrae misurazioni e rilevamenti, come ne decodifica i simboli stampati, come confronta un’immagine con un’altra e come ottiene i risultati da e verso la cam.
Il toolkit è ampio di proposito. Una pipeline classica di visione artificiale in esecuzione su una piccola camera embedded svolge la maggior parte del suo lavoro prima che qualcosa raggiunga un modello di machine learning, quando ce n’è uno – la soglia ripulisce l’input, i filtri eliminano il rumore, le regioni restringono la ricerca, i rilevatori di blob e linee localizzano i candidati, il punteggio di similarità decide se il candidato è interessante, e il livello di I/O passa il risultato a qualunque cosa esegua la fase successiva. Ogni pagina di questo capitolo ha coperto una di queste operazioni; la pipeline giusta per una determinata applicazione è una sequenza di esse composte nell’ordine richiesto dal problema.
5.34.1. Il modello a pipeline¶
La maggior parte delle applicazioni non banali della cam segue lo stesso schema. Acquisisci un frame dal sensore. Pre-elaboralo: converti i formati, equalizza l’istogramma, sfoca via il rumore. Localizza le regioni o le caratteristiche di interesse: rilevamento di blob, rilevamento di linee, template matching, decodifica di codici. Analizza ciò che è stato trovato: misurazioni geometriche, punteggio di similarità, statistiche. Decidi cosa fare in base all’analisi: attivare un GPIO, segnalare un payload, acquisire e registrare, passare il frame a un modello ML. Restituisci la decisione o l’artefatto acquisito: salva, codifica, invia, ridisegna nel frame per l’anteprima nell’IDE.
Nessuna singola pagina del capitolo ha coperto ogni passaggio; il capitolo ha coperto i blocchi costitutivi che la pipeline compone. Scegliere quali blocchi usare e in quale ordine è il compito dello script dell’applicazione.
5.34.2. Dove conduce il capitolo¶
Il modulo image tratta le immagini come immagini – pixel, regioni, disegno, rilevamenti. Molto lavoro sui dati acquisiti non rientra in questa cornice. Calcolare statistiche su un array numerico arbitrario, eseguire aritmetica vettorizzata su dati grezzi del sensore, applicare una trasformazione matriciale personalizzata che non ha un metodo del modulo image alle spalle, preparare dati per un modello di machine learning che richiede un layout di tensore specifico – tutti questi sono compiti per una libreria di array numerici, non per una di elaborazione delle immagini.
Il prossimo capitolo tratta esattamente questo. Il modulo ulab.numpy fornito con MicroPython sulla cam è un sottoinsieme di NumPy, e due ponti lo collegano al modulo image: to_ndarray() copia i pixel di un frame in un ndarray per il lavoro numerico, e il costruttore di Image accetta un ndarray per costruire una nuova immagine dal risultato, pronta per essere visualizzata, salvata o reimmessa nella libreria image. I due moduli si compongono – ciascuno fa ciò che l’altro non fa, e insieme coprono il lavoro numerico e di imaging di cui ha bisogno un’applicazione di visione embedded.