4.2 Sistema di telecamere stereo
4.2.5 Creazione immagine di disparit` a
Come spiegato dettagliatamente nella sezione precedente nel progetto di questa tesi per le corrispondenze stereo ho utilizzato l’algoritmo stereoSGBM() con le modifiche presenti nella libreria openCV. Ci tengo a precisare che, oltre al diverso calcolo dei costi per i pixel, ci sono altre 2 differenze: l’algoritmo fa il match delle corrisponden- ze a blocchi e non a singoli pixel come in quello originale [9], tuttavia impostando il parametro ”blockSize” a 1 si riducono i blocchi a singoli pixel; inoltre sono in- clusi alcuni passaggi di pre e post elaborazione presi dall’algoritmo StereoBM di K. Konolige [15], ad esempio: prefiltraggio e post-filtraggio (controllo di unicit`a, inter- polazione quadratica e filtro speckle).
L’algoritmo SGM di openCV d`a la possibilit`a di migliorare la mappa di disparit`a in output adattando, alle immagini che si stanno utlizzando, alcuni parametri. Di seguito vediamo la lista dei parametri pi`u rilevanti [10] e di come sono stati adattati al nostro progetto per ottenre la mappa di disparit`a in figura 4.15:
• minDisparity: valore di disparit`a minimo possibile. Normalmente `e zero ma a volte gli algoritmi di rettifica possono spostare le immagini, quindi questo parametro deve essere regolato di conseguenza;
• numDisparity: disparit`a massima meno disparit`a minima. Il valore `e sempre maggiore di zero. Nell’attuale implementazione, questo parametro deve essere divisibile per 16;
• blockSize: dimensione del blocco corrispondente. Deve essere un numero dispari ≥ 1. Normalmente, dovrebbe essere compreso tra 3 e 11;
(a) Immagine dalla telecamera di sinistra. (b) Immagine dalla telecamera di destra.
(c)Selezionando un punto col mouse sulle immagini viene mostrata a terminale la disparit`a media in quel punto e le sue coordinate.
Figura 4.15: In questa immagine vediamo i risultati del matching stereo con ste- reoSGBM(), cliccando su un punto dell’immagine di disparit`a vengono evidenziati anche i corrispondenti punti nelle immagini rettificate come in (a) e (b).
• P1: il primo parametro che controlla l’uniformit`a della disparit`a (smoothing); • P2: : Il secondo parametro che controlla la uniformit`a della disparit`a. Pi`u grandi sono i valori, pi`u uniforme `e la disparit`a. P1 `e la penalit`a sulla varia- zione della disparit`a di pi`u o meno 1 tra i pixel vicini. P2 `e la penalit`a sulla variazione della disparit`a di pi`u di 1 tra i pixel vicini. L’algoritmo richiede P2 > P1. Alcuni valori P1 e P2 ragionevolmente buoni possono essere rispetti- vamente 8 x numero dei canali dell’immagine x blockSize x blockSize e 32 x numero dei canali dell’immagine x blockSize x blockSize;
• disp12MaxDiff: differenza massima consentita (in unit`a di pixel interi) nel controllo della disparit`a sinistra-destra. Impostare su un valore non positivo per disabilitare il controllo;
• uniquenessRatio: margine in percentuale in base al quale il valore migliore (minimo) della funzione di costo calcolato dovrebbe ”vincere” il secondo mi- glior valore per considerare corretta la corrispondenza trovata. Normalmente, un valore compreso nell’intervallo 5-15 `e abbastanza buono;
• speckleWindowSize: dimensione massima delle regioni di disparit`a unifor- me per considerare i loro punti di rumore e invalidarli. Si imposta a 0 per
disabilitare il filtro speckle, altrimenti da qualche parte nell’intervallo 50-200 (una specie di filtro gaussiano);
• speckleRange: massima variazione di disparit`a all’interno di ogni compo- nente collegato. Se speckleWindowSize `e attivo, impostare il parametro su un valore positivo, verr`a implicitamente moltiplicato per 16. Normalmente, 1 o 2 `
e sufficiente;
• mode: impostarlo su StereoSGBM :: MODE HH per eseguire l’algoritmo di programmazione dinamica a due passaggi su vasta scala. Occuper`a O(W x H x numDisparities) byte, che `e grande per lo stereo 640x480 ed enorme per le immagini in formato HD. Comprende:
– MODE SGBM (default=0); – MODE HH;
– MODE SGBM 3WAY; – MODE HH4.
Risultati
Parliamo ora dell’immagine di disparit`a ottenuta e mostrata in figura 4.16, di se- guito possiamo vedere come sono stati impostati i parametri della funzione openCV stereoSGBM() per ottenere il risultato ottimale (impostati basandosi sulle nozioni dette sopra e facendo diverse prove per trovare il risultato migliore):
1. min disp = int(round(0 / 16) x 16) 2. num disp = int(round(596.0 / 16) x 16) 3. block size = 11 4. uniquenessRatio = 4 5. speckleRange = 2 6. speckleWindowSize = 200 7. disp12MaxDiff = 0 8. P1 = 1400 9. P2 = 5600 10. mode = 0
Nel capitolo 7 capiremo nel dettaglio come trattare l’immagine di disparit`a per otte- nere un modello 3D del prosciutto e quindi come ricostruire la scena 3D analizzata per poter guidare il robot nello spazio con coordinate precise.
Figura 4.16: Mappa di disparit`a derivante dalle immagini 4.15, ottenuta con i parametri specificati, la scala colori va dal blu scuro/nero che indica la disparit`a minima ad un rosso molto accesso che indica la disparit`a massima.
Capitolo 5
Deep learning nella computer
vision
5.1
Cosa si intende per deep learning?
La traduzione strettamente letterale di questo termine, di chiara matrice anglosasso- ne, `e apprendimento profondo. E’ proprio questo il centro del suo significato, perch´e il deep learning, sottocategoria del Machine Learning, non fa altro che creare mo- delli di apprendimento su pi`u livelli. Il concetto `e molto semplice: immaginiamo di esporre una nozione, la apprendiamo e subito dopo ne esponiamo un’altra. Il nostro cervello raccoglie l’input della prima e la elabora insieme alla seconda, trasforman- dola e astraendola sempre di pi`u. Scientificamente, `e corretto definire l’azione del deep learning come l’apprendimento di dati che non sono forniti dall’uomo, ma sono appresi grazie all’utilizzo di algoritmi di calcolo statistico. Questi algoritmi hanno uno scopo: comprendere il funzionamento del cervello umano e come riesca ad in- terpretare le immagini e linguaggio. L’apprendimento cos`ı realizzato ha la forma di una piramide: i concetti pi`u alti sono appresi a partire dai livelli pi`u bassi.
Il deep learning ha compiuto passi da gigante, ottenendo risultati che, fino a qualche decennio fa, erano pura utopia. Tale successo `e dovuto alle numerose con- quiste in campo informatico, relative soprattutto alla sfera dell’hardware. Abbiamo visto come sia importante portare il calcolatore a fare esperienza su un quantitativo sempre maggiore di dati sensibili e come, fino a poco tempo fa, il tempo per ottene- re tale addestramento fosse abbastanza elevato. Oggi, grazie all’introduzione delle GPUs, ovvero nuove unit`a che concorrono all’elaborazione dati, questo processo `e diventato molto pi`u snello. Un altro importante aiuto `e derivato dalla facilit`a di trovare numerose collezioni di dati (dataset) fondamentali per allenare il sistema. Il deep learning fa una cosa fondamentale: ci regala la rappresentazione dei dati, ma lo fa a livello gerarchico e soprattutto a livelli diversi tra loro, riuscendo a ela- borarli e a trasformarli. Questa trasformazione `e stupefacente perch´e ci consente di assistere ad una macchina che riesce a classificare i dati in entrata (input) e quelli in uscita (output), evidenziando quelli importanti ai fini della risoluzione del problema e scartando quelli che non servono. La rivoluzione apportata dal deep learning `e tutta nella capacit`a, simile a quella umana, di elaborare i dati, le proprie conoscenze a livelli che non sono affatto lineari. Grazie a questa facolt`a, la macchina apprende e perfeziona funzionalit`a sempre pi`u complesse.