Dal riconoscimento procedurale a YOLO. Coi decoder a passata singola la computer vision fa un salto generazionale. Uno sguardo a cosa c’è dietro.

La computer vision è uno dei campi in cui l’Intelligenza Artificiale è in maggiore espansione. Basti pensare alle auto autonome e driverless, dove Tesla ha fatto da apripista, e su cui si stanno ora buttando un po’ tutte le case automobilistiche.

Per anni il riconoscimento e la categorizzazione delle immagini sono stati un problema, specialmente considerando la difficoltà di un algoritmo tradizionale a riconoscere lo stesso oggetto in posizioni e angolazioni differenti.

Considerando quanto sia sembri a noi facile e automatico riconoscere e distinguere da scene visive, rendersi conto dei problemi che si incontrano nel riconoscimento automatico non è così scontato.

Problemi e difficoltà

Innanzitutto dobbiamo distinguere due classi di problemi: la categorizzazione e la localizzazione. La prima, relativamente meno complessa, presenta già difficoltà non banali.

Ci riesce facile per esempio riconoscere una sedia, ma sareste in grado di descriverne una in modo inequivocabile? Potremmo definirlo come un mobile per sedersi con quattro gambe, dei braccioli e uno schienale. Tuttavia, già guardando l’immagine qui sotto si notano diversi problemi: alcune hanno solo tre gambe, alcune addirittura ne hanno solo due, quella rossa di fatto solamente una, quella per ufficio è a rotelle, etc.

Eppure per noi identificarle tutte come sedie è immediato. Istruire una macchina a riconoscerle presentando tutte le possibili eccezioni è ovviamente impossibile. Di conseguenza un riconoscimento basato su regole è destinato come minimo a produrre risultati insoddisfacenti, pieni di falsi positivi (riconoscimento di sedie dove non ce ne sono) e negativi (sedie non riconosciute per tali).

Il problema si complica ancora di più se gli oggetti vengono presentati con differenti orientamenti, o con delle parti mancanti (vedi sotto).

Approcci classici

Senza addentrarci troppo nella storia del riconoscimento oggetti automatico, possiamo dire che, prima dell’avvento del deep learning, uno dei tentativi di face recognition di maggiore successo fu quello di Viola-Jones[1]. Questo algoritmo funzionava in modo molto semplice: si generava una sorta di mappa che rappresentava le feature di un viso, tramite migliaia di semplici classificatori binari usando Haar features. Questa mappa veniva poi “cablata” nell’algoritmo usandola per addestrare una SVM come classificatore per individuare la faccia nell’immagine. Era un algoritmo semplice e veloce, tanto che ancora oggi è utilizzato in alcune fotocamere compatte di fascia economica. Queste presentavano però esattamente i problemi sopra descritti, ovvero erano poco flessibili nel riconoscere oggetti presentati con variazioni anche lievi a quelli utilizzati per l’apprendimento.

Più precisi erano algoritmi come quello di Dalal e Triggs[2], che utilizzava HOG (istogrammi a gradienti orientati) che oltre ai bordi, tiene in conto gli orientamenti dei gradienti in ogni porzione dell’immagine, e SVM per la classificazione.

Tuttavia, pur ottenendo risultati molto più precisi del precedente, era decisamente più lento. Inoltre il problema rimaneva la scarsa robustezza e la conseguente difficoltà nel riconoscere immagini con una certa quantità di “rumore” o distrazioni in background.

Identificare e scomporre immagini come queste erano un problema serio per i primi algoritmi

Un altro problema di questi algoritmi era la capacità di riconoscere solo una singola immagine. Inoltre non erano in grado di generalizzare. In altre parole potevano essere “configurati” solo su un genere di immagini (facce, cani, etc), avevano forti difficoltà nei problemi elencati sopra e avevano limitazioni molto stringenti sul formato delle immagini su cui potevano lavorare.

Arriva il Deep Learning

In effetti per diventare veramente utile il riconoscimento oggetti dovrebbe essere in grado di effettuare riconoscimenti su scene complesse, che sono poi le scene in cui ci imbattiamo nella vita di tutti i giorni (sotto).

