...

Optimal anchor node placement for indoor localization in wireless

by user

on
Category: Documents
19

views

Report

Comments

Transcript

Optimal anchor node placement for indoor localization in wireless
Politecnico di Milano
Facoltà di ingegneria dell’Informazione
Corso di Laurea Magistrale in Ingegneria Informatica
ANALISI ENERGETICA E OTTIMIZZAZIONE
DELL’ALGORITMO BRISK
Autore:
Matr.
Simone ANGHILERI
782978
Relatore:
Ing. Matteo CESANA
Correlatore: Ing. Alessandro REDONDI
Anno Accademico 2012-2013
Sommario
Nel campo dell’internet degli oggetti stiamo assistendo ad uno sviluppo sempre
maggiore delle Visual Sensor Network (VSN), reti di sensori che si occupano di
trasferire ed analizzare immagini. Siccome i nodi che compongono la rete sono alimentati tramite batteria, uno dei requisiti fondamentali è l’efficienza. Il
progetto Greeneyes ha lo scopo di lavorare in questa direzione attraverso la creazione di un nuovo paradigma che permetta ai nodi della rete di eseguire complessi
compiti di analisi visuale. Per fare questo è necessario abbandonare il modello
tradizionale comprimi-poi-analizza (CTA), che prevede che l’immagine venga acquisita, compressa ed inviata ad un nodo centrale per l’analisi. Il nuovo paradigma
analizza-poi-comprimi (ATC) contempla invece che siano i nodi della rete a svolgere i compiti di analisi visuale, inviando poi al nodo centrale una rappresentazione
concisa dell’immagine. Affinché questo nuovo modello possa essere implementato,
è necessario che gli algoritmi che analizzano le immagini siano molto efficienti.
Questa tesi ha lo scopo di ottimizzare l’algoritmo di analisi visuale BRISK, con
il fine di migliorarne le prestazioni dal punto di vista dei consumi energetici. Si
pone inoltre l’obiettivo di effettuare un confronto sul piano energetico dei due paradigmi CTA e ATC, con l’intento di paragonarne i consumi e determinare quindi
quale sia la soluzione migliore.
1
Indice
Abstract
1
Elenco delle figure
3
1 Introduzione
4
1.1
Progetto GreenEyes e scenario applicativo . . . . . . . . . . . . .
6
1.2
Ottimizzazione di BRISK
. . . . . . . . . . . . . . . . . . . . . .
8
1.3
Struttura della tesi . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2 Stato dell’arte
10
2.1
Concetti preliminari
. . . . . . . . . . . . . . . . . . . . . . . . .
10
2.2
Algoritmi di analisi visuale . . . . . . . . . . . . . . . . . . . . . .
12
2.2.1
SIFT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
2.2.2
SURF . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.2.3
BRISK . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
Metodi di riconoscimento e analisi di accuratezza . . . . . . . . .
25
2.3.1
Metodi di riconoscimento . . . . . . . . . . . . . . . . . . .
25
2.3.2
Misure di accuratezza . . . . . . . . . . . . . . . . . . . . .
28
Codifica di descrittori binari . . . . . . . . . . . . . . . . . . . . .
29
2.4.1
Codifica senza perdite . . . . . . . . . . . . . . . . . . . .
30
2.4.2
Costruzione del descrittore: codifica con perdite . . . . . .
31
Modello rate-accuratezza . . . . . . . . . . . . . . . . . . . . . . .
34
2.3
2.4
2.5
2
3 Ottimizzazioni di BRISK
40
3.1
Dispositivo utilizzato . . . . . . . . . . . . . . . . . . . . . . . . .
40
3.2
Considerazioni preliminari e struttura di BRISK . . . . . . . . . .
42
3.3
Ottimizzazioni . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
3.3.1
Selezione delle coppie di punti . . . . . . . . . . . . . . . .
47
3.3.2
Calcolo dell’intensità smussata solo per i punti utilizzati .
48
3.3.3
Conversione delle funzioni di ridimensionamento dell’immagine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
3.3.4
Rimozione di operazioni di interpolazione
. . . . . . . . .
51
3.3.5
Esecuzione in parallelo del test binario . . . . . . . . . . .
52
3.3.6
Rimozione dell’invarianza alla rotazione quando non necessaria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4 Implementazione e risultati
53
55
4.1
I dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
4.2
Selezione delle coppie di punti . . . . . . . . . . . . . . . . . . . .
56
4.3
Calcolo dell’intensità smussata solo per i punti utilizzati . . . . . .
58
4.4
Conversione delle funzioni di ridimensionamento dell’immagine . .
61
4.5
Rimozione di operazioni di interpolazione . . . . . . . . . . . . . .
64
4.6
Esecuzione in parallelo del test binario . . . . . . . . . . . . . . .
68
4.6.1
Rimozione dell’invarianza alla rotazione quando non necessaria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5 Comprimi-poi-analizza vs Analizza-poi-comprimi
69
71
5.1
Confronto rate-energia . . . . . . . . . . . . . . . . . . . . . . . .
71
5.2
Risultati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
5.3
Codifica Entropica . . . . . . . . . . . . . . . . . . . . . . . . . .
79
6 Conclusioni e direzioni di lavoro future
3
81
Bibliografia
84
4
Elenco delle figure
1.1
Architettura del sistema GreenEyes . . . . . . . . . . . . . . . . .
7
2.1
Immagini campione del dataset ZuBuD . . . . . . . . . . . . . . .
11
2.2
Costruzione della piramide scale-space . . . . . . . . . . . . . . .
14
2.3
Individuazione massimi e minimi SIFT . . . . . . . . . . . . . . .
15
2.4
Creazione del descrittore SIFT . . . . . . . . . . . . . . . . . . . .
16
2.5
Approssimazioni di SURF . . . . . . . . . . . . . . . . . . . . . .
18
2.6
Detection dei punti di interesse nello scale-space . . . . . . . . . .
22
2.7
Schema di campionamento di BRISK . . . . . . . . . . . . . . . .
23
2.8
Esempio di corrispondenze trovate tra due immagini utilizzando
BRISK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
Schemi di campionamento di BRISK e di FREAK . . . . . . . . .
30
2.10 Curva rate-accuratezza . . . . . . . . . . . . . . . . . . . . . . . .
37
2.11 Curva di allocazione interna . . . . . . . . . . . . . . . . . . . . .
38
3.1
Dispositivo Beaglebone . . . . . . . . . . . . . . . . . . . . . . . .
41
3.2
Consumi di potenza Beaglebone . . . . . . . . . . . . . . . . . . .
42
3.3
Tempi di esecuzione delle singole operazioni di BRISK alla risolu-
2.9
zione VGA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4
Tempi di esecuzione delle singole operazioni di BRISK alla risoluzione SVGA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.5
45
46
Tempi di esecuzione delle singole operazioni di BRISK alla risoluzione XGA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
46
3.6
Registri a 128 bit utilizzati dall’insieme di istruzioni SSE . . . . .
50
3.7
Rappresentazione dell’esecuzione dell’istruzione NEON VADD . .
51
4.1
Immagini campione del dataset ZuBuD . . . . . . . . . . . . . . .
56
4.2
Immagini campione del dataset Oxford . . . . . . . . . . . . . . .
56
4.3
Tempi di esecuzione con l’ottimizzazione relativa all’intensità smussata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
4.4
Speedup ottenuto con l’ottimizzazione relativa all’intensità smussata 60
4.5
Speedup relativo all’ottimizzazione di ridimensionamento delle immagini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.6
63
Confronto accuratezze versione di BRISK originale e senza fase di
interpolazione . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
4.7
Speedup rimozione interpolazione . . . . . . . . . . . . . . . . . .
66
4.8
Speedup totale fase di detection . . . . . . . . . . . . . . . . . . .
67
4.9
Speedup totale description senza invarianza alla rotazione . . . . .
70
5.1
Funzionamento dei due paradigmi comprimi-poi-analizza (a) e analizzapoi-comprimi (b). . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
5.2
Tempi di esecuzione necessari per la codifica JPEG al variare del rate 73
5.3
Tempi di esecuzione necessari per la fase di detection al variare del
numero di keypoint. . . . . . . . . . . . . . . . . . . . . . . . . . .
5.4
Tempi di esecuzione necessari per la fase di description al variare
del numero di keypoint . . . . . . . . . . . . . . . . . . . . . . . .
5.5
74
75
Energia necessaria per la descrizione di una feature al variare della
dimensione dei descrittori . . . . . . . . . . . . . . . . . . . . . .
76
5.6
Confronto energetico tra il paradigma CTA e ATC (ZuBuD) . . .
77
5.7
Confronto energetico tra il paradigma CTA e ATC (Oxford) . . .
78
5.8
Guadagno energetico in termini percentuali della versione ottimizzata di BRISK rispetto all’originale(ZuBuD) . . . . . . . . . . . .
6
79
5.9
Guadagno energetico in termini percentuali della versione ottimizzata di BRISK rispetto all’originale(Oxford) . . . . . . . . . . . .
7
80
Capitolo 1
Introduzione
La ricerca nell’ambito delle Wireless sensor Networks (WSNs), cioè reti senza fili
di sensori, sta prendendo sempre più piede, dando luogo ad una crescita dell’interesse anche da parte del settore industriale, nell’ottica di un utilizzo commerciale
dei servizi che possono essere forniti da questa tecnologia [1][2]. In particolare, l’integrazione di tecnologie senza fili a basso consumo energetico e dispositivi
hardware a basso costo per l’acquisizione di immagini [3] ha portato allo sviluppo
delle cosiddette wireless multimedia sensor networks (WMSNs), conosciute anche
come visual sensor networks (VSNs)[4][5]. Una VSN può essere pensata come
una rete di dispositivi senza fili in grado di rilevare del contenuto multimediale,
come immagini, video, audio, etc [6]. I nodi provvisti di sensori forniscono al nodo
centrale le informazioni che hanno raccolto e sono in grado di processare i dati
ottenuti in modo distribuito e collaborativo [7].
Le fotocamere digitali sono realizzate sull’esempio dell’apparato visivo umano.
Le immagini vengono acquisite in formato digitale campionando e quantizzando il campo luminoso su un reticolo discreto di pixel. In seguito le immagini
(o sequenze di immagini) vengono compresse per essere poi memorizzate oppure
trasmesse. L’analisi dei dati raccolti può essere compiuta in linea di principio
direttamente dai nodi della rete, tuttavia sistemi di questo tipo sono spesso molto
costosi e soprattutto caratterizzati da un significativo consumo energetico. Attualmente l’approccio più utilizzato nel campo dell’analisi visuale è quello che
8
CAPITOLO 1. INTRODUZIONE
prevede la creazione di una versione compressa, e quindi qualitativamente peggiore, dell’immagine originale. Questa metodologia contrasta però parzialmente con
il paradigma adottato dal sistema visivo umano. In primo luogo i dati relativi alle
immagini vengono memorizzati e trasmessi conservando una rappresentazione a
livello di pixel, ma c’è la possibilità che sia solo la parte semantica ad avere importanza. Ciò comporta un’inefficienza in termini di risorse di rete e computazionali
usate, specialmente quando l’analisi si basa su dati raccolti a partire dall’acquisizione di più di una fotocamera. In secondo luogo, l’efficienza energetica viene
spesso trascurata e assume un ruolo di importanza secondaria, siccome la gran
parte del processo computazionale associato all’analisi visuale viene svolto su un
nodo centralizzato che non presenta problemi energetici.
Un tale paradigma, del tipo comprimi-poi-analizza, è stato utilizzato con successo in molti scenari applicativi, come ad esempio la video sorveglianza, nei quali
non vi sono vincoli stringenti dovuti al consumo energetico. Negli ultimi anni le
VSN hanno ricoperto un ruolo sempre più importante nell’evoluzione del paradigma dell’Internet degli oggetti [8][9]. Le VSN sono in grado infatti di prendersi
carico di funzioni complesse di analisi, quali localizzazione, monitoraggio, riconoscimento di oggetti etc., e forniscono così la base per nuove applicazioni in ambiti
che spaziano della sorveglianza all’assistenza sanitaria.
Questa tesi mira ad andare oltre il modello tradizionale comprimi-poi-analizza,
concentrandosi invece su un nuovo paradigma del tipo analizza-poi-comprimi, nell’ottica di un sistema maggiormente focalizzato sugli aspetti legati ai consumi
energetici ed in linea con gli obiettivi del progetto europeo GreenEyes. In particolare, facendo uso di un dispositivo BeagleBone [10], vengono analizzati i consumi
energetici sia nel caso di un sistema basato modello tradizionale, sia nel caso di un
sistema basato sul nuovo paradigma, andando poi a confrontare i risultati ottenuti. Si prende inoltre in considerazione l’algoritmo di analisi visuale BRISK (Binary
9
CAPITOLO 1. INTRODUZIONE
Robust Invariant Scalable Keypoints) [11], rivelatosi tra i più efficienti, con l’obiettivo di produrne una versione ulteriormente ottimizzata dal punto di vista dei
consumi energetici. Viene analizzata nel dettaglio la struttura dell’algoritmo, al
fine di implementare delle modifiche che lo rendano più efficiente limitando il più
possibile i consumi energetici.
1.1
Progetto GreenEyes e scenario applicativo
Il progetto GreenEyes è un progetto che mira a sviluppare un insieme di nuove
metodologie, algoritmi e protocolli, con il fine di fornire alle reti senza fili di sensori capacità visive comparabili a quelle ottenibili con i sistemi di acquisizione di
immagine tradizionali. Il principio chiave è che la maggior parte delle funzioni
di analisi visuale possono essere portate a termine sulla base di una rappresentazione compressa dell’immagine, in grado di mantenere le caratteristiche globali
e locali ma che allo stesso tempo non fa uso della sottostante rappresentazione
a livello di pixel. Inoltre, operando secondo vincoli energetici molto stringenti è
imperativo ottimizzare la fase di computazione, di codifica e di trasmissione delle
feature dell’immagine. Per quanto riguarda l’aspetto delle computazione e della
codifica, Greeneyes affronta il problema capovolgendo il paradigma tradizionale
comprimi-poi-analizza. Questo nuovo approccio prevede che i nodi provvisti di
sensori acquisiscano i dati sulle immagini, li processino e li inviino alla destinazione finale, al fine di rendere possibile l’esecuzione di funzioni di analisi visuale
di alto livello, per mezzo di algoritmi di analisi che possano essere eseguiti sia in
modo centralizzato che distribuito, ricalcando così il sistema visivo umano.
La Figura 1.1 mette in mostra una rappresentazione illustrativa dell’architettura ad alto livello del sistema proposto, mettendo in rilievo i moduli funzionali e
le loro dipendenze. I nodi sono equipaggiati con microprocessori a basso consumo
energetico e chip radio, in modo tale che possano comunicare tra loro e con un
10
CAPITOLO 1. INTRODUZIONE
Figura 1.1: Architettura del sistema GreenEyes. I nodi blu sono i nodi equipaggiati
con una fotocamera ed hanno quindi la capacità di acquisire immagini, oltre a quella di
processare i dati raccolti. I nodi gialli rappresentano i nodi generici, che pur non potendo
acquisire immagini contribuiscono al funzionamento del sistema in quanto favoriscono il
calcolo distribuito e l’instradamento dei pacchetti informativi.
nodo centrale, quando disponibile. I nodi sono caratterizzati da una batteria con
capacità limitata, da capacità eterogenee in termini di potenza computazionale,
da una banda di comunicazione e dalla disponibilità di dispositivi sensoriali. In
particolare, un sottoinsieme dei nodi è equipaggiato con fotocamere incorporate che possono essere utilizzate per acquisire i dati sulle immagini, necessari per
eseguire vari compiti di analisi visuale. Lo scenario che viene concepito è quindi
quello in cui i nodi muniti di sensori sono in grado di elaborare i dati localmente
per quanto possibile, piuttosto che trasmettere una rappresentazione compressa
nel dominio dei pixel delle immagini acquisite. Si può inoltre osservare che anche nodi non dotati di un sensore visivo rappresentano una importante risorsa,
in quanto possono essere sfruttati sia per l’instradamento delle informazioni sulla
rete, sia per il calcolo distribuito.
Le metodologie sviluppate con il progetto GreenEyes possono avere un significativo impatto in tutti quegli scenari applicativi nei quali l’analisi visuale non è
11
CAPITOLO 1. INTRODUZIONE
al momento fattibile a causa di vincoli energetici molto stringenti. Un esempio
può essere il caso del monitoraggio ambientale in zone pericolose o inaccessibili. Oppure il caso di sistemi di video sorveglianza in luoghi non raggiunti dalle
linee elettriche. Anche in ambito militare è possibile trovare delle applicazioni,
ad esempio per il monitoraggio delle forze alleate sul campo di battaglia. Come
esempio illustrativo, i risultati di questo progetto possono essere particolarmente
rilevanti nel contesto delle cosiddette città intelligenti: anche se l’alimentazione
elettrica è generalmente disponibile in ambiente urbano, la disponibilità di nodi
con sensori visuali alimentati da una batteria permette di ottenere una copertura più completa del territorio, rendendo raggiungibili aree più ampie e limitando
i costi delle infrastrutture necessarie. Dispositivi di questo tipo possono essere
adottati per il monitoraggio del traffico, per parcheggi intelligenti, etc.
1.2
Ottimizzazione di BRISK
Questa tesi vuole contribuire al raggiungimento degli obiettivi del progetto Greeneyes tramite alcuni miglioramenti apportati all’algoritmo di estrazione di feature
BRISK, che è stato scelto in quanto risulta attualmente uno dei più efficienti.
Riuscire ad ottimizzarlo ulteriormente significherebbe favorire un’esecuzione meno onerosa dei compiti di analisi visuale e di conseguenza ottenere un risparmio
energetico. Per il conseguimento di questo obiettivo questa tesi si occupa di modificare il codice di BRISK, implementando alcune ottimizzazioni che permettono
di rendere più efficiente l’algoritmo. Viene ad esempio sfruttato il calcolo parallelo
per la computazione di alcune fasi e viene resa possibile l’esecuzione secondo il
modello rate-accuratezza, in grado di aumentare al massimo le prestazioni. Dopo aver implementato queste ottimizzazioni si procede ad una stima dei consumi
energetici derivanti dall’utilizzo del paradigma analizza-poi-comprimi, basato sia
sulla versione originale di BRISK che su quella modificata, analizzando il guadagno apportato da quest’ultima. Viene infine effettuato un confronto sul piano
12
CAPITOLO 1. INTRODUZIONE
energetico con il paradigma comprimi-poi-analizza, allo scopo di verificare quale
sia la soluzione migliore.
1.3
Struttura della tesi
Questo lavoro di tesi è organizzato come segue.
Nel Capitolo 2 vengono inizialmente introdotti i concetti preliminari riguardanti gli algoritmi di analisi visuale. In seguito viene offerta una panoramica sui
principali algoritmi di analisi visuale allo stato dell’arte, concentrandosi poi sulle modalità di riconoscimento degli oggetti e sui metodi utilizzati per la misura
dell’accuratezza. Viene poi illustrato il concetto di descrittore binario e delle modalità di codifica, concetto che viene poi utilizzato in tutto il resto della tesi. Infine
viene esposto un modello di rate-accuratezza, che sta alla base di parte del lavoro
compiuto.
Nel Capitolo 3 viene analizzata la struttura dell’algoritmo BRISK, al fine di ricercare quali sono le parti più dispendiose di esso e cercare quindi di ottimizzarle.
Vengono quindi esposte nei particolari quali sono le ottimizzazioni pensate per
migliorare l’efficienza dell’algoritmo.
Il Capitolo 4 tratta l’implementazione delle ottimizzazioni illustrate e i risultati
che sono stati ottenuti. Riprendendo il Capitolo precedente, vengono illustrate le
modalità di implementazione delle singole ottimizzazioni e quali sono i contributi
apportati da esse in termini di efficienza.
Nel Capitolo 5 viene effettuato il confronto in termini di consumi energetici, sulla
base del caso preso in esame, tra il paradigma comprimi-poi-analizza ed il nuovo
paradigma analizza-poi-comprimi. Viene inoltre analizzato il comportamento della versione ottimizzata dell’algoritmo BRISK, rapportato a quello della versione
originale.
Il Capitolo 6 infine conclude la tesi e si occupa di delineare quali sono gli sviluppi
futuri.
13
Capitolo 2
Stato dell’arte
In questo capitolo viene fornito una descrizione dettagliata riguardo ai concetti
relativi all’analisi visuale. Vengono inizialmente introdotti concetti utili a comprendere il funzionamento dei principali algoritmi di analisi. Si passa quindi ad
analizzare tre di questi algoritmi allo stato dell’arte. Vengono infine esposti i meccanismi tramite i quali tali algoritmi sono in grado di effettuare il riconoscimento
di oggetti.
2.1
Concetti preliminari
Parlando di analisi visuale bisogna anzitutto introdurre il concetto di feature, in
quanto gli algoritmi che verranno presi in considerazione sono algoritmi di estrazione di feature. Le feature visuali vengono solitamente utilizzate in diversi ambiti
applicativi, a partire dall’acquisizione di immagini e video fino ad arrivare al monitoraggio o al riconoscimento di oggetti. Possono essere suddivise in due classi:
feature globali e feature locali. Le feature globali rappresentano il contenuto di
un’immagine nel suo insieme, senza fare diretto riferimento alla disposizione spaziale del contenuto visivo. Pur rappresentando una soluzione molto efficace nei
casi in cui si lavora su larga scala, le feature globali non sono adatte a scenari in
cui è richiesto di descrivere in modo preciso il contenuto locale di un’immagine.
Le feature locali cercano di superare questi limiti grazie ad una rappresentazione
14
CAPITOLO 2. STATO DELL’ARTE
(a) Immagine originale
(b) Feature dell’immagine
Figura 2.1: Esempio di feature di un’immagine. I cerchi blu indicano feature chiare
mentre i cerchi blu feature scure.
dell’immagine che si comporti in modo robusto nei confronti di trasformazioni
geometriche e cambi di illuminazione [12]. Si può dire che una feature locale rappresenta una porzione degna di nota di un’immagine, che potrebbe coincidere con
una particolare struttura nella rappresentazione nel dominio dei pixel. Esistono
diversi algoritmi, detti detector, che si occupano di individuare feature locali, in
particolare analizzando parti dell’immagine che contengono angoli, bordi o strutture simili a chiazze. La Figura 2.1 mostra un esempio di feature identificate in
un’immagine.
Il processo di estrazione delle feature viene effettuato in due passi. Inizialmente il detector analizza l’immagine e individua un insieme di punti salienti,
detti keypoint, che rappresentano quelle parti dell’immagine che contengono più
informazione. Generalmente il numero di keypoint individuati è dipendente dal
contenuto dell’immagine. La rappresentazione di una scena con molti dettagli
implica un maggior numero di keypoint individuati, viceversa per immagini caratterizzate da pochi bordi, spigoli o chiazze. L’individuazione dei keypoint viene
inoltre fatta anche su scale differenti, tramite una rappresentazione nota come
scale-space, con la conseguenza che le dimensioni della feature locale corrispondente non sono standard. Keypoint individuati su scala ridotta corrispondono a
15
CAPITOLO 2. STATO DELL’ARTE
piccoli dettagli dell’immagine, mentre keypoint individuati su larga scala faranno
riferimento a strutture più grandi.
Dopo la fase di detection è il momento della fase di description, che ha lo scopo
di produrre una rappresentazione in grado di descrivere le feature locali individuate. Per ognuna di esse, viene creato un descrittore (o vettore di descrizione),
ricavato tramite una serie di confronti relativi ai punti nell’intorno del keypoint.
2.2
2.2.1
Algoritmi di analisi visuale
SIFT
L’algoritmo Scale Invariant Feature Transform (SIFT) fu inizialmente proposto
da David Lowe nel 1999 [13] ed è oggi considerato l’algoritmo che sta alla base dell’estrazione e descrizione di feature visuali. Esso consiste di due parti: un
detector di feature invariante alla scala e un algoritmo di descrizione ben consolidato in grado di produrre descrittori che possono essere utilizzati in modo efficace
per eseguire in modo affidabile funzioni di riconoscimento. Molti dei più recenti
algoritmi di estrazione di feature (ed in particolare l’algoritmo BRISK utilizzato
in questa tesi) tendono a ricalcare la struttura di SIFT. Per questa ragione può
essere importante analizzare nel dettaglio il funzionamento di questo algoritmo.
Detector
Il detector di SIFT agisce secondo lo schema seguente: detection di estremi nello
scale-space, localizzazione dei keypoint e assegnazione dell’orientamento. Nella
prima fase, utilizzando l’approccio dei filtri a cascata, vengono individuati i keypoint sul piano dell’immagine e in tutte le scale dell’immagine. In seguito, per
ognuna delle posizioni candidate viene creato un modello dettagliato allo scopo di
determinare in modo accurato la collocazione e la scala di ognuno dei keypoint.
Viene infine assegnato un orientamento ad ogni keypoint, sulla base della dire16
CAPITOLO 2. STATO DELL’ARTE
zione del gradiente locale dell’immagine. In questo modo l’algoritmo garantisce
l’invarianza rispetto alla posizione, alla scala e all’orientamento.
• Detection dei keypoint:
l’individuazione di punti dell’immagine invarianti ai cambiamenti di scala può essere effettuata tramite la ricerca di estremi nello scale-space. La
rappresentazione scale-space viene generalmente definita come una funzione
L(x,y,σ) prodotta dalla convoluzione di una fuzione Gaussiana G(x, y, σ)
con l’immagine in imput I(x, y):
L(x, y, σ) = G(x, y, σ) ∗ I(x, y),
dove * è l’operazione di convoluzione. Per individuare efficientemente dei
keypoint stabili, l’algoritmo propone una convoluzione dell’immagine in input con una funzione di differenza Gaussiana (DoG) D(x, y, σ), ottenuta
come risultato della differenza tra due scale vicine separate da un fattore
costante k:
D(x,y,σ) = (G(x,y,kσ)-G(x,y,σ)) ∗ I(x,y)
(2.1)
E’ stato mostrato che questa funzione scale-space risulta una approssimazione molto vicina al Laplaciano di Gaussiana [14], necessario per ottenere
una vera invarianza alla scala, e produce un insieme di feature più stabili
se confrontate con una gamma di altre possibili funzioni [15]. L’approccio
per la costruzione di D(x,y,σ) è mostrato in Figura 2.2. L’immagine iniziale
viene sottoposta a convoluzioni continue utilizzando filtri Gaussiani, fino a
produrre immagini separate da un fattore di scala costante (colonna di sinistra). Successivamente viene effettuata la sottrazione di immagini adiacenti
offuscate per produrre le immagini DoG mostrate sulla destra. Quando è
stato processato un numero predefinito di scale, l’immagine in input viene
17
CAPITOLO 2. STATO DELL’ARTE
Figura 2.2: Costruzione della piramide scale-space.Immagine tratta da [16]
ridimensionata di un fattore 1/2, e il processo viene ripetuto per tutte le
ottave. Una volta costruito lo scale-space, ognuno dei punti campione viene
confrontato con i suoi otto vicini nella scala corrente e con in nove vicini
nella scala superiore e nella scala inferiore, come mostrato in Figura 2.3. Il
punto campione viene selezionato come estremo solo se è più grande o più
piccolo di tutti i suoi vicini. Una volta che viene individuato un keypoint,
l’algoritmo procede alla creazione di un modello in grado di rappresentare
le caratteristiche del punto, specificando posizione, scala e rapporto di curvatura. Questo processo, oltre a migliorare il riconoscimento e la stabilità,
permette anche di scartare i keypoint con un basso contrasto. Una fase ulteriore si occupa di non considerare i keypoint lungo i bordi, contribuendo
al miglioramento delle prestazioni.
18
CAPITOLO 2. STATO DELL’ARTE
Figura 2.3: I massimi e minimi delle immagini DoG vengono individuati facendo il
confronto tra un pixel (contrassegnato da una X) e i suoi 26 vicini(contrassegnati da
cerchi) nelle regioni 3x3, nella scala corrente e in quelle adiacenti. Immagine tratta da
[16]
• Assegnazione dell’orientamento:
il processo di detection continua poi con l’ottenimento di un orientamento
consistente al keypoint, in modo tale che il descrittore possa contenere questa
informazione e ottenendo così l’invarianza alla rotazione. L’orientamento
viene ricavato grazie alla formazione di un istogramma composto di 36 parti
(che coprono l’intero angolo di 360 gradi), il quale viene riempito con i
campioni nell’intorno del keypoint. Per ogni campione viene poi calcolato
l’orientamento θ utilizzando differenze tra pixel:
θ(x, y) = tan−1 ((L(x, y + 1) − L(x, y − 1))/(L(x + 1, y) − L(x − 1, y))).
Prima di aggiungere un campione all’istogramma, gli viene assegnato un
peso sulla base dell’intensità del suo gradiente. Per selezionare l’orientamento finale, viene individuato il picco più alto dell’istogramma e, per
19
CAPITOLO 2. STATO DELL’ARTE
una migliore accuratezza, tramite l’adattamento a una parabola dei 3 valori
dell’istogramma più vicini al picco, viene interpolato l’orientamento finale.
Descrittore
La fase di detection fornisce quindi i keypoint, con informazioni riguardo alla
posizione, alla scala e all’orientamento. A questo punto deve essere ricavato un
descrittore per la feature locale dell’immagine, in grado di contenere tutti questi
dati e che permetta possibilmente di ottenere l’invarianza rispetto ad altre trasformazioni, quali i cambiamenti di illuminazione. La Figura 2.4 mostra il processo di
costruzione del descrittore di SIFT. In primo luogo vengono campionate le intensità dei gradienti dell’immagine e gli orientamenti nell’intorno di ciascun keypoint:
tutte le coordinate vengono ruotate utilizzando l’orientamento del keypoint per
ottenere l’invarianza alla rotazione. Per l’assegnamento dei pesi viene utilizzata
una funzione Gaussiana (illustrata con una finestra circolare nel lato sinistro della
Figura 2.4), che misura l’intensità di ogni punto campionato, al fine di evitare
cambiamenti improvvisi nel descrittore causati da piccole variazioni nella posizione della finestra. In seguito viene costruito il descrittore del keypoint, tramite
Figura 2.4: Creazione del descrittore.Immagine tratta da [16]
20
CAPITOLO 2. STATO DELL’ARTE
la creazione di istogrammi di orientamento nelle regioni di campionamento 4x4
(lato destro della Figura 2.4). Il descrittore viene ricavato a partire da un vettore
contenente i valori di tutte le voci dell’istogramma relativo all’orientamento. La
Figura 2.4 mostra un array 2x2 degli istogrammi relativi all’orientamento, tuttavia
il descrittore standard di SIFT viene costruito a partire da un array di istogrammi
4x4, ognuno composto da 8 parti. Il descrittore SIFT risulta quindi formato da un
vettore di feature di 4x4x8=128 elementi per ogni keypoint. Per ridurre gli effetti
dovuti ai cambi di illuminazione il descrittore viene normalizzato alla lunghezza
unitaria.
2.2.2
SURF
L’algoritmo Speeded Up Robust Features (SURF)[17] si avvicina alle prestazioni
di SIFT, ma allo stesso tempo risulta più veloce nella computazione. Per questo
motivo si rivela interessante analizzare il suo funzionamento, nell’ottica di un esecuzione efficiente e mirata al risparmio energetico. Questo miglioramento viene
ottenuto appoggiandosi a immagini integrali per la convoluzione compiuta dal detector e semplificando gli schemi esistenti di costruzione del descrittore.
Detector
Il detector di SURF si basa su un’approssimazione della matrice Hessiana [18], in
quanto essa permette di ottenere delle buone prestazioni in termini di computazione e accuratezza. Dato un punto (x, y) in un’immagine I, la matrice Hessiana
H(x, y, σ) alla scala σ è definita come:
"
H(x, y, σ) =
∂2
G(σ) · I(x, y)
∂x2
∂ ∂
G(σ) · I(x, y)
∂x ∂y
#
∂ ∂
G(σ) · I(x, y)
∂x ∂y
∂2
G(σ) · I(x, y)
∂y 2
(2.2)
dove I(x, y) rappresenta l’intensità del pixel alle coordinate (x, y) e G(σ) è il nucleo
Gaussiano. Il calcolo della matrice Hessiana implica delle convoluzioni con deriva21
CAPITOLO 2. STATO DELL’ARTE
Figura 2.5: Da destra a sinistra: derivate parziali Gaussiane del second’ordine e
approssimazioni di SURF tramite filtri.Immagine tratta da [18]
te Gaussiane del second’ordine, e questo può risultare molto costoso. Per ridurre
la complessità, SURF approssima questi calcoli utilizzando dei filtri che possono essere processati in modo efficiente utilizzando delle immagini integrali, come
mostrato in 2.5. Denotando le convoluzioni con Dxx , Dyy e Dxy , il determinante
Hessiano può essere approssimato come:
det(Happrox ) = Dxx Dyy − (0.9Dxy )2
(2.3)
• Detection dei keypoint:
in modo simile a SIFT, il detector di SURF è invariante alla scala e si basa
sulla costruzione di una piramide nello scale-space. A differenza di SIFT però, a causa dell’utilizzo di filtri e immagini integrali, lo scale-space di SURF
viene creato applicando filtri di dimensioni diverse direttamente sull’immagine originale, mantenendo il costo. Di conseguenza lo scale-space viene
analizzato aumentando di volta in volta le dimensioni del filtro piuttosto
che ridurre in modo iterativo le dimensioni dell’immagine. Infine, come in
SIFT, i keypoint sono localizzati con il metodo della soppressione del nonmassimo in un volume 3x3x3 di pixel nello scale-space. Quindi, i massimi
del determinante della matrice Hessiana approssimata vengono interpolati
utilizzando lo stesso approccio di SIFT.
22
CAPITOLO 2. STATO DELL’ARTE
• Assegnazione dell’orientamento:
per ottenere l’invarianza alla rotazione, anche SURF identifica un orientamento riproducibile per ogni keypoint. Invece di operare su istogrammi dei
gradienti locali, SURF calcola le risposte alla wavelet Haar in direzione x e y,
in un intorno circolare del keypoint, come fase precedente all’assegnamento
Gaussiano dei pesi. L’orientamento dominante viene stimato calcolando la
somma di tutte le risposte all’interno di una finestra di orientamento scorrevole che copre un angolo di π/3, e quindi scegliendo l’orientamento che
massimizza la somma.
Descrittore
Il primo passo per l’estrazione del descrittore consiste nel centrare attorno a ciascun keypoint una regione quadrata, orientata lungo l’orientamento dominante e
la cui dimensione è proporzionale alla scala del keypoint. La regione viene quindi suddivisa in 4x4 sottoregioni più piccole. All’interno di ogni regione vengono
selezionati 25 punti di campionamento regolarmente distanziati. Per ognuno di
questi punti vengono calcolate le risposte orizzontali e verticali alla wavelet Haar,
indicate rispettivamente con dx e dy . In seguito le risposte vengono sommate in
ogni sottoregione, formando così un primo insieme di valori del vettore delle feature. Vengono inoltre calcolate le somme dei valori assoluti delle risposte |dx | e |dy |.
Quindi, ogni sottoregione è caratterizzata da un vettore a quattro dimensioni,
definito come:
hX
dx ,
X
dy ,
X
|dx | ,
X
i
|dy | .
(2.4)
Il descrittore finale viene ottenuto concatenando i vettori delle feature di tutte le sottoregioni, producendo un vettore di description composto da 64 elementi. Analogamente a SIFT, l’invarianza al contrasto viene ottenuta tramite
normalizzazione.
23
CAPITOLO 2. STATO DELL’ARTE
2.2.3
BRISK
Negli ultimi anni si è assistito alla comparsa di nuovi tipi di algoritmi di detection e
description, pensati in modo specifico per essere eseguiti su architetture che hanno
a disposizione una potenza limitata. In particolare questi nuovo algoritmi mirano
ad essere molto meno esigenti per quanto riguarda la parte di computazione, ma
mantenendo allo stesso tempo performance di alta qualità. Nel 2011, in linea con
queste caratteristiche, viene proposto l’algoritmo Binary Robust Invariant Scalable Keypoints (BRISK) [11], algoritmo che viene preso in considerazione per gran
parte di questa tesi.
Detector
I punti di interesse dell’immagine sono identificati sia attraverso il piano dell’immagine che attraverso lo scale-space, utilizzando un criterio di rilevanza. Per dare
una spinta all’efficienza della computazione, i keypoint vengono individuati sia
negli strati della piramide corrispondenti alle ottave, sia negli strati intermedi. La
posizione e la scala di ognuno dei keypoint vengono ottenute nel dominio continuo
attraverso l’adattamento ad una funzione quadratica. L’elemento fondamentale
di BRISK, che garantisce un aumento della velocità, risiede nell’applicazione di
un nuovo detector:
• Detection dei keypoint:
Con un occhio di riguardo per l’efficienza della computazione, il detector di
BRISK si ispira al popolare detector di spigoli Fast Accelerated Segment
Test (FAST) [19], che risulta uno strumento molto efficiente per l’estrazione
di feature. Esiste inoltre una versione migliorata di FAST, chiamata AGAST [20], la quale prevede che un punto candidato p (di intensità Ip ) viene
classificato come spigolo se, nel Cerchio di Bresenham di raggio 3 attorno a
p, n pixel contigui risultano tutti più luminosi di Ip + t o tutti più scuri di
Ip − t, dove t è una soglia predefinita. Ad ogni spigolo viene quindi assegna24
CAPITOLO 2. STATO DELL’ARTE
to un punteggio s, definito come la soglia più grande per la quale p viene
classificato come spigolo. Lo svolgimento come prima cosa di un test lungo
le quattro direzioni principali del cerchio permette di escludere fin da subito
quei punti che non sono spigoli, accelerando così il processo di detection.
Inoltre, tramite un approccio di apprendimento automatico, AGAST è in
grado di classificare un punto candidato sulla base di pochi test, velocizzando così la fase di detection. Questa soluzione richiede in media meno di 2.3
test per pixel per determinare se esso corrisponda o no ad una feature.
Con l’obiettivo di ottenere l’invarianza alla scala, BRISK si spinge oltre,
andando a ricercare i keypoint non solo nel piano dell’immagine ma anche
nello scale-space, utilizzando il punteggio s di FAST come misura di rilevanza. BRISK si basa su una struttura piramidale dello scale-space. Gli
strati della piramide si costituiscono di n ottave ci e di n intra-ottave di ,
per i = {0, 1, ..., n − 1} e tipicamente n = 4. Le ottave vengono formate
tramite un progressivo ridimensionamento di un fattore 1/2 dell’immagine
originale (che corrisponde a c0 ). Ogni intra-ottava di si trova tra gli strati ci
e ci+1 , come mostrato in Figura 2.6. La prima intra-ottava d0 è ottenuta con
un sottocampionamento dell’immagine originale c0 di un fattore 1.5, mentre il resto degli strati intra-ottave vengono derivati da sottocampionamenti
successivi di un fattore 2. Quindi, se t denota la scala, allora t(ci ) = 2i e
t(di ) = 2i · 1.5. La Figura 2.6 mostra come vengono individuati i punti di
interesse nello scale-space: un keypoint (cioè il punto con massima rilevanza) viene identificato all’ottava ci sia analizzando i valori dei punteggi di
rilevanza dei suoi 8 vicini sia valutando i valori dei punteggi relativi ai vicini
negli strati immediatamente sopra e immediatamente sotto. In tutti e tre
gli strati di interesse, il punto con rilevanza massima locale viene precisato a livello di pixel ed in seguito, tramite l’adattamento ad una parabola
1D lungo l’asse delle scale, viene interpolata la scala esatta del keypoint.
25
CAPITOLO 2. STATO DELL’ARTE
La posizione del keypoint viene poi ulteriormente re-interpolata alla scala
determinata tra tutti i punteggi massimi della zona presa in esame.
Figura 2.6: Detection dei punti di interesse nello scale-space. Figura tratta da [11]
• Assegnazione dell’orientamento:
Per quanto riguarda l’assegnazione dell’orientamento, BRISK si basa su uno
schema utilizzato per campionare i punti vicini nell’intorno del keypoint.
Questo schema (Figura 2.7) definisce N posizioni equamente spaziate su
cerchi concentrici attorno al keypoint. Per evitare l’aliasing, durante il campionamento di un punto pi nello schema viene applicato lo smussamento
Gaussiano con una deviazione standard σi , proporzionale alla distanza tra i
punti sul rispettivo cerchio. Considerando un keypoint k, se (pi , pj ) denota
una delle N (N − 1)/2 coppie di punti campione e I(pi , σi ) e I(pj , σj ) sono i
26
CAPITOLO 2. STATO DELL’ARTE
Figura 2.7: Schema di campionamento di BRISK con N = 60 punti: i piccoli cerchi
blu rappresentano le posizioni in cui viene fatto il campionamento; i cerchi più grossi
tratteggiati vengono determinati ad un raggio σ corrispondente alla deviazione standard
del nucleo Gaussiano usato per smussare i valori di intensità corrispondenti ai punti
campione. Lo schema esposto si applica ad una scala di t = 1. Figura tratta da [11]
rispettivi valori di intensità smussata dei punti, il gradiente locale g(pi , pj )
può essere stimato come:
I(pj , σj ) − I(pi , σi )
.
kpj − pi k2
Considerando poi l’insieme A di tutte le coppie di punti campione:
g(pi , pj ) = (pj − pi ) ·
A = (pi , pj ) ∈ R2 × R2 |i < N ∧ j < i ∧ i, j ∈ N
(2.5)
(2.6)
vengono definiti il sottoinsieme S delle coppie di breve distanza e il sottoinsieme L delle coppie di lunga distanza:
S = {(pi , pj ) ∈ A| kpj − pi k < δmax } ⊆ A
27
(2.7)
CAPITOLO 2. STATO DELL’ARTE
L = {(pi , pj ) ∈ A| kpj − pi k > δmin } ⊆ A
(2.8)
Le distanze di soglia sono definite come δmax = 9.75t e δmin = 13.67t (dove
t è la scala di k). Iterando attraverso le coppie di punti in L viene infine
stimato l’orientamento del keypoint k come:
gx
1
g=
= ·
gy
L
X
g(pi , pj ).
(2.9)
(pi ,pj )∈L
Per questo calcolo vengono utilizzate le coppie di L , sulla base dell’assunzione che i gradienti locali si annullano a vicenda e non sono quindi necessari
per la determinazione del gradiente globale.
Descrittore
L’ottenimento dei descrittori di BRISK risulta un’operazione molto veloce in quanto si basa sul concetto di descrittore binario, che fu proposto per la prima volta
in [21]. Un descrittore binario viene assemblato come una stringa di bit, ottenuta
a partire da una serie di confronti delle intensità dei pixel, cosa che richiede una
potenza computazionale molto bassa. Per quanto riguarda la formazione di un descrittore che tenga conto dell’invarianza alla rotazione e alla scala, BRISK applica
lo schema di campionamento ruotato di un angolo α = arctan 2(gy , gx ) attorno al
keypoint k. Il descrittore risulta quindi un vettore di bit dk , assemblato tramite il
confronto delle intensità di tutte le coppie di punti di breve distanza (pαi , pαj ) ∈ S,
in modo tale che ogni bit b corrisponde a:
(
1, I(pαj , σj ) > I(pαi , σi )
b=
0, altrimenti
(2.10)
∀(pαi , pαj ) ∈ S
Questa modalità di calcolo dei descrittori di BRISK porta diversi vantaggi. In
primo luogo utilizza uno schema di campionamento deterministico, che comporta
una densità uniforme dei punti campione ad un raggio fissato attorno al keypoint.
28
CAPITOLO 2. STATO DELL’ARTE
Di conseguenza non può succedere che lo smussamento Gaussiano, che viene fatto
su misura, possa accidentalmente distorcere il contenuto informativo dei confronti
smussando due punti campione vicini. Inoltre BRISK utilizza un numero molto
minore di punti campione, limitando così la complessità. Nell’implementazione
originale di BRISK, la soglia δmax è fissata in modo tale che il descrittore risulti
un vettore di 512 bit.
2.3
Metodi di riconoscimento e analisi di accuratezza
Le feature visuali locali estratte con gli algoritmi visti finora vengono spesso utilizzate per molte funzioni dell’analisi visuale. In particolare sono molto efficaci per
quanto riguarda compiti di riconoscimento visuale. Esempi applicativi sono: il riconoscimento di oggetti, il riconoscimento di punti di riferimento, le interrogazioni
visuali, il recupero di immagini, etc. Nel corso di questo lavoro di tesi viene fatto
uso di alcuni metodi di riconoscimento visuale. Vediamo quindi le modalità più
utilizzate per implementare queste funzionalità, fornendo un’analisi delle tecniche
impiegate allo stato dell’arte. Verrà inoltre mostrato come è possibile misurare
l’accuratezza del riconoscimento.
2.3.1
Metodi di riconoscimento
Un sistema di riconoscimento è tipicamente caratterizzato dalla seguente struttura: un dispositivo di acquisizione di immagini fornisce l’immagine in input, che
contiene l’oggetto da riconoscere, e viene processata utilizzando uno degli algoritmi
presentati nella Sezione 2.2. Il processo di riconoscimento utilizza un database di
immagini di riferimento: per ognuna delle immagini del database vengono estratte
le feature visuali corrispondenti, che vengono poi memorizzate. A questo punto
deve essere identificata nel database l’immagine che è più simile all’immagine in
input. Per fare questo si effettua un confronto tra le feature dell’immagine in in29
CAPITOLO 2. STATO DELL’ARTE
put e le feature di ognuna delle immagini del database. Per ognuno dei confronti
l’algoritmo prende nota di quante corrispondenze ci sono tra le feature delle due
immagini. Alla fine di questi processo, l’immagine del database con il più alto
numero di corrispondenze viene considerata la più somigliante. Anche se questa procedura permette di ottenere dei buoni risultati di riconoscimento, possono
essere implementati diversi miglioramenti per ottenere prestazioni migliori. Nel
seguito ne vengono esposti due.
• Ricerca nearest neighbor:
per decidere se una una feature appartenente all’immagine in input corrisponde ad una feature di un’immagine del database viene effettuata la cosiddetta ricerca del nearest neighbor, cioè del vicino più prossimo. Per feature
a valori reali (come per SIFT), si utilizza la distanza euclidea, mentre per
feature binarie si utilizza la distanza di Hamming. Tuttavia, il numero di
feature contenuto nell’immagine di input e in ogni immagine del database
può essere molto alto, nell’ordine delle centinaia o anche delle migliaia. Per
questa ragione può essere molto costoso effettuare un confronto del genere tra l’immagine in input e quelle del database. Per ottimizzare i tempi
possono essere quindi utilizzate tecniche di ricerca come quella del nearest
neighbor [22] [23]. Tuttavia, molte feature di un’immagine non presentano
una corrispondenza corretta in quanto derivano da uno sfondo poco definito
o non sono state individuate nelle immagini su cui si è effettuato il training.
Per questo motivo, al fine di scartare le feature che non hanno una buona
corrispondenza con il database, può venire l’idea di una soglia globale sulla
distanza dalla feature più vicina. Questa soluzione non risolve però il problema, in quanto alcuni descrittori sono molto più discriminanti di altri. Un
metodo più efficace è quello di confrontare la distanza del nearest neighbor
con quella del secondo nearest neighbor, utilizzando il cosiddetto test del
30
CAPITOLO 2. STATO DELL’ARTE
rapporto. La corrispondenza viene considerata valida se:
d1 ≤ τ · d2
(2.11)
dove d1 e d2 sono rispettivamente le distanze del nearest neighbor e del
secondo nearest neighbor. E’ stato dimostrato [16] che l’impiego di un test
del rapporto con una soglia τ nel range 0.6-0.8 può migliorare nettamente
le prestazioni.
• Controllo di consistenza geometrica:
Anche il test del rapporto non è in grado di eliminare tutte le false corrispondenze. Per questa ragione esiste un’altra soluzione in grado di scartare
quelle corrispondenze che non rispettano una trasformazione geometrica globale. Questo metodo è detto RAndom SAmple Consensus (RANSAC) [24],
che è in grado di stimare una omografia tra l’immagine in input e quella
del database e verificare quindi quali sono le corrispondenze che rispettano
l’omografia stimata.
Alla conclusione della fase di confronto delle dipendenze viene generata una classifica delle immagini del database sulla base del numero di corrispondenze trovate
con l’immagine in input. Le immagini che sono in cima alla classifica sono quelle
più simili all’immagine in input (avranno infatti il maggior numero di corrispondenze). La Figura 2.8 mostra le corrispondenze rilevate su un’immagine d’esempio.
Quando il numero di immagini nel database è molto elevato, un tipo di confronto
come quello di cui si è parlato finora può essere molto dispendioso. Possono essere
utilizzati approcci differenti, i quali si appoggiano su una rappresentazione ancora più ridotta dell’immagine basata su descrittori di dimensioni fisse. E’ il caso
del modello Bag of Visual Words (BoW) [25], con il quale i descrittori vengono
quantizzati in cosiddette parole visuali, definite a partire da descrittori derivati da
31
CAPITOLO 2. STATO DELL’ARTE
Figura 2.8: Esempio di corrispondenze trovate tra due immagini utilizzando BRISK.
Le linee verdi mettono in relazione le corrispondenze trovate. Immagine tratta da [11]
un certo numero di immagini campione. Pe ogni immagine, viene prodotta una
firma identificativa nella forma di un istogramma, che conta il numero di volte
in cui una determinata parola visuale compare nell’immagine. La corrispondenza
delle immagini viene quindi ottenuta tramite il confronto degli istogrammi, invece
che analizzando la corrispondenza di ogni singola feature. Tuttavia, siccome la
rappresentazione BoW ignora le relazioni spaziali delle feature locali, il processo
descritto precedentemente (cioè il confronto a coppie seguito dal RANSAC) viene
generalmente applicato per riclassificare i risultati ottenuti con l’approccio BoW.
2.3.2
Misure di accuratezza
Per stimare le prestazioni di un sistema di riconoscimento di immagini possono
essere utilizzati diversi metodi. Uno degli indici di misura più utilizzati, e che
viene usato anche in questa tesi, è il Mean of Average Precision (MAP). Data
un’interrogazione q, la precisione media (AP) è definita come:
Pn
APq =
k=1
Pq (k)rq (k)
,
Rq
(2.12)
dove Pq (k) rappresenta la precisione (cioè la frazione degli elementi rilevanti recuperati) considerando i primi k risultati nella classifica delle immagini del database;
32
CAPITOLO 2. STATO DELL’ARTE
rq (k) è una funzione che risulta uguale a 1 se l’elemento in posizione k è rilevante per l’interrogazione e uguale a 0 altrimenti; Rq è il numero totale di elementi
rilevanti per l’interrogazione q e n è il numero totale degli elementi nella lista. Il
valore medio di precisione (MAP) per un insieme Q di interrogazioni corrisponde
alla media aritmetica dell’AP tra interrogazioni differenti:
PQ
2.4
APq
,
Q
q=1
M AP =
(2.13)
Codifica di descrittori binari
Come si è visto nelle sezioni precedenti, gli algoritmi di analisi visuale possono
utilizzare due diversi tipi di descrittori: i descrittori non binari (SIFT [16], SURF
[18]), e i descrittori binari (BRIEF [21], ORB [26], BRISK [11], FREAK [27]).
I descrittori binari, di cui verrà fatto uso in questa tesi, sono intrinsecamente
differenti dai descrittori a valori reali. Ogni elemento del descrittore è infatti già
quantizzato a un bit per definizione. Di conseguenza l’applicazione degli schemi di
codifica tradizionali risulta difficoltosa. Tuttavia, anche se una codifica senza perdite può comunque essere applicata in modo convenzionale, esiste la possibilità di
regolare la dimensione dei descrittori binari, variando il numero di confronti delle
coppie a seconda della disponibilità di bit. Nel seguito viene descritto un metodo
di codifica senza perdite per descrittori binari seguito da uno studio sull’efficacia
dei descrittori in funzione della loro dimensione, quando si varia la strategia di
scelta dei confronti da effettuare [28].
Ogni elemento di un descrittore binario è quindi un bit, che rappresenta il
risultato di un test binario valutato sulla sulla base del contenuto dell’intorno
di ciascun keypoint. Se si considerano in particolare due descrittori allo stato
dell’arte, BRISK e FREAK, che adottano un metodo simile di costruzione del
descrittore, si vede che in entrambi i casi ogni test binario effettua il confronto tra
due valori di intensità smussata di una coppia di pixel. La posizione di questi pixel
33
CAPITOLO 2. STATO DELL’ARTE
Figura 2.9: Schemi di campionamento nel caso di (a) BRISK e nel caso di (b) FREAK
nell’intorno del keypoint è determinata sulla base degli schemi di campionamento
illustrati nelle figure 2.9(a) e 2.9(b).
Il numero totale di test binari possibili dipende dalla configurazione dello schema di campionamento. Lo schema di campionamento standard di BRISK consiste
di N = 60 punti, quindi |A| = 1770. Invece nel caso di FREAK N = 43 punti, quindi |A| = 903. Sono state studiate diverse strategie che possono essere
usate per selezionare un sottoinsieme di queste coppie a partire dai vincoli sulla
dimensione del descrittore D.
2.4.1
Codifica senza perdite
Indipendentemente dalla specifica strategia di selezione, il descrittore sarà costituito da una stringa di D bit, ognuno rappresentante il risultato di un test binario.
Siccome i test binari non sono statisticamente indipendenti, è possibile modellare
il descrittore come una sorgente binaria con memoria ed eseguire una codifica senza perdite utilizzando un numero di bit R ≤ D. Sia H(πn ), n = 1, ..., D, l’entropia
dell’n-esimo elemento del descrittore, che viene calcolata come:
H(πn ) = −pn (0) log2 pn (0) − pn (1) log2 pn (1)
34
(2.14)
CAPITOLO 2. STATO DELL’ARTE
In modo simile, è possibile calcolare l’entropia condizionata H(πn1 |πn2 ). Le statistiche utilizzate per calcolare H(πn ) e H(πn1 |πn2 ) possono essere ottenute analizzando un insieme di descrittori di prova estratti da una collezione di immagini. Sia
π̃n , n = 1, ..., D, una permutazione delle D coppie selezionate, che indica l’ordine
sequenziale utilizzato per codificare il descrittore. La lunghezza media della codifica necessaria per codificare senza perdite il descrittore è limitata inferiormente
da
R=
D
X
H(π̃n |π̃n−1 , ..., π̃1 ).
(2.15)
n=1
Per ottimizzare l’efficienza della codifica, risulta utile trovare la permutazione che
minimizza il limite inferiore (2.15). Per fare questo viene adottata una strategia
Greedy, che assume che il descrittore possa essere modellato come una sorgente di
Markov del prim’ordine, cioè H(π̃n |π̃n−1 , ..., π̃1 ) = H(π̃n |π̃n−1 ). Per questo motivo
il descrittore viene poi riordinato selezionando iterativamente gli elementi. In
modo specifico, l’elemento n-esimo viene scelto come l’elemento che minimizza
l’entropia condizionata rispetto agli elementi selezionati precedentemente
π̃n = arg min H(πn |π̃n−1 )
πn
(2.16)
Per quanto riguarda il primo elemento, viene selezionato quello con l’entropia
minore, anche se è stato verificato che questa scelta euristica non influisce in
modo significativo sulla dimensione della codifica.
2.4.2
Costruzione del descrittore: codifica con perdite
In questa sezione vengono considerate diverse strategie di selezione, a partire da
quelle adottate nelle implementazioni di BRISK e FREAK, arrivando poi a descrivere altre tre nuove strategie presentate in [28], cioè la strategia matching-based,
la strategia coding-based e la strategia hybrid.
35
CAPITOLO 2. STATO DELL’ARTE
Strategia di BRISK
La strategia di Brisk per la costruzione del descrittore è stata esposta nella Sezione 2.2.3. Come abbiamo visto, il numero di elementi D del descrittore dipende
dal valore della soglia sulla distanza δmax . In [11], δmax è stata fissata a 13.67σm ,
in modo tale che venga ottenuto un descrittore con D = |S| = 512 elementi. In
[28] viene proposto invece di variare δmax per testare dimensioni differenti del descrittore.
Strategia di FREAK
La fase di descrizione di FREAK introduce un algoritmo euristico per selezionare
l’insieme di test binari usati per costruire il descrittore. Durante una fase preliminare, FREAK analizza tutte le possibili N (N − 1)/2 coppie nell’insieme A, a
partire da un elevato numero di chiazze dell’immagine estratte da diverse immagini. Sia D ∈ {0, 1}N (N −1)/2×Q una matrice contenente i risultati dei test binari per
tutte le chiazze Q. FREAK calcola la varianza di ogni coppia e seleziona come
prima coppia quella con la varianza maggiore. Ciò è equivalente a selezionare
la coppia per la quale le occorrenze di zeri e uni sono distribuite in modo più
uniforme, ossia la coppia con l’entropia maggiore. In seguito vengono selezionate
iterativamente le altre coppie, scegliendo la coppia che minimizza la correlazione con la coppia selezionata precedentemente. L’algoritmo risulta quindi di tipo
Greedy per natura e, ad ogni passo, cerca di selezionare una coppia in modo tale
da massimizzare la diversità. L’algoritmo termina quando la disponibilità D è
esaurita.
Strategia matching-based
La strategia di selezione utilizzata in FREAK considera la distribuzione statistica
dei test binari compiuti su un elevato numero di chiazze. Tuttavia non considera
36
CAPITOLO 2. STATO DELL’ARTE
la bontà delle coppie selezionate quando vengono confrontati descrittori estratti
da immagini diverse dello stesso luogo. La strategia di selezione matching-based
considera la distribuzione congiunta di test binari effettuati nel caso in cui vengano
trovate corrispondenze tra le chiazze e nel caso in cui non vengano trovate. Questa
strategia sfrutta la disponibilità del dataset introdotto in [29], che include un vasto
insieme di chiazze estratte da diverse immagini dello stesso luogo e acquisite da
diversi punti di vista. Il dataset fornisce inoltre informazioni riguardo a quali
chiazze corrispondono allo stesso keypoint fisico. Come per FREAK, sia D ∈
{0, 1}N (N −1)/2×Q una matrice contenente i risultati dei test binari per tutte le
chiazze Q. Sia M invece l’insieme di indici delle coppie con corrispondenze:
M = {(q1 , q2 )|dq1 e dq2 sono keypoint corrispondenti}
(2.17)
In modo simile è possibile definire un insieme N di indici di coppie senza corrispondenze. Quindi, per ognuna delle coppie in A, è possibile ricavare l’informazione
condivisa I M (πn ), m = 1, ..., N (N − 1)/2,
I M (πn ) =
X X
pM
n (x, y) log2
x∈0,1 y∈0,1
pM
n (x, y)
,
pn (x) · pn (y)
(2.18)
dove pn (0) e pn (1) sono le probabilità di osservare rispettivamente zero o uno
come risultato del test binario relativo all’ n-esima coppia in A. La probabilità
pM
n (x, y) misura le occorrenze congiunte di zeri e uni nelle coppie di descrittori
che corrispondono. Ad esempio pM
n (0, 0) rappresenta la probabilità che entrambi
i descrittori in una coppia con corrispondenze contengano uno zero nell’elemento
relativo all’n-esimo test binario. Viene definita allo stesso modo l’informazione
InN per le coppie senza corrispondenze. In conclusione, per ognuna delle coppie in
A viene ricavata la seguente funzione di punteggio:
Jn = I M (πn ) − I N (πn ),
37
(2.19)
CAPITOLO 2. STATO DELL’ARTE
e le coppie vengono classificate in ordine decrescente di Jn . Questa strategia sceglie poi le prime D coppie con il più alto valore di Jn .
Strategia coding-based
La strategia di selezione coding-based procede costruendo un descrittore di D elementi con l’obiettivo di minimizzare il numero di bit necessari per codificarlo. La
strategia di selezione segue lo stesso approccio descritto nella Sezione 2.4.1 ma,
ad ogni iterazione dell’algoritmo Greedy, considera tutte le possibili N (N − 1)/2
coppie piuttosto che un sottoinsieme di D coppie. L’algoritmo termina quando
vengono selezionate D coppie.
Strategia hybrid
L’approccio hybrid combina il metodo matching-based con quello coding-based.
D elementi del descrittore vengono selezionati per mezzo della seguente strategia:
π̃n = arg max α(I M (πn ) − I N (πn )) − (1 − α)H(πn |π̃n−1 )
πn
(2.20)
Per quanto riguarda la prima coppia π̃1 il termine H(πn |π̃n−1 ) viene sostituito da
H(πn ).
2.5
Modello rate-accuratezza
Il lavoro svolto in questa tesi, in particolare per quanto riguarda il confronto dei
paradigmi analizza-poi-comprimi e comprimi-poi-analizza, si basa su un modello
rate-accuratezza proposto in [28]. La creazione di questo modello parte dal presupposto, già espresso in precedenza, che nel contesto delle reti di sensori visuali
è estremamente importante minimizzare il più possibile la quantità di dati da
immagazzinare o trasmettere da un nodo, a causa della disponibilità limitata di
38
CAPITOLO 2. STATO DELL’ARTE
banda e energia. Tale quantità di dati corrisponde non solo ai bit usati per codificare ciascuna feature visuale, ma anche dal numero totale di feature che devono
essere trasmesse. Questo modello mira quindi a svolgere un’analisi che permetta
di comprendere quale sia il parametro con un impatto maggiore sull’accuratezza
finale: si potrebbe dover scegliere ad esempio, a parità di disponibilità di bitrate,
se inviare poche feature quantizzate in modo preciso oppure se inviarne molte
quantizzate grossolanamente. Viene di seguito illustrato il modello.
Sia I un’immagine che viene processata per mezzo di un detector invariante
alla scala. Il detector identifica i keypoint rilevanti ki , i = 1, ..., Mi , dove Mi rappresenta il numero di keypoint (dipendente dal contenuto) estratti dall’immagine
I. Il vettore ki = [xi , yi , σi , Hi ]t indica la posizione del keypoint nel dominio dello
scale-space e una misura legata alla rilevanza del keypoint. Per ogni keypoint
viene ricavato un descrittore di di dimensione proporzionale a σi a partire dalla chiazza intorno a (xi , yi ). Se il descrittore non è binario (come per SIFT e
SURF) allora di ∈ Rd . Nel caso invece di descrittori binari (come per BRISK),
di ∈ {0, 1}d . I descrittori vengono quindi codificati attraverso uno dei metodi
esposti nella Sezione 2.4. Nel caso di descrittori non binari, ogni descrittore viene
quantizzato e codificato entropicamente in modo da ottenere un rate medio per
d
. Il rate complessivo necessario per trasmettere le feature locali
descrittore r∆,i
dell’immagine I è uguale a
d
),
ρI = MI (rIk + r∆,i
(2.21)
dove rIk è il rate necessario per codificare le coordinate spaziali di ciascun keypoint.
Nel caso invece di descrittori binari, ogni descrittore viene ricavato tramite una
specifica strategia di selezione e codificato in modo tale da rispettare una certa
d
disponibilità di bitrate rD,i
. Il rate complessivo necessario per trasmettere le
feature locali binarie dell’immagine I risulta quindi uguale a:
39
CAPITOLO 2. STATO DELL’ARTE
d
).
ρI = MI (rIk + rD,i
(2.22)
Anche la posizione dei keypoint deve essere codificata e trasmessa, affinché possa
essere effettuata la verifica spaziale (ad esempio con RANSAC) sul nodo centrale. La maggior parte dei detector producono coordinate rappresentate con una
precisione in virgola mobile, tuttavia la maggior parte dei compiti di analisi richiede una precisione minore. Per questa ragione le coordinate di ciascun keypoint
vengono codificate utilizzando rIk = log2 4Nx + log2 4Ny , dove Nx e Ny sono le
dimensioni dell’immagine in input.
Per la realizzazione di questo modello è stato utilizzato un sistema in cui un
nodo provvisto di fotocamera acquisisce un’immagine contenente un particolare
oggetto, estrae quindi le feature locali e le invia ad un nodo centrale, il quale si
occupa di eseguire il processo di riconoscimento. Le corrispondenze vengono rilevate confrontando i vettori delle feature locali e quelli relativi alle immagini del
database e viene utilizzato RANSAC per controllare la consistenza geometrica.
Ciò che è stato osservato è che, in contrasto con gli studi precedenti, sia il numero di feature M da trasmettere, sia il bitrate di quantizzazione possono essere
ricavati indipendentemente per ogni immagine di interrogazione. Il numero dei
keypoint estratti dipende dal contenuto dell’immagine e può verificarsi che ecceda
M . E’ quindi necessario determinare un sottoinsieme di M keypoint per il calcolo
e l’invio dei descrittori associati. Come è stato mostrato in [30], selezionando i
primi M keypoint in ordine descrescente in base al valore di punteggio associato
(come ad esempio il punteggio s per le feature di BRISK), vengono migliorate
le prestazioni della fase di ricerca delle corrispondenze. A questo punto vengono
ricavati M vettori di feature e vengono trasmessi al nodo centrale. L’accuratezza
viene quindi valutata per mezzo del MAP. I risultati ottenuti hanno mostrato che
le curve rate-accuratezza ottenute presentano lo stesso comportamento al variare
del dataset e dell’algoritmo di estrazione delle feature. La Figura 2.10 mostra la
40
CAPITOLO 2. STATO DELL’ARTE
Figura 2.10: Curva rate-accuratezza nel caso del dataset ZuBuD e feature di BRISK.
Ognuna delle linee colorate rappresenta la curva di rate-accuracy per un diverso numero
di feature M al variare del numero D di confronti bit a bit. La linea nera tratteggiata
è l’inviluppo della famiglia di curve di rate-accuratezza, e rappresenta l’accuratezza
migliore che può essere ottenuta ad un dato rate. La curva corrispondente all’etichetta
ALL è stata ottenuta utilizzando la totalità delle feature estratte.
famiglia di curve ottenuta utilizzando il dataset ZuBuD e le feature ottenute con
BRISK. Come si può vedere, l’accuratezza finale non dipende solo dal numero di
feature usate per il riconoscimento ma anche dal rate. Per esempio, prendendo
in considerazione la Figura 2.10, usando M = 20 feature codificate con rd = 800
bit per feature si ottiene un’accuratezza più bassa rispetto ad un utilizzo di 40
feature con 400 bit per feature, pur mantenendosi costante il rate complessivo.
Allo scopo di determinare l’inviluppo della famiglia di curve, ogni curva AM (ρ)
viene approssimata con una funzione lineare a tratti composta da due parti:
AM (ρ) = min(gM (ρ), hM (ρ)),
(2.23)
gM (ρ) = mρ + pM , hM (ρ) = qm .
(2.24)
41
CAPITOLO 2. STATO DELL’ARTE
Per ridurre il numero di parametri da stimare, viene imposto che le linee che si
adattano alla prima parte della curva abbiano tutte lo stesso coefficiente angolare
m, mentre le linee che si adattano la seconda parte della curva siano tutte parallele
all’asse delle x. In seguito, per ogni valore di M si ottengono pM e qM con il metodo
dei minimi quadrati, andando poi ad analizzare il loro comportamento al variare
di M , cosa che può essere modellata come segue:
p(M ) = α + βM, q(M ) = δ +
γ
M
(2.25)
dove α, β, γ e δ sono parametri del modello ottenuti dalla famiglia di curve osservata. L’inviluppo di tale famiglia risulta il luogo dei punti per il quale g(ρ) = h(ρ)
e quindi:
M ρ + (α + βM ) = δ +
γ
M
(2.26)
Risolvendo per M si ottiene quindi il numero ottimale di feature da utilizzare ad
un certo rate ρ al fine di massimizzare l’accuratezza del compito di analisi:
Figura 2.11: Curva di allocazione interna con dataset ZuBuD e feature di SURF.
42
CAPITOLO 2. STATO DELL’ARTE
M (ρ) =
−(α − δ + mρ) +
p
(α − δ + mρ)2 + 4βγ
.
2β
(2.27)
A questo punto, sostituendo la (2.27) nella (2.22), si trova il numero ottimale di
bit rd (ρ) che deve essere allocato per ogni descrittore di feature, che può essere
utilizzato per selezionare in modo appropriato il numero di confronti bit a bit D.
La coppia hM (ρ), rd (ρ)i definisce l’allocazione interna per un certo rate ρ. La
Figura 2.11 mostra la curva di allocazione interna con il dataset ZuBuD e feature
di SURF.
43
Capitolo 3
Ottimizzazioni di BRISK
Per utilizzare un paradigma del tipo analizza-poi-comprimi, come si è visto in
precedenza, è di fondamentale importanza ridurre al massimo i consumi energetici, in particolare quelli derivanti dall’esecuzione dei compiti di analisi visuale sui
nodi della rete. In quest’ottica risulta determinante la scelta di quale algoritmo
di estrazione delle feature utilizzare. Prendendo in considerazione gli algoritmi
in grado di mantenere l’invarianza alla scala, caratteristica cruciale per diverse
applicazioni, è necessario scegliere quello che riesce ad eseguire il proprio compito
nel modo più efficiente. Come si è visto in [12], l’algoritmo che risponde a questi
requisiti è BRISK [11]. Seppure BRISK risulta molto efficiente, l’esecuzione di
funzioni di analisi visuale su nodi alimentati da una batteria può comunque rivelarsi molto dispendiosa per i nostri scopi. Si rivela quindi necessaria un’analisi
approfondita dell’algoritmo di BRISK, con lo scopo di individuare ulteriori ottimizzazioni possibili, in modo tale da rendere massima l’efficienza dell’esecuzione
su dispositivi con scarse disponibilità energetiche.
3.1
Dispositivo utilizzato
Il lavoro effettuato in questa tesi si basa sull’utilizzo di un dispositivo Beaglebone,
mostrato in Figura 3.1. La beaglebone è un computer di dimensioni ridotte, a
basso costo, dotato di un processore ARM Cortex-A8 e che utilizza l’architettura
44
CAPITOLO 3. OTTIMIZZAZIONI DI BRISK
Figura 3.1: Dispositivo Beaglebone. La Figura mostra il lato superiore e il lato
inferiore della board.
ARMv7-A. Le caratteristiche di questo dispositivo sono le seguenti[10]:
• Processore ARM Cortex-A8 (fino a 720 Mhz di frequenza)
• 256 MB DDR2 RAM
• 10/100 Ethernet RJ45 socket, IPv4 e IPv6 networking
• sistema operativo: Ubuntu Linux
• slot MicroSD
• card microSD da 4gb
• porta USB 2.0 di tipo A
• alimentazione a +5V tramite connettore o porta USB.
45
CAPITOLO 3. OTTIMIZZAZIONI DI BRISK
Figura 3.2: La tabella in Figura mostra i diversi consumi di potenza della Beaglebone
in vari scenari esecutivi. I valori sono espressi in mA.
• dimensioni: 86.4mm x 53.3mm
In questo lavoro di tesi la Beaglebone viene utilizzata tramite connessione USB
ad un computer desktop. L’accesso al dispositivo viene effettuato dal computer
desktop tramite il protocollo di rete SSH. Vengono utilizzate le funzioni di analisi
visuale della versione 2.4.5 di OpenCV. Nella Figura 3.2 possiamo osservare i
consumi energetici della board in alcuni scenari esecutivi.
3.2
Considerazioni preliminari e struttura di BRISK
L’assunzione che sta alla base di questo lavoro è quella per cui il consumo energetico derivante dall’esecuzione di un algoritmo sia direttamente proporzionale al
tempo dell’esecuzione stessa. Una tale assunzione si è resa necessaria a causa del
fatto che, per questo lavoro di tesi, gli strumenti a disposizione non permettono
una misurazione diretta dell’energia effettivamente consumata. D’altro canto, i
consumi energetici derivanti da un dispositivo Beaglebone durante l’esecuzione
di un determinato processo sono pressoché costanti nel tempo. Grazie allo strumento software cpufreq è infatti possibile tenere sotto controllo la frequenza di
lavoro del processore. Abbiamo osservato che durante l’esecuzione di un processo
la frequenza assume lo stesso valore (500MHz) per la quasi totalità del tempo
di esecuzione. Questo valore corrisponde alla frequenza massima di lavoro del
46
CAPITOLO 3. OTTIMIZZAZIONI DI BRISK
processore. Prendiamo quindi in considerazione una potenza di lavoro della CPU
pari a 2.1 W, corrispondente al valore di frequenza di picco del dispositivo.
Per comprendere come migliorare l’efficienza di BRISK, è necessaria una fase
preliminare che analizzi la struttura di brisk e determini quali sono le parti più
dispendiose di esso. La struttura dell’algoritmo può essere vista come composta
di tre parti: (i) la generazione del nucleo, (ii) la fase di detection e (iii) la fase di
description. Nel dettaglio:
1. Generazione del nucleo:
Questa è la fase preliminare dell’algoritmo. Vengono create le strutture dati
necessarie per implementare lo schema di campionamento visto nella Sezione
2.2.3. Vengono definiti quali sono i punti da campionare attorno al keypoint
e quali sono le distanze tra di essi. In seguito vengono prese in considerazione
tutte le coppie di punti appartenenti allo schema, che costituiscono l’insieme
A: in base alla distanza tra i due punti di una coppia e alle due soglie δmax
e δmin vengono definiti i due sottoinsiemi S delle coppie a breve distanza e
L delle coppie a lunga distanza. Questi due sottoinsiemi saranno poi utili
per ottenere i descrittori e l’invarianza alla rotazione.
2. Fase di detection:
In questa fase vengono estratti i keypoint a partire dall’immagine in input.
E’ prevista l’esecuzione di due funzioni:
• Costruzione della piramide delle scale: vengono determinati i vari strati
nello scale-space che andranno a costituire la cosiddetta piramide. In
particolare vengono definiti gli strati corrispondenti alle ottave e gli
strati intermedi tra le ottave. Per questa operazione viene fatto uso di
due funzioni che ridimensionano l’immagine (una che effettua un ridimensionamento di 1/2 e l’altra di 2/3), permettendo quindi di lavorare
su scale differenti.
47
CAPITOLO 3. OTTIMIZZAZIONI DI BRISK
• Estrazione dei keypoint: questa funzione si occupa di determinare i
punti salienti dell’immagine, tramite le modalità esposte nella Sezione
2.2.3. La sua implementazione prevede l’utilizzo di una soglia, che
determina la severità dei vincoli che un punto deve rispettare per essere
identificato come saliente. Se la soglia è alta, i vincoli sono molto
stringenti, e di conseguenza il numero di keypoint individuati è basso.
Viceversa, nel caso di una soglia piccola, i keypoint individuati saranno
molti. Questa parte si occupa quindi di effettuare tutte le operazioni di
confronto tra i valori di intensità dei pixel, sia sul piano dell’immagine
che nello scale-space, sfruttando anche funzioni di interpolazione.
3. Fase di description:
In questa fase vengono determinati i descrittori sulla base dei keypoint individuati nella fase di detection. L’implementazione prevede inizialmente
una procedura di rimozione dei keypoint molto vicini ai bordi. In seguito,
per ognuno dei keypoint individuati, vengono eseguite le seguenti operazioni: viene innanzitutto determinato il gradiente globale associato al keypoint
per ottenere l’invarianza alla rotazione; successivamente vengono prese in
considerazione tutte le coppie dell’insieme S e viene effettuato il test binario per ognuna di esse, in modo tale da determinare i bit che comporranno
il descrittore.
Vediamo ora come si comporta ognuna di queste fasi in termini di tempi di esecuzione. Sono stati acquisiti i tempi necessari per eseguire l’analisi di alcune
immagini campione a tre diverse risoluzioni: VGA (640x480), SVGA (800x600)
e XGA (1024x768). E’ stata inoltre fatta variare la soglia per la detection dei
keypoint. Nelle figure 3.3, 3.4 e 3.5 sono rappresentati in percentuale i pesi delle
singole fasi sul tempo di esecuzione totale, per ognuna delle risoluzioni. Da questi
risultati si può osservare come prima cosa che, nella maggior parte dei casi, la fase
di description rappresenta la parte più dispendiosa. Anche la fase di generazione
48
CAPITOLO 3. OTTIMIZZAZIONI DI BRISK
del nucleo occupa una fetta rilevante del tempo di esecuzione totale. Tuttavia è
importante notare che questa parte può essere eseguita in modo totalmente indipendente dall’immagine che viene analizzata, in quanto si occupa solamente di
creare strutture che non necessitano di nessun dato relativo all’immagine stessa.
Per questa ragione la fase di generazione del nucleo può essere eseguita una sola
volta all’inizio del processo, non andando così ad impattare sulle prestazioni. Per
quanto riguarda la costruzione della piramide, si osserva che, alle risoluzioni più
alte e considerando soglie grandi, l’impatto sul tempo totale è considerevole. E’
degno di nota il fatto che gran parte dell’esecuzione di questa fase è occupata
dalle funzioni di ridimensionamento dell’immagine, che risultano quindi le parti
onerose. Infine osserviamo che la fase di estrazione dei keypoint rappresenta un
peso pressoché costante (poco meno del 20%) in quasi tutti i casi.
Partendo da queste osservazioni, si può pensare all’implementazione di migliorie
che riducano le componenti più dispendiose.
70
Generazione nucleo
Costruzione piramide
Estrazione keypoint
Description
60
Percentuale
50
40
30
20
10
0
60
70
80
90
Soglia
100
110
120
Figura 3.3: Tempi di esecuzione delle singole operazioni di BRISK alla risoluzione
VGA, al variare della soglia.
49
CAPITOLO 3. OTTIMIZZAZIONI DI BRISK
80
Generazione nucleo
Costruzione piramide
Estrazione keypoint
Description
70
Percentuale
60
50
40
30
20
10
0
60
70
80
90
Soglia
100
110
120
Figura 3.4: Tempi di esecuzione delle singole operazioni di BRISK alla risoluzione
SVGA, al variare della soglia.
80
Generazione nucleo
Costruzione piramide
Estrazione keypoint
Description
70
Percentuale
60
50
40
30
20
10
0
60
70
80
90
Soglia
100
110
120
Figura 3.5: Tempi di esecuzione delle singole operazioni di BRISK alla risoluzione
XGA, al variare della soglia.
3.3
Ottimizzazioni
In questa sezione verranno esposte le migliorie pensate per rendere l’esecuzione di
BRISK più efficiente. Le osservazioni fatte precedentemente hanno messo in mostra come nessuna parte dell’algoritmo presenti tempi di esecuzione trascurabili.
50
CAPITOLO 3. OTTIMIZZAZIONI DI BRISK
L’obiettivo diventa quindi quello di cercare di ottimizzare ogni singola porzione
di BRISK, con un occhio di riguardo per la fase di description, e fatta eccezione
per quanto riguarda la generazione del nucleo, che come abbiamo visto può essere
eseguita una sola volta all’inizio di tutto il processo di analisi.
3.3.1
Selezione delle coppie di punti
Questa ottimizzazione ha l’obiettivo di migliorare l’efficienza della fase di description. Come si è visto nella Sezione 2.2.3, per la creazione del costruttore, BRISK agisce tramite l’esecuzione di test binari che confrontano i valori di intensità
smussata delle coppie di punti appartenenti all’insieme S. Il risultato di ciascun
confronto determina il valore di uno dei bit del descrittore binario risultante. La
dimensione del descrittore dipende quindi dal numero di confronti che vengono
effettuati, in quanto tale numero corrisponde alla grandezza in bit del descrittore.
In ultima analisi quindi, è la quantità di coppie presenti nell’insieme S a determinare la dimensione finale del descrittore. La versione originale di BRISK prevede
che l’insieme S sia composto da 512 coppie, con la conseguenza che i descrittori
binari sono composti da 512 bit. La Sezione 2.4.2 ci ha mostrato che può essere
determinata la dimensione ottimale dei descrittori per garantire la massima accuratezza al variare del rate. Di conseguenza, si può pensare di rimuovere il vincolo
presente sulla dimensione del descrittore (fissa a 512), permettendo invece la determinazione di descrittori che abbiano anche dimensioni ridotte. Una modifica di
questo tipo può impattare positivamente anche sull’efficienza dell’algoritmo. Dimensioni ridotte dei descrittori comportano infatti un numero minore di confronti
necessari, riducendo così il carico computazionale. L’algoritmo deve quindi essere
modificato in modo tale da permettere una selezione delle coppie che compongono
l’insieme S basata sulle strategie esposte nella Sezione 2.4.2.
51
CAPITOLO 3. OTTIMIZZAZIONI DI BRISK
3.3.2
Calcolo dell’intensità smussata solo per i punti utilizzati
Anche questa ottimizzazione viene pensata per ridurre il costo associato alla fase
di description. Come si è visto in precedenza, i confronti effettuati per determinare i bit del descrittore prendono in considerazione i valori di intensità dei punti
attorno al keypoint, valori che vengono però smussati, al fine di evitare effetti
di aliasing durante la fase di campionamento. Questa operazione viene compiuta
applicando il cosiddetto smussamento Gaussiano, con una deviazione standard
proporzionale alla distanza tra i punti sul rispettivo cerchio dello schema di campionamento. L’operazione di smussamento utilizza i valori di una distribuzione
gaussiana in due dimensioni per costruire una matrice di convoluzione che viene
poi applicata all’immagine originale. L’intensità di un determinato pixel assume
poi il valore della media pesata delle intensità dei punti attorno al pixel stesso.
Il carico computazionale associato a questa operazione risulta quindi piuttosto
considerevole. L’implementazione di BRISK degli autori prevede che durante la
fase di description vengano calcolati i valori di intensità smussata per ciascuno dei
60 punti previsti dallo schema di campionamento. Dalle esecuzioni di BRISK si
osserva che per generare un descrittore di 512 bit vengono solitamente utilizzati
tutti i 60 punti dello schema. L’implementazione dell’ottimizzazione proposta nella Sezione precedente implicherebbe tuttavia la possibilità di lavorare con vettori
di descrizione di dimensioni anche molto minori di 512 bit. Siccome nel caso di
descrittori di dimensioni ridotte le coppie prese in considerazione per i test binari
sulle intensità sono poche, non tutti i punti previsti dallo schema di campionamento vengono effettivamente utilizzati. Di conseguenza il calcolo dell’intensità
smussata per questi punti rappresenterebbe un’operazione del tutto inutile. La
miglioria che deve essere implementata in questo caso deve quindi fare in modo
che l’intensità smussata venga determinata solamente per i punti dello schema di
campionamento realmente utilizzati.
52
CAPITOLO 3. OTTIMIZZAZIONI DI BRISK
3.3.3
Conversione delle funzioni di ridimensionamento dell’immagine
La fase di costruzione della piramide relativa allo scale-space è occupata prevalentemente dall’esecuzione di due funzioni che svolgono il compito di ridimensionare
l’immagine di partenza, una di un fattore 1/2 e l’altra di un fattore 2/3, permettendo così la formazione dei vari strati della piramide. Ottimizzare questa porzione di codice significa quindi migliorare le due funzioni di ridimensionamento.
L’implementazione originale di BRISK relativa a questa parte prevede l’utilizzo
di alcune istruzioni SSE2 e SSE3, che permettono di ottenere prestazioni migliori
in termini di velocità di esecuzione. Le SSE (Streaming SIMD Extensions) sono
un insieme di istruzioni SIMD (Single Instruction, Multiple Data) implementate da processori Intel. Le funzioni di ridimensionamento dell’immagine devono
effettuare molte operazioni identiche sui pixel dell’immagine. Siccome molti di
questi calcoli possono essere fatti in modo indipendente tra loro, BRISK sfrutta l’insieme di istruzioni SSE per elaborare tali dati in parallelo, ottenendo così
un incremento delle prestazioni. Naturalmente questa ottimizzazione è limitata
dal fatto che l’esecuzione dell’algoritmo deve avvenire su un’architettura (x86)
in grado di supportare queste istruzioni. Molti dei dispositivi in commercio che
possono essere utilizzati come nodi di una rete di sensori visuali si basano però
su un’architettura ARM, che è incompatibile con l’insieme di istruzioni SSE. E’
questo il caso del dispositivo Beaglebone utilizzato per questa tesi. La versione
di BRISK degli autori prevede che, nel caso di un’architettura non x86, vengano
utilizzate funzioni standard di ridimensionamento che non sono ottimizzate. Il
miglioramento che può essere apportato in questo caso è quindi una conversione
delle istruzioni SSE in istruzioni equivalenti supportate dall’architettura ARM. La
controparte delle SSE su ARM è rappresentata dalla tecnologia chiamata NEON.
NEON è una combinazione di istruzioni SIMD nata per accelerare e standardizzare il trattamento e l’elaborazione di segnali multimediali. Una conversione di
53
CAPITOLO 3. OTTIMIZZAZIONI DI BRISK
questo tipo permetterebbe quindi di ottenere le stesse prestazioni ottimizzate anche nel caso di architetture ARM. L’obiettivo è quello di effettuare una traduzione
che produca funzioni in grado di ottenere gli stessi risultati delle funzioni originali.
Entrambe le tecnologie hanno la caratteristica comune di lavorare con registri a
128 bit. In Figura 3.6 è mostrata una rappresentazione dei registri utilizzati dalle
istruzioni SSE, che possono essere suddivisi in elementi da 32 o 64 bit a seconda
delle necessità.
Figura 3.6: Registri a 128 bit utilizzati dall’insieme di istruzioni SSE.
Anche nel caso della tecnologia NEON i registri possono contenere diverse combinazioni di numeri interi o a virgola mobile, con dimensioni che possono variare
dai 16 bit ai 64 bit. Una volta riempiti, questi registri possono essere utilizzati per
eseguire operazioni in parallelo sui vari elementi che li compongono. La Figura
3.7 mostra un esempio di operazione di addizione bit a bit tra registri vettoriali,
eseguita tramite istruzioni NEON. Q1 e Q2 sono i registri sorgente composti da 8
elementi da 16 bit ciascuno mentre Q0 rappresenta il registro destinazione. L’operazione di addizione viene eseguita in parallelo tramite un’unica istruzione, e
54
CAPITOLO 3. OTTIMIZZAZIONI DI BRISK
Figura 3.7: Rappresentazione dell’esecuzione dell’istruzione VADD.I16 Q0, Q1, Q2.
Q1 e Q2 sono i due registri sorgente a 128 bit, suddivisi in 8 elementi da 16 bit (lane).
Q0 è il registro destinazione in cui vengono memorizzati i risultati.
indipendentemente per ogni coppia di elementi appartenenti ai registri Q1 e Q2;
i risultati vengono poi memorizzati negli elementi di Q0.
Sfruttando quindi la disponibilità delle istruzioni di NEON per l’architettura ARM, è possibile ottimizzare le funzioni di ridimensionamento dell’immagine
riproducendo gli algoritmi implementati originariamente con istruzioni SSE. La
difficoltà che si può incontrare risiede nel fatto che per molte delle istruzioni SSE
non esiste un’istruzione NEON corrispondente che svolga la stessa funzione. La
realizzazione di questo miglioramento contribuirebbe a ridurre il peso della fase
di detection.
3.3.4
Rimozione di operazioni di interpolazione
Nella Sezione 2.2.3 è stato mostrato come agisce BRISK per determinare i keypoint nella fase di detection. In particolare si è visto che un punto viene classificato
55
CAPITOLO 3. OTTIMIZZAZIONI DI BRISK
come keypoint solamente se il punteggio s a lui associato è maggiore non solo del
punteggio di tutti suoi vicini, ma anche di tutti i punteggi dei pixel sugli strati
della piramide immediatamente superiori e inferiori (nella zona corrispondente).
Più precisamente, in ognuno dei tre strati presi in considerazione, BRISK considera la rilevanza di un pixel come una quantità continua, e per questa ragione ricava
il punto con la rilevanza locale massima per mezzo di un’interpolazione. Questa
operazione presenta naturalmente dei vantaggi in termini di precisione dell’analisi. Tuttavia, nell’ottica di un risparmio energetico derivante dalla riduzione del
carico computazionale, può essere interessante studiare cosa succede nel caso in
cui questa operazione di rifinitura tramite interpolazione non venga eseguita, e
considerando quindi la rilevanza di un punto come una quantità discreta. L’idea
è quella di ricavare i punteggi massimi, sul livello superiore e sul livello inferiore
della piramide, per mezzo di semplici confronti, e prendendo in considerazione il
maggiore tra tutti i valori s associati ai punti della zona in analisi. Per verificare
poi se questa modifica può essere applicata con successo è necessario effettuare
delle valutazioni riguardanti sia i tempi di esecuzione sia l’accuratezza finale. In
particolare devono essere confrontati i tempi di esecuzione della fase di detection
originale e della detection in cui è stata rimossa l’interpolazione. Allo stesso modo deve essere effettuato un confronto sull’accuratezza finale della procedura di
riconoscimento dell’immagine. Per la valutazione dell’accuratezza è possibile utilizzare la misura del MAP, come abbiamo visto nella Sezione 2.3.2. Se i risultati
mostrano che i tempi di esecuzione vengono ridotti in modo rilevante e allo stesso
tempo l’accuratezza finale non peggiora significativamente, può essere considerata
l’applicazione di questa modifica, contribuendo a rendere meno onerosa la fase di
detection.
3.3.5
Esecuzione in parallelo del test binario
Come si è visto nella Sezione 3.3.3, su un’architettura ARM esiste la possibilità
di sfruttare le potenzialità del calcolo parallelo per mezzo dell’insieme di istru56
CAPITOLO 3. OTTIMIZZAZIONI DI BRISK
zioni NEON. Una parte del codice di BRISK per cui può essere implementata
questa funzionalità è la procedura di esecuzione del test binario. Come mostrato
in precedenza, questa fase prevede che per ciascuno dei keypoint individuati nella
detection vengano effettuati una serie di confronti, che danno poi come risultato
i bit di cui è composto il vettore di descrizione. Questi confronti risultano del
tutto indipendenti tra loro, in quanto vengono comparati valori di intensità già
calcolati in precedenza. Si può quindi pensare di sfruttare le potenzialità del calcolo parallelo per eseguire questo processo. I valori di intensità che devono essere
confrontati possono essere rappresentati tramite interi a 32 bit. Siccome la tecnologia NEON prevede l’utilizzo di registri a 128 bit, è possibile riempire ciascuno
di questi registri con quattro elementi da 32 bit. Di conseguenza ogni registro può
contenere fino a quattro diversi valori di intensità. Supponiamo di riempire due di
questi registri in modo tale che gli elementi in posizioni corrispondenti contengano
i valori delle intensità che ci interessa confrontare. Per esempio, chiamando I1 e I2
i valori delle intensità che devono essere comparate, se il primo elemento del primo
registro contiene I1 , il primo elemento del secondo registro dovrà contenere I2 . A
questo punto è possibile eseguire quattro confronti contemporaneamente con una
sola istruzione. Tramite l’istruzione adeguata vengono confrontati gli elementi dei
registri nella posizione corrispondente e il risultato viene poi memorizzato in un
registro destinazione. Un’ottimizzazione di questo tipo permetterebbe quindi, in
linea teorica, di eseguire il test binario quattro volte più velocemente.
3.3.6
Rimozione dell’invarianza alla rotazione quando non
necessaria
La fase di description di BRISK comprende, come abbiamo visto nella Sezione
3.2, l’esecuzione di una procedura che ha lo scopo di ottenere l’invarianza alla
rotazione. Grazie ad essa l’algoritmo risulta in grado di effettuare anche il riconoscimento di immagini ruotate rispetto all’immagine originale. Tuttavia non
tutti gli scenari applicativi necessitano di questa funzione: si pensi ad esempio
57
CAPITOLO 3. OTTIMIZZAZIONI DI BRISK
al caso del monitoraggio ambientale, in cui le fotocamere sono solitamente fisse
e acquisiscono immagini di un preciso luogo; anche i sistemi di video sorveglianza possono presentare queste caratteristiche e non necessitare quindi di sistemi
di riconoscimento invarianti alla rotazione. Per questa ragione, nei casi in cui i
vincoli energetici siano particolarmente stringenti e non sia presente l’eventualità
di dover riconoscere immagini ruotate, risulta ragionevole pensare di rimuovere
la fase di esecuzione relativa all’invarianza alla rotazione. Pur non essendo un
miglioramento applicabile in un contesto generale, si rivela comunque interessante osservare cosa comporta dal punto di vista dei consumi energetici, offrendosi
come possibile applicazione negli gli scenari sopra citati. Dal momento che questa operazione viene eseguita per ciascuno dei keypoint e prevede lo svolgimento
di calcoli piuttosto dispendiosi, ci si aspetta che una sua rimozione porti ad un
miglioramento incisivo delle prestazioni.
58
Capitolo 4
Implementazione e risultati
In questo capitolo verranno discussi i dettagli relativi all’implementazione delle ottimizzazioni esposte in precedenza e verranno mostrati i risultati ottenuti. Ognuna delle seguenti sezioni si riferisce all’ottimizzazione corrispondente illustrata nel
Capitolo 3.
4.1
I dataset
Nel corso di questo lavoro di tesi, le modifiche proposte vengono testate su due dataset differenti. Questi dataset sono disponibili pubblicamente e sono ampiamente
utilizzati allo stato dell’arte:
• ZuBuD:
lo Zurich Building Database5 (ZuBuD) contiene 1005 immagini a colori di
201 edifici appartenenti alla città di Zurigo. Ad ogni edificio sono associate
cinque immagini VGA (640x480), acquisite da punti di vista casuali, in stagioni differenti, in diverse condizioni climatiche e da due diverse fotocamere.
Un archivio separato rappresenta invece il dataset delle interrogazioni, e
contiene 115 immagini (alla risoluzione di 320x240) degli stessi edifici (immagini ottenute a partire da condizioni di acquisizione differenti). Alcune
immagini di questo dataset sono illustrate in Figura 4.1.
59
CAPITOLO 4. IMPLEMENTAZIONE E RISULTATI
(a)
(b)
(c)
Figura 4.1: Immagini campione del dataset ZuBuD
(a)
(b)
(c)
Figura 4.2: Immagini campione del dataset Oxford
• Oxford:
L’Oxford Building Database consiste di 5062 immagini ottenute da Flickr
attraverso la ricerca di determinati luoghi di Oxford. L’insieme di immagini
è stato poi manualmente annotato per costituire una tabella delle corrispondenze relativa a 11 diversi luoghi, ognuno rappresentato da cinque possibili
interrogazioni. Ciò fornisce un insieme di 55 interrogazioni sulle quali basare
la valutazione di un sistema di riconoscimento. Alcune immagini di questo
dataset sono illustrate in Figura 4.2.
4.2
Selezione delle coppie di punti
L’implementazione di questa ottimizzazione comporta una modifica della fase di
generazione del nucleo. E’ qui che viene infatti generato l’insieme S delle coppie
di breve distanza che viene poi utilizzato per ricavare il vettore di descrizione. La
versione originale di BRISK prevede che questo insieme sia formato dalle coppie
60
CAPITOLO 4. IMPLEMENTAZIONE E RISULTATI
di punti la cui distanza (in valore assoluto) sia minore della soglia δmax =9.75t,
dove t è la scala del keypoint. Per fare quindi in modo che vi sia la possibilità
di selezionare le coppie deve essere modificata la modalità di generazione dell’insieme S. In particolare, la nuova versione del codice è in grado di leggere, da
un file appositamente creato, quali sono le coppie da considerare per la creazione
del descrittore. Le coppie presenti nel file vengono scelte sulla base di una delle
strategie di selezione esposte nella Sezione 2.4.2. Usufruendo di una struttura
dati ausiliaria, le coppie vengono quindi acquisite dal file e vengono poi utilizzate
per la generazione dell’insieme S. Di seguito possiamo osservare una porzione del
codice modificato, che si occupa di riempire la struttura dati shortPairs, corrispondente all’insieme S, con l’insieme delle coppie precedentemente acquisite da
un file esterno:
1
2
3
4
5
6
for(int isp=0;isp<pairs.size();isp++){
BriskShortPair& shortPair = shortPairs_[indexChange[noShortPairs_]];
shortPair.i = temp_idx[isp].i;
shortPair.j = temp_idx[isp].j;
noShortPairs_++;
}
In Figura 4.3 possiamo osservare (linea rossa) il comportamento dei tempi di
esecuzione relativi alla computazione di un descrittore al variare del numero di
coppie utilizzate. Per l’ottenimento di questo grafico sono state prese in considerazione tre diverse risoluzioni: VGA, SVGA e XGA. Le coppie utilizzate per la
creazione dell’insieme S sono state generate casualmente, in quanto l’interesse di
questa analisi è focalizzato sui tempi di esecuzione della fase di description e la
procedura di riconoscimento può essere trascurata. Naturalmente una risoluzione
elevata, come nel caso di XGA, implica una maggiore quantità di dati che devono
essere processati e comporta l’identificazione di un numero più elevato di keypoint
rispetto a risoluzioni più basse. Per questa ragione i tempi di esecuzione risultano
maggiori. Il grafico mostra che il tempo impiegato per ricavare un descrittore
cresce in modo proporzionale al numero di coppie utilizzate. Possiamo osservare
61
CAPITOLO 4. IMPLEMENTAZIONE E RISULTATI
ad esempio che, se il numero di coppie utilizzate è basso (attorno a 100), il tempo di esecuzione impiegato per ricavare un singolo descrittore risulta ridotto di
circa 0,05 ms rispetto al tempo ottenuto con l’uso di tutte le coppie. Nell’ottica
del modello rate-accuratezza illustrato nella Sezione 2.3.2, che prevede l’utilizzo
di descrittori di dimensioni inferiori a 512 bit, questa ottimizzazione è in grado
quindi di apportare un primo miglioramento alle prestazioni di BRISK.
4.3
Calcolo dell’intensità smussata solo per i punti
utilizzati
Per implementare questa miglioria è necessario agire sia sulla fase di generazione
del nucleo sia sulla fase di description. Nel momento in cui le coppie vengono
inserite nell’insieme S, si procede anche alla memorizzazione di un dato, relativo
ad ognuno dei punti, che specifica se il punto stesso deve essere utilizzato durante
la fase di campionamento oppure no. Nell’implementazione originale della fase di
descrizione sono presenti due iterazioni tramite cui vengono presi in considerazione tutti gli N = 60 punti dello schema di campionamento e per ognuno di essi
viene ricavata l’intensità smussata. La modifica introdotta fa in modo che durante
queste iterazioni, considerando i dati raccolti nella fase di generazione del nucleo,
vengano calcolate le intensità smussate solamente per i punti effettivamente utilizzati. Ecco una porzione del codice modificato:
1
2
3
4
5
6
7
8
for(unsigned int i = 0; i<points_; i++){
if(pointUsed[i]==1){
*(pvalues++)=smoothedIntensity(image, _integral, x,y,scale,0,i);
}
else{
*(pvalues++);
}
}
pvalues è la struttura dati contenente i valori calcolati delle intensità smussate.
Se il punto preso in considerazione ha come valore associato 1 (pointUsed[i]==1)
62
CAPITOLO 4. IMPLEMENTAZIONE E RISULTATI
0.9
0.85
Tempo (ms)
0.8
0.75
0.7
0.65
0.6
Intensità smussata per tutti i punti
Intensità smussata per i punti utilizzati
0.55
0.5
0
100
200
300
400
Numero di coppie
500
600
Figura 4.3: Tempi di esecuzione per il calcolo di un singolo descrittore al variare del
numero di coppie selezionate, sia nel caso in cui l’intensità smussata venga calcolata
per tutti i punti dello schema di campionamento (linea rossa), sia nel caso in cui venga
calcolata solamente per i punti effettivamente utilizzati (linea blu).
viene eseguita la funzione per il calcolo dell’intensità smussata, altrimenti viene
semplicemente incrementato il puntatore.
Anche in questo caso sono stati acquisiti i tempi di esecuzione al variare del
numero di coppie utilizzate. In Figura 4.3 (linea blu) è possibile osservare i risultati relativi al tempo di esecuzione necessario per ricavare un singolo descrittore.
Come per il caso precedente sono state prese in considerazione tre diverse risoluzioni e le coppie utilizzate per la creazione dell’insieme S sono state generate
casualmente. Anche in questo grafico possiamo osservare i tempi di esecuzione
crescere all’aumentare del numero di coppie utilizzate. Tuttavia, possiamo notare
che quando il numero di coppie è basso, i tempi per il calcolo del descrittore si
63
CAPITOLO 4. IMPLEMENTAZIONE E RISULTATI
1.6
1.5
Speedup
1.4
1.3
1.2
1.1
1
0.9
0
100
200
300
400
Numero di coppie
500
600
Figura 4.4: Speedup ottenuto (al variare del numero di coppie) con l’ottimizzazione
del calcolo dell’intensità smussata solo per i punti utilizzati, rispetto al calcolo per tutti
i punti dello schema di campionamento.
riducono drasticamente. Questo si verifica poiché, quando le coppie considerate
sono poco numerose, anche i punti dello schema di campionamento utilizzati risultano conseguentemente pochi, limitando così il numero di esecuzioni necessarie
della funzione per il calcolo delle intensità smussate. In particolare, se il numero di
coppie considerate è minore di 150, il miglioramento che si può osservare è molto
significativo e influisce positivamente sulle prestazioni. Nella Figura 4.4 possiamo
osservare lo speedup che si ottiene.
64
CAPITOLO 4. IMPLEMENTAZIONE E RISULTATI
4.4
Conversione delle funzioni di ridimensionamento dell’immagine
Per quanto riguarda la conversione delle funzioni di ridimensionamento, l’obiettivo è quello di cercare di riprodurre fedelmente, tramite la tecnologia NEON,
l’implementazione originale fatta con le istruzioni SSE. Si è cercato quindi di seguire la stessa struttura dell’algoritmo degli autori, avvalendosi dei registri per
eseguire le stesse operazioni in parallelo sui vari elementi. Per utilizzare l’insieme
di istruzioni NEON è possibile sia seguire la via della programmazione in ARM
Assembly, sia usufruire dell’alternativa chiamata intrinsics. Le funzioni intrinsics permettono di incorporare facilmente operazioni specifiche di un determinato
dominio in porzioni di codice C o C++, senza la necessità di implementazioni
complesse. Una funzione intrinsics appare come una chiamata di funzione in C o
C++, ma durante la compilazione viene sostituita da una sequenza specifica di
istruzioni a basso livello. Il compilatore è in grado di generare automaticamente
la combinazione migliore di istruzioni per la specifica architettura utilizzata [31].
Ad esempio, la funzione di addizione saturata tra due interi in istruzioni intrinsics
assume la seguente forma:
1
2
3
int a, b, result;
...
result = L_add(a, b);
Il compilatore effettua poi la sostituzione con la seguente istruzione a basso livello:
1
QADD r0, r0, r1 /* Assumendo r0 = a, r1 = b */
Tramite queste funzioni è quindi possibile realizzare istruzioni ARM Assembly
direttamente dal codice C o C++. Abbiamo quindi scelto di utilizzare questa
alternativa, realizzando la conversione da SSE direttamente all’interno del codice
C++ di BRISK, sia per ragioni di comodità, sia perché l’implementazione originale utilizza anch’essa istruzioni intrinsics (per architetture intel).
Per lo svolgimento delle funzioni di analisi visuale svolte da BRISK, ogni immagine assume la forma di una matrice di pixel. Le funzioni di ridimensionamento
65
CAPITOLO 4. IMPLEMENTAZIONE E RISULTATI
dell’immagine agiscono quindi su questa matrice. In particolare, per quanto riguarda la funzione di dimezzamento dell’immagine, vengono effettuate operazioni
in parallelo per il calcolo del valore medio tra vari pixel. I risultati vengono poi
memorizzati in una matrice che avrà dimensioni corrispondenti alla metà della
grandezza della matrice di partenza. Anche il ridimensionamento di 2/3 prevede
una struttura simile, ma richiede anche operazioni più complesse, come interpolazioni o salvataggi condizionati in memoria.
Per alcune delle istruzioni SSE esiste una controparte NEON che è strutturata
esattamente nello stesso modo e svolge la medesima funzione. In questi casi la
conversione si è rivelata un’operazione semplice. Prendiamo ad esempio il caso
dell’operazione di load di un dato dalla memoria e caricamento in un registro.
Nella versione SSE assume la seguente forma:
1
2
3
__m128i* p1=(__m128i*)srcimg.data;
__m128i upper;
upper=_mm_load_si128(p1);
La stessa procedura svolta con istruzioni NEON prevede una struttura del tutto
simile:
1
2
3
int32_t* p1=(int32_t*)srcimg.data;
int32x4_t upper;
upper=vld1q_s32(p1);
In altri casi tuttavia la conversione non risulta così lineare. Molte delle istruzioni
SSE infatti non possiedono una versione equivalente in NEON, e si rende quindi necessario riprodurle tramite una combinazione di istruzioni diverse. Vediamo come
esempio il caso del salvataggio condizionato in memoria. La seguente operazione
SSE salva in memoria alla posizione dest1 il contenuto del vettore resultUpper,
sulla base dei bit significativi di ciascun byte del selettore storeMask:
1
_mm_maskmoveu_si128(resultUpper, storeMask, (char*)dest1);
Per eseguire questa stessa procedura in NEON sono necessarie operazioni differenti:
1
uint8x16_t tmp_dest1 = vld1q_u8((uint8_t*)dest1);
66
CAPITOLO 4. IMPLEMENTAZIONE E RISULTATI
1.55
1.5
VGA
SVGA
XGA
Speedup(Detection)
1.45
1.4
1.35
1.3
1.25
1.2
1.15
1.1
60
70
80
90
Soglia
100
110
120
Figura 4.5: Speedup ottenuto con le nuove funzioni di ridimensionamento rispetto
alla fase di detection originale, al variare della soglia per la fase di detection, per tre
diverse risoluzioni dell’immagine.
2
3
vbslq_u8(tmp_dest1,resultUpper,storeMask);
vst1q_u8((uint8_t*)dest1,tmp_dest1);
In questo caso viene creato un registro temporaneo che viene utilizzato per effettuare l’operazione bit a bit di inserimento condizionato vbslq; successivamente il
risultato ottenuto viene salvato in memoria nella posizione iniziale.
Una volta effettuata la conversione completa, è necessario verificare che le nuove
funzioni abbiano lo stesso comportamento di quelle originali e producano quindi
gli stessi risultati. Per effettuare questo controllo abbiamo effettuato un confronto
bit a bit delle matrici risultato prodotte.
Nel grafico in Figura 4.5 è possibile osservare lo speedup che si ottiene nella fase
67
CAPITOLO 4. IMPLEMENTAZIONE E RISULTATI
di detection applicando le funzioni di ridimensionamento con istruzioni NEON,
rispetto alla versione originale che prevede l’utilizzo di funzioni C (per l’esecuzione
su architetture ARM). Anche in questo caso sono state prese in considerazione tre
diverse risoluzioni e la soglia per la fase di detection è stata fatta variare tra 60
e 120. Ciò che si osserva è innanzitutto che il miglioramento è tanto maggiore
quanto più la risoluzione è alta. Questo deriva dal fatto che risoluzioni elevate
implicano immagini di dimensioni maggiori; di conseguenza la fase di ridimensionamento comporta un carico computazionale molto rilevante durante la detection.
Per questa ragione il miglioramento di queste funzioni influisce notevolmente sullo
speedup della procedura di detection. In secondo luogo, dal grafico si può vedere
che lo speedup acquista un peso maggiore al crescere della soglia. La motivazione
è che per soglie basse, il numero di keypoint individuati risulta molto alto, e di
conseguenza la funzioni di ridimensionamento hanno un impatto relativamente
basso sul tempo di esecuzione totale. Al contrario, per soglie alte, la fase di detection individua un numero ridotto di keypoint, dando così una rilevanza maggiore
alle procedure in questione. In conclusione, la conversione da istruzioni SSE a
istruzioni NEON permette di ottenere un significativo aumento delle prestazioni,
favorendo il risparmio energetico.
4.5
Rimozione di operazioni di interpolazione
Per l’implementazione di questa ottimizzazione è necessario modificare la parte di
codice della fase di detection relativa dell’estrazione dei keypoint dell’immagine.
In particolare, viene fatto uso di due funzioni, chiamate getScoreMaxAbove() e
getScoreMaxBelow(), che si occupano di ricavare il punteggio massimo locale nei
due strati immediatamente superiore e inferiore della piramide delle scale. Le due
funzioni agiscono in due passi: inizialmente controllano tutti i punteggi dei pixel
nella zona considerata e trovano il valore massimo; in seguito perfezionano il dato
su questo valore tramite un’operazione di interpolazione. Al fine di implementare
68
CAPITOLO 4. IMPLEMENTAZIONE E RISULTATI
1
originale
modificato
0.9
0.8
0.7
MAP
0.6
0.5
0.4
0.3
0.2
0.1
0
40
45
50
55
60
Soglia
65
70
75
80
Figura 4.6: Accuratezza dell’algoritmo BRISK nella versione originale e nella versione modificata rimuovendo l’operazione di interpolazione. Le misure di accuratezza
(MAP) sono state calcolate al variare della soglia. Le immagini utilizzate sono quelle
appartenenti al dataset ZuBuD
la modifica desiderata è quindi sufficiente rimuovere questa seconda fase in cui
il valore del punteggio massimo viene interpolato. Nella Figura 4.6 vengono mostrate le curve di accuratezza ottenute in corrispondenza della versione originale
e di quella modificata. E’ stata fatta variare ancora una volta la soglia e sono
stati calcolati i valori di misura dell’accuratezza (MAP). I dati sono stati ricavati
a partire dall’analisi delle immagini presenti nel dataset ZuBuD ed è stato utilizzato il controllo di consistenza geometrica RANSAC. Dai risultati ottenuti si vede
che la differenza in accuratezza nei due casi è pressoché trascurabile. L’algoritmo
modificato risulta anzi leggermente più accurato dell’originale (nel range di valori
di soglia preso in considerazione). E’ tuttavia necessario analizzare ora i risultati
69
CAPITOLO 4. IMPLEMENTAZIONE E RISULTATI
legati ai tempi di esecuzione per poter esprimere un giudizio completo. La Figura 4.7 mostra lo speedup che si ottiene sul tempo di esecuzione della procedura
di detection dopo aver rimosso l’operazione di interpolazione. Si può notare che
vi è un miglioramento tanto più grande quanto più la soglia è bassa. Un tale
comportamento è dovuto al fatto che soglie besse implicano vincoli poco stringenti per l’individuazione dei keypoint, e le due funzioni getScoreMaxAbove() e
getScoreMaxBelow() vengono eseguite molte volte. Sulla base di questi risultati
si può quindi concludere che, dal punto di vista dei tempi di esecuzione, anche
questa modifica contribuisce ad aumentare le prestazioni.
Un esito di questo tipo conferma quindi la validità dell’ottimizzazione in que-
1.16
VGA
SVGA
XGA
1.14
Speedup
1.12
1.1
1.08
1.06
1.04
1.02
40
50
60
70
80
Soglia
90
100
110
120
Figura 4.7: Speedup ottenuto sulla fase di detection rispetto all’implementazione
originale, rimuovendo l’operazione di interpolazione, al variare della soglia e per tre
diverse risoluzioni dell’immagine.
70
CAPITOLO 4. IMPLEMENTAZIONE E RISULTATI
1.6
1.55
VGA
SVGA
XGA
1.5
Speedup
1.45
1.4
1.35
1.3
1.25
60
70
80
90
Soglia
100
110
120
Figura 4.8: Speedup ottenuto rispetto all’implementazione originale grazie al contributo di entrambe le ottimizzazioni per la fase di detection: ridimensionamento dell’immagine e rimozione dell’operazione di interpolazione. Sono state prese in considerazione
tre risoluzioni ed è stata fatta variare la soglia.
stione, che rende possibile un miglioramento considerevole della fase di detection.
Nella Figura 4.8 possiamo invece osservare lo speedup che si ottiene per le tre
risoluzioni grazie al contributo di entrambe le ottimizzazioni relative alla fase di
detection (rimozione dell’interpolazione e conversione delle funzioni di ridimensionamento). Possiamo notare che lo speedup cresce all’aumentare della soglia,
indicando che l’ottimizzazione sul ridimensionamento è quindi quella che influisce
maggiormente. Se prendiamo ad esempio in considerazione la risoluzione VGA,
vediamo che lo speedup parte da un valore di 1.25 per soglie basse fino ad arrivare
a 1.45 quando la soglia è 120.
71
CAPITOLO 4. IMPLEMENTAZIONE E RISULTATI
4.6
Esecuzione in parallelo del test binario
Anche per l’esecuzione in parallelo del test binario abbiamo scelto di utilizzare
le istruzioni intrinsics per comodità di implementazione. La versione originale di
BRISK esegue il test binario sfruttando un vettore ausiliario di 60 elementi che
contiene i valori di intensità smussata di ciascun punto dello schema di campionamento. Vengono poi iterate tutte le coppie, prendendo in considerazione i valori
di intensità nelle posizioni del vettore i cui indici corrispondono ai punti da confrontare. Per eseguire il test binario in parallelo è tuttavia necessario modificare
questa struttura. Il vettore ausiliario originale viene sostituito da due vettori che
contengono, nelle posizioni corrispondenti, i valori di intensità che devono essere
confrontati. Questa scelta è inevitabile per un efficiente caricamento dalla memoria ai registri. Una volta effettuata questa fase preliminare è possibile iniziare la
computazione in parallelo. I registri vengono riempiti con i valori delle intensità
presenti in memoria, come mostrato nell’esempio seguente:
1
q8=vld1q_u32(p1);
Vengono poi confrontati a due a due tramite l’istruzione vcgtq, che inizializza
a 0 o a 1 tutti i bit dell’elemento corrispondente del registro destinazione, sulla
base dell’esito del confronto. Vediamo un esempio di come vengono effettuati 16
diversi confronti utilizzando 4 istruzioni:
1
2
3
4
q8=vcgtq_u32(q8, q9);
q9=vcgtq_u32(q10, q11);
q10=vcgtq_u32(q12, q13);
q11=vcgtq_u32(q14, q15);
E’ possibile organizzare il codice in cicli da 32 confronti (utilizzando quindi 8 registri). Dopo alcune operazioni di shifting e riordinamento di registri, si arriva
ad ottenere un elemento composto da 32 bit che costituirà parte del vettore di
descrizione. Ognuno dei bit rappresenta infatti il risultato di un confronto tra i
valori delle intensità smussate.
La comparazione del tempo di esecuzione del codice originale e di quello modifi72
CAPITOLO 4. IMPLEMENTAZIONE E RISULTATI
cato mostra però che il risparmio ottenuto implementando questa ottimizzazione
è minimo. Il motivo è da ricercarsi nel fatto che la creazione iniziale dei vettori ausiliari contenenti i valori delle intensità è piuttosto onerosa e non permette
di ottenere il guadagno sperato. Inoltre, la computazione del test binario richiede un tempo di esecuzione particolarmente basso in relazione all’intera fase di
description, rendendo sostanzialmente invisibile questo miglioramento. In conclusione, questa modifica sfortunatamente non permette di osservare un incremento
significativo delle prestazioni.
4.6.1
Rimozione dell’invarianza alla rotazione quando non
necessaria
L’implementazione originale di BRISK permette di rimuovere in maniera semplice la procedura che si occupa di ottenere l’invarianza alla rotazione. E’ infatti
sufficiente modificare il valore di una variabile booleana per disabilitare questa
funzione. Abbiamo quindi acquisito i tempi di esecuzione relativi all’analisi di
quattro diverse immagini senza invarianza alla rotazione. Nella Figura 4.9 possiamo osservare lo speedup che si ottiene per la fase di description rispetto alla
versione originale, sommando i contributi di quest’ultima ottimizzazione e di quella mostrata nella Sezione 4.3. Sono stati acquisiti i valori per 16, 32, 64,128, 256 e
512 coppie. Si osserva che lo speedup è tanto maggiore quanto minore è il numero
di coppie utilizzate. La curva del grafico mostra un andamento simile a quella in
Figura 4.4; in questo caso però la rimozione della procedura di invarianza alla rotazione contribuisce ad aumentare ulteriormente lo speedup. Possiamo vedere che
anche per un numero di coppie piuttosto alto (attorno a 300) il miglioramento che
si ottiene è notevole. Siccome nella versione originale i calcoli relativi all’invarianza alla rotazione vengono effettuati per ciascuna delle feature, il miglioramento che
si ottiene è proporzionale al numero di keypoint rilevati. In conclusione, per tutte
quelle applicazioni che non necessitano dell’invarianza alla rotazione, è possibile
ottenere un incremento delle prestazioni molto significativo.
73
CAPITOLO 4. IMPLEMENTAZIONE E RISULTATI
3.5
Speedup(Description)
3
2.5
2
1.5
1
0
100
200
300
400
Numero di coppie
500
600
Figura 4.9: Speedup ottenuto nella fase di description grazie al contributo delle due
ottimizzazioni di calcolo dell’intensità smussata solo per i punti utilizzati e di rimozione
dell’operazione relativa all’ottenimento dell’invarianza alla rotazione. La curva si basa
sui valori acquisiti a partire dall’analisi di 2 immagini del dataset ZuBuD e 2 appartenenti
al dataset Oxford
74
Capitolo 5
Comprimi-poi-analizza vs
Analizza-poi-comprimi
Le ottimizzazioni presentate finora hanno lo scopo di favorire l’adozione del nuovo
paradigma analizza-poi-comprimi (ATC) in sostituzione del tradizionale comprimipoi-analizza (CTA). La Figura 5.1 mostra il funzionamento dei due paradigmi. Nel
caso CTA le immagini vengono acquisite tramite i nodi della rete provvisti di fotocamera, vengono compresse e quindi inviate al nodo centrale per l’analisi. Nel caso
ATC invece, il nodo di acquisizione si occupa di estrarre direttamente le feature
dall’immagine, per poi codificarle e inviarle al nodo centrale, dove verrà eseguita
la fase di riconoscimento. In questo capitolo vengono confrontati i due paradigmi
sul piano energetico, stimandone i consumi sulla base dei tempi di esecuzione. In
particolare viene analizzato il comportamento sia della versione originale di BRISK sia di quella ottimizzata, nell’ipotesi di un’esecuzione secondo il paradigma
ATC; vengono poi confrontati questi risultati con il caso CTA, in cui l’immagine
acquisita viene compressa tramite la codifica JPEG. Tutti i tempi presi in esame
si riferiscono all’esecuzione sul dispositivo Beaglebone (Sezione 3.1).
5.1
Confronto rate-energia
Per entrambi i casi in analisi, l’energia necessaria per eseguire le funzionalità
richieste sul nodo della rete è data dal contributo dell’energia spesa dal processore
75
CAPITOLO 5. COMPRIMI-POI-ANALIZZA VS
ANALIZZA-POI-COMPRIMI
(a) CTA
(b) ATC
Figura 5.1: Funzionamento dei due paradigmi comprimi-poi-analizza (a) e analizzapoi-comprimi (b).
per l’acquisizione e l’analisi dei dati, sommato al contributo dell’energia spesa per
l’invio dei dati al nodo centrale. Come abbiamo visto nella Sezione 3.2, possiamo
assumere che l’energia consumata dal processore per l’esecuzione di algoritmi sia
dipendente dal tempo stesso di esecuzione. Per quanto riguarda il caso CTA, se
consideriamo la potenza dissipata dal processore Pcpu e il tempo di esecuzione
necessario per codificare l’immagine tcpu (ρ), l’energia può quendi essere espressa
come:
ECT A (ρ) = Ecpu (ρ) + Etx (ρ)
(5.1)
dove ρ rappresenta il bitrate, Etx è l’energia spesa per la trasmissione, e Ecpu (ρ) =
Pcpu · tcpu (ρ) è l’energia spesa dal processore. La Figura 5.2 mostra i tempi di
esecuzione rilevati per la codifica JPEG.
76
CAPITOLO 5. COMPRIMI-POI-ANALIZZA VS
ANALIZZA-POI-COMPRIMI
0.034
0.032
Tempo [s]
0.03
0.028
0.026
0.024
0.022
0
10
20
30
40
50
Rate [kB]
Figura 5.2: Tempi di esecuzione necessari per la codifica JPEG al variare del rate. E’
stato utulizzato il dataset ZuBuD.
Il caso del paradigma ATC richiede invece una stima dell’energia più complessa.
Prendiamo in considerazione separatamente i tempi della fase di detection e di
description BRISK. La Figura 5.3 mostra che il tempo della fase di detection
dipende dal numero M di keypoint individuati, e può quindi essere espresso come:
tdet (M ) = τof f + M τdet .
(5.2)
τdet è il coefficiente angolare della retta, e rappresenta quindi il tempo necessario
per la detection di un keypoint. τof f è invece un offset che si riferisce al tempo
necessario per l’inizializzazione della piramide dello scale-space.
E’ possibile fare un ragionamento simile anche per la fase di description (Figura
5.4). Tuttavia, supponendo di lavorare secondo il modello rate-accuratezza mo77
CAPITOLO 5. COMPRIMI-POI-ANALIZZA VS
ANALIZZA-POI-COMPRIMI
0.22
0.2
0.18
Tempo [s]
0.16
0.14
0.12
0.1
0.08
0.06
0
100
200
300
400
500
Num keypoint
600
700
800
900
Figura 5.3: Tempi di esecuzione necessari per la fase di detection al variare del numero
di keypoint. E’ stato utilizzato il dataset ZuBuD.
strato nella Sezione 2.3.2, il tempo di esecuzione dipende in questo caso dalla
dimensione ottimale dei descrittori utilizzati. Il grafico della Figura 5.4 mostra i
risultati ottenuti utilizzando descrittori di 512 bit. Abbiamo rilevato i tempi di
esecuzione anche per dimensioni minori dei descrittori. Si osserva che al diminuire della grandezza, i tempi possono essere modellati come rette con coefficienti
angolari τdesc sempre più piccoli. La dimensione dei descrittori dipende dal rate
ρ. Il modello rate-accuratezza infatti, tramite il calcolo dell’allocazione interna,
ricava il numero ottimale di keypoint M (ρ) che devono essere utilizzati ad un
determinato rate. Di conseguenza la dimensione ottimale D dei descrittori può
essere ricavata come:
D(ρ) =
ρ
,
M (ρ)
78
(5.3)
CAPITOLO 5. COMPRIMI-POI-ANALIZZA VS
ANALIZZA-POI-COMPRIMI
0.7
0.6
Tempo [s]
0.5
0.4
0.3
0.2
0.1
0
0
100
200
300
400
500
Num keypoint
600
700
800
900
Figura 5.4: Tempi di esecuzione necessari per la fase di description al variare del
numero di keypoint. E’ stato utilizzato il dataset ZuBuD.
ed è possibile esprimere il tempo di descrizione come:
tdesc (ρ) = M (ρ)τdesc (ρ),
(5.4)
in cui τdesc (ρ) è il tempo necessario per la descrizione di una feature, dipendente
dalla dimensione D e quindi dal rate ρ. A questo punto è possibile ricavare
le stime dell’energia necessaria in entrambe le fasi. Per la detection i consumi
saranno quindi pari a:
Edet (ρ) = Pcpu · [τof f + M (ρ)τdet ] .
(5.5)
L’energia necessaria per la fase di description dipende invece anche dalla dimensione dei descrittori, e quindi:
Edesc (ρ) = Pcpu · M (ρ)τdesc (ρ).
79
(5.6)
CAPITOLO 5. COMPRIMI-POI-ANALIZZA VS
ANALIZZA-POI-COMPRIMI
La Figura 5.5 mostra i consumi derivanti dalla descrizione di una singola feature, al variare della dimensione dei descrittori. Più i descrittori sono piccoli,
minore è l’energia necessaria. In conclusione, possiamo esprimere il valore totale
dell’energia consumata con il paradigma ATC come:
(5.7)
EAT C (ρ) = Pcpu · [τof f + M (ρ)(τdet + τdesc (ρ))] + Etx (ρ)
−3
1.8
x 10
1.6
1.4
Energia [J]
1.2
1
0.8
0.6
0.4
ottimizzato con invarianza rotazione
ottimizzato senza invarianza rotazione
originale
0.2
0
0
100
200
300
400
Dimensione descrittore [bit]
500
600
Figura 5.5: Energia necessaria per la descrizione di una feature al variare della dimensione dei descrittori, nel caso originale (rosso), ottimizzato con invarianza alla rotazione
(blu) e ottimizzato senza invarianza alla rotazione(verde).
80
CAPITOLO 5. COMPRIMI-POI-ANALIZZA VS
ANALIZZA-POI-COMPRIMI
5.2
Risultati
Grazie all’allocazione interna, come visto nella Sezione 2.3.2, è quindi possibile
ricavare il numero ottimale di keypoint da utilizzare al variare del rate. Sulla base
di questo calcolo e dei tempi di esecuzione acquisiti per i dataset ZuBuD e Oxford
abbiamo ottenuto i risultati esposti di seguito. Per effettuare la stima dei consumi
energetici sono stati utilizzati i valori seguenti:
• Pcpu = 2.1 [W]
• Etx = 2.6 × 10−6 [J/bit]
20
CTA
ATC BRISK originale
ATC BRISK ottimizzato
ATC BRISK ottimizzato no invarianza rotazione
18
16
Energia [J]
14
12
10
8
6
4
2
0
0
5
10
15
20
Rate [kB]
25
30
35
40
Figura 5.6: Confronto energetico tra il paradigma CTA e ATC basato sia sulla versione
originale di BRISK sia su quelle ottimizzate (con e senza invarianza alla rotazione). I
risultati si riferiscono ad un analisi effettuata sul dataset ZuBuD.
81
CAPITOLO 5. COMPRIMI-POI-ANALIZZA VS
ANALIZZA-POI-COMPRIMI
25
CTA
ATC BRISK originale
ATC BRISK ottimizzato
ATC BRISK ottimizzato no invarianza rotazione
Energia [J]
20
15
10
5
0
0
20
40
60
80
100
Rate [kB]
Figura 5.7: Confronto energetico tra il paradigma CTA e ATC basato sia sulla versione
originale di BRISK sia su quelle ottimizzate (con e senza invarianza alla rotazione). I
risultati si riferiscono ad un analisi effettuata sul dataset Oxford.
Le figure 5.6 e 5.7 mostrano i risultati del confronto tra il paradigma CTA e il paradigma ATC, ottenuti analizzando immagini dei dataset ZuBuD e Oxford. Come
si può vedere, e come è stato già osservato in altri lavori [32], il paradigma CTA
(linea rossa) richiede in generale un’energia minore rispetto al paradigma ATC
basato sull’esecuzione della versione originale di BRISK (linea verde). Tuttavia i
risultati mostrano anche che per bassi bitrate la scelta del paradigma ATC si rivela
non solo la migliore, ma anche l’unica che può essere utilizzata. L’implementazione delle ottimizzazioni di BRISK permette inoltre di ridurre in modo significativo
i consumi energetici derivanti dall’utilizzo del paradigma ATC (linea blu). Nel
caso non ci fosse la necessità di invarianza alla rotazione si riuscirebbe ad ottenere
82
CAPITOLO 5. COMPRIMI-POI-ANALIZZA VS
ANALIZZA-POI-COMPRIMI
un risparmio ancora più grande, avvicinandosi molto ai consumi del paradigma
CTA (linea nera). Le figure 5.8 e 5.9 mostrano il guadagno in energetico termini
percentuali della versione ottimizzata di BRISK (con e senza invarianza alla rotazione) rispetto a quella originale.
Da questi risultati si può quindi concludere che allo stato attuale, e per quanto riguarda il dispositivo Beaglebone, il paradigma CTA risulta energeticamente
più efficiente. Grazie alle migliorie apportate all’algoritmo di BRISK è tuttavia
possibile ridurre il divario tra ATC e CTA. Esiste la possibilità che future ottimizzazioni hardware o software permettano di colmare completamente questo divario,
100
100
90
90
80
80
70
70
Guadagno [%]
Guadagno [%]
rendendo il paradigma ATC il più efficiente.
60
50
40
60
50
40
30
30
20
20
10
10
0
0
5
10
15
20
Rate [kB]
25
30
35
0
40
(a) Con invarianza alla rotazione
0
5
10
15
20
Rate [kB]
25
30
35
40
(b) Senza invarianza alla rotazione
Figura 5.8: Guadagno energetico in termini percentuali della versione ottimizzata di
BRISK rispetto all’originale. Il dataset utilizzato è ZuBuD.
5.3
Codifica Entropica
Nella Sezione 2.4.1 abbiamo visto come sia possibile codificare un descrittore (di
dimensione D) con un numero di bit R ≤ D. Per alleggerire ulteriormente il
paradigma ATC, si può pensare di codificare entropicamente i descrittori binari
ottenuti con BRISK prima di inviarli al nodo centrale. Nel caso in cui l’energia
spesa per effettuare la codifica fosse trascurabile, si potrebbero ridurre i consumi
83
100
100
90
90
80
80
70
70
Guadagno [%]
Guadagno [%]
CAPITOLO 5. COMPRIMI-POI-ANALIZZA VS
ANALIZZA-POI-COMPRIMI
60
50
40
60
50
40
30
30
20
20
10
10
0
0
20
40
60
80
0
100
0
20
40
Rate [kB]
60
80
100
Rate [kB]
(a) Con invarianza alla rotazione
(b) Senza invarianza alla rotazione
Figura 5.9: Guadagno energetico in termini percentuali della versione ottimizzata di
BRISK rispetto all’originale. Il dataset utilizzato è Oxford.
dovuti all’invio dei descrittori, in quanto dipendenti dalla loro dimensione.
Tuttavia, alcuni test effettuati misurando i tempi di esecuzione relativi alla
codifica hanno mostrato che non si ottiene il risparmio energetico sperato. I
risultati, mostrati nella tabella 5.1, mostrano infatti che l’energia spesa per
effettuare la codifica entropica risulta maggiore di quella che si risparmierebbe
nell’invio.
Tabella 5.1: Dati relativi all’energia consumata per effettuare la codifica entropica
DIMENSIONE
DESCRITTORE
[bit]
GUADAGNO
TEMPO
CODIFICA
[ms]
ENERGIA
CODIFICA [mJ]
ENERGIA
RECUPERATA
[mJ]
NETTO [mJ]
16
32
64
128
256
512
8%
9%
11 %
15 %
21 %
29 %
0.0372
0.0670
0.1267
0.2461
0.4811
0.9477
0.08
0.14
0.27
0.52
1.01
1.99
0.003
0.008
0.019
0.053
0.148
0.411
-0.077
-0.132
-0.25
-0.47
-0.86
-1.58
84
Capitolo 6
Conclusioni e direzioni di lavoro
future
Per lo sviluppo delle Visual Sensor Networks è necessario ottenere prestazioni
ottimali in termini di efficienza, permettendo ai nodi della rete alimentati da
batteria di consumare meno energia possibile. Il progetto Greeneyes si muove in
questa direzione, proponendo un cambiamento rispetto al modello tradizionale e
prevedendo la possibilità per i nodi della rete di eseguire direttamente i compiti
di analisi visuale. Questa tesi vuole contribuire all’ottenimento degli obiettivi che
il progetto si prefigge. In particolare, sono stati presentati alcuni miglioramenti
per l’algoritmo di estrazione di feature BRISK, ed è stato effettuato un confronto
sul piano energetico tra i paradigmi comprimi-poi-analizza (CTA) e analizza-poicomprimi (ATC).
In primo luogo, abbiamo fornito una panoramica dei principali algoritmi di estrazione delle feature allo stato dell’arte, partendo da quelli classici come SIFT, fino
ad arrivare ad algoritmi più recenti (BRISK) e caratterizzati da un’efficienza maggiore. Questo ci è servito per comprendere il funzionamento di tali algoritmi ed
essere poi in grado di analizzarli allo scopo di implementare delle ottimizzazioni.
Abbiamo poi esposto le principali tecniche di riconoscimento di immagini e come
è possibile misurarne l’accuratezza. Ci siamo quindi concentrati sui metodi di
codifica dei descrittori binari, utili per comprendere il funzionamento di BRISK.
85
CAPITOLO 6. CONCLUSIONI E DIREZIONI DI LAVORO FUTURE
E’ stato inoltre illustrato un modello rate-accuratezza, che permette di effettuare l’estrazione di feature in condizioni ottimali, contribuendo ad un’esecuzione
efficiente.
Nella parte successiva ci siamo occupati di esporre quali sono le ottimizzazioni
pensate per BRISK. Per fare questo abbiamo prima analizzato la struttura dell’algoritmo, determinando quali sono le parti più onerose. Abbiamo poi visto come
è possibile implementare dei miglioramenti nell’ottica di una maggiore efficienza
computazionale.
Nel seguito sono stati illustrati i risultati ottenuti dopo l’implementazione delle
ottimizzazioni e dopo averle testate sul dispositivo Beaglebone. E’ risultato che
quasi tutte le migliorie corrispondono ad una diminuzione dei tempi di esecuzione,
contribuendo così ad un incremento delle prestazioni.
Nell’ultima parte è stato effettuato il confronto sul piano energetico dei due paradigmi CTA e ATC. Grazie ad una stima effettuata sulla base dei tempi di
esecuzione, si è mostrato che il paradigma CTA risulta ancora quello più efficiente
per bitrate elevati, mentre nel caso di una bassa disponibilità di banda ATC si
rivela la soluzione migliore. Inoltre, le migliorie apportate all’algoritmo di BRISK
permettono di avvicinare in modo significativo le prestazioni di CTA, riducendo
l’energia necessaria per l’esecuzione. Questa riduzione del divario tra i due paradigmi può rappresentare un punto di partenza per ulteriori ottimizzazioni future
a favore della soluzione ATC. Bisogna infatti tenere in considerazione che le ottimizzazioni sono state testate solamente sul dispositivo Beaglebone. Inoltre il
paradigma CTA si basa sull’utilizzo della codifica JPEG, il cui algoritmo è il risultato di più di 20 anni di ottimizzazioni; al contrario gli algoritmi utilizzati nella
modalità ATC sono molto recenti e ben lontani dall’avere prestazioni ottimali in
termini di consumi energetici.
Le misure di potenza, e quindi quelle dei consumi energetici, sono state ricavate
a partire da alcune stime. Esse sono utili per dare un’idea generale del compor-
86
CAPITOLO 6. CONCLUSIONI E DIREZIONI DI LAVORO FUTURE
tamento dei due paradigmi ma non possono ritenersi totalmente accurate. Una
prima direzione di lavoro è quindi quella che prevede la misura diretta dei consumi
dei due paradigmi tramite uno strumento adatto, come può essere l’oscilloscopio.
In questo modo sarebbe possibile conoscere il comportamento esatto della Beaglebone in termini di potenza e ricavare dei valori accurati.
Siccome questa tesi è basata sull’utilizzo del dispositivo Beaglebone, un altro possibile sviluppo può essere la ripetizione degli stessi test su altri dispositivi con le
stesse caratteristiche. E’ inoltre possibile che in futuro vengano prodotti nuovi
computer con le stesse funzionalità ma molto più efficienti in termini di consumi
energetici, favorendo così l’applicazione del paradigma ATC. Inoltre la Beaglebone è stata utilizzata con un sistema operativo Ubuntu Linux per esigenze legate
alla comunicazione di rete. E’ stato brevemente osservato tuttavia che i tempi
di esecuzione sono differenti se si utilizza la distribuzione di Linux Ångström. Si
potrebbe quindi ripetere il lavoro su questo sistema operativo, maggiormente ottimizzato per dispositivi come la Beaglebone, e verificare se è possibile un ulteriore
incremento delle prestazioni.
Infine, possibili lavori futuri consistono nello sviluppo di nuovi algoritmi di estrazione di feature, strettamente mirati all’efficienza energetica. Si sta già lavorando
in questa direzione attraverso delle ricerche sui cosiddetti Application Specific Integrated Circuits (ASIC), capaci di individuare ed estrarre feature con consumi
bassissimi.
I miglioramenti che possono essere fatti in termini di efficienza sono quindi ancora
molti, nell’ottica di un passaggio dal paradigma comprimi-poi-analizza a quello
analizza-poi-comprimi.
87
Bibliografia
[1] Lambros Sarakis, Theodore Zahariadis, Helen-Catherine Leligou, and Mischa
Dohler. A framework for service provisioning in virtual sensor networks.
EURASIP J. Wireless Comm. and Networking, 2012:135, 2012.
[2] J.A. Stankovic. Wireless sensor networks. Computer, 41(10):92–95, 2008.
[3] G. Lu, B. Krishnamachari, and C.S. Raghavendra. Performance evaluation of
the ieee 802.15.4 mac for low-rate low-power wireless networks. In Performance, Computing, and Communications, 2004 IEEE International Conference
on, pages 701–706, 2004.
[4] Yeong-Hyun Kwon and Dong-Ryeol Shin. The security monitoring system
using ieee 802.15.4 protocol and cmos image sensor. In New Trends in Information and Service Science, 2009. NISS ’09. International Conference on,
pages 1197–1202, 2009.
[5] P. Chen, P. Ahammad, C. Boyer, Shih-I Huang, Leon Lin, E. Lobaton,
M. Meingast, Songhwai Oh, S. Wang, Posu Yan, A.Y. Yang, Chuohao Yeo,
Lung-Chung Chang, J. D. Tygar, and S.S. Sastry. Citric: A low-bandwidth
wireless camera network platform. In Distributed Smart Cameras, 2008.
ICDSC 2008. Second ACM/IEEE International Conference on, pages 1–10,
2008.
[6] Y. Charfi, N. Wakamiya, and M. Murata. Challenging issues in visual sensor
networks. Wireless Communications, IEEE, 16(2):44–49, 2009.
88
BIBLIOGRAFIA
[7] Bulent Tavli, Kemal Bicakci, Ruken Zilan, and JoseM. Barcelo-Ordinas. A
survey of visual sensor network platforms. Multimedia Tools and Applications,
60(3):689–726, 2012.
[8] Jayavardhana Gubbi, Rajkumar Buyya, Slaven Marusic, and Marimuthu Palaniswami. Internet of things (iot): A vision, architectural elements, and
future directions. CoRR, abs/1207.0203, 2012.
[9] M. Zorzi, A. Gluhak, S. Lange, and A. Bassi. From today’s intranet of things
to a future internet of things: a wireless- and mobility-related view. Wireless
Communications, IEEE, 17(6):44–51, 2010.
[10] Gerald Coley. Beaglebone rev a6 system reference manual. Computer, 2012.
[11] S. Leutenegger, M. Chli, and R.Y. Siegwart. Brisk: Binary robust invariant
scalable keypoints. In Computer Vision (ICCV), 2011 IEEE International
Conference on, pages 2548–2555, 2011.
[12] A. Canclini, M. Cesana, M.Tagliasacchi A.Redondi, J. Ascenso, and R. Cilla.
Evaluation of low-complexity visual feature detectors and descriptors. 2013.
[13] David G. Lowe. Object recognition from local scale-invariant features. In
Proceedings of the International Conference on Computer Vision-Volume 2
- Volume 2, ICCV ’99, pages 1150–, Washington, DC, USA, 1999. IEEE
Computer Society.
[14] Tony Lindeberg. Scale-space theory: A basic tool for analysing structures at
different scales. Journal of Applied Statistics, pages 224–270, 1994.
[15] Krystian Mikolajczyk. Detection of local features invariant to affines transformations. PhD thesis, Institut National Polytechnique de Grenoble, July
2002.
89
BIBLIOGRAFIA
[16] David G. Lowe. Distinctive image features from scale-invariant keypoints.
Int. J. Comput. Vision, 60(2):91–110, November 2004.
[17] Herbert Bay, Tinne Tuytelaars, and Luc Gool. Surf: Speeded up robust
features. In Aleš Leonardis, Horst Bischof, and Axel Pinz, editors, Computer
Vision – ECCV 2006, volume 3951 of Lecture Notes in Computer Science,
pages 404–417. Springer Berlin Heidelberg, 2006.
[18] Tony Lindeberg.
Feature detection with automatic scale selection.
International Journal of Computer Vision, 30:79–116, 1998.
[19] Edward Rosten, R. Porter, and Tom Drummond. Faster and better: A machine learning approach to corner detection. Pattern Analysis and Machine
Intelligence, IEEE Transactions on, 32(1):105–119, 2010.
[20] Elmar Mair, GregoryD. Hager, Darius Burschka, Michael Suppa, and Gerhard Hirzinger. Adaptive and generic corner detection based on the accelerated segment test. In Kostas Daniilidis, Petros Maragos, and Nikos Paragios, editors, Computer Vision – ECCV 2010, volume 6312 of Lecture Notes
in Computer Science, pages 183–196. Springer Berlin Heidelberg, 2010.
[21] Michael Calonder, Vincent Lepetit, Mustafa Özuysal, Tomasz Trzcinski,
Christoph Strecha, and Pascal Fua.
Brief: Computing a local binary
descriptor very fast.
[22] Sunil Arya, David M. Mount, Nathan S. Netanyahu, Ruth Silverman, and Angela Y. Wu. An optimal algorithm for approximate nearest neighbor searching
fixed dimensions. J. ACM, 45(6):891–923, November 1998.
[23] Simon A. J. Winder, Gang Hua, and Matthew Brown. Picking the best daisy.
In CVPR, pages 178–185. IEEE, 2009.
90
BIBLIOGRAFIA
[24] Martin A. Fischler and Robert C. Bolles. Random sample consensus: a
paradigm for model fitting with applications to image analysis and automated
cartography. Commun. ACM, 24(6):381–395, June 1981.
[25] James Philbin, Ondrej Chum, Michael Isard, Josef Sivic, and Andrew Zisserman.
Object retrieval with large vocabularies and fast spatial mat-
ching. In Computer Vision and Pattern Recognition, 2007. CVPR’07. IEEE
Conference on, pages 1–8. IEEE, 2007.
[26] E. Rublee, V. Rabaud, K. Konolige, and G. Bradski. Orb: An efficient alternative to sift or surf. In Computer Vision (ICCV), 2011 IEEE International
Conference on, pages 2564–2571, 2011.
[27] Alexandre Alahi, Raphaël Ortiz, and Pierre Vandergheynst. FREAK: Fast
Retina Keypoint. In IEEE Conference on Computer Vision and Pattern
Recognition, IEEE Conference on Computer Vision and Pattern Recognition,
New York, 2012. Ieee. CVPR 2012 Open Source Award Winner.
[28] A. Redondi, M. Cesana, and M. Tagliasacchi. Rate-accuracy optimization of
binary descriptors. In IEEE International Conference on Image Processing,
September 2013.
[29] M. Brown, Gang Hua, and S. Winder. Discriminative learning of local image
descriptors. Pattern Analysis and Machine Intelligence, IEEE Transactions
on, 33(1):43–57, 2011.
[30] Redondi Alessandro, Matteo Cesana, Marco Tagliasacchi, Joao Ascenso, and
Luca Baroffio. Rate-accuracy optimization in visual wireless sensor networks.
ICIP, page 1105–1108, 2012.
[31] Realview compilation tools. 2010.
[32] Alessandro Redondi. Energy-aware visual analysis for wireless multimedia
sensor networks. PhD thesis, Politecnico di Milano, 2013.
91
Fly UP