{"id":18,"date":"2026-04-25T18:00:00","date_gmt":"2026-04-25T16:00:00","guid":{"rendered":"https:\/\/airex.se\/blogg\/bilraknaren-cars-mer-nu\/"},"modified":"2026-08-04T16:26:46","modified_gmt":"2026-08-04T14:26:46","slug":"bilraknaren-cars-mer-nu","status":"publish","type":"post","link":"https:\/\/airex.se\/blogg\/bilraknaren-cars-mer-nu\/","title":{"rendered":"Bilr\u00e4knaren: en kamera, en AI-accelerator och allt det sv\u00e5ra som kommer efter modellen"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">En kamera mot en v\u00e4g, en AI-accelerator stor som ett tuggummipaket, och en webbsida som r\u00e4knar bilar dygnet runt. Den ligger p\u00e5 <a href=\"https:\/\/cars.mer.nu\/\">cars.mer.nu<\/a> och har rullat oavbrutet sedan i vintras.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det l\u00e5ter som ett helgprojekt. Detektera bilar \u00e4r ocks\u00e5 ett helgprojekt \u2014 det \u00e4r l\u00f6st sedan l\u00e4nge, och modellen g\u00f6r jobbet gratis. Att <em>r\u00e4kna<\/em> dem \u00e4r n\u00e5got helt annat.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Det sv\u00e5ra \u00e4r inte att se bilen<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En objektdetektor svarar p\u00e5 fr\u00e5gan &#8221;vad finns i den h\u00e4r bilden?&#8221;. Trettio g\u00e5nger i sekunden f\u00e5r du tillbaka en lista med rutor och etiketter. Bil, lastbil, buss, motorcykel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Men en bil i bild nummer 1 och en bil i bild nummer 2 \u00e4r f\u00f6r modellen tv\u00e5 helt orelaterade observationer. Den har inget minne. Ska man r\u00e4kna m\u00e5ste man sj\u00e4lv h\u00e5lla reda p\u00e5 att det \u00e4r <em>samma<\/em> bil, f\u00f6lja den mellan bildrutor, avg\u00f6ra n\u00e4r den har passerat, och se till att den inte r\u00e4knas igen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Och verkligheten \u00e4r full av specialfall som ingen demovideo inneh\u00e5ller. Bilar som stannar i bild. K\u00f6er d\u00e4r samma fordon syns i tv\u00e5hundra bildrutor i rad. En lastbil som skymmer en personbil halvv\u00e4gs genom passagen. Vinden som f\u00e5r kameran att skaka s\u00e5 att alla rutor hoppar en centimeter \u00e5t sidan samtidigt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Riktningen \u2014 \u00f6sterut eller v\u00e4sterut \u2014 kr\u00e4ver dessutom att man sparar en bana, inte bara en position. Det \u00e4r f\u00f6rst n\u00e4r man har banan som man kan s\u00e4ga n\u00e5got meningsfullt om trafiken.<\/p>\n\n\n\n<figure class=\"airex-fig\"><img decoding=\"async\" src=\"\/blogg\/wp-content\/themes\/airex\/assets\/img\/cars-statistik.webp\" alt=\"Statistikpanel med antal bilar, lastbilar, bussar och fordon i m\u00f6rker\" loading=\"lazy\"><figcaption>Ett dygns r\u00e4kning. Raden &#8217;fordon i m\u00f6rker&#8217; \u00e4r nattl\u00e4gets egen \u2014 d\u00e4r tittar systemet p\u00e5 ljuspunkter, inte p\u00e5 bilar.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Natten \u00e4r ett annat program<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Det h\u00e4r \u00e4r den del jag inte hade r\u00e4knat med.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">N\u00e4r det blir m\u00f6rkt slutar objektdetektorn fungera. Inte &#8221;blir s\u00e4mre&#8221; \u2014 den ser ingenting. Det finns ingen bil i bilden att k\u00e4nna igen. Det finns tv\u00e5 ljuspunkter och en aning asfalt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Frestelsen \u00e4r att leta efter en b\u00e4ttre modell. R\u00e4tt svar var att skriva ett annat program. Nattl\u00e4get struntar i AI helt och h\u00e5llet och letar i st\u00e4llet efter ljusa fl\u00e4ckar: tillr\u00e4ckligt ljusa, av rimlig storlek, inte f\u00f6r avl\u00e5nga \u2014 och sedan sp\u00e5rar dem \u00f6ver tid. En fl\u00e4ck r\u00e4knas f\u00f6rst n\u00e4r den r\u00f6rt sig mer \u00e4n \u00e5tta procent av bildbredden, vilket sorterar bort gatlyktor, reflexer i en bl\u00f6t v\u00e4gbana och grannens altanbelysning. En sp\u00e4rr per h\u00f6jdniv\u00e5 i bilden hindrar att samma str\u00e5lkastarpar r\u00e4knas tv\u00e5 g\u00e5nger.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">V\u00e4xlingen mellan l\u00e4gena sker automatiskt p\u00e5 bildens medelljusstyrka. Ingen klocka, inga soltabeller \u2014 mulet v\u00e4der mitt p\u00e5 dagen f\u00e5r den att byta, och det \u00e4r precis r\u00e4tt beteende.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L\u00e4rdomen \u00e4r generell: n\u00e4r f\u00f6ruts\u00e4ttningarna \u00e4ndras i grunden \u00e4r svaret ofta inte en b\u00e4ttre modell utan en annan metod. Att envisas med samma verktyg f\u00f6r b\u00e5da fallen hade gett ett system som fungerar halva dygnet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fr\u00e5n prototyp till n\u00e5got som orkar<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">F\u00f6rsta versionen skrevs i Python. Den fungerade, och den var lagom snabb \u2014 \u00e4nda tills man ville ha fyra megapixlar trettio g\u00e5nger i sekunden i m\u00e5nader i str\u00e4ck p\u00e5 en enkortsdator.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">S\u00e5 den skrevs om i C++, med enhetstester och byggsystem.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Och h\u00e4r finns n\u00e5got v\u00e4rt att uppeh\u00e5lla sig vid, f\u00f6r det s\u00e4ger mer om hur jag arbetar i dag \u00e4n om trafikm\u00e4tning. <strong>Den omskrivningen hade aldrig blivit av om jag skulle ha knappat in den sj\u00e4lv.<\/strong> Att skriva om ett fungerande system i ett annat spr\u00e5k \u00e4r s\u00e4llan v\u00e4rt en arbetshelg \u2014 man g\u00f6r det inte, man lever med prototypen, och tre \u00e5r senare \u00e4r prototypen produktionssystemet.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Med en agent som skriver koden blev det i st\u00e4llet en kv\u00e4ll av att beskriva, granska och r\u00e4tta. Det som \u00e4ndras \u00e4r inte att arbetet g\u00e5r fortare. Det \u00e4r att <em>tr\u00f6skeln f\u00f6r vad som \u00e4r v\u00e4rt att g\u00f6ra ordentligt<\/em> flyttar sig. Saker som var rationella att strunta i blir pl\u00f6tsligt rationella att g\u00f6ra.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det finns en baksida, och den \u00e4r att man lika l\u00e4tt bygger saker som inte borde byggas alls. Att n\u00e5got g\u00e5r snabbt \u00e4r inget argument f\u00f6r att det beh\u00f6vs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Midnatt, och det som \u00e4r v\u00e4rt att spara<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Tv\u00e5 fel som \u00e4r typiska f\u00f6r system som m\u00e4ter n\u00e5got \u00f6ver tid.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det f\u00f6rsta: r\u00e4knaren nollst\u00e4lldes aldrig vid midnatt. Den bara v\u00e4xte. &#8221;Antal bilar&#8221; utan en tidsperiod \u00e4r inget m\u00e4tv\u00e4rde, det \u00e4r en kilometerr\u00e4knare.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Det andra var allvarligare. St\u00e4dningen av gammal data behandlade allt lika: r\u00e5data och sammanst\u00e4llning fick samma livsl\u00e4ngd. R\u00e5data \u2014 varje enskild detektion \u2014 \u00e4r stort och tar plats. Timsammanst\u00e4llningen \u00e4r minimal och \u00e4r hela po\u00e4ngen med systemet. Med en gemensam gallring hade all historik f\u00f6rsvunnit med j\u00e4mna mellanrum, och det hade inte m\u00e4rkts f\u00f6rr\u00e4n n\u00e5gon ville titta bak\u00e5t.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00e4tt svar var att separera dem: r\u00e5data en m\u00e5nad, timsammanst\u00e4llningen drygt ett \u00e5r. Sammanst\u00e4llningen \u00e4r billig att lagra och dyr att f\u00f6rlora. R\u00e5data \u00e4r tv\u00e4rtom.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Med historiken p\u00e5 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 \u00e4r n\u00e4stan uteslutande vardag.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Integriteten<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">En kamera mot en v\u00e4g med en publik webbsida \u00e4r inte en oskyldig konstruktion, och den f\u00f6rtj\u00e4nar att t\u00e4nkas igenom snarare \u00e4n att bortf\u00f6rklaras.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">All bildbehandling sker p\u00e5 enheten. Ingen video l\u00e4mnar den, och inga bilder sparas \u2014 det som lagras \u00e4r siffror: tidpunkt, fordonstyp, riktning, f\u00e4rg. Ingen bildruta g\u00e5r till n\u00e5gon molntj\u00e4nst f\u00f6r analys, av det enkla sk\u00e4let att acceleratorn sitter i samma l\u00e5da som kameran. Det \u00e4r inte en integritetspolicy, det \u00e4r en arkitektur, och skillnaden \u00e4r att den inte g\u00e5r att gl\u00f6mma bort att f\u00f6lja.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En detalj fr\u00e5n verkligheten: kamerans lysdiod g\u00e5r inte att sl\u00e4cka. Den \u00e4r h\u00e5rdvarustyrd och t\u00e4nds n\u00e4r sensorn str\u00f6mmar, oavsett vad mjukvaran vill. Det finns ingen inst\u00e4llning, och den enda l\u00f6sningen \u00e4r en bit tejp. Ibland vinner den fysiska v\u00e4rlden.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Vad jag tar med mig<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Modellen \u00e4r den l\u00e4tta delen.<\/strong> Detektionen var klar f\u00f6rsta kv\u00e4llen. Allt d\u00e4refter \u2014 sp\u00e5rning, dubbelr\u00e4kning, nattl\u00e4ge, dygnsgr\u00e4nser, gallring \u2014 var vanlig systemutveckling utan ett uns AI i sig. Det \u00e4r ungef\u00e4r proportionerna i varje AI-projekt jag byggt: den intelligenta biten \u00e4r en komponent, inte l\u00f6sningen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Edge betyder att integritet blir ett designval, inte ett l\u00f6fte.<\/strong> N\u00e4r ber\u00e4kningen sker p\u00e5 plats beh\u00f6ver man inte lova att data inte sprids. Den har ingenstans att ta v\u00e4gen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Och det roligaste:<\/strong> systemet har nu m\u00e4tt trafiken utanf\u00f6r i m\u00e5nader, och svarar p\u00e5 fr\u00e5gor jag inte visste att jag hade. Hur mycket tung trafik som passerar en vanlig tisdag. Hur mycket det lugnar sig p\u00e5 s\u00f6ndagar. Att det finns en liten men tydlig puckel vid tretiden p\u00e5 natten. Det \u00e4r inte nyttigt. Det \u00e4r bara mycket sv\u00e5rt att sluta titta p\u00e5.<\/p>\n\n","protected":false},"excerpt":{"rendered":"<p>Att detektera bilar \u00e4r l\u00f6st sedan l\u00e4nge. Att r\u00e4kna dem \u00e4r n\u00e5got helt annat \u2014 och n\u00e4r det blir m\u00f6rkt slutar modellen fungera och man f\u00e5r skriva ett annat program.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-18","post","type-post","status-publish","format-standard","hentry","category-bygget"],"_links":{"self":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/18","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/comments?post=18"}],"version-history":[{"count":1,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/18\/revisions"}],"predecessor-version":[{"id":51,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/posts\/18\/revisions\/51"}],"wp:attachment":[{"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/media?parent=18"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/categories?post=18"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/airex.se\/blogg\/wp-json\/wp\/v2\/tags?post=18"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}