Scena con diversi oggetti, presenti in diverse proporzioni, colori e angolature

L’esplosione dell’uso delle reti neurali nell’era dei Big Data, e della conseguente popolarità del Deep Learning cambiarono le carte in tavola. In particolare lo sviluppo delle reti convolute diede una forte spinta.

Un approccio comune a quasi tutti gli algoritmi (compresi i precedenti) è stato quello della “sliding window”, ovvero scansionare zona per zona tutta l’immagine, analizzandola una porzione (la finestra appunto) alla volta.

Nel caso delle reti convolute (CNN), l’idea è di ripetere il processo con diverse dimensioni della finestra, ottenendo per ciascuna una predizione del contenuto, con grado di confidenza. Alla fine vengono scartate le predizioni con grado di confidenza più basso.

Classificazione tramite CNN
Classificazione tramite CNN

YOLO, il pioniere dei decoder a passata singola

Le necessità di oggi vanno molto oltre la semplice classificazione o localizzazione in immagini statiche, oggi la necessità è di avere analisi in tempo reale: nessuno vorrebbe trovarsi a bordo di un’automobile autonoma che impiega diversi minuti (o anche solo secondi) per riconoscere immagini!

La soluzione al problema è quella di utilizzare reti convolute a passata singola, ovvero che analizzano tutte le parti dell’immagine in parallelo, simultaneamente, consentendo di evitare l’uso della sliding window.

Yolo è stato sviluppato da Redmon e Farhadi nel 2015, durante il loro dottorato. Il concetto è di ridimensionare l’immagine in modo da ricavarne una griglia di quadrati. Nella v3 (l’ultima), YOLO fa predizioni su 3 diverse scale, riducendo l’immagine rispettivamente di 32, 16 e 8, allo scopo di rimanere accurata anche su scale più piccole (le versioni precedenti avevano dei problemi con le immagini piccole). Per ciascuna delle 3 scale, ogni cella è responsabile della predizione di 3 bounding box, utilizzando 3 anchor box[3].

Yolo v3 è in grado di lavorare con 80 classi differenti. Al termine dell’elaborazione vengono mantenute solo le bounding box con la confidenza più elevata, scartando le altre.

 

Architettura di Yolo v3 (Fonte: Ayoosh Kathuria)

YOLO v3 risulta molto più preciso delle versioni precedenti, e pur essendo un po’ più lento, rimane comunque uno degli algoritmi più veloci in circolazione. La v3 usa come architettura una variante di Darknet, con 106 layer convoluti. Interessante è anche Tiny YOLO, funzionante su Tiny Darknet, e in grado di girare su dispositivi limitati come gli smartphone.

Qui sotto si può vedere YOLO v3 all’opera su filmati in tempo reale.

 

Note

[1] P. Viola and M. Jones: Rapid object detection using a boosted cascade of simple features, CVPR 2001.

[2] N. Dalal, B. Triggs: Histograms of Oriented Gradients for Human Detection, CVPR 2005.

[3] Un anchor box non è altro che un rettangolo di proporzioni pre-definite. Si usano per avere maggior corrispondenza tra bounding box predetta e attesa (qui si può seguire l’ottima spiegazione di Andrew Ng).

LINKS

Object detection: an overview in the age of Deep Learning

Evolution of Object Detection and Localization Algorithms

YOLO website

Redmon J, Farhadi A. – You Only Look Once: Unified, Real-Time Object Detection (arXiv:1506.02640v5)

Redmon J, Farhadi A. – YOLOv3: An Incremental Improvement (arXiv:1804.02767v1)

Wei Liu et al. – SSD: Single Shot MultiBox Detector (arXiv:1512.02325v5)

What’s new in YOLO v3?

Speed/accuracy trade-offs for modern convolutional object detectors

Single Shot Detectors

Andrew NG’s YOLO lecture on Coursera

YOLO: Real Time Object Detection

 

Histogram of Oriented Gradients

RNNs in Darknet

Tutorial: Implement Object Recognition on Live Stream

YOLO — You only look once, real time object detection explained

INVESTIGATING HUMAN PRIORS FOR PLAYING VIDEO
GAMES

COCO – Common Objects in COntext