Nvidia Jetson Nano – Come utilizzare la webcam USB

Jetson Nano B01

La scheda Nvidia Jetson Nano dispone di una uscita HDMI digitale su scheda attraverso input CSI. Ma è possibile gestire una webcam via USB?

I kit per sviluppatori NVIDIA Jetson supportano l’integrazione della telecamera a connessione diretta utilizzando due metodi principali. Il primo consiste nell’utilizzare un’interfaccia seriale per fotocamera MIPI (CSI). La MIPI Alliance è il nome del gruppo industriale che sviluppa specifiche tecniche per l’ecosistema mobile. Su schede Jetson come il Nano, questo potrebbe essere un modulo sensore come la familiare fotocamera Raspberry Pi V2 basata sul sensore di immagine Sony IMX219.

Il secondo tipo di periferica è una fotocamera che si collega tramite una porta USB, ad esempio una webcam. In questo articolo, liberamente ispirato dal lavoro di JetsonHacks, parleremo di come collegare una fotocamera USB.

V4L2

Al loro interno, le schede Nvidia Jetson utilizzano il modulo del kernel Linux chiamato Video Four Linux (version 2) (V4L2).  V4L2 è una parte di Linux, non specifico delle schede Jetson. Chi utilizza ad esempio software come OBS Studio sotto Linux trovrà sicuramente qualche riferimento a tale modulo nella sezione di configurazione video. V4L2 esegue un gran numero di operazioni, ma in questo articolo ci concentreremo sulla cattura video da obiettivo esterno.

Nvidia V4L2
Lo Stack della Jetson Camera Architecture (NVIDIA Jetson documentation)

CSI, ovvero…

Come accennato in precedenza, ci sono due modi principali per acquisire video da telecamere direttamente collegate al Jetson. Il primo, tramite le porte CSI, utilizza libargus che è una libreria specifica di Jetson che collega il sensore della fotocamera al processore del segnale di immagine SoC Tegra (ISP). L’hardware dell’ISP esegue un’ampia varietà di attività di elaborazione delle immagini, come il debayering di un’immagine, gestisce il bilanciamento del bianco, il contrasto e così via. Non si trata di una operazione banale, e richiede strumenti e competenze speciali per produrre video di alta qualità.

 

Un minimo di attenzione va posta nell scelta della scheda. Nvidia ha infatti rilasciato diversi developer kit per Jetson Nano. Oltre alla classica opzione con 2GB anziché 4GB di memoria RAM a bordo, ricordiamo anche che la differenza tra versione A02 e B01 consiste nella possibilità di utilizzare due porte CSI per la visione stereo.

Nano A02 vs B01

USB, vale a dire…

Il video da una fotocamera USB prende un percorso diverso. Il driver USB Video Class (uvcvideo) è un modulo del kernel Linux. Il modulo uvcvideo supporta i controlli dell’unità di estensione (controlli XU) su V4l2 tramite la mappatura e un’interfaccia ioctl specifica del driver. I controlli di input/output (ioctls) sono l’interfaccia per l’API V4L2. Per ulteriori informazioni: il driver Linux USB Video Class (UVC).

Ciò significa che un driver in un dispositivo con fotocamera USB può specificare diversi controlli dipendenti dal dispositivo, senza che uvcvideo o V4l2 debbano comprenderli in modo specifico. Il driver della fotocamera USB consegna un codice per una funzione, insieme a un intervallo di valori possibili, a uvcvideo. Quando l’utente specifica un valore di funzione per la telecamera, uvcvideo controlla i limiti dell’argomento e lo passa alla telecamera insieme al codice della funzione. La fotocamera quindi si regola di conseguenza.

V4L2 con USB
Source: JetsonHacks

Tool di sviluppo

Nell’architettura della fotocamera Jetson, un flusso della fotocamera V4L2 è disponibile per un’applicazione in due modi diversi. Il primo modo è utilizzare l’interfaccia V4L2 direttamente attraverso i controlli ioctl o tramite una libreria che dispone di un backend V4L2. Il secondo modo è utilizzare GStreamer che è un framework di elaborazione multimediale.

