Diff-FIT Studio

Identikit forensi
con modelli
di diffusione.

Le cinque pipeline dello strumento, i lavori scientifici su cui poggia, e il collegamento con la fenotipizzazione del DNA.

Tomašević, Peer, Štruc, Miočić · IEEE Access 2026 DOI 10.1109/ACCESS.2026.3672229 · CC BY 4.0 Backend locale GPU + OpenRouter + AiDNA EVC
Identikit generato 1 Identikit generato 2 Identikit da profilo genetico Identikit dopo inpainting
01 · Il problema

L'identikit tradizionale
assembla parti.

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.

Perché è un limite serio

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.

L'alternativa generativa

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.

Il prezzo da pagare

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.

Come funziona un modello di diffusione
Approfondimento

Generare togliendo rumore.

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.

In addestramento si fa il contrario: si prende una foto vera, le si aggiunge rumore in quantità nota e si chiede al modello di indovinarlo. Generare è quel processo eseguito al rovescio.
Denoising progressivo
Fig. 1 Il processo ricostruito sull'immagine realmente prodotta dal backend locale. 25 passi, scheduler DPM++ a passo singolo.
Le tre parti che compongono il modello
Approfondimento

Le tre parti di Stable Diffusion.

Quando nelle slide si legge «il modello», in realtà sono tre reti che lavorano insieme.

VAE — l'autoencoder

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.

U-Net — chi predice il rumore

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.

CLIP — chi legge il prompt

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.

I parametri che si vedono nell'interfaccia
Approfondimento · glossario

I parametri, in parole semplici.

seed Il numero che genera il rumore iniziale. Stesso seed e stessi parametri producono la stessa identica immagine: è ciò che rende un identikit riproducibile e verificabile. -1 significa casuale.
steps Quante volte si ripete il ciclo «stima il rumore, toglilo». Pochi step danno immagini abbozzate, molti costano tempo senza migliorare oltre un certo punto. Qui: 25.
guidance · CFG Quanto il modello deve dare retta al prompt. Il modello calcola due previsioni — una con prompt e una senza — e ne amplifica la differenza. Basso: più libero. Alto: più aderente ma con artefatti. Tipico 6–8.
strength Solo in img2img: quanto rumore aggiungere all'immagine di partenza prima di rigenerarla. 0 la lascia intatta, 1 la ricrea da zero. Sotto 0,6 l'identità del soggetto sopravvive.
scheduler L'algoritmo che decide di quanto ridurre il rumore a ogni passo. Cambia velocità e resa a parità di modello. Il backend locale ne espone otto.
maschera Un'immagine in bianco e nero della stessa dimensione del volto: bianco = rigenera, nero = non toccare. È il modo in cui si limita una modifica a una sola zona.
02 · Architettura

Tre servizi, un'unica interfaccia.

interfaccia web Presenta i cinque tab e smista ogni richiesta al backend attivo. Non calcola nulla.
calcolo locale local-fit Esegue i modelli sulla GPU della macchina. Nessun dato lascia il computer.
calcolo remoto openrouter-fit Delega la generazione a modelli hosted. Non richiede GPU, ma l'immagine esce.
sempre locale segmentazione Il parser che disegna le maschere gira sulla macchina in entrambe le modalità.

Un solo switch cambia tutto

Il selettore Locale / OpenRouter nell'intestazione commuta l'intero flusso: stessi tab, stessi gesti, motore diverso. L'operatore non deve imparare due strumenti.

Perché i due backend restano separati

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.

I cinque tab dell'interfaccia
Approfondimento

Cinque tab, un flusso di lavoro.

Interfaccia Diff-FIT Studio
Fig. 2 Diff-FIT Studio in modalità locale. In alto a destra i badge del profilo attivo: Lite, GTX 1660 Ti, online.
01

Genera

Il volto nasce dagli attributi riferiti dal testimone.

02

Img2Img

Variazioni dell'intero volto, mantenendo l'identità.

03

Inpaint

Modifica di una sola zona; il resto resta invariato.

04

Transform

Spostamento dei tratti lungo frecce, per correzioni di forma.

05

AiDNA EVC

Il volto parte da un profilo genetico anziché da un racconto.

03 · Pipeline 1 — Generazione
Video 1 Sessione reale sul backend locale: gli otto attributi, il seed fissato a 777 per rendere l'esito ripetibile, la generazione.

