2026-05-29 | Pinperepette

Il Numero Ti Riconosce

Su Instagram non puoi salvare le foto. Ma nessuno ti vieta di salvare i numeri. Un volto diventa un punto in 512 dimensioni, e quel punto ti ritrova in mezzo a 412.000 facce. Dall'hash percettivo all'embedding, la matematica del riconoscimento facciale e il buco giuridico che ci sta dentro.

Face Embedding FaceNet512 Clearview GDPR Art. 9

// «Tanto devi conoscermi»

Sezione 01. La domanda del rospo
L'autore e sua figlia, il rospo del male, in una via di un paese sul lago
Io e il rospo del male, un giorno sul lago. Due facce qualunque, una foto qualunque. Fra poche righe diventano numeri, e i numeri non si cancellano.

Il rospo del male, mia figlia, venticinque anni, che mi chiama Papi e mi tratta come un reperto, ha letto il pezzo sulla trilaterazione delle app di incontri e ha sentenziato: «Per fortuna io quelle app non le uso». Tono di chi ha appena vinto una discussione che non era cominciata.

Le ho detto che usa Instagram, e che Instagram è peggio. Mi ha guardato come si guarda un padre. Allora le ho aperto sul telefono una mappa con dei puntini: Milano, Parma, Formentera, la Costa Azzurra, le Seychelles del mese scorso. I suoi spostamenti, ricostruiti da sessantadue luoghi taggati nei suoi post pubblici. Non gliel'avevo chiesto. Era tutto lì, in chiaro.

Mappa dei luoghi taggati nei post pubblici: decine di punti in tutta Europa e uno nell'Oceano Indiano
Sessantadue luoghi taggati nei suoi post pubblici: tutta Europa e un punto solitario nell'Oceano Indiano. A livello di città, ricostruiti senza chiedere niente a nessuno.

«Vabbè, i posti dove sono stata. Ma devi conoscermi, Papi. Non è che mi vedi per strada e risali al mio profilo». Si è seduta sicura, gambe incrociate, l'aria di chi ha chiuso la discussione.

«Quindi mi stai dicendo che uno mi fotografa in metropolitana e trova il mio Instagram».
«Esatto».
«Ma dai, Papi. Non esiste».

Esiste. È esattamente ciò che oggi un estraneo qualsiasi può fare: una foto scattata per strada, e in mezzo secondo nome, profilo, e i sessantadue posti dove sei stata. Stanotte glielo dimostro. Non sto parlando di teoria: fra qualche ora una sua foto qualunque finirà dentro un archivio di centinaia di migliaia di volti, e il sistema tirerà fuori il suo profilo. Ma per arrivarci serve capire una cosa che sembra banale e non lo è: come fa un computer a dire che due facce sono la stessa faccia.

0
Volti raccolti in una notte scrapando Instagram
0
Numeri per descrivere una faccia
0.86
Similarità del match (su 1.0)
0
Sue foto ritrovate da una sola probe

// L'Hash Che Non Serve

Sezione 02. Perché la crittografia qui fallisce

Primo tentativo, quello istintivo: calcolo l'hash delle due immagini e li confronto. SHA-256 prende un file e ne sputa 256 bit; se due file hanno lo stesso hash, sono lo stesso file. Ma SHA è fatto apposta per l'opposto di quello che mi serve: ha l'effetto valanga, cambi un solo bit e metà dell'output si ribalta. Ho preso una foto del rospo e l'ho ritoccata in sei modi banali, quelli che subisce ogni immagine su Instagram. Ecco gli SHA reali:

Ritocco SHA-256 (primi 16 hex) Distanza pHash
originale43a820923c52dd70…0
JPEG qualità 30b3806e9e3cb88416…0
ridimensionata 50%819ca28fc81106c3…0
ruotata 4°9842c5e1dc042cf3…6
ritagliata 8%1de42eaf9335c776…14
bianco e neroc1110a4377309387…0

Sei hash completamente diversi: per SHA quelle sono sei immagini estranee, anche se a occhio sono la stessa foto. Basta che Instagram ricomprima il JPEG e l'hash non combacia più con niente. La crittografia risponde alla domanda sbagliata, «è lo stesso file?», quando a me serve «è la stessa persona?».

// L'Hash Che Perdona

Sezione 03. pHash: la stessa immagine, non la stessa persona