ioctl

La libreria più popolare su Jetson per l’interfacciamento con le telecamere V4L2 tramite ioctl su Jetson è il repository Github dusty-nv/jetson-utils. Dustin Franklin di NVIDIA ha utility Linux wrapper C/C++ per fotocamera, codec, GStreamer, CUDA e OpenCV nel repository.

GStreamer

GStreamer è una parte importante dell’architettura della fotocamera Jetson. L’architettura GStreamer è estensibile. NVIDIA implementa elementi DeepStream che, una volta aggiunti alla pipeline GStreamer, forniscono analisi di deep learning di un flusso video. NVIDIA chiama questo Intelligent Video Analytics.

GStreamer dispone di strumenti che gli consentono di funzionare come un’applicazione autonoma. Ci sono anche librerie che consentono a GStreamer di far parte di un’applicazione. GStreamer può essere integrato in un’applicazione in diversi modi, ad esempio utilizzando OpenCV. Ad esempio, la popolare libreria Python su Github NVIDIA-AI-IOT/jetcam utilizza OpenCV per gestire la fotocamera e il display.

OpenCV

OpenCV è un framework popolare per la creazione di applicazioni di visione artificiale. Molte persone usano OpenCV per gestire l’input della telecamera e visualizzare il video in una finestra usando poche righe di codice. OpenCV è flessibile. Nella distribuzione Jetson predefinita, OpenCV può utilizzare un’interfaccia V4L2 (ioctl) o un’interfaccia GStreamer. Inoltre, OpenCV può implementare display GTK+ o QT per la grafica.

Jetson Nano OpenCV

Note USB

Come accennato nel video, la larghezza di banda USB per Jetson potrebbe non corrispondere alle aspettative. Ad esempio su Jetson Nano e Xavier NX, ci sono 4 porte USB 3. Tuttavia, le porte USB sono collegate a un hub internamente sulle schede Jetson Jetson. Ciò significa che saremo limitati alla velocità dell’hub, che è inferiore a quella di 4 porte USB super veloci.

Inoltre, per risparmiare energia, Jetson implementa quella che viene chiamata “sospensione automatica USB”. Questo spegne una porta USB quando non è in uso. La maggior parte delle fotocamere USB lo gestisce correttamente e non consente la sospensione automatica della porta USB. Tuttavia, occasionalmente potremmo incontrare una fotocamera che non lo fa.

Considerazioni finali

Come abbiamo visto, lavorare su video con le schede Jetson è sempre divertente (tempo fa abbiamo presentato un sistema per codifica FFMPEG in parallelo con Nano). Oggi l’articolo di JetsonHacks ci ha mostrato le differenze hardware e software insite nell’uso di una videocamera esterna attraverso USB rispetto alla classica CSI fornita a corredo dello Starter Kit.

Nei prossimi articoli vedremo come confrontare uno script OpenCV che giri su Raspberry PI e su Jetson Nano.

 

Link utili

 

Join our groups onTelegram…

… and don’t forget our social channels!

Definire ciò che si è non risulta mai semplice o intuitivo, in specie quando nella vita si cerca costantemente di migliorarsi, di crescere tanto professionalmente quanto emotivamente. Lavoro per contribuire al mutamento dei settori cardine della computer science e per offrire sintesi ragionate e consulenza ad aziende e pubblicazioni ICT, ma anche perche’ ciò che riesco a portare a termine mi dà soddisfazione, piacere. Così come mi piace suonare (sax, tastiere, chitarra), cantare, scrivere (ho pubblicato 350 articoli scientfici e 3 libri sinora, ma non ho concluso ciò che ho da dire), leggere, Adoro la matematica, la logica, la filosofia, la scienza e la tecnologia, ed inseguo quel concetto di homo novus rinascimentale, cercando di completare quelle sezioni della mia vita che ancora appaiono poco ricche.

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.