Generazione
da attributi.

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.

45s 3 varianti
2,1it/s denoising
25 step

Misurato su GTX 1660 Ti 6 GB, profilo lite, SD 1.5 Dreamshaper: circa 15 secondi per volto.

Il prompt che arriva al modello
Approfondimento

Dagli attributi al prompt.

Prompt prodotto dal backend per gli attributi uomo · capelli corti castano scuro · occhi marroni · barba:

30 year old white male with dark brown short straight hair, brown eyes, no glasses, beard, uomo sui 40 anni, sguardo serio, passport photo, front view, facing camera, both ears visible, centered headshot, solid plain white background, isolated on white

La coda in corsivo è un vincolo, non uno stile

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.

Il negative prompt

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.

Gli otto scheduler
Approfondimento

Otto modi di togliere il rumore.

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ù.

SchedulerComportamento
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.
Approfondimento · il meccanismo

Che cosa vuol dire, esattamente,
togliere il rumore.

«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.

01 · addestramento Sporcare per imparare Si prende un latente pulito, gli si aggiunge rumore gaussiano in quantità nota e si chiede alla rete di indovinare quale rumore è stato aggiunto. Milioni di volte, a tutti i livelli di disturbo.
02 · cosa sa fare la rete Stimare, non ripulire A fine addestramento la rete risponde a una sola domanda: «dato questo latente e il suo livello di rumore σ, quale sarebbe l'originale?». È una stima, tanto più grossolana quanto più σ è alto.
03 · generazione Scendere lungo una curva Non si sottrae tutto il rumore in un colpo: la stima iniziale è troppo imprecisa. Si scende per gradi da σ massimo a σ quasi nullo, e a ogni gradino la stima migliora.
dx / dσ  =  ( xD(x, σ) )  /  σ Il percorso da rumore puro a immagine è la soluzione di questa equazione differenziale. D(x,σ) è la stima della rete; generare significa integrarla da σ grande fino a σ ≈ 0.
Da qui la divisione dei compiti: la rete fornisce la direzione, lo scheduler decide come percorrerla. Stessi pesi e stesso seed, con integratori diversi, danno immagini diverse — e a parità di qualità richiedono un numero di passi molto diverso.
Approfondimento · le differenze

Quattro assi, otto combinazioni.

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.

Ordine

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.

Single vs multi-step

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.

Deterministico o stocastico

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ù.

Distribuzione dei σ

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-stepsingle-step deterministicauniforme Pochi passi (15–25). Il default
DPM single-step + Karrassingle-step deterministicaKarras Come sopra, dettaglio un filo migliore
DPM multi-stepmulti-step deterministicauniforme Da 25 passi in su, quando la rincorsa si ammortizza
DPM multi-step + Karrasmulti-step deterministicaKarras Molti passi, rese uniformi
Euler deterministicauniforme Riferimento prevedibile; serve più passi
DPM-SDEsingle-step stocasticauniforme Più varietà e texture, meno ripetibile
DPM-SDE + Karrassingle-step stocasticaKarras 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.

04 · Pipeline 2 — Img2Img

Variazioni dell'intero volto.

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.

Volto di partenza
Partenzastrength 0
Variante 1
Variante 1strength 0,45
Variante 2
Variante 2strength 0,45
Variante 3
Variante 3strength 0,45

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.

05 · Pipeline 3 — Inpainting
Video 2 Sessione reale: scelta della regione, rilevamento automatico della maschera, rigenerazione dei soli capelli e confronto prima/dopo.

Modifica locale
guidata da maschera.

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.

0,7s maschera
27s 2 varianti
La maschera, passo per passo
Approfondimento

Dalla segmentazione al pixel finale.

Volto originale
1L'identikit di partenza.
Maschera capelli
2Il parser isola la classe capelli: maschera binaria.
Maschera sovrapposta
3Nell'interfaccia è sovrapposta in verde e ritoccabile a pennello.
Risultato inpainting
4Solo i capelli sono cambiati. Barba, occhi e incarnato sono gli stessi pixel.

Perché la ricomposizione è necessaria

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.

Le regioni disponibili

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.

Chi produce la maschera
Approfondimento

Il parser facciale.

Tre componenti che spesso vengono citate insieme ma fanno cose diverse.

