Hogyan működik a VIN‑szkennerünk?
A VIN‑szám kézi begépelése azon apró,
idegesítő feladatok egyike, amelyek hibánál valós veszteséget okozhatnak. 8 volt, vagy B?
5 vagy S? Egyetlen hibás karakter, és a járműelőélet‑jelentés üresen jön vissza – vagy, ami
még rosszabb, egy másik autót ír le.
Ezért készítettünk egy VIN‑szkennert, amely teljes egészében a telefonod
böngészőjében fut. Nincs app‑telepítés, nincs képfeltöltés. Ebben a bejegyzésben
megmutatjuk, mi történik valójában abban a két‑három másodpercben, amíg
a kamerát a VIN‑számra irányítod, majd meglátod az eredményt – beleértve néhány dolgot,
ami minket is meglepett a fejlesztés során.
Két neurális háló, egy feladat
Amikor megérinted a „Szkennelés” gombot, a böngésződ letölt két kisméretű MI‑modellt (összesen körülbelül 13 MB – az első látogatás után gyorsítótárba kerülnek), és helyben futtatja őket WebAssembly segítségével. Mindegyiknek nagyon konkrét szerepe van. Kereső. Az első modell egy YOLO‑családba tartozó objektumdetektor, amelyet kifejezetten egy dologra tanítottunk be: hogy megtalálja a VIN‑számot a kamera képkockáján. Nem „szöveget talál” – VIN‑t talál. Látott már VIN‑számokat a szélvédőnél lévő adattáblán, az ajtóoszlop‑matricán, nyers fémbe ütve a rugótornyokon, valamint nyomtatott forgalmi dokumentumokon, ezért felismeri a különbséget a VIN‑szám, a rendszámtábla vagy egy véletlen alkatrészszám között. Ami fontos, nem egyszerűen egy téglalapot rajzol a VIN köré – hanem elforgatott keretet ad vissza, így pontosan ismeri a szöveg dőlésszögét, még akkor is, ha ferdén tartod a telefont, vagy oldalról fotózod a motorteret.
Olvasó. A kivágott és kiegyenesített pixelsáv ezután a második modellhez kerül: egy, a PaddleOCR-családba tartozó szövegfelismerő hálózathoz, amelyet kifejezetten a VIN-számokra hangoltunk finomra. Az univerzális OCR-modellnek több ezer karakterrel kell számolnia – a miénk csak 33-at ismer. karakterrel – a miénk csak 33-at ismer.
Miért csak 33 karakter? Egy érdekesség 1981-ből
Az I, O és Q betűk használata a VIN-számokban tiltott. Az 1981-es ISO-szabvány éppen azért zárta ki őket,
mert túl könnyű összetéveszteni őket az 1-es és 0-s számjegyekkel – a beütött fémen, a
kifakult matricákon és (iróniával élve) az OCR-ben is.
Ezt a szabályt közvetlenül beépítettük az olvasó-modell ábécéjébe. Fizikailag
képtelen kiírni az O betűt – ha a jel kereknek látszik, a legközelebbi
megengedett válasz a 0, és pontosan ezt jelenti ki. Az OCR-hibák egy teljes klasszikus
osztálya egyszerűen nem fordulhat elő. Ez a legnagyobb egyedi előnye annak, hogy
a VIN-számokra hangoltuk a modellt a kész OCR-motor használata helyett.
Egyetlen fotó csak tippelés. A videó bizonyíték.
A fejlesztés korai szakaszában hoztunk egy döntést, amely az egész szkennert meghatározta: soha ne bízz egyetlen képkockában. A kamerád másodpercenként több új képkockát is szolgáltat, ezért ahelyett, hogy mindent egy felvételre tennénk fel, a szkenner újra és újra beolvassa a VIN-számot, és hagyja, hogy a képkockák szavazzanak. Az eredményt csak akkor fogadjuk el, ha a független képkockák egyeznek – és az „egyezés” küszöbe rugalmas:
- Ha ugyanaz a 17 karakter kétszer is megjelenik és a VIN beépített ellenőrzőösszege helyes, az eredményt szinte azonnal elfogadjuk.
- Nincs ellenőrzőösszeg? (Erről bővebben lejjebb.) Akkor megvárjuk a harmadik megerősítést.
- Ha a képkockák továbbra sem értenek egyet egyetlen karakterben, minden jelöltet
az alapján súlyozunk, hogy az olvasó mennyire volt biztos benne – karakterről karakterre.
Ez az utolsó szabály a tesztek során bizonyította az értékét. Az egyik tesztklipünkön – egy erős fényben készült
forgalmi engedélyen – a visszaverődés miatt a sorozatszámban lévő
0a képkockák több mint felén8-nak látszott. Az egyszerű ismétlés a hibás választ választotta volna ki. A modellnek azonban ezekben a8-asokban való bizonyossága alacsony volt. következetesen alacsonyabb, mint a tiszta0leolvasásoknál, a szavazási logika pedig a következő: észrevette. A szkenner egyszerűen csak egy másodperccel tovább várt, amíg a bizonyítékok stabilizálódtak – és visszaadta a helyes VIN-számot.
Ellenőrző összeg, amely csak bizonyos autóknál működik
A VIN-számok tartalmaznak egy rejtett önellenőrző mechanizmust: a 9. pozíció egy ellenőrző számjegy, amelyet a többi 16 karakterből számítanak ki. Ez remek ellenőrző jel – amikor működik. Van azonban egy csavar: csak az Észak-Amerikában értékesített járműveknél kötelező. A legtöbb, európai piacra szánt VIN egyáltalán nem használja. egyáltalán nem használja. Ezért a szkennerünk az ellenőrző számjegyet bónuszként kezeli, soha nem követelményként. Ha stimmel, a találatot gyorsabban elfogadhatjuk. Ha nem stimmel, az még nem hiba – valószínűleg egyszerűen egy európai autóról van szó, és a terhet a képkocka-szavazási rendszer veszi át.
A VIN-számod soha nem hagyja el a telefonodat
Érdemes ezt világosan kimondani: a kamera képkockái teljes egészében a saját eszközödön kerülnek feldolgozásra. Az MI-modellek a böngésződbe töltődnek le; a képeid soha, sehova nem kerülnek elküldésre. Nincs szerver, amely a felismerést végzi, és nincs a felhőben tárolt fénykép. Az egyetlen dolog, ami elhagyja a telefonodat, a végső, 17 karakteres VIN-szám – és az is csak akkor, amikor továbblépsz a jelentés oldalára. Ez nem kizárólag adatvédelmi döntés volt. Ennek köszönhetően a szkenner gyors is (nincs oda-vissza kommunikáció a szerverrel minden egyes képkockánál), és gyenge térerő mellett is működik a mélygarázsban – vagyis pontosan ott, ahol a leggyakrabban a VIN-szám mellett állsz.
Hogyan néz ki ez a gyakorlatban
Tesztjeink során az üvegen lévő VIN-szám, az ajtóoszlop-matricák, a rugótornyon beütött VIN, sőt még a forgalmi engedély is – a szkenner általában egy–négy másodperc alatt beméri a helyes VIN-számot. Néhány őszinte tipp, hogyan gyorsíthatod fel ezt:
- A fény a legfontosabb tényező. A zseblámpa gombja nem véletlenül létezik – a motortérben beütött VIN-számokat egyszerűen imádja.
- Menj közel. A VIN-számnak nagyjából ki kell töltenie a segédkeret ablakát.
- Ne görcsölj a mozdulatlanságon. Nincs szükség tökéletesen stabil kézre – a szavazórendszert kifejezetten azokra az apró mozgásokra terveztük, amelyeket egy valódi kéz természetesen végez.
A motorháztető alatt, röviden
A technika iránt érdeklődőknek: a detekció egy YOLO-alapú modellen fut, amelyet ONNX-formátumba exportáltunk, a felismerés pedig egy finomhangolt PaddleOCR-modell, VIN-ekre korlátozott ábécével; mindkettő ugyanabban a WebAssembly futtatókörnyezetben (ONNX Runtime) fut egy web workerben, így az oldal reszponzív marad. A két modell közötti perspektívakorrekció – a VIN-számot tartalmazó, elfordult csík kiegyenesítése – ugyanazt a matematikát használja, mint a dokumentumszkennelő alkalmazásod. Minden más gondos mérnöki munka egyetlen alapelv köré szervezve: olcsó leolvasások, gyakran végezve, egyezőséggel ellenőrizve.
Megtanítjuk a szkennernek, hogy néz ki egy VIN
Nemrég hozzáadtunk egy harmadik „modellt” – és ez nem neurális háló. Ez egy statisztikai térkép arról, hogy néznek ki a valódi VIN-ek, több mint félmillió valódi VIN alapján, amelyek európai és amerikai járműnyilvántartásokból származnak.
Íme az ötlet. Egy VIN nem véletlenszerű karakterlánc – nyelvtana van. Az első
három karakter a gyártót azonosítja, a következő nyolc a modellt, az évjáratot
és a gyárat kódolja, és minden gyártó a saját merev mintáit követi (a Volkswagen
imádja a WVWZZZ… formát, a BMW-nek megvan a maga dialektusa). Így amikor az
OCR beolvassa a WVW2ZZ… szöveget, a nyelvi modellünk tudja, hogy egy 2 azon
a helyen ezerszer valószínűtlenebb, mint egy Z – és csendben azt az olvasatot
részesíti előnyben, amelyet a gyártó ténylegesen beütött volna.
Ahelyett, hogy hagynánk, hogy az olvasó háló minden pozíción a legvalószínűbb egyetlen karaktert válassza ki, és a legjobbban reménykednénk, a szkenner most egyszerre több lehetséges olvasatot vizsgál (ezt a technikát beam search néven ismerik), és mindegyiket egyszerre pontozza aszerint, hogy mit mondanak a pixelek, és aszerint is, hogy mit mond a VIN nyelvtana. A nyereség pontosan ott a legnagyobb, ahol a szkennelés a legnehezebb: a csupasz fémbe ütött VIN-eknél, ahol egy szomszédos karakter besurran a kivágásba, vagy egy kopott karakter kiesik. A legnehezebb tesztfelvételünkön a tökéletesen beolvasott képkockák aránya nagyjából 9-ből 1-ről 4-ből 3-ra nőtt.
A tesztelésből egy tanulság megér egy megosztást: az okosabb olvasó következetesebb olvasó – akkor is, amikor következetesen téved. Kezdetben a továbbfejlesztett szkenner egy kopott számjegyet képkockáról képkockára ugyanúgy olvasott félre, és a képkockák boldogan megegyeztek a rossz válaszban. A megoldás az volt, hogy magasabbra tettük a lécet: aktív nyelvi modell mellett a szavazórendszer most egy további független megerősítést követel meg, mielőtt elfogadna egy eredményt. A pontosság jó dolog; a megbízható pontosság az igazi termék.
És összhangban minden fentivel: a nyelvi modell egy 190 KB-os fájl, amely a többi modellel együtt töltődik le, és teljes egészében a telefonodon fut. A VIN-ed továbbra sem hagyja el soha az eszközödet.
Próbáld ki te is: irányítsd a telefonodat bármelyik autó szélvédőjének sarkára, és olvasd be a VIN-számot.