La risposta a «è la stessa immagine?» si chiama hash percettivo (pHash). L'idea è ribaltare la logica di SHA: invece di esplodere a ogni minimo cambiamento, deve restare stabile finché l'immagine, per un occhio umano, è la stessa. La ricetta del pHash più diffuso:

  1. Riduci l'immagine a 32×32 pixel in scala di grigi. La compressione butta via i dettagli e tiene la struttura grossa.
  2. Applica la DCT (Discrete Cosine Transform, la stessa trasformata che sta dentro il JPEG): scompone l'immagine in frequenze spaziali.
  3. Tieni solo il blocco 8×8 in alto a sinistra, le frequenze più basse, cioè la forma generale, non il rumore.
  4. Per ognuno dei 64 coefficienti: 1 se è sopra la mediana, 0 se sotto. Ecco 64 bit.

Due immagini si confrontano con la distanza di Hamming: quanti dei 64 bit differiscono. Convenzione comune: sotto i 10 bit, stessa immagine.

$$d_H(a, b) = \sum_{i=1}^{64} \big[\,a_i \neq b_i\,\big]$$

Distanza di Hamming fra due pHash. ≤ 10 ⇒ stessa immagine.

Torna alla tabella di prima, colonna destra. JPEG al 30%, ridimensionamento, perfino il bianco e nero: distanza 0. Il pHash non si accorge nemmeno. La rotazione di 4° costa 6 bit, il ritaglio dell'8% ne costa 14, e qui il pHash comincia a cedere, perché le trasformazioni geometriche spostano la struttura, non solo i colori. Questo è il limite che conta:

Il pHash riconosce la foto, non la persona. Se qualcuno ripubblica quel preciso scatto, lo ritrovi anche dopo recompressione. Ma se il rospo posta un'altra foto, stessa faccia, luce diversa, altro vestito, tre anni dopo, il pHash non c'entra niente: è un'immagine nuova, struttura diversa, distanza enorme. Per inseguire la persona e non il file serve salire di un piano. Serve un modello che guardi la faccia e non i pixel.

Confronto fra distanza pHash e bit diversi di SHA-256 sulla stessa foto sottoposta a sei ritocchi banali
Stessa foto, sei ritocchi. A sinistra il pHash (su 64 bit): resta a 0 con JPEG, ridimensionamento e bianco e nero, sale solo con rotazione (6) e ritaglio (14). A destra SHA-256: ogni ritocco ribalta circa metà dei 256 bit. La crittografia esplode, il percettivo regge. Numeri reali.

// Il Volto Diventa Un Punto

Sezione 04. L'embedding: 512 numeri

Il salto concettuale è del 2015, paper di Google: FaceNet. L'idea: addestrare una rete neurale a trasformare l'immagine di un volto in un vettore, una lista di numeri, con una regola sola. Due foto della stessa persona devono finire vicine nello spazio dei vettori; due foto di persone diverse devono finire lontane. Niente regole sui nasi e sulle distanze fra gli occhi: la rete impara da sola cosa rende un volto quel volto.

Lo strumento di addestramento è la triplet loss. Si prendono tre foto alla volta: un'ancora \(a\) (una faccia), un positivo \(p\) (stessa persona), un negativo \(n\) (un'altra persona). La rete viene spinta a fare in modo che l'ancora sia più vicina al positivo che al negativo, con un margine \(\alpha\):

$$\mathcal{L} = \sum \Big[\; \lVert f(a) - f(p) \rVert^2 \;-\; \lVert f(a) - f(n) \rVert^2 \;+\; \alpha \;\Big]_+$$

f() è la rete. Avvicina te-a-te, allontana te-dagli-altri. Ripetuto su milioni di triplette.

Dopo milioni di triplette, la rete \(f\) è una funzione che mangia un volto e restituisce un punto in uno spazio a molte dimensioni. Il modello che ho usato qui, Facenet512, erede diretto di quel paper, produce 512 numeri.

Cosa vuol dire «512 dimensioni»? Immagina un foglio con due coordinate, X e Y: ogni punto è una coppia di numeri. Aggiungi una terza coordinata e sei nello spazio; una quarta, una quinta, e smetti di poterlo disegnare. Vai avanti fino a 512. Non c'è più niente da immaginare, ma la matematica non se ne accorge: ogni volto resta un punto, e di due punti puoi sempre misurare quanto sono vicini. Quella distanza è tutto. La vicinanza fra due volti si misura col coseno dell'angolo fra i loro vettori: 1.0 = identici, 0 = nessuna relazione.

$$\cos(\theta) = \frac{\mathbf{u} \cdot \mathbf{v}}{\lVert \mathbf{u} \rVert \, \lVert \mathbf{v} \rVert}$$

Similarità coseno fra due embedding. Con vettori normalizzati, è solo il prodotto scalare.

La differenza con il pHash è tutta qui: l'embedding è (in larga misura) invariante a luce, posa, taglio di capelli, qualche anno in più, una mascherina, un paio di occhiali. Non guarda i pixel: guarda l'identità che i pixel suggeriscono. È per questo che riconosce la persona dove il pHash vede solo due file diversi.