BiSeNet — la rete

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.

ResNet — il backbone

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.

CelebAMask-HQ — il dataset

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.

06 · Pipeline 4 — Transform
Video 3 Sessione reale: gli slider generano frecce e maschera sui landmark, poi la trasformazione viene applicata.

Correzioni
di forma.

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.

Gli slider non spostano pixel direttamente: producono coppie di punti (da dove, a dove) sui landmark del volto, più la maschera dell'area coinvolta. Sono quelle coppie a guidare la rigenerazione.
Come gli slider diventano frecce
Approfondimento

68 punti sul volto.

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.

Frecce e maschera generate dagli slider
Fig. 3 Mascella a +25 e dimensione occhi a +6: frecce rosse (origine) e blu (destinazione) sui landmark, maschera in verde.
Cosa succede senza Lightning Drag
Approfondimento · comportamento reale

Due implementazioni dello stesso gesto.

Il Transform ha due motori. Quale entra in funzione dipende dal profilo attivo, e la differenza si vede a occhio.

Con Lightning Drag (profilo full, ≥ 16 GB)

Il modello dedicato riceve le coppie di punti e produce direttamente lo spostamento, preservando texture e identità. È la modalità descritta dal paper.

Senza Lightning Drag (profilo lite e OpenRouter)

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.

Volto di partenza
Primavolto di partenza
Transform in profilo lite
Locale liteSD 1.5 · 12,1 s
Transform su OpenRouter
OpenRouterNano Banana 2 · 10,6 s

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.

I lavori dietro il drag editing
Approfondimento

Tre lavori che rendono possibile il drag.

Shi et al. · CVPR 2024 · arXiv:2306.14435

DragDiffusion

Il problema
Trascinare un punto di un'immagine e vedere il contenuto seguirlo era possibile sulle GAN, non sui modelli di diffusione.
Il contributo
Ottimizza il latente di un singolo passo di diffusione finché le feature del punto di partenza non migrano su quello di arrivo.
Il limite
Richiede un'ottimizzazione a ogni modifica: decine di secondi.
Shi et al. · 2024 · arXiv:2405.13722

LightningDrag

Il problema
L'ottimizzazione al momento dell'uso rende il drag inutilizzabile in modo interattivo.
Il contributo
Sposta il costo in addestramento: una rete impara una volta per tutte a produrre il risultato dati immagine e punti, senza ottimizzare nulla al momento.
L'effetto
Da decine di secondi a circa un secondo per modifica.
Ye et al. · 2023 · arXiv:2308.06721

IP-Adapter

Il problema
I modelli accettano condizioni testuali, ma «questa persona» non si descrive a parole.
Il contributo
Un ramo di cross-attention aggiuntivo che inietta le feature di un'immagine di riferimento, addestrando pochi milioni di parametri invece di rifare il modello.
In Diff-FIT
Tiene ferma l'identità del soggetto mentre i tratti si spostano.
A questi si aggiunge LCM-LoRA (arXiv:2311.05556), che porta l'inferenza a ~8 step: è il pezzo che rende il drag «lightning». Spiegato nella sezione sui paper.
07 · Il vincolo hardware

Quanta GPU serve.

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.

Il caso delle GTX 16xx
Approfondimento · nota tecnica

Perché qui il VAE
lavora in float32.

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.

Profilo consigliato per 6 GB

DIFF_FIT_LITE=1 DIFF_FIT_LOW_VRAM=1 DIFF_FIT_MODEL=lite DIFF_FIT_LIGHTNING_DRAG=0

Profilo qualità paper (≥ 16 GB)

DIFF_FIT_LITE=0 DIFF_FIT_MODEL=lightning5 DIFF_FIT_LOW_VRAM=0 DIFF_FIT_LIGHTNING_DRAG=1
08 · Due backend

GPU locale o modelli hosted.

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.

Locale · GPU

DatiNon escono dalla macchina
ControlloSeed, step, guidance, 8 scheduler
CostoSolo elettricità
RiproducibilitàTotale a parità di seed
Resa misurata512² · ~15 s (lite, 6 GB)
VincoloServe NVIDIA con CUDA; pesi da scaricare

OpenRouter · cloud

