Jak działa nasz skaner VIN?

Wpisywanie numeru VIN ręcznie to jedno z tych drobnych,
irytujących zadań, które przy pomyłce powodują realne straty. Czy to była 8 czy B?
5 czy S? Jeden zły znak i raport historii pojazdu wraca pusty – albo, co
gorsza, opisuje cudzy samochód.
Dlatego zbudowaliśmy skaner VIN, który działa w całości w przeglądarce Twojego telefonu. Bez instalowania aplikacji, bez wysyłania zdjęć. W tym wpisie pokażemy, co naprawdę dzieje się w ciągu dwóch, trzech sekund między skierowaniem aparatu na numer VIN a zobaczeniem wyniku – w tym kilka rzeczy, które zaskoczyły nas podczas budowy.
Dwie sieci neuronowe, jedno zadanie
Gdy dotkniesz „Skanuj”, Twoja przeglądarka pobiera dwa niewielkie modele AI (łącznie około 13 MB – zapisywane w pamięci podręcznej po pierwszej wizycie) i uruchamia je lokalnie za pomocą WebAssembly. Każdy z nich ma bardzo konkretną rolę.
Wypatrywacz. Pierwszy model to detektor obiektów z rodziny YOLO, który wytrenowaliśmy, by robił dokładnie jedną rzecz: znajdował numer VIN w klatce z aparatu. Nie „znajdował tekst” – znajdował VIN. Widział numery VIN na tabliczkach przy szybie, naklejkach na słupku drzwiowym, wybite w gołym metalu na wieżyczkach amortyzatorów oraz na drukowanych dokumentach rejestracyjnych, więc rozpoznaje różnicę między numerem VIN a tablicą rejestracyjną czy przypadkowym numerem części. Co ważne, nie rysuje po prostu ramki wokół VIN-u – zwraca obróconą ramkę, dzięki czemu zna dokładny kąt tekstu, nawet gdy trzymasz telefon krzywo albo fotografujesz komorę silnika z boku.
Czytnik. Wycięty i wyprostowany pasek pikseli trafia następnie do drugiego modelu: sieci rozpoznającej tekst z rodziny PaddleOCR, którą dostroiliśmy specjalnie pod numery VIN. Uniwersalny model OCR musi brać pod uwagę tysiące znaków – nasz zna tylko 33.
Dlaczego tylko 33 znaki? Ciekawostka z 1981 roku
Litery I, O i Q są w numerach VIN zakazane. Norma ISO z 1981 roku wykluczyła je właśnie dlatego, że zbyt łatwo pomylić je z cyframi 1 i 0 – na wybijanym metalu, na wyblakłych naklejkach i (jak na ironię) w OCR.
Wpisaliśmy tę zasadę wprost w alfabet modelu-czytnika. Jest on fizycznie
niezdolny do wypisania O – jeśli znak wygląda na okrągły, najbliższą
dozwoloną odpowiedzią jest 0 i to właśnie zgłasza. Cała klasa klasycznych
błędów OCR po prostu nie może wystąpić. To największa pojedyncza korzyść z
dostrojenia pod numery VIN zamiast używania gotowego silnika OCR.
Jedno zdjęcie to zgadywanie. Wideo to dowód.
Na wczesnym etapie podjęliśmy decyzję, która ukształtowała cały skaner: nigdy nie ufaj pojedynczej klatce.
Twój aparat dostarcza nową klatkę kilka razy na sekundę, więc zamiast stawiać wszystko na jednym ujęciu, skaner odczytuje numer VIN raz za razem i pozwala klatkom głosować. Wynik jest akceptowany dopiero wtedy, gdy niezależne klatki się zgadzają – a próg „zgodności” jest elastyczny:
- Jeśli te same 17 znaków pojawi się dwa razy i wbudowana suma kontrolna VIN-u jest poprawna, akceptujemy wynik niemal natychmiast.
- Brak sumy kontrolnej? (Więcej o tym poniżej.) Wtedy czekamy na trzecie potwierdzenie.
- Jeśli klatki wciąż nie zgadzają się co do jednego znaku, każdy kandydat jest ważony tym, jak pewny był czytnik – znak po znaku.
Ta ostatnia zasada udowodniła swoją wartość podczas testów. W jednym z naszych
klipów testowych – dokument rejestracyjny w ostrym świetle – odblask sprawił,
że 0 w numerze seryjnym wyglądało jak 8 na ponad połowie klatek. Samo
powtarzanie wybrałoby błędną odpowiedź. Ale pewność modelu co do tych 8 była
niezmiennie niższa niż przy czystych odczytach 0, a logika głosowania to
zauważyła. Skaner po prostu poczekał sekundę dłużej, aż dowody się
ustabilizują – i zwrócił poprawny numer VIN.
Suma kontrolna, która działa tylko w niektórych samochodach
Numery VIN zawierają ukryty mechanizm samokontroli: pozycja 9 to cyfra kontrolna obliczana z pozostałych 16 znaków. To świetny sygnał weryfikacyjny – kiedy działa. Jest jednak haczyk: jest ona obowiązkowa tylko dla pojazdów sprzedawanych w Ameryce Północnej. Większość VIN-ów z rynku europejskiego w ogóle jej nie używa.
Dlatego nasz skaner traktuje cyfrę kontrolną jako bonus, nigdy jako wymóg. Gdy się zgadza, możemy zaakceptować wynik szybciej. Gdy się nie zgadza, to nie błąd – to prawdopodobnie po prostu europejski samochód, a ciężar bierze na siebie system głosowania klatek.
Twój numer VIN nigdy nie opuszcza telefonu
Warto to jasno powiedzieć: klatki z aparatu są przetwarzane w całości na Twoim urządzeniu. Modele AI są pobierane do Twojej przeglądarki; Twoje obrazy nigdy nigdzie nie są wysyłane. Nie ma serwera wykonującego rozpoznawanie, nie ma zdjęcia przechowywanego w chmurze. Jedyną rzeczą, która opuszcza Twój telefon, jest końcowy, 17-znakowy numer VIN – i to tylko wtedy, gdy przejdziesz do strony z raportem.
To nie była wyłącznie decyzja związana z prywatnością. Dzięki temu skaner jest też szybki (żadnego kursowania do serwera i z powrotem dla każdej klatki) i działa przy słabym zasięgu w podziemnym garażu – czyli dokładnie tam, gdzie najczęściej stoisz obok numeru VIN.
Jak to wygląda w praktyce
Na naszych testach numery VIN na szybie, naklejki na drzwiach, VIN wybity na wieżyczce amortyzatora, a nawet dokument rejestracyjny – skaner zwykle namierza poprawny numer VIN w jedną do czterech sekund. Kilka szczerych wskazówek, jak to przyspieszyć:
- Światło ma największe znaczenie. Przycisk latarki istnieje nie bez powodu – wybijane numery VIN w komorze silnika je uwielbiają.
- Podejdź blisko. Numer VIN powinien mniej więcej wypełniać ramkę pomocniczą.
- Nie zabiegaj o bezruch. Nie potrzebujesz idealnie stabilnej ręki – system głosowania został zaprojektowany dokładnie pod drobne ruchy, jakie wykonuje prawdziwa ręka.
Pod maską, w skrócie
Dla technicznie ciekawych: detekcja działa na modelu opartym na YOLO wyeksportowanym do ONNX, rozpoznawanie to dostrojony model PaddleOCR z alfabetem ograniczonym do VIN-ów, a oba wykonują się w jednym środowisku uruchomieniowym WebAssembly (ONNX Runtime) wewnątrz web workera, dzięki czemu strona pozostaje responsywna. Korekcja perspektywy między dwoma modelami – prostowanie obróconego paska z numerem VIN – to ta sama matematyka, której używa Twoja aplikacja do skanowania dokumentów. Cała reszta to staranna inżynieria wokół jednej zasady: tanie odczyty, wykonywane często, weryfikowane przez zgodność.
Nauczyliśmy skaner, jak wygląda VIN
Niedawno dodaliśmy trzeci „model” – i nie jest to sieć neuronowa. To statystyczna mapa tego, jak wyglądają prawdziwe numery VIN, zbudowana z ponad pół miliona autentycznych VIN-ów z europejskich i amerykańskich rejestrów pojazdów.
Oto pomysł. VIN nie jest losowym ciągiem znaków – ma swoją gramatykę. Pierwsze
trzy znaki identyfikują producenta, kolejnych osiem koduje model, rok i
fabrykę, a każdy producent trzyma się własnych sztywnych wzorców (Volkswagen
uwielbia WVWZZZ…, BMW ma swój własny dialekt). Więc kiedy OCR odczyta
WVW2ZZ…, nasz model językowy wie, że 2 w tym miejscu jest tysiące razy
mniej prawdopodobna niż Z – i po cichu preferuje odczyt, który producent
faktycznie by wybił.
Zamiast pozwalać sieci odczytującej wybierać pojedynczy, najbardziej prawdopodobny znak na każdej pozycji i liczyć na najlepsze, skaner bada teraz kilka kandydujących odczytów naraz (technika zwana beam search) i ocenia każdy z nich zarówno pod kątem tego, co mówią piksele, jak i tego, co mówi gramatyka VIN-u. Zysk jest największy dokładnie tam, gdzie skanowanie jest najtrudniejsze: przy numerach VIN wybijanych w gołym metalu, gdzie sąsiedni znak wkrada się w kadr albo starty znak znika. Na naszym najtrudniejszym klipie testowym odsetek klatek odczytanych bezbłędnie wzrósł z mniej więcej 1 na 9 do 3 na 4.
Jedną lekcją z testów warto się podzielić: mądrzejszy czytnik jest bardziej konsekwentny – również wtedy, gdy konsekwentnie się myli. Na początku ulepszony skaner błędnie odczytywał jedną startą cyfrę tak samo, klatka po klatce, a klatki ochoczo zgadzały się na złą odpowiedź. Rozwiązaniem było podniesienie poprzeczki: z aktywnym modelem językowym system głosowania wymaga teraz dodatkowego, niezależnego potwierdzenia, zanim zaakceptuje wynik. Dokładność jest miła; dokładność godna zaufania to właściwy produkt.
I zgodnie ze wszystkim powyżej: model językowy to plik o rozmiarze 190 KB, który pobiera się razem z pozostałymi modelami i działa w całości na Twoim telefonie. Twój VIN wciąż nigdy nie opuszcza Twojego urządzenia.
Wypróbuj sam: skieruj telefon na róg szyby dowolnego samochodu i zeskanuj numer VIN.