Le cinque pipeline dello strumento, i lavori scientifici su cui poggia, e il collegamento con la fenotipizzazione del DNA.
I software classici compongono il volto scegliendo occhi, naso e bocca da archivi di ritagli. Ogni pezzo viene da una faccia diversa, con illuminazione e proporzioni proprie: il risultato è un collage che raramente somiglia a una persona reale.
Il riconoscimento facciale umano è olistico: valutiamo il volto come configurazione d'insieme, non come somma di parti. Un composito costruito per parti lavora contro il modo in cui la memoria del testimone funziona davvero.
Un modello generativo produce fin dal primo passo un volto internamente coerente — una sola illuminazione, una sola geometria — che l'operatore poi corregge per raffinamenti successivi.
Coerenza e realismo non sono accuratezza. Un volto fotorealistico può comunicare una sicurezza che la descrizione del testimone non ha. È il rischio che attraversa tutta la presentazione.
Un modello di diffusione impara a fare una cosa sola: data un'immagine un po' rumorosa, prevedere il rumore da togliere. Ripetendo l'operazione decine di volte a partire da rumore puro, emerge un'immagine.
Quando nelle slide si legge «il modello», in realtà sono tre reti che lavorano insieme.
Comprime l'immagine da 512×512×3 valori a una griglia latente circa 48 volte più piccola, e sa ricostruirla. Tutta la diffusione avviene in questo spazio ridotto: è ciò che rende la generazione ad alta risoluzione praticabile su una GPU sola.
È anche il pezzo che su schede Turing va forzato in float32 — vedi la slide sui vincoli hardware.
La rete che a ogni passo guarda il latente rumoroso e stima il rumore presente. Ha forma a «U»: prima riduce la risoluzione per cogliere la struttura d'insieme, poi la risale per recuperare il dettaglio, con collegamenti diretti fra i due rami.
Un encoder di testo trasforma il prompt in una sequenza di vettori. La U-Net li consulta a ogni passo tramite cross-attention: un meccanismo che per ogni zona dell'immagine pesa quali parole del prompt sono rilevanti. È così che «barba» agisce sul mento e non sulla fronte.
Il selettore Locale / OpenRouter nell'intestazione commuta l'intero flusso: stessi tab, stessi gesti, motore diverso. L'operatore non deve imparare due strumenti.
Sono due contenitori distinti che non si parlano. Chi lavora su materiale riservato può non avviare affatto il servizio remoto: l'invio a terzi diventa impossibile per costruzione, non per disciplina.
Il volto nasce dagli attributi riferiti dal testimone.
Variazioni dell'intero volto, mantenendo l'identità.
Modifica di una sola zona; il resto resta invariato.
Spostamento dei tratti lungo frecce, per correzioni di forma.
Il volto parte da un profilo genetico anziché da un racconto.
Otto attributi strutturati — etnia, sesso, lunghezza, colore e stile dei capelli, colore degli occhi, occhiali, barba — più una descrizione libera. Il backend li compone in un prompt e produce n varianti in una sola passata.
Misurato su GTX 1660 Ti 6 GB, profilo lite, SD 1.5 Dreamshaper: circa 15 secondi per volto.
Prompt prodotto dal backend per gli attributi uomo · capelli corti castano scuro · occhi marroni · barba:
Posa frontale, entrambe le orecchie visibili, sfondo bianco uniforme. Serve a rendere i volti confrontabili tra loro, come una foto segnaletica: senza questo vincolo il modello varierebbe inquadratura e illuminazione a ogni generazione.
Un secondo prompt elenca ciò che non deve comparire — pose di tre quarti, sguardo altrove, sfondi colorati, rese illustrative o da rendering. Il modello lo usa come polo negativo del calcolo di guidance.
Lo scheduler decide la traiettoria: quanto rumore togliere a ogni passo. «Karras» indica una distribuzione dei livelli di rumore che concentra gli step dove incidono di più.
| Scheduler | Comportamento |
|---|---|
| DPM single-step default | Miglior compromesso qualità/velocità: risultati nitidi e stabili già in pochi step. |
| DPM single-step + Karras | Stessa base con transizioni di rumore più morbide: spesso dettagli migliori a parità di step. |
| DPM multi-step | Riusa le stime dei passi precedenti per convergere meglio. Rende al massimo alzando il numero di step. |
| DPM multi-step + Karras | Bilancia il rumore lungo l'intera traiettoria: rese più uniformi. |
| Euler | Il metodo classico di integrazione. Semplice e prevedibile: utile quando serve riproducibilità. |
| DPM-SDE | Variante stocastica: reinietta rumore a ogni passo. Più varietà e texture, ma meno deterministico. |
| DPM-SDE + Karras | La variante stocastica con transizioni morbide: buon dettaglio soprattutto sulla pelle. |
| TCD | Pensato per 4–8 step. Molto rapido con i modelli Lightning; richiede di abbassare gli step. |
«Denoising» suggerisce che a ogni passo si sottragga un po' di disturbo da un'immagine. Non è così: si sta risolvendo numericamente un'equazione, e capirlo spiega tutto il resto.
Se generare è integrare un'equazione, gli scheduler sono metodi di integrazione numerica: si distinguono per le stesse quattro scelte che distinguono un solutore da un altro.
Quanta informazione si usa per stimare la curvatura. Il 1° ordine segue la tangente e sbaglia nelle curve, il 2° la corregge: meno errore per passo, quindi meno passi.
Due modi di ottenere il 2° ordine. Single-step: valutazioni in più dentro il passo, costoso ma autonomo. Multi-step: riusa le stime dei passi precedenti, gratis ma serve una rincorsa.
L'ODE segue la curva e basta. La variante SDE reinietta rumore fresco a ogni passo: corregge gli errori accumulati e aggiunge grana, ma il risultato dipende da quel caso in più.
Dove cadono i gradini lungo la discesa. Uniforme spreca passi dove non cambia nulla; Karras li addensa a σ basso, dove si decide il dettaglio.
| Scheduler | Ordine | Struttura | Traiettoria | σ | Dove conviene |
|---|---|---|---|---|---|
| DPM single-step | 2° | single-step | deterministica | uniforme | Pochi passi (15–25). Il default |
| DPM single-step + Karras | 2° | single-step | deterministica | Karras | Come sopra, dettaglio un filo migliore |
| DPM multi-step | 2° | multi-step | deterministica | uniforme | Da 25 passi in su, quando la rincorsa si ammortizza |
| DPM multi-step + Karras | 2° | multi-step | deterministica | Karras | Molti passi, rese uniformi |
| Euler | 1° | — | deterministica | uniforme | Riferimento prevedibile; serve più passi |
| DPM-SDE | 2° | single-step | stocastica | uniforme | Più varietà e texture, meno ripetibile |
| DPM-SDE + Karras | 2° | single-step | stocastica | Karras | Grana della pelle, volti meno «lisci» |
| TCD | non integra: il modello è distillato per saltare | 4–8 passi, solo con modelli Lightning | |||
Per l'uso forense: solo le traiettorie deterministiche garantiscono che stesso seed e stessi parametri riproducano il file identico. Con le SDE il seed fissa la partenza, non il rumore reiniettato lungo la strada.
Quando il testimone dice «ci somiglia, ma non è ancora lui», serve esplorare attorno al volto ottenuto. La img2img aggiunge rumore all'immagine esistente e la rigenera parzialmente: il parametro strength decide quanto rumore, e quindi quanto allontanarsi.
Prompt di modifica: "same man, slightly older, tired expression" · 3 varianti in 26,2 s sulla 1660 Ti. Fascia utile per conservare l'identità: 0,4–0,6. Sopra 0,7 il soggetto tende a diventare un'altra persona.
Un modello di segmentazione etichetta ogni pixel del volto in 19 classi. Da lì nasce la maschera. Il modello rigenera solo l'area bianca; il risultato viene poi ricomposto sull'originale con un bordo sfumato.
Un modello di diffusione, lasciato libero, rigenera tutta l'immagine: anche le zone che volevamo conservare verrebbero ridisegnate in modo leggermente diverso. Reincollare solo l'area mascherata garantisce che il resto del volto resti identico al pixel.
Capelli, sopracciglia, occhi, naso, orecchie, labbra, barba, incarnato. Ogni regione ha valori preimpostati — per i capelli: castano chiaro e scuro, biondo, bianco, rosso e tre colori di fantasia.
Tre componenti che spesso vengono citate insieme ma fanno cose diverse.
Assegna a ogni pixel una delle 19 classi facciali. La segmentazione ha un dilemma: capire il contesto richiede di ridurre la risoluzione, ma dei bordi precisi richiedono di mantenerla. BiSeNet usa due rami paralleli — uno ad alta risoluzione e poco profondo, uno a bassa risoluzione e profondo — e li fonde alla fine.
Non è un modello a sé: è la rete che estrae le feature per BiSeNet. Il suo contributo storico sono le connessioni residue, che fanno imparare a ogni blocco la differenza rispetto al proprio input invece dell'intera trasformazione.
30.000 volti annotati a mano con maschere di 19 componenti. Non è codice: definisce il vocabolario delle regioni. Quando l'interfaccia offre «sopracciglia» o «labbra» come preset, sta usando le classi di questo dataset.
Alcune correzioni non riguardano il colore ma la geometria: un mento più lungo, occhi più distanti. Il tab Transform sposta i tratti lungo frecce punto-a-punto e rigenera la zona in modo coerente.
Un predittore di landmark individua in circa un millisecondo 68 punti chiave: contorno del viso, sopracciglia, occhi, naso, bocca. Muovere lo slider «mascella · verticale» sposta i punti del contorno mandibolare verso il basso, e ogni spostamento diventa una freccia.
Dalla nuvola di punti spostati si ricava anche il rettangolo che li contiene: è la maschera dell'area da rigenerare. È il motivo per cui, muovendo uno slider, sul canvas compaiono insieme le frecce e il riquadro verde — visibili nel video accanto e nella figura qui a fianco.
Il Transform ha due motori. Quale entra in funzione dipende dal profilo attivo, e la differenza si vede a occhio.
Il modello dedicato riceve le coppie di punti e produce direttamente lo spostamento, preservando texture e identità. È la modalità descritta dal paper.
Il backend costruisce un prompt che descrive a parole lo spostamento, lo applica come img2img limitata alla maschera dei landmark, e ricompone. Non è un drag geometrico: è una riscrittura locale guidata dal testo.
Stessa richiesta ai due backend — mascella verticale +30 — sullo stesso volto. Il lite non regge la riscrittura locale e sfalda la bocca; il modello hosted allunga la mascella lasciando il volto integro. Sotto una certa capacità del modello, il drag simulato non è utilizzabile.
| GPU / VRAM | Profilo | Cosa si ottiene | Drag |
|---|---|---|---|
| 6 GB GTX 1660 Ti · questa demo |
Lite + low VRAM SD 1.5 · ~2 GB |
Genera, Img2Img, Inpaint, EVC. ~15 s per volto a 25 step. | ripiego |
| 8 GB RTX 2060/3060/4060 |
Lite + low VRAM | Stesse pipeline, più margine per batch di varianti. | ripiego |
| 12 GB RTX 3060 12G · 4070 |
Full + low VRAM | SDXL possibile scaricando parte dei pesi sulla CPU: più qualità, più lentezza. | limite |
| 16 GB + RTX 4080/4090 · A4000 |
Full quality SDXL · ~20 GB pesi |
Qualità del paper: RealVisXL V5.0 Lightning e Lightning Drag. | completo |
| 24 GB + A5000 · A100 · L40S |
Full, batch ampi | Tutto attivo, più varianti in parallelo. | completo |
| Nessuna GPU | OpenRouter | Generazione delegata al cloud. La segmentazione resta locale. | ripiego |
Il paper indica 20 GB di VRAM per il caricamento pieno e 15 GB in modalità low-VRAM. Lo stack Studio abbassa la soglia d'ingresso a 6 GB rinunciando a SDXL e al drag dedicato: si perde qualità assoluta, si guadagna la possibilità di girare su un portatile.
Le schede Turing consumer — GTX 1650, 1660, 1660 Ti — producono immagini completamente nere se il VAE di SD 1.5 lavora a mezza precisione: alcuni valori intermedi superano il massimo rappresentabile in float16 e diventano infiniti.
Nel profilo lite Diff-FIT forza quindi il VAE in float32. Costa memoria e un po' di velocità, ma senza questa scelta lo strumento sarebbe inutilizzabile su questa fascia di schede. È il tipo di dettaglio che decide se un progetto di ricerca funziona anche fuori dal laboratorio.
Lo stesso flusso di lavoro può appoggiarsi a una GPU locale o a modelli remoti. La scelta non è solo tecnica: riguarda dove finiscono i dati.
| Dati | Non escono dalla macchina |
| Controllo | Seed, step, guidance, 8 scheduler |
| Costo | Solo elettricità |
| Riproducibilità | Totale a parità di seed |
| Resa misurata | 512² · ~15 s (lite, 6 GB) |
| Vincolo | Serve NVIDIA con CUDA; pesi da scaricare |
| Dati | L'immagine viene inviata a terzi |
| Controllo | Varianti, seed e scelta del modello |
| Costo | A immagine — da ~$0,014/MP |
| Riproducibilità | Limitata, dipende dal provider |
| Resa misurata | 1024² · 10–15 s (Nano Banana 2) |
| Vincolo | Serve una API key e connettività |
Il punto dirimente per l'uso forense: in modalità OpenRouter il volto sotto indagine transita su un servizio esterno. Per materiale coperto da segreto istruttorio la modalità locale non è una preferenza ma un requisito.
| Modello | Nota |
|---|---|
| Nano Banana 2 · Flash | default |
| Nano Banana Pro | qualità massima |
| Nano Banana 2 Lite | economico |
| Nano Banana | classico |
| FLUX.2 Klein 4B | ~$0,014/MP |
| Seedream 4.5 | $0,04/img |
| GPT Image 1 Mini | — |
I modelli hosted non accettano una maschera: rigenerano l'intera immagine da un prompt. Diff-FIT lo aggira segmentando in locale, inviando immagine e prompt localizzato, e ricomponendo solo dentro la maschera con bordo sfumato. Fuori dalla maschera i pixel restano l'originale: la stessa logica del percorso locale.
Nel localStorage del browser, inviata nell'header X-OpenRouter-Key, oppure come variabile d'ambiente lato server. Mai nel codice.
Sul profilo lite il divario è netto: risoluzione quadrupla, pelle e capelli più credibili, meno artefatti, a parità di tempo. Su questa fascia hardware il cloud è semplicemente migliore.
Il confronto cambia con SDXL su una scheda da 16 GB. E soprattutto: nessuna differenza di qualità compensa l'invio del volto di un indagato a un servizio di terzi.
Attributi identici ai due backend nella stessa sessione: uomo bianco, capelli corti castano scuro, occhi marroni, barba. Nota metodologica: il confronto è lite contro cloud, non Diff-FIT contro cloud — il profilo full locale non era eseguibile su questa macchina, che è esattamente il punto della slide precedente.
Su una scena del crimine può non esserci nessuno in grado di descrivere un volto, ma può esserci una traccia biologica. È il punto in cui Diff-FIT smette di essere uno strumento per il testimone e diventa l'ultimo anello di una catena che parte dal DNA.
AiDNA stima caratteristiche fisiche osservabili a partire da marcatori genetici ed epigenetici, e produce un output strutturato pensato per essere consumato da un motore generativo.
Colore di occhi, capelli e pelle dal pannello SNP HIrisPlex-S, con un modello logistico multinomiale.
Età dalla metilazione del DNA. Quattro orologi — Forensic 5 CpG, Horvath, Hannum, SkinBlood — combinati in un consenso pesato.
Registro estendibile a plugin: calvizie, miopia, lentiggini, fumo. Nuovi marcatori senza toccare il resto.
Interroga i predittori in parallelo e costruisce il metafile EVC standardizzato.
Dieci microservizi in tutto, coordinati da un api_gateway, con job_store su PostgreSQL, coda RabbitMQ per le esecuzioni asincrone, un predictive_registry che risolve i predittori a runtime e un function_runner che esegue funzioni versionate in Python, JavaScript e R.
EVC sta per Externally Visible Characteristics: i caratteri visibili dall'esterno. Ogni tratto arriva con la sua distribuzione di probabilità, non come certezza.
fit_shared/evc_mapper.py è deterministico: nessuna rete neurale, nessuna interpretazione. Legge i campi e li traduce in frasi di prompt secondo regole fisse. È la scelta che rende l'output ispezionabile e ripetibile.
POST /api/generate/evc accetta il metafile completo o il solo blocco evc, sia in locale sia su OpenRouter.
Forma del naso, taglio di capelli, cicatrici, espressione: non vengono predetti. Il metafile fissa pigmentazione, età, sesso e pochi marcatori — tutto il resto resta indeterminato e va trattato come tale.
Prompt prodotto dal mapper a partire dal metafile:
Ogni frase evidenziata traduce un campo del JSON: age.predicted_years → «38 year old», hair_color.most_likely → «blonde hair», markers_extra[freckles] → «visible freckles». 47 s per tre varianti.
Le varianti condividono i tratti predetti — biondo, occhi azzurri, carnagione molto chiara, lentiggini, uomo sui 38 anni — e differiscono in tutto ciò che il DNA non determina.
eye_color · blue 0.72
hair_color · blonde 0.55
skin_color · very_light 0.50
age · 38 ± 5
sex · male 0.85
freckles · present 0.70
La divergenza tra le varianti non è un difetto: è la rappresentazione visiva dell'incertezza. Un volto solo suggerirebbe una precisione che il dato genetico non possiede.
Le cinque pipeline non si usano in fila: si usano in cerchio. Il punto di partenza qui non è un testimone ma il JSON che arriva dall'aggregatore AiDNA.
Ogni risultato ha i pulsanti → Img2Img, → Inpaint, → Transform: diventa immediatamente l'ingresso della pipeline successiva, senza scaricare e ricaricare nulla.
Seed, scheduler, step e guidance di ogni passaggio. Senza quel registro l'identikit finale non è riproducibile, e un risultato non riproducibile è difficile da difendere.
L'esperimento: dato un volto «reale» e il profilo genetico corrispondente, si prova a ricostruirlo partendo solo dal metafile e correggendo la geometria con il Transform.
Il metafile ha portato pigmentazione, età e lentiggini. L'inpaint ha accorciato i capelli e arretrato l'attaccatura — l'unico passo con un effetto visibile a occhio. Il Transform ha stretto mascella e occhi di pochi pixel.
Il DNA fissa il colore di una persona, non il suo volto. Un identikit da EVC restringe il campo — esclude chi ha occhi scuri o capelli neri — ma non identifica nessuno. È uno strumento di esclusione, non di riconoscimento.
Il volto «target» è stato generato dallo stesso modello a partire da una descrizione affine. La somiglianza che si vede misura quindi la coerenza del generatore, non l'accuratezza della predizione genetica. Una valutazione vera richiede volti reali e DNA reale — è ciò che il paper fa con ArcFace su dataset controllati.
I due sistemi non si conoscono: comunicano solo attraverso un JSON versionato. AiDNA può cambiare modelli predittivi e Diff-FIT può cambiare motore generativo senza che l'altro debba essere modificato.
Riportare l'incertezza dentro l'immagine: oggi si prende il valore più probabile e il resto della distribuzione va perso. Campionare le varianti secondo le probabilità sarebbe il passo successivo.
Diff-FIT non introduce un modello nuovo: mette insieme, per un compito forense, risultati che vengono da ambiti diversi. Vale la pena sapere cosa ciascuno ha risolto.
DragDiffusion, LightningDrag e IP-Adapter sono spiegati nella sezione Transform. Tutti i PDF sono nella cartella papers/ del repository. Per architetture, dimensioni dei pesi e configurazioni effettive: scheda tecnica modelli e pesi.
Valutare un volto che non esiste richiede di scomporre la domanda: corrisponde alla descrizione? è un'immagine buona? conserva l'identità? Nessuna metrica risponde da sola.
Misura quanto l'immagine generata corrisponde alla descrizione testuale, confrontando immagine e testo in uno spazio comune. Risponde a: «il modello ha ascoltato il testimone?»
Usa un modello di visual question answering: gli si chiede se l'immagine contiene ciò che il prompt dichiara e si misura quanto è sicuro della risposta.
Un modello di riconoscimento facciale trasforma ogni volto in un vettore; la similarità del coseno fra due vettori dice quanto si somigliano. Nei test si confronta il generato col volto reale di riferimento.
Qualità dal punto di vista biometrico: non «è bella» ma «è utilizzabile per un confronto facciale automatico».
Identity Retention Score: quanto l'identità sopravvive alle modifiche successive di inpainting e drag. Serve a verificare che correggere un dettaglio non produca un'altra persona.
Il dataset di volti reali usato come riferimento: la distribuzione contro cui misurare quanto il generato somigli a fotografie autentiche.
Nota di metodo: ArcFace misura la somiglianza, non l'identità. Un identikit con alta similarità rispetto a un sospetto non prova che sia quella persona: è un indizio investigativo e va comunicato come tale.
Diff-FIT genera ipotesi visive, non identifica persone. Un identikit prodotto qui è un supporto alla ricerca, mai un elemento probatorio autonomo.
Il repository AiDNA dichiara esplicitamente che alcuni coefficienti dei predittori sono illustrativi e vanno sostituiti con quelli pubblicati prima di qualunque uso reale.
La distribuzione dei dati di addestramento si ripresenta nei volti generati. Su gruppi sottorappresentati la resa peggiora: è un limite da dichiarare, non da nascondere.
Pigmentazione, età, sesso e pochi marcatori. La morfologia — la parte che rende un volto riconoscibile — resta fuori portata.
Un volto fotorealistico comunica una sicurezza che il dato di partenza non ha. È il rischio principale dell'intero approccio: la qualità estetica non è accuratezza.
Un modo per trasformare una descrizione — verbale o genetica — in un punto di partenza visivo coerente, correggibile e riproducibile.
Cinque pipeline, nove lavori scientifici, due backend e un contratto JSON con la genetica.