DatiL'immagine viene inviata a terzi
ControlloVarianti, seed e scelta del modello
CostoA immagine — da ~$0,014/MP
RiproducibilitàLimitata, dipende dal provider
Resa misurata1024² · 10–15 s (Nano Banana 2)
VincoloServe 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.

I modelli disponibili e l'inpainting emulato
Approfondimento

Sette modelli, un solo switch.

ModelloNota
Nano Banana 2 · Flashdefault
Nano Banana Proqualità massima
Nano Banana 2 Liteeconomico
Nano Bananaclassico
FLUX.2 Klein 4B~$0,014/MP
Seedream 4.5$0,04/img
GPT Image 1 Mini

L'inpainting che il cloud non offre

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.

Dove sta la chiave

Nel localStorage del browser, inviata nell'header X-OpenRouter-Key, oppure come variabile d'ambiente lato server. Mai nel codice.

Le due interfacce a confronto
Approfondimento

Stessa interfaccia, controlli diversi.

Modalità locale
Locale Compaiono scheduler, step e guidance: il controllo completo del processo di denoising. I badge mostrano profilo e GPU.
Modalità OpenRouter
OpenRouter Restano varianti, seed e scelta del modello. Il denoising avviene altrove, quindi non è esposto.
La differenza di resa
Approfondimento · confronto reale

Stessi attributi, due backend.

Locale lite 1
LocaleSD 1.5 lite · 512²
Locale lite 2
Locale~15 s · GTX 1660 Ti
Cloud Nano Banana 2
CloudNano Banana 2 · 1024²
Cloud Nano Banana 2 bis
Cloud10–15 s · nessuna GPU

Cosa mostra il confronto

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.

Perché il locale resta necessario

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.

09 · Il collegamento

Quando manca
il testimone.

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.

09 · AiDNA

Fenotipizzazione forense
a microservizi.

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.

hirisplex_s

Colore di occhi, capelli e pelle dal pannello SNP HIrisPlex-S, con un modello logistico multinomiale.

methylclock

Età dalla metilazione del DNA. Quattro orologi — Forensic 5 CpG, Horvath, Hannum, SkinBlood — combinati in un consenso pesato.

newmarkerAiDNA

Registro estendibile a plugin: calvizie, miopia, lentiggini, fumo. Nuovi marcatori senza toccare il resto.

aggregator

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.

SNP, CpG e orologi epigenetici
Approfondimento · glossario

Il vocabolario del DNA forense.

SNP Single Nucleotide Polymorphism: una posizione del genoma in cui una singola lettera varia fra individui. Alcune di queste posizioni influenzano la pigmentazione: sapere quale variante è presente permette di stimare colore di occhi e capelli.
HIrisPlex-S Il pannello di SNP diventato standard per predire simultaneamente colore di occhi, capelli e pelle. È lo strumento più consolidato della fenotipizzazione forense.
softmax La funzione che trasforma i punteggi grezzi del modello in probabilità che sommano a 1. È il motivo per cui il metafile riporta «blu 0,72 · intermedio 0,18 · marrone 0,10» e non una risposta secca.
CpG Un punto del DNA in cui una citosina è seguita da una guanina. Su questi punti può legarsi un gruppo metile: una modifica epigenetica che non cambia la sequenza ma ne regola l'uso.
metilazione La quantità di metilazione di certi CpG cambia in modo regolare con l'età. Misurandola si può stimare l'età biologica del donatore della traccia, con un margine di alcuni anni.
orologio Un modello che pesa un insieme di CpG per produrre una stima d'età. Ne esistono diversi, tarati su tessuti diversi: AiDNA ne combina quattro per ridurre l'errore del singolo.
Il metafile EVC
Approfondimento

Il contratto fra i due sistemi.

EVC sta per Externally Visible Characteristics: i caratteri visibili dall'esterno. Ogni tratto arriva con la sua distribuzione di probabilità, non come certezza.

{ "schema_version": "1.0", "sample_id": "sample_blond_male", "evc": { "pigmentation": { "eye_color": { "most_likely": "blue", "probabilities": { "blue": 0.72, "intermediate": 0.18, "brown": 0.10 } }, "hair_color": { "most_likely": "blonde", … }, "skin_color": { "most_likely": "very_light", … } }, "age": { "predicted_years": 38, "margin_years": 5 }, "sex": { "called": "male", "male": 0.85 }, "markers_extra": [ { "marker_id": "baldness", "most_likely": "none" }, { "marker_id": "freckles", "most_likely": "present" } ] } }