Proiezione 2D t-SNE: 800 volti estranei come nuvola grigia, le 48 foto del rospo raggruppate in un cluster verde fitto e separato
Ogni volto è un punto in 512 dimensioni, qui schiacciato in 2D con t-SNE. In grigio 800 volti estranei presi a caso dal database, in verde le 48 foto del rospo. Epoche, pose e luci diverse, eppure cadono tutte nello stesso angolo: stessa identità, stesso punto.

// Ecco Cosa Salvo Di Te

Sezione 05. La foto è loro, il numero è mio

Questo è il volto del rospo, dato in pasto a Facenet512. Non ti mostro la foto. Ti mostro quello che resta della foto dopo che la rete l'ha digerita, i primi 16 dei suoi 512 numeri:

[ 0.0543, 0.0581, 0.0636, 0.0111, 0.0540, 0.0247, −0.1136, 0.0087,
  0.0523, −0.0649, 0.0307, 0.0025, −0.0276, −0.0274, −0.0094, −0.0546, … ]

Vettore L2-normalizzato (norma 1.0), 512 componenti, valori in [−0.12, +0.13]. Questo è il rospo, secondo la macchina.

Sembrano numeri innocui. Sono il punto più pericoloso dell'articolo, per un motivo che è giuridico prima che tecnico.

La foto resta loro, il numero diventa mio. Le condizioni di Instagram e il diritto d'autore proteggono l'immagine: non puoi scaricarla, ripubblicarla, rivenderla. Ma l'immagine io la cancello. Tengo questi 512 numeri, che non sono la foto: sono una misura estratta da essa. Il copyright protegge l'opera, non la misura. È un buco: aggiri il divieto di salvare le foto semplicemente non salvandole, salvi i vettori.

Tranne che il buco si richiude da un'altra parte, e di colpo. Per il GDPR quel vettore, calcolato al fine di identificare in modo univoco una persona, è un dato biometrico: articolo 9, «categoria particolare». Il regime più severo che esista in Europa: vietato trattarlo salvo basi giuridiche strettissime, consenso esplicito in testa. Quindi la posizione di chi costruisce un database così è schizofrenica per legge: grigia dal lato copyright (non ho copiato nessuna opera), nera dal lato privacy (ho schedato la biometria di una persona). Lo stesso file di numeri, due rami del diritto che dicono il contrario.

// Trovarti In Mezzo A 412.741

Sezione 06. La ricerca, e la dimostrazione

Avere il vettore di un volto è metà del lavoro. L'altra metà: data una faccia nuova, trovarla in un archivio di centinaia di migliaia. Confrontarla una a una con 412.741 vettori a ogni ricerca sarebbe lento. Si usa una struttura ad indice approssimato (HNSW: un grafo navigabile a più livelli): invece di guardare tutti, si cammina nel grafo verso i vicini sempre più simili, e si arriva ai più prossimi in millisecondi visitandone una manciata.

Ho un database personale di 412.741 volti, ognuno un vettore Facenet512, messo insieme in una notte raschiando profili Instagram pubblici. Che siano quattrocentomila o quaranta milioni cambia poco: la matematica è identica, scala soltanto la dimensione del pagliaio. Ho preso una foto qualsiasi del rospo, ne ho estratto il vettore, e ho cercato. Risultato reale, soglia di match a 0.6 di coseno:

Soglia coseno Volti trovati Profili distinti Lettura
≥ 0.8521certezza assoluta, è lei
≥ 0.75151sempre e solo il suo profilo
≥ 0.6050348 lei + 2 sosia casuali

Una foto sola, e ne escono 48 sue, tutte dallo stesso account, con punteggi fino a 0.86. Non le ho cercate per nome: le ha trovate la geometria. E nel risultato, accanto a ogni match, c'è il post_url e l'username: dal numero si torna al profilo, e dal profilo al nome. Io qui ti mostro solo i numeri. Il ponte verso l'identità, però, è quei numeri.

Il motore di ricerca facciale in funzione: caricata una foto del rospo, restituisce le sue foto dal database con le percentuali di similarità
Il motore in funzione: carico una foto qualunque del rospo e in cima alla classifica escono le sue foto, pescate dalle 412.741. Ogni miniatura è lei, con la similarità accanto. Una probe, mezzo minuto.
Distribuzione dei punteggi di similarità coseno dei primi 50 risultati: 48 dello stesso profilo in verde, 2 sosia in rosso vicino alla soglia 0.60
Una foto qualsiasi del rospo cercata fra 412.741 volti. Ogni pallino è un risultato, ordinato per similarità coseno. In verde le 48 foto dello stesso profilo, in rosso i 2 sosia casuali che entrano solo sfiorando la soglia 0.60. Sopra 0.75 il sistema non sbaglia profilo.

