Come funziona il nostro scanner VIN?
Digitare manualmente il numero VIN è uno di quei piccoli,
fastidiosi compiti che, in caso di errore, causano perdite reali. Era un 8 o una B?
5 o S? Un solo carattere sbagliato e il rapporto sulla storia del veicolo torna vuoto – oppure, cosa
ancora peggiore, descrive l’auto di qualcun altro.
Per questo abbiamo creato uno scanner VIN che funziona interamente nel browser del tuo
telefono. Senza installare app, senza inviare foto. In questo articolo
mostreremo cosa succede davvero nei due o tre secondi tra il momento in cui punti la fotocamera sul numero VIN e quello in cui vedi il risultato – inclusi alcuni aspetti
che ci hanno sorpreso durante lo sviluppo.
Due reti neurali, un solo compito
Quando tocchi “Scansiona”, il tuo browser scarica due piccoli modelli di IA (in totale circa 13 MB – memorizzati nella cache dopo la prima visita) e li esegue in locale tramite WebAssembly. Ognuno di essi ha un ruolo molto specifico. Il Cercatore. Il primo modello è un rilevatore di oggetti della famiglia YOLO, che abbiamo addestrato per fare esattamente una cosa: trovare il numero VIN nel fotogramma della fotocamera. Non “trovare del testo” – trovare il VIN. Ha visto numeri VIN su targhette sul cruscotto visibili dal parabrezza, adesivi sul montante della porta, punzonati sul metallo nudo sulle torrette degli ammortizzatori e su documenti di immatricolazione stampati, quindi riconosce la differenza tra un numero VIN, una targa o un numero di parte casuale. È importante sottolineare che non disegna semplicemente un riquadro attorno al VIN – restituisce un riquadro ruotato, così conosce l’angolo esatto del testo, anche quando tieni il telefono inclinato oppure fotografi il vano motore di lato.
Lettore. La striscia di pixel ritagliata e raddrizzata viene quindi inviata a un secondo modello: una rete di riconoscimento del testo della famiglia PaddleOCR, che abbiamo ottimizzato specificamente per i numeri VIN. Un modello OCR universale deve tenere conto di migliaia di caratteri – il nostro ne conosce solo 33.
Perché solo 33 caratteri? Una curiosità dal 1981
Le lettere I, O e Q sono vietate nei numeri VIN. La norma ISO del 1981 le ha escluse proprio
perché è troppo facile confonderle con le cifre 1 e 0 – sul metallo punzonato, sulle
etichette scolorite e (ironia della sorte) nell’OCR.
Abbiamo inserito questa regola direttamente nell’alfabeto del modello-lettore. Esso è fisicamente
incapace di restituire O – se un carattere appare circolare, la risposta consentita più vicina
è 0 ed è proprio quella che segnala. Un’intera classe di errori
OCR classici semplicemente non può verificarsi. Questo è il singolo vantaggio più grande
dell’ottimizzazione per i numeri VIN invece di usare un motore OCR generico.
Una singola foto è un’ipotesi. Il video è una prova.
In una fase iniziale abbiamo preso una decisione che ha plasmato l’intero scanner: mai fidarsi di un singolo fotogramma. La fotocamera fornisce un nuovo fotogramma più volte al secondo, quindi invece di puntare tutto su un singolo scatto, lo scanner legge il numero VIN ripetutamente e permette ai fotogrammi di votare. Il risultato viene accettato solo quando i fotogrammi indipendenti sono concordi – e la soglia di “concordanza” è flessibile:
- Se gli stessi 17 caratteri compaiono due volte e il checksum integrato del VIN è corretto, accettiamo il risultato quasi immediatamente.
- Nessun checksum? (Maggiori dettagli qui sotto.) In tal caso attendiamo una terza conferma.
- Se i fotogrammi continuano a non concordare su un singolo carattere, ogni candidato viene
pesato in base a quanto il lettore fosse sicuro – carattere per carattere.
Quest’ultima regola ha dimostrato il proprio valore durante i test. In una delle nostre
clip di prova – un documento di immatricolazione in piena luce – un riflesso ha fatto sì
che lo
0nel numero di serie sembrasse un8in oltre metà dei fotogrammi. Il solo ripetere avrebbe scelto la risposta errata. Ma il livello di sicurezza del modello riguardo a quegli8era costantemente inferiore rispetto alle letture pulite di0e la logica di voto è se ne è accorto. Lo scanner ha semplicemente aspettato un secondo in più finché le evidenze si stabilizzassero – e ha restituito il numero VIN corretto.
Una cifra di controllo che funziona solo in alcune auto
I numeri VIN contengono un meccanismo nascosto di autocontrollo: la posizione 9 è la cifra di controllo calcolata a partire dagli altri 16 caratteri. È un ottimo segnale di verifica – quando funziona. C’è però un problema: è obbligatoria solo per i veicoli venduti in Nord America. La maggior parte dei VIN del mercato europeo non la utilizza affatto. Per questo il nostro scanner tratta la cifra di controllo come un bonus, mai come un requisito. Quando coincide, possiamo accettare il risultato più rapidamente. Quando non coincide, non è un errore – probabilmente si tratta semplicemente di un’auto europea e il carico ricade sul sistema di voto dei frame.
Il tuo numero VIN non lascia mai il telefono
Vale la pena dirlo chiaramente: i frame della fotocamera vengono elaborati interamente sul tuo dispositivo. I modelli di IA vengono scaricati nel tuo browser; le tue immagini non vengono mai inviate da nessuna parte. Non c’è alcun server che esegue il riconoscimento, nessuna foto archiviata nel cloud. L’unica cosa che lascia il tuo telefono è il numero VIN finale, di 17 caratteri – e solo quando prosegui alla pagina del rapporto. Non è stata una decisione dettata esclusivamente dalla privacy. In questo modo lo scanner è anche veloce (nessun andirivieni verso il server per ogni frame) e funziona anche con segnale debole in un parcheggio sotterraneo – cioè esattamente dove più spesso ti trovi accanto al numero VIN.
Come si presenta in pratica
Nei nostri test, i numeri VIN sul parabrezza, gli adesivi sulla porta, il VIN punzonato sulla torretta dell’ammortizzatore e persino il libretto di circolazione – lo scanner di solito individua il numero VIN corretto in uno-quattro secondi. Alcuni consigli sinceri per velocizzare il tutto:
- L’illuminazione è l’aspetto più importante. Il pulsante della torcia esiste per un motivo – i numeri di telaio (VIN) punzonati nel vano motore le adorano.
- Avvicinati. Il numero VIN dovrebbe più o meno riempire il riquadro di inquadratura.
- Non cercare l’immobilità assoluta. Non hai bisogno di una mano perfettamente ferma – il sistema di votazione è stato progettato proprio per i piccoli movimenti che compie una mano reale.
Sotto il cofano, in breve
Per chi è curioso dal punto di vista tecnico: la rilevazione funziona su un modello basato su YOLO esportato in ONNX, il riconoscimento è un modello PaddleOCR ottimizzato con un alfabeto limitato ai VIN, ed entrambi vengono eseguiti in un unico ambiente di runtime WebAssembly (ONNX Runtime) all’interno di un web worker, grazie al quale la pagina rimane reattiva. La correzione della prospettiva tra i due modelli – raddrizzare la striscia con il numero VIN ruotata – è la stessa matematica utilizzata dalla tua app per la scansione dei documenti. Tutto il resto è un’accurata ingegneria costruita attorno a un unico principio: letture economiche, eseguite spesso, verificate tramite la coerenza.
Insegnare allo scanner che aspetto ha un VIN
Di recente abbiamo aggiunto un terzo «modello» – e non è una rete neurale. È una mappa statistica dell’aspetto dei VIN reali, costruita a partire da oltre mezzo milione di VIN autentici provenienti dai registri automobilistici europei e statunitensi.
Ecco l’idea. Un VIN non è una stringa casuale – ha una grammatica. I primi tre
caratteri identificano il produttore, gli otto successivi codificano il modello,
l’anno e lo stabilimento, e ogni casa automobilistica segue i propri schemi
rigidi (Volkswagen adora WVWZZZ…, BMW ha il suo dialetto). Così, quando l’OCR
legge WVW2ZZ…, il nostro modello linguistico sa che un 2 in quel punto è
migliaia di volte meno probabile di una Z – e preferisce in silenzio la
lettura che il produttore avrebbe effettivamente impresso.
Invece di lasciare che la rete di lettura scelga il singolo carattere più probabile in ogni posizione sperando per il meglio, lo scanner ora esplora più letture candidate contemporaneamente (una tecnica chiamata beam search) e valuta ciascuna sia in base a ciò che dicono i pixel sia in base a ciò che dice la grammatica del VIN. Il vantaggio è massimo proprio dove la scansione è più difficile: i VIN impressi nel metallo nudo, dove un carattere vicino si intrufola nel ritaglio o un carattere consumato scompare. Nel nostro clip di test più difficile la percentuale di fotogrammi letti perfettamente è passata da circa 1 su 9 a 3 su 4.
Una lezione emersa dai test merita di essere condivisa: un lettore più intelligente è un lettore più coerente – anche quando sbaglia in modo coerente. All’inizio lo scanner aggiornato leggeva male una cifra consumata allo stesso modo fotogramma dopo fotogramma, e i fotogrammi si trovavano volentieri d’accordo sulla risposta sbagliata. La soluzione è stata alzare l’asticella: con il modello linguistico attivo, il sistema di voto ora richiede un’ulteriore conferma indipendente prima di accettare un risultato. L’accuratezza è cosa buona; un’accuratezza affidabile è il vero prodotto.
E in linea con tutto quanto sopra: il modello linguistico è un file da 190 KB che si scarica insieme agli altri modelli e viene eseguito interamente sul tuo telefono. Il tuo VIN continua a non lasciare mai il tuo dispositivo.
Prova tu stesso: punta il telefono verso l’angolo del parabrezza di qualsiasi auto e scansiona il numero VIN.