Un mapper, non un modello

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.

Un endpoint su entrambi i backend

POST /api/generate/evc accetta il metafile completo o il solo blocco evc, sia in locale sia su OpenRouter.

Quello che il DNA non dice

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.

10 · EVC in azione
Video 4 Sessione reale: metafile AiDNA nell'interfaccia, generazione sul backend locale, tre identikit coerenti col profilo.

Dal profilo
genetico al volto.

Prompt prodotto dal mapper a partire dal metafile:

38 year old white male with blonde hair, blue eyes, approximately 38 years old, visible freckles on the face, passport photo, front view, facing camera…

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.

Il risultato a confronto col profilo
Approfondimento

Tre volti, un solo profilo genetico.

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.

Dal metafile

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

Identikit EVC 1
Variante 1
Identikit EVC 2
Variante 2
Identikit EVC 3
Variante 3

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.

11 · Il ciclo operativo

Come si lavora davvero.

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.

00 Metafile EVC Il JSON prodotto dalla pipeline genetica. Fissa pigmentazione, età e sesso — con le loro probabilità.
01 Genera Il mapper traduce il JSON in prompt e produce n varianti. Nessuna è «la risposta».
02 Scarta L'operatore elimina ciò che contraddice altri elementi dell'indagine e tiene una base di lavoro.
03 Raffina Inpaint per i dettagli locali, Img2Img per l'aspetto d'insieme, Transform per la geometria.
04 Itera Ogni risultato torna a essere immagine di lavoro. Si esce quando nessuna modifica migliora più nulla.

Cosa rende il ciclo possibile

Ogni risultato ha i pulsanti → Img2Img, → Inpaint, → Transform: diventa immediatamente l'ingresso della pipeline successiva, senza scaricare e ricaricare nulla.

Cosa va annotato a ogni giro

Seed, scheduler, step e guidance di ogni passaggio. Senza quel registro l'identikit finale non è riproducibile, e un risultato non riproducibile è difficile da difendere.

Il ciclo applicato: ricostruire un volto dal DNA
Approfondimento · esperimento
Video 5 Il ciclo completo in una sessione: metafile AiDNA, identikit, inpaint dei capelli, poi Transform sulla geometria.

Quanto ci si
avvicina?

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.

Inpaint sui capelli con prompt libero — «shorter cropped hair, slightly receding hairline» — poi Transform: mascella verticale +30, orizzontale −20, distanza occhi −15. Due passaggi, 28 s in tutto.
Il risultato, e cosa dimostra davvero
Approfondimento · risultato

Il colore converge, la forma no.

Volto target
Targetil volto da ricostruire
Identikit dal metafile EVC
1 · Solo DNAdal metafile · 12 s
Dopo l'inpaint dei capelli
2 · Inpaintcapelli · 14 s
Dopo il transform
3 · Transform3 slider · 14 s

Chi ha fatto cosa

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.

La lettura corretta

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.

Avvertenza su questo esperimento

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.

12 · Sintesi

La catena completa.

Perché la giunzione regge

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.

Cosa manca ancora

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.

13 · Fondamenta

I lavori su cui poggia Diff-FIT.

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.

Rombach et al. · CVPR 2022 · arXiv:2112.10752

Latent Diffusion Models

Il problema
I modelli di diffusione lavoravano sui pixel: per un'immagine 512×512 significa calcolare il rumore su oltre 260.000 valori a ogni passo, per decine di passi. Servivano cluster di GPU.
Il contributo
Spostare la diffusione in uno spazio latente compresso da un autoencoder, circa 48 volte più piccolo. Stessa qualità, costo di calcolo ridotto di un ordine di grandezza.
In Diff-FIT
È l'architettura di Stable Diffusion, quindi il motore di tutti i tab di generazione.
He et al. · CVPR 2016 · arXiv:1512.03385

Deep Residual Learning

Il problema
Aggiungendo livelli, le reti profonde peggioravano — e non per overfitting: l'errore in addestramento stesso cresceva. Erano diventate troppo difficili da ottimizzare.
Il contributo
La connessione residua: ogni blocco impara la differenza rispetto al proprio ingresso invece dell'intera trasformazione. Se non serve fare nulla, basta imparare zero.
In Diff-FIT
ResNet-18/34 è il backbone che estrae le feature per il parser facciale.
Yu et al. · ECCV 2018 · arXiv:1808.00897