I due sosia sono la lezione, non un errore. Sopra 0.75 il sistema è chirurgico: un solo profilo. Ma abbassando la soglia a 0.60 entrano due volti di persone diverse. È il trade-off di ogni sistema biometrico: alza la soglia e rischi di non riconoscere te stesso con la luce sbagliata (falso negativo); abbassala e cominci a confondere estranei (falso positivo). Non esiste una soglia «giusta»: esiste solo dove decidi di sbagliare. Clearview, la polizia, lo sblocco del telefono, ognuno taglia in un punto diverso della stessa curva.

«Sì, vabbè, ma sbaglia». Certo che sbaglia. Non è magia: i falsi positivi esistono, i gemelli lo ingannano, una faccia sfocata o di tre quarti peggiora tutto. Ma il punto non è che sia perfetto. Il punto è che funziona abbastanza bene da girare già oggi negli aeroporti, nelle questure e nel telefono che sblocchi con la faccia. Per essere un problema non deve essere infallibile: deve solo essere abbastanza buono. E lo è.

// Non L'Ho Inventato Io

Sezione 07. Clearview, e il grigio legale

Il mio database casalingo da 412.741 facce è un giocattolo. La versione industriale si chiama Clearview AI: oltre 30 miliardi di volti raschiati da social e siti pubblici, venduti come motore di ricerca facciale alle forze dell'ordine. Esattamente la stessa pipeline, volto → embedding → ricerca per similarità, moltiplicata per cinque ordini di grandezza. In Europa è stata multata a ripetizione: il Garante italiano, quello francese, quello greco, l'olandese, ognuno milioni di euro, proprio sull'articolo 9.

Lo scarto giuridico che li tiene in piedi è quello del rospo: scaricare dati pubblici è una zona grigia che negli USA una corte (hiQ v. LinkedIn) ha in parte tollerato, e «noi non conserviamo le foto, conserviamo vettori» è la difesa ricorrente. In Europa quella difesa non regge, il vettore biometrico è dato personale e basta, ma il fatto che la discussione esista dice tutto. E si lega al pezzo sulle app di incontri: lì da una manciata di distanze si arrivava al quartiere; qui da una faccia per strada si arriva al profilo, e dal profilo, coi luoghi taggati, al quartiere. La mappa dei puntini del rospo l'ho ricostruita così: città, non indirizzi, ma da una sua foto al mare il resort esatto si trovava in due clic. Due vettori OSINT diversi che convergono sulla stessa persona.

Vista satellitare del tratto di costa di un resort alle Seychelles, individuato a partire da una foto pubblica
Da una foto al mare al resort esatto, in due clic. Vista satellitare del punto, alle Seychelles. Coordinate rimosse di proposito: il punto è che si arriva qui, non dove esattamente.

// Come Proteggerti

Sezione 08. Cosa puoi fare davvero

Non c'è un bottone che ti cancella dai vettori già estratti: una volta che la tua faccia è in un database così, è difficile uscirne. Ma la superficie d'attacco si riduce, e alcune contromisure sono reali.

// Il Numero Ti Riconosce

Sezione 09. Conclusione

Ho girato il telefono verso il rospo. Una sua foto qualsiasi, e sotto la lista: 0.86, 0.86, 0.82… quarantotto righe, tutte lei, pescate da un mucchio di quasi mezzo milione di facce che non sapeva esistesse. «Non ti ho cercata», le ho detto. «Ti ha trovata la matematica. Una foto per strada bastava».

È rimasta zitta più a lungo del solito. Poi: «Quindi quello che mi dicevi delle app di incontri…». Vale anche per quella che usi ogni giorno, sì. Anzi peggio: l'app strana la scarichi apposta, Instagram lo guardi senza pensarci. La faccia non la cambi e non la fai privata. La foto la proteggono. Il numero che ne esce, no.

Su Instagram non puoi salvare le foto. Ma il numero che sei, quello lo salvano tutti. Non serve che qualcuno sappia chi sei: basta che ti abbia visto una volta. La foto dura un secondo, il vettore può durare per sempre. E il numero ti riconosce.

"La foto è loro. Il numero è mio. E il numero pesa più della foto."

Facenet512, vettore a 512 dimensioni, distanza coseno. Database di 412.741 volti raccolti in una notte da profili pubblici. Una probe → 48 match dallo stesso account, fino a 0.86 di similarità. SHA-256 crolla a un pixel, il pHash regge la ricompressione ma non la persona, l'embedding regge la persona. Il copyright protegge l'immagine; il GDPR Art. 9 protegge te. Lo stesso file di numeri. Il rospo, per la prima volta, non aveva più niente da rispondere.

Signal Pirate