Poenget er å spørre én gang per kort, ikke én gang per bilde
Kortgjenkjenning fungerer allerede. Rett en god modell mot et samlekort, så får du navnet, settet og nummeret tilbake på omtrent et halvt sekund. Det er når du kjører dette på video at det faller sammen, ikke teknisk, men på grunn av det rene volumet.
Video er stort sett gjentakelse. Et kort som holdes opp i fire sekunder med femten bilder i sekundet, er seksti bilder av ett og samme kort, og spør du et identifiseringsendepunkt seksti ganger, får du det samme svaret seksti ganger. Hver naiv pipeline for strømming gjør akkurat det, og derfor har analyse av strømmer ry på seg for å være noe bare en plattform med solid finansiering har råd til.
cardstream finnes for å fjerne den gjentakelsen. Det er en liten tilstandsmaskin mellom videoen din og gjenkjenningskallet, bygd nesten bare på signaler den regner ut selv: har scenen roet seg, er dette det samme kortet som for et øyeblikk siden, er det i det hele tatt et kort i bildet? Kallet sendes når et virkelig nytt kort ligger i ro, og ellers ikke. Alt annet kjører på maskinvare du allerede eier.
Ett kall per kort, ikke per bilde
En time med show i femten bilder i sekundet, som er toppen av det prosjektet er testet for, og rundt hundre unike kort holdt opp foran linsen. To måter å analysere nøyaktig den samme videoen på:
identifiseringskall, ett per bilde, og de fleste stiller på nytt et spørsmål som ble besvart et øyeblikk tidligere.
identifiseringskall, ett per unikt kort, uansett bildefrekvens og uansett hvor lenge du holder opp hvert kort.
Rundt 540 ganger færre kall, og forskjellen er ikke et talltriks: den er hele designet. Hold kortet i ro, og tallet står stille. Kjør kameraet raskere, og tallet står stille. Antallet kall følger kortene du viser, ikke timene du strømmer.
Hvem som holder den i gang
Laget av folk som leverer gjenkjenning
cardstream kommer fra teamet bak Ximilars gjenkjenning av samleobjekter. Endepunktene for identifisering som den kaller, er de samme som vi kjører i produksjon, så klienten og tjenesten vedlikeholdes av de samme folkene.
Arbeidet skjer i det åpne
Hele pakken ligger på GitHub: tilstandsmaskinen, begge driftsformene og brukergrensesnittet i nettleseren. Ingenting av beslutningslogikken er gjemt bak en tjeneste du ikke kan inspisere.
Testet uten nettverk
Hele testsamlingen kjører frakoblet, med etterligninger i stedet for modellfilene og HTTP-kallene. Lag en fork av repoet på en bærbar uten API-nøkkel, og du kan fortsatt se om du har ødelagt noe.
Det koden ikke har lov til å glemme
-
Ett kall per kort, ikke per bilde
Hver designbeslutning starter her. Hvis et signal kan regnes ut lokalt, kjører det før det ene kallet som forlater maskinen.
-
Én kopi av beslutningslogikken
Spørsmålet om når et kall skal sendes, avgjøres i nøyaktig én modul. Ikke spredt over en driver, en transport og et grensesnitt der tre personer kan endre den på tre måter, men én fil du kan lese i ett strekk.
-
Driverne holdes tynne
Planlegging, logging og I/O hører til driveren; hva som regnes som et nytt kort, hører til motoren. Å bytte hvordan bildene kommer inn, endrer aldri i det stille når et kall går ut.
-
Ingenting blokkerer bildeløkken
Dekoding, deteksjon, HTTP og disk kjører alle utenfor løkken. En treg identifisering koster ett bilde; den gjør aldri strømmen din til en forsinkelse som bare vokser.
-
Ingen innlåsing hos noen leverandør, heller ikke hos oss
Identifiseringskallet er ett utskiftbart trinn bak et lite grensesnitt. Hvert filter, hver struping og hver hurtigbuffer fungerer videre om du peker det et helt annet sted.
-
På din egen maskin som standard
Din maskinvare, din nøkkel, din video. I klientmodus er ett enkelt utsnitt per unikt kort det eneste som forlater maskinen, med mindre du velger å lagre showet på din egen Ximilar-konto.
Det kortene har lært oss
Noe av dette er så lite intuitivt at vi skriver det ned der neste person finner det: i repoet, ved siden av koden det gjelder.
Et godt ment hint kan koste presisjon
Forteller du endepunktet hvilket spill et kort er fra, slår det av sin egen klassifiserer for skriftsystem, som da faller tilbake til latin, og et japansk kort får i det stille treff på den engelske utgaven. Målt, ikke gjettet, og derfor regnes det som en feil å angi et spill uten skriftsystem.
Et litt romslig utsnitt gir bedre treff
Et tett utsnitt rundt kortet ser riktig ut, men gir dårligere resultater. Utsnittet som sendes, har en bevisst marg, for litt kontekst slår en ren kant.
Å komme seg videre slår å late som
Når et kall henger forbi tidsavbruddet, løsner pipelinen seg selv og går videre i stedet for å vente på et resultat som kanskje aldri kommer. Begrensningen er skrevet ned i repoet i stedet for å bli skjult.
Les den, kjør den, send endringer
Repoet er offentlig: én installerbar Python-pakke med uavhengige tillegg og et brukergrensesnitt i nettleseren. Modellvektene for lokalisering og embeddings er våre, trent og publisert under Apache-2.0 sammen med utgivelsene. Issues og pull requests er velkomne, særlig rapporter fra ekte show, som avdekker ting ingen testrigg gjør.
Selve gjenkjenningen er Ximilars endepunkt og vil alltid være det; det er den delen som har kortdatabasen bak seg. Alt rundt den kan du endre som du vil.
Åpen kildekode. På din egen maskin. Din strøm, ditt oppsett.
Ingen plattform i midten, ingen lisens per bruker: koble til Ximilars API eller ditt eget identifiseringssystem, så kaller cardstream det én gang per unikt kort i stedet for én gang per bilde. Enten du kjører breaks på Whatnot, holder et show i Fanatics Live-stil eller strømmer fra ditt eget oppsett for livesalg, kan du kjøre cardstream allerede i kveld på maskinvaren du har.