Prima ancora del deep learning "in tempo reale": la computer vision classica
La computer vision è il ramo dell'intelligenza artificiale che permette alle macchine di elaborare, analizzare e comprendere immagini e video — un campo di ricerca molto più vecchio dell'AI generativa e degli LLM multimodali di oggi. Prima di raccontare i due progetti che abbiamo costruito davvero — il Theremin virtuale (una forma di pose estimation applicata alle mani) ed EmoLens (una forma di classificazione applicata alle micro-espressioni del volto) — vale la pena guardare la mappa completa dei compiti che questo campo affronta: sono entrambi, in fondo, casi particolari di questa tassonomia più generale.
Compiti su una singola immagine
"Cosa c'è in questa foto?"
Assegna un'etichetta a un'intera immagine scegliendo tra un insieme predefinito di classi (es. "persona", "auto"). È il compito più semplice e il primo su cui le reti convoluzionali hanno superato le prestazioni umane, un decennio prima dei transformer.
"Chi è questa persona?"
Non basta riconoscere "è un volto umano" (classificazione): bisogna riconoscere quale istanza specifica di quella classe — questa persona, non un'altra. È la base del riconoscimento facciale.
"Dove si trova, esattamente?"
Localizza uno o più elementi in un'immagine con un riquadro di delimitazione. Spesso è una fase preliminare: rilevare un volto prima di analizzarlo, o un componente danneggiato prima di classificarne il guasto. È il compito centrale di strumenti come YOLO e Detectron2.
"Quali pixel, esattamente?"
Non un riquadro ma una maschera pixel-per-pixel. La segmentazione di oggetti restituisce una maschera per classe (tutti i pixel "auto"); la segmentazione di istanze una maschera diversa per ogni singola auto riconosciuta — un compito in cui le reti neurali sono ancora lontane dalla precisione del cervello umano.
"Come è orientato/posizionato?"
Per oggetti rigidi, la posizione e l'orientamento nello spazio 3D rispetto alla telecamera (utile per la robotica). Per corpi umani, la posizione delle parti del corpo l'una rispetto all'altra — esattamente il compito che MediaPipe Hands risolve per il nostro Theremin, solo applicato alle mani invece che all'intero corpo.
Compiti su un flusso video
La visione artificiale non si ferma alla singola immagine: alcuni compiti richiedono di considerare una sequenza nel suo complesso, non fotogramma per fotogramma, per tenere conto della coerenza temporale. Il tracciamento localizza un elemento specifico lungo tutto il flusso video — potrebbe essere fatto applicando il rilevamento a ogni singolo fotogramma, ma è molto più efficiente usare i risultati dei fotogrammi precedenti per prevedere la posizione futura, sfruttando la continuità del movimento. Il riconoscimento di azioni va oltre: riconoscere un gesto o un movimento (ballare, disegnare un cerchio) richiede per definizione una sequenza continua, allo stesso modo in cui non si può capire una frase da parole isolate e disordinate. È il principio dietro il debouncer che usiamo nel Theremin per confermare un pugno chiuso solo dopo alcuni fotogrammi consecutivi, non da un singolo frame isolato.
Gli stessi compiti, un'interfaccia completamente diversa
Fino a pochi anni fa, ciascuno di questi cinque compiti richiedeva un modello dedicato, addestrato su un dataset specifico per quel compito. Gli LLM multimodali cambiano l'interfaccia: un solo modello, un prompt in linguaggio naturale, e la risposta arriva come testo libero invece che come classe/riquadro/maschera strutturati. In SOLVEIAGENTS (https://blog.solvei.it/blog/solveiagents-medilog.html) questo si traduce in due agenti — agent-image e agent-medical — che interpretano il contenuto di un'immagine qualunque su richiesta, senza che nessuno abbia addestrato un modello apposta per quel task specifico. Tre esempi reali, presi dall'uso quotidiano della piattaforma.
Nessuna classe predefinita, nessun riquadro di delimitazione: il modello descrive soggetti, sfondo, colori dominanti, composizione e persino il testo leggibile su un cartello nel corridoio — un compito che avrebbe richiesto la combinazione di almeno quattro modelli specializzati (rilevamento persone, riconoscimento colori, OCR, stima della profondità) fino a pochi anni fa.
Soggetto principale
In primo piano (sinistra): una donna con capelli biondi raccolti in trecce, completo da infermiera blu scuro, tessera identificativa. Seduta a un tavolo, mano destra sul tastierino del computer, l'altra appoggiata al mento in un gesto riflessivo. Sul tavolo documenti sparsi, un monitor con dati medici, un telefono fisso, penne.
Al centro: un uomo con capelli scuri, completo da infermiere azzurro chiaro, cammina verso destra tenendo in mano un foglio.
A destra (primo piano): una donna con capelli corti grigi, completo verde acqua, spinge un carrello medico pieno di pacchi e documenti, tablet in mano.
Sfondo
Il corridoio si estende verso l'interno, illuminato da luci fluorescenti. Sulla parete sinistra un cartello: "Ambulatori Cardiologia Degenza / Chirurgia". Sullo sfondo altre persone in uniforme medica e un uomo con vestito scuro e cravatta, probabilmente personale amministrativo.
Colori dominanti
Tonalità cliniche — azzurri, verdi, grigi, bianchi — con i colori delle uniformi (blu scuro, azzurro chiaro, verde acqua) predominanti sulle tonalità neutre di pareti e pavimento. La luce fluorescente bianca contribuisce all'atmosfera fredda tipica di un ambiente ospedaliero.
Composizione
Prospettiva a "sfondo profondamente ricavato", con l'area del tavolo in primo piano come punto focale mentre il corridoio si allunga creando profondità. I tre soggetti sono distribuiti in modo dinamico: attività lavorativa, movimento, azione operativa.
Testi leggibili
Sul cartello: "Ambulatori Cardiologia Degenza / Chirurgia", chiaro e ben visibile. Nessun altro elemento testuale rilevante (niente scrittura leggibile su schermo o documenti).
Elementi rilevanti
Oggetti medici e amministrativi (carrello, monitor, documenti, penne); ambientazione clinica tipica (illuminazione fluorescente, pareti neutre, corridoio lungo); movimento umano dinamico che riflette l'attività quotidiana dei professionisti sanitari.
Lo stesso agente si presta anche a un uso più insolito — l'analisi grafologica di un appunto scritto a mano:
Descrizione dell'immagine
Un foglio di carta bianca, probabilmente un blocco per appunti, appoggiato su una superficie scura di legno. Il testo è scritto a mano con una penna a inchiostro nero: un elenco di note tecniche organizzate in punti, con predominanza di termini informatici e acronimi.
Pressione
Osservazione: costante e media, senza forti variazioni di spessore nel tratto, a eccezione di alcuni tratti finali più leggeri.
Interpretazione: equilibrio emotivo e controllo razionale, nessun segno di impulsività aggressiva né di estrema fragilità.
Dimensione
Osservazione: scrittura di dimensioni medie, con tendenza alla compattezza specialmente nelle parole tecniche ("GLM-OCR", "LM-STUDIO").
Interpretazione: persona adattabile, senso di misura, preferisce l'efficienza alla teatralità.
Inclinazione
Osservazione: prevalentemente verticale, con lievi oscillazioni verso destra in alcune parole.
Interpretazione: predominio della ragione sull'emozione — tratto tipico di chi è analitico e orientato all'obiettivo.
Ritmo e regolarità
Osservazione: ritmo rapido e funzionale; lettere non perfettamente formate ma coerenti, con semplificazione di alcuni tratti per velocizzare la scrittura.
Interpretazione: mente rapida e pragmatica, che privilegia contenuto e velocità di acquisizione rispetto alla forma estetica.
Connessioni tra lettere
Osservazione: lettere sciolte o collegate in modo intermittente, scrittura "ibrida" tra stampato e corsivo.
Interpretazione: pensiero sintetico, intelligenza che procede per blocchi logici piuttosto che per flussi emotivi continui.
Margini e spaziatura
Osservazione: margini a sinistra rispettati ma irregolari; spaziatura ampia e ariosa tra le righe, variabile tra le parole.
Interpretazione: metodo di lavoro schematico, abitudine a lasciare spazio per integrazioni future — tipico di chi pianifica processi tecnici.
Profilo sintetico
Profilo fortemente orientato alla razionalità, alla pragmatica e all'efficienza: una mentalità analitica, abituata a gestire flussi di informazioni complessi. Nessuno spazio per l'ornamento o l'emotività superficiale — un profilo tecnico/professionale, disciplinato ma rapido, capace di sintesi e con un forte controllo di sé.
Testo estratto (OCR)
FARE WEB APP che consente di trascinare PDF e ottenere markdown scorribile
OLLAMA LM-STUDIO - VLLM sono MODEL RUNNERS
EMBEDDING GEMMA — skills.sh
AGENTI - WEB APP per PDF/DOCX/XLSX/PPTX → .MD — LLM-WIKI
agent-medical applica lo stesso principio in ambito clinico, con un modello diverso e un prompt di sistema orientato alla diagnostica per immagini:
Descrizione dell'immagine
Sede: torace, vista anteriore-posteriore (PA).
Morfologia: struttura ossea completa (scapole, clavicole, coste) con bordi ben definiti; cuore posizionato centralmente, rapporto cardio-toracico normale (≤50%); polmoni con opacità segmentali nell'area inferiore destra e sinistra, suggerendo infiltrazione parenchimale.
Bordi: le opacità hanno margini irregolari e non delimitati, tipici di processi infiammatori.
Segni clinici rilevanti
Presenza di opacità segmentali e distribuzione focalizzata suggerisce un processo infettivo, come una polmonite. Nessun segno di pleurite (costofrenico non blunting), né di effusione pleurica o pneumotorace.
Diagnosi differenziale
Polmonite batterica (es. Streptococcus pneumoniae) — opacità segmentale tipica, distribuzione focale, frequente nell'area inferiore.
Tubercolosi polmonare — richiederebbe esami complementari (test di tubercolina o TC) per essere confermata o esclusa.
Infiammazione cronica (asma severo o sindrome da infiammazione respiratoria) — di norma associata a sintomi persistenti, non a opacità segmentali così marcate.
Da un flusso di pixel a un significato
Una webcam, di per sé, non "vede" niente: cattura un flusso di numeri — trenta volte al secondo, un milione di pixel a botta, ciascuno con tre valori di colore. Il lavoro interessante comincia dopo, quando quel flusso di numeri viene trasformato in qualcosa che ha significato per una persona: questa è una mano, sta indicando lì; questo è un volto, e sta per sorridere davvero — non solo con la bocca.
Negli ultimi anni questo passaggio — da pixel a significato — è diventato accessibile a chiunque abbia un laptop, grazie a un pugno di librerie open source mature che fanno il lavoro sporco (rilevare un volto, tracciare uno scheletro di mano, stimare una posa) lasciando al resto del codice il compito di decidere cosa farne. In questo articolo raccontiamo lo stato dell'arte di questi strumenti attraverso tre progetti concreti nati in casa nostra: uno già suonato dal vivo, uno già in produzione, e uno che per ora è solo un piano molto dettagliato scritto in un file Markdown.
Cosa può vedere oggi una webcam qualunque
Semplificando parecchio, il riconoscimento visivo basato su volti/mani/corpi si divide in due famiglie di problemi, spesso confuse tra loro ma concettualmente molto diverse. La prima è la geometria: dove sono, nello spazio, i punti che compongono una mano, un volto, uno scheletro — coordinate, distanze, angoli. La seconda è la semantica: cosa significa quella geometria — questa configurazione di muscoli facciali è un sorriso genuino o di circostanza, questo movimento del polso è uno smash o un lob. I due strumenti open source più maturi disponibili oggi coprono, non a caso, esattamente queste due famiglie.
MediaPipe
- 468 punti sul volto (Face Mesh), 21 per mano (Hands), 33 sullo scheletro (Pose)
- Modelli leggerissimi (BlazeFace/BlazePose), pensati per girare in tempo reale su CPU
- Gira nel browser via WebAssembly + WebGL — nessun server necessario
- Nessuna nozione di "emozione" o "intenzione": solo coordinate
py-feat
- Rileva Action Unit facciali (intensità per singolo muscolo) ed emozioni
- Wrappa più reti neurali pretrained (RetinaFace, modelli di regressione AU)
- Nato in ambito accademico (Dartmouth) per implementare la metodologia FACS
- Più pesante: pensato per girare su server, non nel browser
Fino a pochi anni fa, un pipeline decente di riconoscimento facciale richiedeva un server con GPU e un modello proprietario a pagamento. Oggi MediaPipe gira in un tab del browser sul telefono di chiunque, e py-feat automatizza un compito che fino agli anni 2000 richiedeva mesi di addestramento umano specializzato (lo vediamo più avanti, parlando di FACS). Il salto non è solo di prestazioni: è di accessibilità.
Il Theremin virtuale: suonare l'aria con una webcam
Il primo progetto che abbiamo costruito nella "palestra tecnologica" SOLVEI è un prototipo che trasforma il movimento delle mani davanti a una webcam in suono, ricreando digitalmente uno degli strumenti musicali più strani e affascinanti mai inventati — il theremin. Per capire perché è un caso di studio perfetto per parlare di riconoscimento gestuale, bisogna prima raccontare chi lo ha inventato: perché la storia del suo inventore è, quasi letteralmente, più incredibile del suo strumento.
Lev Termen, l'uomo che suonava il vuoto
Lev Sergeevič Termen — in Occidente conosciuto come Léon Theremin — nasce a San Pietroburgo nel 1896. Studia fisica e, in parallelo, violoncello: una combinazione che si rivelerà decisiva. All'inizio degli anni '20, mentre lavora su sensori di prossimità per misurare la densità dei gas, nota un effetto collaterale curioso: avvicinando la mano a un circuito oscillante ad alta frequenza, la frequenza stessa cambia in modo udibile. Invece di considerarlo un rumore di fondo, ci costruisce sopra uno strumento musicale.
Il principio è di una semplicità elegante: due antenne, una verticale che controlla l'altezza della nota e una a cappio orizzontale che ne controlla il volume, ciascuna collegata a un oscillatore radio. La mano dell'esecutore, avvicinandosi o allontanandosi, altera la capacità elettrica del circuito e quindi la frequenza generata; due oscillatori vicini producono, per eterodina, una frequenza differenza udibile. Il risultato è spesso definito lo strumento musicale elettronico più antico ancora suonato oggi, ed è certamente il primo pensato per essere suonato senza alcun contatto fisico — puro gesto nello spazio, catturato da un campo elettromagnetico invece che da un microfono o una tastiera.
Termen costruisce il primo theremin a Petrograd. Lo dimostra a Lenin in persona, che secondo la tradizione riesce a suonare "Il cigno" di Saint-Saëns al primo tentativo e lo abbraccia entusiasta.
Tournée europea, poi trasferimento a New York. Il brevetto viene concesso in licenza a RCA. Termen fonda una società, inventa il Terpsitone (un palco che genera musica dai passi di una ballerina) e, con il compositore Henry Cowell, il Rhythmicon — considerato uno dei primi drum machine della storia.
Sommerso dai debiti della Grande Depressione e sposato da poco con Lavinia Williams, ballerina afroamericana (un matrimonio già scandaloso per l'alta società newyorkese segregata dell'epoca), Termen scompare da un giorno all'altro. Viene richiamato — di fatto rimpatriato con la forza — in Unione Sovietica, senza che la moglie sappia più nulla di lui per decenni.
Condannato ai lavori forzati, viene poi trasferito in una sharashka — un laboratorio-prigione dell'NKVD — dove è costretto a mettere il suo talento al servizio dello spionaggio sovietico. Inventa "The Thing": un microfono passivo nascosto dentro una riproduzione lignea dello stemma USA, donata all'ambasciatore americano a Mosca nel 1945. Resterà lì, in ascolto, per sette anni prima di essere scoperto. Per questo lavoro riceve il Premio Stalin.
Riabilitato durante il disgelo chruščëviano, lavora al Conservatorio di Mosca costruendo nuovi strumenti elettronici — finché una campagna sovietica contro la musica "formalista" non pone fine anche a questo capitolo.
Riscoperto da giornalisti occidentali dopo decenni di oblio, riceve la visita a Mosca di Robert Moog — il padre del sintetizzatore moderno, che da giovane costruiva e vendeva theremin — e torna per un'ultima volta negli Stati Uniti, a 95 anni, per rivedere la sua allieva più celebre, Clara Rockmore.
Muore a Mosca, a 97 anni. La sua storia — fisico, musicista, spia, prigioniero, riabilitato — è raccontata nel documentario Theremin: An Electronic Odyssey (1993).
Il theremin, insomma, è probabilmente il primo esempio di riconoscimento gestuale della storia — analogico, fatto di antenne e capacità elettrica invece che di reti neurali, ma concettualmente identico a quello che facciamo oggi con una webcam: trasformare la posizione di una mano nello spazio in un parametro continuo, in tempo reale.
La versione digitale: MediaPipe al posto del campo elettromagnetico
Il nostro Theremin virtuale sostituisce le due antenne con MediaPipe Hands: la webcam cattura il flusso video, MediaPipe estrae 21 punti di riferimento per ciascuna mano rilevata (nocche, punte delle dita, palmo) a ogni fotogramma, e da quei punti calcoliamo le stesse due grandezze che Termen otteneva con la fisica pura — una distanza mano-camera che guida l'altezza della nota, una seconda distanza (tipicamente pollice-indice) che ne guida il volume. Il principio dello strumento non è cambiato in un secolo; è cambiato solo il modo in cui si cattura il gesto.
La prima versione dello strumento suonava con un ritardo percepibile e uno sfasamento fastidioso tra gesto e suono. La causa non era, come si sospettava all'inizio, la potenza di calcolo — era un accumulo di fotogrammi in attesa che cresceva silenziosamente, perché nulla rallentava l'acquisizione quando il resto del sistema non riusciva a stare al passo: ogni fotogramma nuovo veniva accodato anche se i precedenti non erano ancora stati processati, e il ritardo cresceva nel tempo invece di restare costante. La soluzione (un "frame gate" che scarta i fotogrammi in eccesso invece di accumularli) è un promemoria che spesso il collo di bottiglia in una pipeline video in tempo reale non è il modello — è la coda davanti al modello.
Versione attuale: da prototipo a strumento suonabile davvero
Dopo il primo test dal vivo, sono emersi i limiti tipici di ogni prototipo che funziona "in teoria": un range di poco più di sei ottave (troppo stretto per un pianoforte vero), un gesto di cambio forma d'onda che a volte scattava per sbaglio, e nessun riscontro visivo su quale nota si stesse effettivamente suonando. Ecco cosa è cambiato:
88 tasti veri, non più 80
Da 27,5 Hz (La0) a 4.186,01 Hz (Do8) — l'intera estensione di un pianoforte acustico, non più fermata a metà tra Mi7 e Do8. La mappatura resta logaritmica: passi uguali di movimento della mano coprono lo stesso numero di ottave, non gli stessi Hz.
Due pannelli, non più uno
Webcam e controlli separati in due colonne invece di un overlay semitrasparente sopra il video — spazio dedicato per la tastiera a 88 tasti e il nome della nota, leggibili anche in fullscreen.
Un pugno, letto per durata
Il tentativo iniziale di aggiungere un secondo gesto ("un dito esteso") per il toggle intonazione continua/discreta interferiva col pugno esistente — riaprire il pugno passa naturalmente per uno stato "un dito esteso". Sostituito con un solo gesto, distinto solo dalla durata della tenuta: pugno breve cicla la forma d'onda, pugno tenuto alterna intonazione continua/discreta.
Nome della nota e tastiera
In modalità discreta il suono si quantizza al semitono più vicino (12-TET) e il nome della nota compare in notazione italiana (Do, Do#, Re…); la tastiera a 88 tasti nel pannello evidenzia in tempo reale il tasto corrispondente.
Pinch per "congelare" la nota
Un nuovo gesto sulla mano destra (pollice-indice, con isteresi a due soglie per non sfarfallare): tenendo il pinch chiuso il suono resta fisso mentre slider e tastiera continuano ad aggiornarsi in anteprima, così si può riposizionare la mano silenziosamente prima di "rilasciare" la nuova nota.
Niente più arretrato di fotogrammi
Il ritardo percepito e il tracking che "continuava da solo" (mani già uscite dal frame, ma il backend ancora impegnato a elaborare fotogrammi vecchi) non era un problema di potenza di calcolo ma di un meccanismo mancante che rallentasse l'invio quando il sistema non riusciva a stare al passo — un frame gate ora garantisce al massimo un fotogramma in volo per volta, come già raccontato più sopra.
EmoLens: leggere un volto come un testo
Se il Theremin virtuale è un esercizio di geometria — conta la posizione della mano nello spazio, non il significato del gesto — EmoLens, il nostro agente di analisi facciale, si muove interamente nel territorio della semantica: non si limita a tracciare un volto, ma cerca di capire cosa quel volto sta comunicando. Per farlo si appoggia a una metodologia che non nasce nell'informatica, ma nella psicologia sperimentale di mezzo secolo fa.
FACS: cinquant'anni prima delle reti neurali
Negli anni '60, lo psicologo americano Paul Ekman, insieme a Wallace Friesen, affronta una domanda che sembra semplice e non lo è affatto: come si misura oggettivamente un'espressione facciale, senza che l'osservatore ci proietti sopra la propria interpretazione culturale? Partendo dal lavoro dell'anatomista svedese Carl-Herman Hjortsjö, che negli anni '60 aveva già catalogato i muscoli responsabili delle espressioni facciali, Ekman e Friesen costruiscono nel 1978 il Facial Action Coding System (FACS): una tassonomia anatomica di circa quaranta Action Unit (AU), ciascuna corrispondente al movimento di un muscolo o gruppo muscolare preciso del viso, del tutto indipendente da qualunque etichetta emotiva.
Una AU non è "un sorriso" o "una smorfia di disgusto" — è un movimento muscolare atomico: AU6 è il sollevamento della guancia, AU12 è la trazione dell'angolo della bocca verso l'alto, AU9 è la rugosità del naso. Le emozioni riconoscibili emergono solo dalla combinazione di più AU. Un sorriso genuino ("di Duchenne") è AU6+AU12 insieme; un sorriso di circostanza è AU12 da solo, senza il coinvolgimento dei muscoli oculari — la differenza tra i due, impercettibile a uno sguardo distratto, diventa misurabile e ripetibile.
Il motivo per cui vale la pena misurarle con questa precisione è che le espressioni non sono un sottoprodotto passivo dell'emozione — fanno un lavoro comunicativo attivo: segnalano agli altri come ci sentiamo prima ancora che troviamo le parole, anticipano un'intenzione (uno sguardo di rabbia può precedere uno scontro), e regolano in tempo reale l'interazione — un sorriso invita, una fronte corrugata mette in guardia. E diverse emozioni si concentrano in zone diverse del viso: rabbia e paura si leggono soprattutto negli occhi e nelle sopracciglia (contratte e ravvicinate nella prima, sollevate e spalancate nella seconda), felicità e disgusto soprattutto in bocca e labbra, mentre le guance — sollevate solo nel sorriso genuino di Duchenne — sono il dettaglio che più spesso separa un'emozione vera da una recitata.
Ekman non si ferma alla tassonomia: negli stessi anni conduce studi sul campo con la tribù Fore della Papua Nuova Guinea, isolata da ogni contatto con i media occidentali, mostrando fotografie di espressioni facciali e chiedendo di associarle a situazioni emotive. I risultati sostengono l'ipotesi — controversa allora, tuttora dibattuta — che un piccolo nucleo di emozioni di base si esprima con configurazioni facciali universali, le stesse in ogni cultura: felicità, tristezza, rabbia, paura, sorpresa, disgusto, e — proposta più tardi da Ekman stesso e tuttora dibattuta in letteratura — il disprezzo, settima espressione candidata all'elenco.
Gli studi cross-culturali restano esposti a un'obiezione ovvia: anche le comunità più isolate hanno, oggi, un minimo di contatto visivo con il resto del mondo. Una prova più netta viene da chi il volto altrui non lo ha mai potuto vedere in vita sua. Nel 2009 lo psicologo David Matsumoto — allievo diretto di Ekman — ha confrontato le espressioni spontanee di atleti di judo vedenti e non vedenti dalla nascita alle Olimpiadi e Paralimpiadi di Atene 2004, nell'istante esatto della vittoria o della sconfitta di un incontro. Le configurazioni muscolari coincidevano — stessa contrazione delle sopracciglia nella sconfitta, stesso sollevamento degli angoli della bocca nella vittoria — prodotte da persone che non avevano mai potuto imparare quei movimenti guardando il volto di qualcun altro. Se un'espressione fosse un comportamento imitato, chi nasce cieco semplicemente non potrebbe riprodurla; il fatto che la riproduca è l'argomento più solido a favore di un'origine biologica, cablata, non (solo) sociale.
Il volto perde il controllo prima del resto del corpo: un'emozione vera, anche quando la si vuole nascondere, lascia una traccia muscolare — spesso per una frazione di secondo — prima che l'espressione "corretta" prenda il sopravvento. Ekman e Friesen documentano questo fenomeno studiando filmati di interviste cliniche, chiamandolo microespressione: un lampo involontario, sotto mezzo secondo, che rivela ciò che l'espressione dominante sta mascherando.
Per decenni, codificare un video con FACS è stato un lavoro artigianale: diventare FACS coder certificato richiede circa cento ore di addestramento e un esame di affidabilità — un investimento enorme per analizzare pochi minuti di filmato. È esattamente questo collo di bottiglia che gli strumenti open source moderni hanno eliminato.
Da FACS a EmoLens: cosa abbiamo effettivamente costruito
EmoLens si appoggia a py-feat (Python Facial Expression Analysis Toolbox), un progetto open source nato in ambito accademico che automatizza esattamente il lavoro di un FACS coder umano: rileva il volto (usiamo RetinaFace), individua i landmark facciali, e con reti neurali dedicate stima l'intensità di ciascuna Action Unit e la probabilità di ognuna delle emozioni di base. Deliberatamente non attiviamo i modelli di identità e sguardo che py-feat offre — non sono mai letti dall'interfaccia, e disattivarli riduce sensibilmente il tempo di analisi.
L'agente gira in tre modalità: immagine singola (analisi sincrona), webcam live (via WebSocket, con overlay disegnato in tempo reale nel frontend) e video caricato o da YouTube (job asincrono). Un secondo servizio, agent-emolens-gpu, dedicato e su GPU, spinge oltre il perimetro classico di FACS affrontando esattamente il fenomeno che Ekman aveva documentato negli anni '60: lo spotting delle microespressioni, cioè l'individuazione automatica delle tre fasi di un'espressione fugace — onset (l'inizio del movimento), apex (il picco) e offset (la dissoluzione) — per ciascuna Action Unit, su sequenze video ad alto frame-rate.
Due trasparenze che vale la pena mettere per iscritto. Primo: py-feat non riconosce il disprezzo, la settima emozione che parte della letteratura successiva a Ekman ha proposto di aggiungere alle sei originarie — è un limite fisso della libreria, non nostro. Secondo: l'euristica di spotting delle microespressioni non è ancora tarata su un dataset reale annotato da FACS coder umani — funziona, gira in produzione con fallback automatico GPU→CPU senza perdere un fotogramma, ma la sua accuratezza quantitativa resta da validare.
Analizzare volti tocca inevitabilmente dati sensibili. Ecco cosa è effettivamente in codice, non un elenco di intenzioni:
- Nessuna persistenza. Immagini, frame webcam e video caricati vengono elaborati solo in memoria o in file temporanei e cancellati immediatamente dopo l'uso. Non esistono dati memorizzati nel DBMS (Postgres) e nell'Object Store (MinIO) LOCALI utilizzati a livello infrastrutturale da SOLVEIAGENTS, azzerando il rischio di esfiltrazione dei dati.
- Nessuna identificazione biometrica. I modelli di riconoscimento
dell'identità e dello sguardo (
identity_model,gaze_model) sono disattivati esplicitamente in configurazione. EmoLens riconosce Action Unit ed espressioni — come si muove un volto — non chi è quel volto. - Inferenza interamente self-hosted. Nessuna chiamata a servizi cloud terzi (OpenAI, Google Vision o simili): l'analisi gira su infrastruttura propria, CPU o GPU A10 aziendale, mai su un'API esterna a cui inviare un volto.
- La stima della postura gira nel browser. Il modulo PoseOverlay usa MediaPipe self-hosted via WASM, interamente client-side: per quella funzione nessun dato lascia mai il dispositivo dell'utente.
- Accesso solo autenticato. Ogni endpoint, HTTP e WebSocket, richiede login — doppio controllo, a livello applicativo e di reverse proxy.
- Escluso dal backup giornaliero, di proposito. Non una svista: se non si conserva nulla, non c'è nulla da salvare né da poter riesumare in seguito.
Sul piano normativo, due punti concreti. L'AI Act (art. 5) vieta il riconoscimento delle emozioni sul posto di lavoro e nelle istituzioni educative, salvo ristrette eccezioni mediche o di sicurezza — un limite d'uso, non di tecnologia: EmoLens non è pensato per quei contesti. Il GDPR (art. 9) tratta come dato biometrico "particolare" solo i dati trattati allo scopo di identificare univocamente una persona — disattivare identity/gaze non è quindi solo una scelta di performance, tiene il trattamento fuori da quella soglia più stringente.
CourtIntelligence: dal volto al campo da gioco
Il terzo capitolo di questa storia esiste solo su carta — un documento di progettazione, non una riga di codice funzionante. Vale comunque la pena raccontarlo, perché mostra bene dove porta naturalmente questa stessa cassetta degli attrezzi una volta puntata non su un volto ma su un campo da gioco: CourtIntelligence, un agente pensato per estrarre statistiche da un video (offline, upload o URL) di una partita di beach tennis o padel — metri percorsi, velocità di giocatori e palla, conteggio dei colpi per tipo.
Il piano, nella sua versione più recente, combina strumenti che abbiamo già incontrato in questo articolo con altri specifici del dominio sportivo: YOLOv8 + ByteTrack per il tracciamento multi-giocatore, un modello pretrained per la pallina (il bersaglio più difficile — piccola e velocissima), una proiezione omografica per convertire pixel in metri reali, un filtro di Kalman causale per smussare le traiettorie, e — qui torna in scena MediaPipe — la stima della posa, ma solo nella finestra temporale ristretta attorno a un contatto rilevato, per classificare il colpo (dritto, rovescio, smash, lob, drop shot, volée, servizio) con regole semplici, non con un modello addestrato ad hoc.
Una scelta di design interessante del piano è che l'overlay — riquadri sui giocatori, traiettoria della palla, statistiche istantanee — è pensato come dato strutturato disegnato su un canvas trasparente, non "bruciato" nel video: lo stesso componente funziona identico sia durante l'analisi live (dati che arrivano via WebSocket mentre il calcolo procede) sia nella dashboard finale di replay. Anche il calcolo pesante è pensato per girare on-demand su una VM GPU dedicata, che si accende all'avvio dell'analisi e si spegne da sola dopo un periodo di inattività — lo stesso pattern già collaudato per la GPU condivisa dell'orchestratore.
CourtIntelligence non è mai passato dalla fase di progettazione: nessun container, nessuna riga di pipeline, nessuna migrazione database. Il piano esiste come documento di design dettagliato — nome dell'agente, schema del database, rischi tecnici noti (il modello di detection della pallina non è ancora scelto, la classificazione dei colpi non è tarata su footage reale) — pronto per essere ripreso, non per essere dato per fatto.