BiSeNet

Il problema
Nella segmentazione semantica capire cosa c'è richiede di ridurre la risoluzione; tracciare dove finisce richiede di mantenerla. I due obiettivi confliggono.
Il contributo
Due rami paralleli — uno spaziale ad alta risoluzione e poco profondo, uno contestuale profondo e a bassa risoluzione — fusi alla fine. Bordi netti in tempo reale.
In Diff-FIT
Decide quali pixel sono capelli, occhi o labbra: è ciò che produce le maschere di inpainting.
Gli altri lavori
Approfondimento

Dataset, accelerazione, landmark.

Lee et al. · CVPR 2020 · arXiv:1907.11922

CelebAMask-HQ

Cos'è
Non un modello ma un dataset: 30.000 volti ad alta risoluzione con maschere disegnate a mano per 19 componenti facciali.
Perché conta
Definisce il vocabolario delle regioni. Le classi di questo dataset sono esattamente i preset che si vedono nel menu «Regione» dell'inpainting.
In Diff-FIT
È il dato su cui il parser è stato addestrato: la qualità delle maschere dipende da queste annotazioni.
Luo et al. · 2023 · arXiv:2311.05556

LCM-LoRA

Il problema
Servono 25–50 passi per una buona immagine. I Latent Consistency Model li riducono a 4–8, ma richiedono di riaddestrare il modello: costoso e da rifare per ogni checkpoint.
Il contributo
Distillare quella capacità in un LoRA — poche matrici a basso rango, pochi MB — innestabile su qualunque checkpoint compatibile senza riaddestrarlo.
In Diff-FIT
È il pezzo che rende il drag abbastanza rapido da essere interattivo.
Kazemi & Sullivan · CVPR 2014

Face Alignment with Regression Trees

Il problema
Individuare i punti chiave di un volto era troppo lento per l'uso in tempo reale.
Il contributo
Partire da una forma media e correggerla in cascata con un insieme di alberi di regressione. 68 punti in circa un millisecondo, senza GPU.
In Diff-FIT
Converte lo spostamento di uno slider in frecce sulle parti giuste del volto — la base del tab Transform.

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.

Come si valuta il risultato
Approfondimento

Le metriche di valutazione.

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.

CMMD

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?»

VQAScore

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.

ArcFace

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.

eDifFIQA

Qualità dal punto di vista biometrico: non «è bella» ma «è utilizzabile per un confronto facciale automatico».

IRS

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.

FFHQ

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.

14 · Cautele

Cosa questo strumento non è.

Non è riconoscimento facciale

Diff-FIT genera ipotesi visive, non identifica persone. Un identikit prodotto qui è un supporto alla ricerca, mai un elemento probatorio autonomo.

I coefficienti vanno validati

Il repository AiDNA dichiara esplicitamente che alcuni coefficienti dei predittori sono illustrativi e vanno sostituiti con quelli pubblicati prima di qualunque uso reale.

Il modello riflette i suoi dati

La distribuzione dei dati di addestramento si ripresenta nei volti generati. Su gruppi sottorappresentati la resa peggiora: è un limite da dichiarare, non da nascondere.

Il DNA descrive poco del volto

Pigmentazione, età, sesso e pochi marcatori. La morfologia — la parte che rende un volto riconoscibile — resta fuori portata.

Il realismo può indurre in errore

Un volto fotorealistico comunica una sicurezza che il dato di partenza non ha. È il rischio principale dell'intero approccio: la qualità estetica non è accuratezza.

Quello che invece è

Un modo per trasformare una descrizione — verbale o genetica — in un punto di partenza visivo coerente, correggibile e riproducibile.

Fine

Identikit forensi
con modelli
di diffusione.

Cinque pipeline, nove lavori scientifici, due backend e un contratto JSON con la genetica.

Diff-FIT Studio · locale GPU + OpenRouter + AiDNA EVC docker compose up --build -d → localhost:3000 Paper IEEE Access 2026 · CC BY 4.0 Scheda tecnica: modelli e pesi →
Identikit Variante Identikit da EVC Dopo inpainting