Jak funguje náš VIN skener?
Ruční zadávání VIN je jeden z těch drobných,
otravných úkolů, které při chybě způsobují reálné ztráty. Byla to 8 nebo B?
5 nebo S? Jeden špatný znak a výpis historie vozidla se vrátí prázdný – nebo, co
hůř, popisuje cizí auto.
Proto jsme vytvořili VIN skener, který běží celý v prohlížeči vašeho
telefonu. Bez instalace aplikace, bez odesílání fotek. V tomto článku
ukážeme, co se ve skutečnosti děje během dvou až tří sekund mezi
namířením fotoaparátu na VIN a zobrazením výsledku – včetně několika věcí,
které nás při vývoji překvapily.
Dvě neuronové sítě, jeden úkol
Když klepnete na „Skenovat”, váš prohlížeč stáhne dva malé modely AI (celkem asi 13 MB – po první návštěvě se uloží do mezipaměti) a spustí je lokálně pomocí WebAssembly. Každý z nich má velmi konkrétní úlohu. Hledač. První model je detektor objektů z rodiny YOLO, který jsme natrénovali, aby dělal přesně jednu věc: našel VIN v záběru z fotoaparátu. Ne „našel text” – našel VIN. Viděl VINy na štítcích u čelního skla, nálepkách na sloupku dveří, vyražené v holém kovu na věžích tlumičů i na tištěných registračních dokumentech, takže rozpozná rozdíl mezi VINem a registrační značkou nebo náhodným číslem dílu. Důležité je, že nekreslí jen obdélník kolem VINu – vrací otočený rámeček, takže zná přesný úhel textu, i když držíte telefon nakřivo nebo fotíte motorový prostor z boku. Čtečka. Vyříznutý a narovnaný pruh pixelů pak putuje do druhého modelu: sítě pro rozpoznávání textu z rodiny PaddleOCR, kterou jsme doladili speciálně na VIN kódy. Univerzální model OCR musí brát v úvahu tisíce znaků – náš jich zná jen 33.
Proč jen 33 znaků? Zajímavost z roku 1981
Písmena I, O a Q jsou ve VIN kódech zakázaná. Norma ISO z roku 1981 je vyloučila právě
proto, že je příliš snadné si je splést s číslicemi 1 a 0 – na vyraženém kovu, na
vybledlých nálepkách a (jak naschvál) v OCR.
Toto pravidlo jsme zapsali přímo do abecedy modelu-čtečky. Je fyzicky
neschopný vypsat O – pokud znak vypadá kulatě, nejbližší
povolenou odpovědí je 0 a tu také vrátí. Celá třída klasických
chyb OCR prostě nemůže nastat. To je největší jednotlivá výhoda
doladění na VIN kódy místo použití hotového OCR enginu.
Jedna fotka je hádání. Video je důkaz.
V rané fázi jsme přijali rozhodnutí, které určilo celý skener: nikdy nevěř jediné snímkové frekvenci. Tvůj fotoaparát dodává nový snímek několikrát za sekundu, takže místo toho, abychom všechno vsadili na jeden záběr, čte skener VIN kód znovu a znovu a nechává snímky hlasovat. Výsledek je přijat teprve tehdy, když se nezávislé snímky shodnou – a práh „shody“ je flexibilní:
- Pokud se stejných 17 znaků objeví dvakrát a vestavěný kontrolní součet VINu je správný, přijmeme výsledek téměř okamžitě.
- Chybí kontrolní součet? (Více o tom níže.) Pak čekáme na třetí potvrzení.
- Pokud se snímky stále neshodnou v jednom znaku, každý kandidát je
vážen podle toho, jak si byl čtečka jistá – znak po znaku.
Toto poslední pravidlo se osvědčilo během testů. V jednom z našich
testovacích klipů – registrační doklad v ostrém světle – odlesk způsobil,
že
0v sériovém čísle vypadala jako8na více než polovině snímků. Samotné opakování by vybralo chybnou odpověď. Ale jistota modelu ohledně těchto8byla stále nižší než při čistých odečtech0a hlasovací logika je takováto: si všiml. Skener prostě počkal o sekundu déle, až se důkazy ustálí – a vrátil správné číslo VIN.
Kontrolní součet, který funguje jen u některých aut
Čísla VIN obsahují skrytý samokontrolní mechanismus: pozice 9 je kontrolní číslice vypočítaná z ostatních 16 znaků. Je to skvělý ověřovací signál – když funguje. Má to ale háček: povinná je pouze pro vozidla prodávaná v Severní Americe. Většina VINů z evropského trhu ji vůbec nepoužívá. Proto náš skener bere kontrolní číslici jako bonus, nikdy jako podmínku. Když sedí, můžeme výsledek přijmout rychleji. Když nesedí, není to chyba – pravděpodobně jde prostě o evropské auto a tíhu přebírá hlasovací systém snímků.
Tvé číslo VIN nikdy neopustí telefon
Stojí za to to říct jasně: snímky z fotoaparátu jsou zpracovávány kompletně ve tvém zařízení. Modely AI se stahují do tvého prohlížeče; tvoje obrázky se nikam neposílají. Neexistuje žádný server, který by prováděl rozpoznávání, žádná fotka uložená v cloudu. Jediné, co opustí tvůj telefon, je finální, 17znakové číslo VIN – a to jen tehdy, když přejdeš na stránku s reportem. Nebyla to jen otázka soukromí. Díky tomu je skener také rychlý (žádné posílání na server a zpět pro každý snímek) a funguje i při slabém signálu v podzemní garáži – tedy přesně tam, kde nejčastěji stojíš vedle čísla VIN.
Jak to vypadá v praxi
V našich testech čísla VIN na čelním skle, štítky na dveřích, VIN vyražený na věži tlumiče a dokonce i technický průkaz – skener většinou najde správné číslo VIN během jedné až čtyř sekund. Několik upřímných tipů, jak to ještě urychlit:
- Světlo je nejdůležitější. Tlačítko baterky tam není bezdůvodně – vyražená čísla VIN v motorovém prostoru je milují.
- Přibliž se blíž. Číslo VIN by mělo zhruba vyplňovat pomocný rámeček.
- Nesnaž se o naprostý klid. Nepotřebuješ dokonale stabilní ruku – systém hlasování byl navržen přesně pro drobné pohyby, které dělá skutečná ruka.
Pod kapotou, ve zkratce
Pro technicky zvídavé: detekce běží na modelu založeném na YOLO, exportovaném do ONNX, rozpoznávání je vyladěný model PaddleOCR s abecedou omezenou na VINy a oba běží v jednom běhovém prostředí WebAssembly (ONNX Runtime) uvnitř web workera, takže stránka zůstává responzivní. Korekce perspektivy mezi dvěma modely – narovnání pootočeného štítku s číslem VIN – je stejná matematika, jakou používá tvoje aplikace pro skenování dokumentů. Všechno ostatní je pečlivé inženýrství kolem jediné zásady: levné čtení, prováděné často, ověřované shodou.
Naučit skener, jak VIN vypadá
Nedávno jsme přidali třetí „model” – a není to neuronová síť. Je to statistická mapa toho, jak vypadají skutečné VINy, sestavená z více než půl milionu pravých VINů z evropských a amerických registrů vozidel.
Tady je ta myšlenka. VIN není náhodný řetězec – má svou gramatiku. První tři
znaky identifikují výrobce, dalších osm kóduje model, rok a závod a každý
výrobce se drží vlastních pevných vzorců (Volkswagen miluje WVWZZZ…, BMW má
svůj vlastní dialekt). Takže když OCR přečte WVW2ZZ…, náš jazykový model ví,
že 2 na tomto místě je tisíckrát méně pravděpodobná než Z – a tiše dává
přednost čtení, které by výrobce skutečně vyrazil.
Místo aby čtecí síť vybírala na každé pozici jediný nejpravděpodobnější znak a doufala v nejlepší výsledek, skener nyní zkoumá několik kandidátních čtení naráz (technika zvaná beam search) a hodnotí každé z nich jak podle toho, co říkají pixely, tak podle toho, co říká gramatika VINu. Přínos je největší přesně tam, kde je skenování nejtěžší: u VINů vyražených do holého kovu, kde se do výřezu vloudí sousední znak nebo opotřebovaný znak vypadne. Na našem nejtěžším testovacím klipu vzrostl podíl dokonale přečtených snímků zhruba z 1 z 9 na 3 ze 4.
Jedno poučení z testování stojí za to sdílet: chytřejší čtenář je konzistentnější čtenář – i tehdy, když se konzistentně mýlí. Zpočátku vylepšený skener špatně četl jednu opotřebovanou číslici snímek za snímkem stejně a snímky se ochotně shodly na špatné odpovědi. Řešením bylo zvednout laťku: s aktivním jazykovým modelem hlasovací systém nyní vyžaduje další nezávislé potvrzení, než výsledek přijme. Přesnost je fajn; důvěryhodná přesnost je ten skutečný produkt.
A v souladu se vším výše uvedeným: jazykový model je soubor o velikosti 190 KB, který se stahuje spolu s ostatními modely a běží zcela na tvém telefonu. Tvůj VIN stále nikdy neopustí tvé zařízení.
Vyzkoušej si to sám: namiř telefon na roh čelního skla libovolného auta a naskenuj číslo VIN.