En kamera mot en väg, en AI-accelerator stor som ett tuggummipaket, och en webbsida som räknar bilar dygnet runt. Den ligger på cars.mer.nu och har rullat oavbrutet sedan i vintras.
Det låter som ett helgprojekt. Detektera bilar är också ett helgprojekt — det är löst sedan länge, och modellen gör jobbet gratis. Att räkna dem är något helt annat.
Det svåra är inte att se bilen
En objektdetektor svarar på frågan ”vad finns i den här bilden?”. Trettio gånger i sekunden får du tillbaka en lista med rutor och etiketter. Bil, lastbil, buss, motorcykel.
Men en bil i bild nummer 1 och en bil i bild nummer 2 är för modellen två helt orelaterade observationer. Den har inget minne. Ska man räkna måste man själv hålla reda på att det är samma bil, följa den mellan bildrutor, avgöra när den har passerat, och se till att den inte räknas igen.
Och verkligheten är full av specialfall som ingen demovideo innehåller. Bilar som stannar i bild. Köer där samma fordon syns i tvåhundra bildrutor i rad. En lastbil som skymmer en personbil halvvägs genom passagen. Vinden som får kameran att skaka så att alla rutor hoppar en centimeter åt sidan samtidigt.
Riktningen — österut eller västerut — kräver dessutom att man sparar en bana, inte bara en position. Det är först när man har banan som man kan säga något meningsfullt om trafiken.

Natten är ett annat program
Det här är den del jag inte hade räknat med.
När det blir mörkt slutar objektdetektorn fungera. Inte ”blir sämre” — den ser ingenting. Det finns ingen bil i bilden att känna igen. Det finns två ljuspunkter och en aning asfalt.
Frestelsen är att leta efter en bättre modell. Rätt svar var att skriva ett annat program. Nattläget struntar i AI helt och hållet och letar i stället efter ljusa fläckar: tillräckligt ljusa, av rimlig storlek, inte för avlånga — och sedan spårar dem över tid. En fläck räknas först när den rört sig mer än åtta procent av bildbredden, vilket sorterar bort gatlyktor, reflexer i en blöt vägbana och grannens altanbelysning. En spärr per höjdnivå i bilden hindrar att samma strålkastarpar räknas två gånger.
Växlingen mellan lägena sker automatiskt på bildens medelljusstyrka. Ingen klocka, inga soltabeller — mulet väder mitt på dagen får den att byta, och det är precis rätt beteende.
Lärdomen är generell: när förutsättningarna ändras i grunden är svaret ofta inte en bättre modell utan en annan metod. Att envisas med samma verktyg för båda fallen hade gett ett system som fungerar halva dygnet.
Från prototyp till något som orkar
Första versionen skrevs i Python. Den fungerade, och den var lagom snabb — ända tills man ville ha fyra megapixlar trettio gånger i sekunden i månader i sträck på en enkortsdator.
Så den skrevs om i C++, med enhetstester och byggsystem.
Och här finns något värt att uppehålla sig vid, för det säger mer om hur jag arbetar i dag än om trafikmätning. Den omskrivningen hade aldrig blivit av om jag skulle ha knappat in den själv. Att skriva om ett fungerande system i ett annat språk är sällan värt en arbetshelg — man gör det inte, man lever med prototypen, och tre år senare är prototypen produktionssystemet.
Med en agent som skriver koden blev det i stället en kväll av att beskriva, granska och rätta. Det som ändras är inte att arbetet går fortare. Det är att tröskeln för vad som är värt att göra ordentligt flyttar sig. Saker som var rationella att strunta i blir plötsligt rationella att göra.
Det finns en baksida, och den är att man lika lätt bygger saker som inte borde byggas alls. Att något går snabbt är inget argument för att det behövs.
Midnatt, och det som är värt att spara
Två fel som är typiska för system som mäter något över tid.
Det första: räknaren nollställdes aldrig vid midnatt. Den bara växte. ”Antal bilar” utan en tidsperiod är inget mätvärde, det är en kilometerräknare.
Det andra var allvarligare. Städningen av gammal data behandlade allt lika: rådata och sammanställning fick samma livslängd. Rådata — varje enskild detektion — är stort och tar plats. Timsammanställningen är minimal och är hela poängen med systemet. Med en gemensam gallring hade all historik försvunnit med jämna mellanrum, och det hade inte märkts förrän någon ville titta bakåt.
Rätt svar var att separera dem: rådata en månad, timsammanställningen drygt ett år. Sammanställningen är billig att lagra och dyr att förlora. Rådata är tvärtom.
Med historiken på plats blev siffrorna intressanta. Tyngsta dygnet hittills: drygt fyratusen personbilar, tolvhundra lastbilar och ett par dussin bussar. Helgerna syns tydligt som dalar i veckodiagrammet, och tung trafik är nästan uteslutande vardag.
Integriteten
En kamera mot en väg med en publik webbsida är inte en oskyldig konstruktion, och den förtjänar att tänkas igenom snarare än att bortförklaras.
All bildbehandling sker på enheten. Ingen video lämnar den, och inga bilder sparas — det som lagras är siffror: tidpunkt, fordonstyp, riktning, färg. Ingen bildruta går till någon molntjänst för analys, av det enkla skälet att acceleratorn sitter i samma låda som kameran. Det är inte en integritetspolicy, det är en arkitektur, och skillnaden är att den inte går att glömma bort att följa.
En detalj från verkligheten: kamerans lysdiod går inte att släcka. Den är hårdvarustyrd och tänds när sensorn strömmar, oavsett vad mjukvaran vill. Det finns ingen inställning, och den enda lösningen är en bit tejp. Ibland vinner den fysiska världen.
Vad jag tar med mig
Modellen är den lätta delen. Detektionen var klar första kvällen. Allt därefter — spårning, dubbelräkning, nattläge, dygnsgränser, gallring — var vanlig systemutveckling utan ett uns AI i sig. Det är ungefär proportionerna i varje AI-projekt jag byggt: den intelligenta biten är en komponent, inte lösningen.
Edge betyder att integritet blir ett designval, inte ett löfte. När beräkningen sker på plats behöver man inte lova att data inte sprids. Den har ingenstans att ta vägen.
Och det roligaste: systemet har nu mätt trafiken utanför i månader, och svarar på frågor jag inte visste att jag hade. Hur mycket tung trafik som passerar en vanlig tisdag. Hur mycket det lugnar sig på söndagar. Att det finns en liten men tydlig puckel vid tretiden på natten. Det är inte nyttigt. Det är bara mycket svårt att sluta titta på.