Un ‘applicazione per il riconoscimento delle immagini basata sull’algoritmo SURF e sviluppata per core ARM

In questo articolo parliamo di un'applicazione o più comunemente "App" che ho realizzato per la mia tesi magistrale la quale permette il riconoscimento di un’immagine all’interno di una fotografia scattata, ad esempio, da un visitatore di un museo, di un palazzo antico oppure di una semplice mostra.

L’idea nasce dalla possibilità di voler fornire, nel momento in cui viene riconosciuto l’oggetto, delle informazioni caratteristiche riguardo all’anno in cui è stato creato, l’autore, il contesto storico e tutte le tipiche informazioni che si forniscono a dei visitatori di mostre o esposizioni artistiche. Semplice no? Eppure è una soluzione abbastanza innovativa e che tenderebbe a sostituire i soliti "telefoni guida" che troviamo attualmente nella maggior parte di musei, mostre o chiese, con qualcosa di più innovativo e immediato: i nostri amati smartphone !

Partiamo con una breve introduzione dell'applicazione: sono stati utilizzati gli algoritmi e le funzioni generali per l’analisi ed elaborazione delle immagini contenuti nella libreria OpenCV, sviluppata dalla Intel ma attualmente sotto licenza free BSD. In particolare tra tutti gli algoritmi contenuti nella suddetta libreria, si è scelto di utilizzare le potenzialità nell’estrazione delle features di un’immagine dell’algoritmo SURF (Speeded Up Robust Features), sia in termini di robustezza che in termini di calcolo computazionale.

Attualmente la libreria OpenCV è compatibile sia con il sistema operativo Linux sia per iOS, quindi ci permette di realizzare un'applicazione che puà girare su quasi tutti dispositivi mobili disponibili sul mercato (ovviamente le prestazioni cambiano a seconda dell'hardware a disposizione..).

Per questo lavoro abbiamo scelto come dispositivo target il multimedial processor Freescale i.MX51, il quale presenta come core principale un processore ARM A8 con frequenza di clock pari a 600 MHz. In questa architettura non troviamo un DSP specifico, ma il coprocessore NEON il quale esegue istruzioni SIMD a 128 bit.

La scelta di questo processore non è casuale, anzi, molti dispositivi in commercio fanno uso di tale processore e tra i tanti troviamo (non a caso) anche l'ormai celeberrimo Iphone 4.

Ovviamente, l'applicazione deve permettere a ciascun visitatore di ottenere le informazioni desiderate in tempi brevi (real time app. ) e in maniera corretta, ossia senza errori di matching in fase di confronto...

Un altro aspetto di cui tener conto è la dimensione dell'applicazione in termini di spazio occupante in memoria sia da parte dell'eseguibile dell'applicazione sia in termini di spazio occupato dalle foto di riferimento.

Infatti, tutte le immagini scattate andranno ad essere confrontate e matchate con le immagini di riferimento contenute all'interno del database delle originali.

Per testare l'applicazione sono state fatte diverse foto in modo tale da simulare la maggior parte delle condizioni che si possono verificare quando una persona scatta una foto all'interno di una mostra. Di seguito riportiamo alcune immagini utilizzate come test:

Immagine A:

Immagine B:

Immagine C:

 

Come si vede le foto sono del tutte amatoriali e troviamo per esempio delle persone che si trovano tra l'obiettivo della camera e il quadro(nella fattispecie me stesso 🙂 ), angoli non ottimali, persone che scattano la foto insieme al quadro ma in realtà sono state testate anche altre condizioni non ottimali come ad esempio variazioni di luminosità, immagini sfocate, ecc..

Vediamo adesso come funziona l'applicazione e quali sono i passi principali che vengono eseguiti affinchè si ottenga il matching corretto:

1)Acquisizione dell'immagine scattata dall'utente

2)Elaborazione e caratterizzazione di tale immagine mediante i cosiddetti descrittori SURF.

3)Confronto tra i descrittori estratti e quelli delle immagini originali contenute nel database

4)Presentazione del risultato ottenuto.

