Elk vangstrecord is een punt op de kaart — nauwkeurig, maar schaars: niemand bemonstert élke overhangende wilg. En juist in die meters denkt een visser: die ene wilg, de T-splitsing in het kanaal, de rietkraag, de omgevallen boom. Kun je die fijne structuur uit luchtfoto's leren — overal, niet alleen waar toevallig iemand langskwam — en koppelen aan welke vis er zit?
Eerst de doodlopende weg
De voor de hand liggende aanpak: label met de hand een paar honderd voorbeelden — omgevallen boom, waterlelie, rietrand, brug, T-splitsing — en train daar een classificatiemodel op. We bouwden het labelgereedschap en begonnen. Toen viel het kwartje: door zelf de klassen te kiezen, zet je een plafond op het model. Het kan nooit iets vinden wat wij niet al bedacht hadden. En er zijn waarschijnlijk honderden visuele patronen die Nederlandse wateren onderscheiden — waterkleur, oevermateriaal, stedelijk versus landelijk, algentint — die we nooit met de hand zouden benoemen.
Het model zichzelf laten ontdekken
Dus draaiden we het om. We knippen luchtfoto's in kleine stukjes en halen ze door DINOv2 — een open beeldmodel van Meta dat zonder labels leert wat beelden van elkaar onderscheidt. Geen voorgeschreven klassen; het model bouwt zelf een landkaart van visuele patronen. Vervolgens clusteren we die patronen, en dan komt de truc die wij de vangst-scheidsrechter noemen: de vangstdata zelf bepaalt welke clusters ertoe doen. Voor elk cluster kijken we welke vissoorten er in die gridcellen vaker voorkomen dan gemiddeld.
Wat we handmatig labelen — en waarom we het volhouden
Self-supervised leren vindt de patronen; om ze te benoemen en per soort te toetsen, labelen we alsnog met de hand — maar nu gericht. Bruggen, omgevallen bomen, T-splitsingen, waterlelievelden, kleine eilanden. Voor elk zoeken we: welke soorten trekt deze structuur aan, en welke juist niet?
Sommige signalen zijn sterk en consistent. Waterlelievelden zijn positief voor zeelt, maar negatief voor snoekbaars — en dat is ecologisch precies logisch. Andere zijn een stuk grilliger. En die grilligheid is de reden dat dit hoofdstuk nog niet af is.
De brug-paradox — en waarom we hem níét publiceren
Neem bruggen. Onze handmatige analyse zei: bij bruggen zit ondergemiddeld veel vis — negatief voor karper, brasem, snoek, baars en snoekbaars. Een schijnbaar nette conclusie: 'vis mijdt bruggen.' Maar tegelijk bleef ons beeldmodel bruggen juist aanwijzen als kansrijke plek. Twee analyses op dezelfde data, tegengestelde antwoorden.
Dus 'vis mijdt bruggen' halen we niet als kop naar buiten. Eerst corrigeren we voor toegankelijkheid; pas wat daarna overblijft is het echte vissignaal. Dat is precies het soort werk dat je nooit terugziet in het eindproduct — en precies waarom je de conclusies die we wél publiceren kunt vertrouwen.
Wat er nog meer onder ligt
Onderweg leerden we nog een paar dingen. De keuze van het beeldmodel doet ertoe: een backbone die op luchtfoto's is getraind, verslaat DINOv2 op de fijnste kenmerken — domeinkennis wint. En vorm blijkt verrassend voorspellend: als je elk Nederlands water clustert op puur zijn geometrie, tekent zich een 'vingerafdruk' af. Het bermpje bijvoorbeeld leeft uitgesproken in kleine ronde plassen en juist niet in lange kanalen — hetzelfde beestje, tegengesteld signaal, puur door de vorm van het water.
Waarom dit nog niet live staat
Dit is bewust nog geen knop in de app. De signalen die kloppen willen we scheiden van de signalen die bias zijn, en dat is precies de stap die de meeste mensen overslaan. Onze regel is dezelfde als bij de modellen — de weerleggingstoets: het gaat pas live als we onze eigen conclusie niet meer onderuit kunnen halen. Voor overhangende bomen en karper zijn we er bijna. Voor bruggen nog lang niet.
Status: lopend. We publiceren per bevinding, niet per belofte.
Bijgewerkt: 9 juli 2026