Hvordan virker det?
En lille tur ind under motorhjelmen
Kort fortalt
Sommerfugl ID kombinerer en billedklassifikator med en geografisk og tidsmæssig statistik. Modellen ser på dit billede og ranglister hvor sandsynligt det er hver af de 75 danske dagsommerfuglearter. Bagefter ganger vi den vurdering med hvor ofte arten historisk er observeret i den kommune på den tid af året. De to signaler samlet giver et meget mere robust svar end nogen af delene alene.
1. Modellen
Hjertet er en EfficientNet-V2-S — en ~22 millioner-parameter CNN oprindeligt trænet på ImageNet og finjusteret på ~71.000 feltbilleder fra GBIF og iNaturalist, alle med CC0- eller CC-BY-licens. Modellen trænes ved 384×384 px opløsning i 60 epochs med MixUp + CutMix augmentation. På et hold-out validationssæt rammer den 95,7 % top-1 og 99,5 % top-5 — altså: det rigtige svar ligger næsten altid i top-5.
Vi har bevidst ikke brugt naturbasen.dk's egne billeder til træning, da de ikke er licenseret til offentlig brug. Naturbasen-data bruges udelukkende til prior-trin 2 (rene observationsfakta — ikke ophavsretsbeskyttede).
EfficientNet-V2-S blev valgt fordi den er hurtig på CPU (~300-500 ms pr. billede), har god induktiv bias for tekstur (præcis hvad der adskiller fx forskellige blåfuglearter — antal og placering af pletter på undervingen), og er parameter-effektiv sammenlignet med større modeller.
2. Prioren — geografi og dato
Mange sommerfugle har en stærk fænologi og habitatsbinding. Bølleblåfugl flyver typisk i jyske moser i juni. Dukatsommerfugl er knyttet til kalkpåvirkede enge og topper sent på sommeren. Vi udnytter den viden ved at beregne en empirisk prior baseret på ~104.000 historiske observationer fra naturbasen.dk:
P(art | kommune, måned) — "hvor ofte er den her art observeret i den her kommune i den her måned, blandt alle observationer der opfylder kriterierne?"
Hvis der ikke er nok data for kommune+måned, falder vi tilbage til region+måned, så bare måned, så hele Danmark som sidste udvej. Smoothing (Laplace, α=0,5) sikrer at sjældne arter ikke får nul vægt.
3. Bayes-kombinationen
Vi kombinerer modellens output og prioren i log-rummet:
log P(final) ∝ log P(billede) + w · log P(prior)
Sliderens vægt w styrer balancen: 0 = kun billede, 1 = klassisk Bayes (lige vægt), 3 = stort set kun statistik. Standardværdien er 1. I praksis giver kombinationen et effektivt top-1 hit-rate på ~97-98 %.
4. Hvad sker der ikke?
Når du trykker "Identificér" sker følgende ikke:
- Dit billede gemmes ikke — det forlader ikke vores server efter inferensen
- Vi gemmer ikke din IP-adresse, browser eller andet identificerende
- Vi sender ikke noget til tredjeparter (ingen Google Vision, ingen Cloud AI)
Vi logger et anonymt datapunkt med dato, kommune og hvilken art der vandt — så vi kan vise tælleren på forsiden og indsendelses-feed'et. Se privatlivspolitikken for detaljer.
5. Teknik-stakken
- Model: PyTorch + EfficientNet-V2-S, ~85 MB checkpoint
- Træning: 4× NVIDIA L4 GPU (DDP), 60 epochs, ~3,5 timer
- Backend: FastAPI på en privat Hugging Face Space (CPU)
- Frontend: Next.js 16 (App Router) + React 19
- Træningsbilleder: ~71.000 fra GBIF/iNaturalist (CC0 + CC-BY)
- Observationsdata: ~104.000 obs fra naturbasen.dk (offentlige fakta)