Per non appesantire troppo l'articolo, diciamo soltanto che i descrittori citati nel punto 2 vengono estratti implementando l'algoritmo SURF il quale prevede di caratterizzare l'immagine con i suoi punti salienti (detti anche "keypoints"), i quali vengono identificati attraverso un processo matematico che si basa sulla differenza di luminosità di alcune regioni dell'immagine che risultano essere quindi particolari nonchè uniche e caratterizzanti per l'immagine stessa.

Di seguito si riporta un'immagine in cui vengono mostrati dei cerchi rossi che evidenziano i descrittori delle immagine:

NB. L'immagine è in bianco e nero in quanto l'algoritmo SURF opera proprio su immagini in "gray scale", infatti una delle prime operazioni realizzate grazie alle funzioni di OpenCV è proprio la conversione in b/n dell'immagine a colori. 

Per ottimizzare il tempo di esecuzione totale dell'applicazione, è stato necessario ridurre al minimo il numero di descrittori e allo stesso tempo prendere quelli che permettessero una valutazione univoca dell'immagine, garantendo quindi affidabilità e tempestività dell'applicazione. Per ottenere questi risultati si è agito sia sulla dimensione minima che l'immagine può assumere sia su un parametro caratterizzante dell'algoritmo SURF: la soglia dell'Hessiano ( ma qui si rimanda al link sul SURF per i più curiosi...).

Le ottimizzazioni di cui abbiamo appena parlato in realtà sarebbero state vane se prima non sfruttiamo a pieno l'hardware a nostra disposizione. Infatti, l'i.MX51 oltre ad avere un buon processore che viaggia ad un'ottima frequenza di clock (600 MHz), abbiamo visto dispone anche del NEON.

Questo dispositivo è stato abilitato opportunamente in fase di compilazione del codice sorgente attraverso un'opportuna flag passata al compilatore gcc ( in particolare la flag è -mfpu=neon indica che utilizziamo come floating point unit il NEON).

Per farvi rendere conto di quanto il NEON possa influire su operazioni di elaborazione grafica, riporto la seguente tabella:

Dove con A, B e C si indicano le immagini viste in precedenza e confrontate con le loro immagini originali che risiedono nel database. Come possiamo vedere dalla tabella 1 abilitando soltanto il NEON si ottengono dei tempi di estrazione e di matching molto elevati ( figuriamoci SENZA la sua azione...ricordo venivano fuori tempi esagerati !!). Per quanto riguarda il valore della soglia possiamo dire che più è grande e maggiore è il numero di descrittori che vengono "filtrati" e quindi scartati. 1000 è un valore che permette di prendere un elevato numero di descrittori ma per questa tabella non si guardava a ottimizzare questo fattore.

Passiamo adesso ad agire sullo scaling delle dimensioni oltre che abilitare il NEON:

Nella tabella II il confronto è stato fatto 1-1 ossia non si è confrontato i descrittori estratti con tutti i descrittori del database.

Nella prossima tabella invece il confronto è stato fatto anche con le restanti immagini nel database (in questo caso 3):

Come possiamo vedere in 8-9 secondi riusciamo ad ottenere il nostro matching correttamente. Il risultato prodotto è quello di tracciare un rettangolo che individui l'area riconosciuta:

Ovviamente vi chiederete che avere soltanto 3 immagini in un database non è il massimo, infatti le ottimizzazioni che si è cercato di fare sono mirate a velocizzare il singolo confronto e capire come effettuare un "ranking" dei descrittori affinchè l'applicazione non sbagliasse il confronto. Sviluppi futuri dell'applicazione sono sicuramente rivolti sia all'implementazione di un database organizzato in modo intelligente, sia rivolti al metodo di ricerca e confronto delle due immagini.

Ad ogni modo dei buoni risultati sono stati ottenuti in quanto si è riusciti a capire su quali parametri agire per le ottimizzazioni complessive delle prestazioni sia temporali che di affidabilità.

Ecco il PDF con l'articolo originale

Scarica subito una copia gratis
Tags:

2 Commenti

  1. Avatar photo Nicholas Angelucci 6 Marzo 2015

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend