Een gegenereerde titelkaart voor esp32-eye met de ondertitel 'Twee ESP32-S3-borden, één MacBook, twee MiniCPM-V 4.7-groottes' en chips met de tekst '1B-poort elke 1,5 s', '35B-identiteitscontrole' en '89 geverifieerde gebeurtenissen', boven een platte illustratie van een kat bij een waterbak, een cameraboard op de rand, een laptop en een rond AMOLED-bord.
Engineering & Research

esp32-eye: de kattenwaterbakmonitor die MiniCPM-V 4.7 twee keer aanroept

Auteur

Gideon Frost

Publicatiedatum

Nieuwste modellen · 20Bekijk alle modellen →
Benchmarks: Artificial Analysis · dagelijks bijgewerkt
Terug naar alle berichten

Twee ESP32-S3-borden, één MacBook en twee verschillende maten MiniCPM-V 4.7 houden nu een log bij van welke kat wanneer uit de waterbak dronk. Een camerabord houdt de bak in de gaten, een MacBook draait het kleine model lokaal om één nauwe vraag te beantwoorden, en het grote model wordt pas aangeroepen nadat er al een gebeurtenis heeft plaatsgevonden. Het project heet esp32-eye, het staat op github.com/emwstudio/esp32-eye en het werd openbaar op 25 oktober 2026. OpenBMB liet het in de eerste week van november zien, en zo hebben de meeste mensen het leren kennen.

Het onderliggende model is het onderdeel waarover we precies moeten zijn. OpenBMB heeft MiniCPM-V 4.7 op 6 en 7 oktober 2026 naar Hugging Face geüpload, de modelkaart en de Apache-2.0-licentie op 12 oktober gepubliceerd en op 15 oktober via PR Newswire een Engelstalig persbericht uitgebracht. Dit is dus geen lanceerverhaal, en de kattenmonitor is geen leveranciersbenchmark. Het is de meest gedetailleerde openbare implementatie van het model die iemand buiten het lab tot nu toe heeft gedocumenteerd, en het is toevallig een huishoudapparaat.

Wat de build daadwerkelijk doet

De hardware is bewust goedkoop en ietwat onhandig. Een Waveshare ESP32-S3-CAM-OV5640 staat op de rand van de kom en streamt 1024×768 JPEG-frames plus microfoonaudio via Wi-Fi. Een tweede board, een Waveshare ESP32-S3-Touch-AMOLED-2.16, is het bureaubladscherm: een paneel van 480×480 dat een live videostrook, vier kattenkaarten, een dagelijkse telling tegen een doel van acht drankjes en een kleine highlight-animatie toont wanneer een kat is bevestigd. De MacBook is het brein. Een FastAPI-server ontvangt de stream, voert de detectielogica uit, schrijft naar SQLite en knipt voor elke gebeurtenis een MP4-clip met vijf seconden voorloop, drie seconden na-loop en de originele audio.

De camerapositie is het eerste dat je moet begrijpen, want die verklaart het hele detectieontwerp. De lens kijkt vanaf de rand van de kom omhoog naar het gezicht van de kat, wat betekent dat het wateroppervlak niet in beeld is. Het systeem kan niet zien dat een kat drinkt. Het kan alleen zien dat een kat het gebied rond de kom bezet, en leidt de rest af uit persistentie en identiteit. Iedereen die weleens een cameraproject heeft gebouwd, weet dat dit het punt is waar de eerlijkheid meestal de deur uit gaat; hier staat het in de README.

De pijplijn vóór er welk model dan ook draait, is een grijswaarden-achtergrondverschil ten opzichte van een referentieframe van een lege kom. Als het aandeel voorgrond onder 15 procent ligt, wordt het frame weggegooid zonder een neuraal netwerk aan te raken. Boven 15 procent wordt aan de lokale MiniCPM-V 4.7 1B één vraag gesteld: zit er een kat in deze afbeelding? Een bevestigend antwoord plus een aandeel voorgrond boven 35 procent wordt één bevestigende stem. Drie opeenvolgende bevestigende stemmen openen een gebeurtenis; vier opeenvolgende negatieve stemmen sluiten die.

De opsplitsing in twee modellen is het interessante technische aspect.

Een visionmodel elke 1,5 seconde voor altijd laten draaien is een slecht idee, en de build behandelt het als zodanig. De 1B draait lokaal via llama.cpp als een Q4_K_M-quantisatie op een OpenAI-compatibele llama-server op poort 8080. Het is goedkoop genoeg dat het project het zich kan veroorloven om het herhaaldelijk aan te roepen, maar het wordt nog steeds alleen geactiveerd bij een verschil in de achtergrond, zodat een lege kamer niets kost. De taak van de 1B is bewust smal: aanwezigheid, niet identiteit, niet gedrag.

Identiteit is de kostbare vraag, en die wordt één keer per gebeurtenis gesteld. Wanneer een gebeurtenis wordt afgesloten, bemonstert de server frames uit de clip en stuurt die via ModelBest's cloud-API naar MiniCPM-V 4.7 35B-A3B, met voor elk van de vier katten een referentiefoto. Het grote model retourneert een kattenidentificatie, een betrouwbaarheidswaarde en een ja/nee of de scène een drinkwaterscène is. Frames die de drinkwatercontrole niet doorstaan, worden weggegooid en niet meegeteld. Dubbelzinnige identiteiten worden als onbekend opgeslagen in plaats van aan de dichtstbijzijnde kat te worden toegewezen, en als de cloudaanroep mislukt, gaat de gebeurtenis naar een pad voor nieuwe pogingen in plaats van te worden opgevuld met de gok van de 1B.

A screenshot of the Hugging Face model card for openbmb/MiniCPM-V-4.7-35B-A3B, captured 6 November 2026, showing 553,116 downloads last month, 1.11k likes, an apache-2.0 licence tag, a model size of 35B params in BF16, the on-device claim of 13+ tokens per second on an iPhone 17 Pro Max, Evaluation results of MMLU-Pro 83.45 and MathArena AIME 2026 76.46, and a sidebar line stating the model is not deployed by any Inference Provider.

Die taakverdeling is hetzelfde argument dat de on-device-literatuur al twee jaar maakt, nu met een bewijsstuk. Een klein model is een sensor. Een groot model is een rechter. Het kostenmodel volgt daar direct uit: de 1B betaal je in milliseconden en batterij, de 35B betaal je in tokens, en de tokenrekening schaalt met het aantal drinkmomenten in plaats van met het aantal frames. In een huishouden met vier katten is dat een handvol aanroepen per dag.

Wat de 89 gebeurtenissen wel en niet bewijzen

In een bericht van OpenBMB staat dat in een huishouden met vier katten over drie dagen 89 drinkgebeurtenissen handmatig zijn gecontroleerd en dat elke kattenidentiteit correct was. Dat is een echt resultaat en tegelijk een beperkt resultaat. De identiteitstaak is een gesloten keuze uit vier mogelijkheden tussen katten waarvoor het systeem al referentiefoto's heeft. Het is geen open-set heridentificatie, het is geen bewering over honderd katten, en het is geen bewering dat het systeem werkt in een huis dat het nog nooit heeft gezien.

Negenentachtig gebeurtenissen over drie dagen is ongeveer dertig per dag voor vier katten, of ongeveer zeven en een half per kat per dag, wat plausibel is voor een onderzoek naar wateropname en veel te klein om met enige betrouwbaarheid een foutpercentage te schatten. Een systeem dat 89 van de 89 keer goed zit, kan nog steeds één op de vijftig keer fout zitten. Het getal dat je moet onthouden is niet 100 procent; het is dat niemand het in drie dagen gewoon gebruik hoefde te corrigeren.

Er is ook een voorbehoud over de herkomst. De auteur is een community-ambassadeur van OpenBMB en de showcase draaide op OpenBMB's eigen account. Dat maakt het resultaat niet onjuist, maar het betekent wel dat de validatie niet door een scepticus is ontworpen, en geen enkele derde partij heeft deze herhaald.

Waarom de 1B de kat niet identificeert

De README bevat de nuttigste zin van het hele project, en het is een negatief resultaat: met drie lichtgekleurde katten die op elkaar lijken, was de lokale MiniCPM-V 4.7 1B niet betrouwbaar in het kiezen van één van de vier. Het team probeerde het, vond de vierwegdiscriminatie onbetrouwbaar en verschoof de identiteitsbepaling naar de 35B in plaats van met een gok te komen.

Dit is de moeite van het overdenken waard, want het druist in tegen de manier waarop kleine visiemodellen gewoonlijk worden verkocht. Een model met 1,55 miljard parameters dat goed scoort op OCR- en grafiekbenchmarks, is niet automatisch goed in het van elkaar onderscheiden van twee vergelijkbare dieren in een vast camerabeeld. Fijnmazige identiteit is precies het soort taak waarbij een gecomprimeerd visueel tokenbudget nadelig is: de verschillen tussen twee tabbykatten zijn klein, lokaal en makkelijk weg te middelen. Het antwoord van deze build — het kleine model gebruiken voor de makkelijke vraag en betalen voor de moeilijke — is nuttiger dan welke leaderboardregel dan ook.

A generated system diagram of the esp32-eye pipeline in five stages: ESP32-S3 plus OV5640 capture at 1024 by 768 every 1.5 seconds, a background-difference gate at 15 percent foreground, a local MiniCPM-V 4.7 1B on llama.cpp taking three consecutive positive votes, a cloud MiniCPM-V 4.7 35B-A3B identity call with four reference photos, and SQLite plus an AMOLED dashboard.

Wat het kost om het te laten draaien, en wat er gebeurt als het cloudgedeelte uitvalt

Slechts één onderdeel van deze pijplijn heeft een factuur. De 1B is een lokaal GGUF-bestand op een laptop, dus de marginale kosten van een frame zijn elektriciteit. De 35B is een gehoste aanroep naar de API van ModelBest, wat het eigen endpoint van de leverancier is in plaats van een externe host, en het project heeft daarvoor een sleutel nodig. In de README staat expliciet dat de 35B niet lokaal is uitgerold: de MacBook bevat geen 35 miljard parameters, maar een client.

Die splitsing creëert een faalmodus die het project afhandelt in plaats van verbergt. Als de cloudaanroep mislukt, wordt de gebeurtenis opnieuw geprobeerd; het 1B-resultaat wordt nooit tot een identiteit gepromoveerd. Voor een hobbyproject is dat ongewoon gedisciplineerd. Voor alles wat op productie lijkt, zet hetzelfde ontwerp één enkel extern eindpunt op het kritieke pad van een systeem waarvan het hele doel is om gebeurtenissen zonder toezicht vast te leggen.

Dit is de kloof die een router opvult, en het is de moeite waard precies te zijn over wat een router hier wel en niet kan. OrcaRouter biedt één API voor meer dan 200 modellen waarbij de lijstprijs van de provider wordt doorgegeven tegen 0% opslag, plus automatische failover tussen upstreams, wat de juiste vorm is voor een pipeline zoals deze. Momenteel ondersteunt het MiniCPM-V 4.7 niet, dus het 35B-gedeelte in esp32-eye zou nog steeds op de eigen API van de leverancier draaien. De eerlijke versie van het advies is: houd het retry-pad aan, en als de identiteitsstap essentieel wordt, zet dan een tweede model dat je daadwerkelijk kunt bereiken achter dezelfde aanroep.

Wat is er nog onbevestigd?

Drie dingen zouden veranderen hoeveel gewicht deze build verdient. Het eerste is een tweede huishouden. Alles wat tot nu toe is gerapporteerd, komt uit één huis met vier bekende katten en een vaste camera. Het tweede is een langere looptijd: drie dagen kunnen geen onderscheid maken tussen een systeem dat werkt en een systeem dat werkt totdat een kat van vacht verandert, het licht verschuift of er een bezoeker arriveert. Het derde is een onafhankelijke controle van de 89 gebeurtenissen, die momenteel berust op de eigen handmatige beoordeling van de bouwer.

Wat al vaststaat, is bescheidener en nuttiger. MiniCPM-V 4.7 bestaat in twee formaten die kunnen worden gecombineerd: een dense model van 1,55B dat in een Q4_K_M-bestand op een laptop draait, en een 35,2B sparse mixture-of-experts dat ongeveer 3 miljard parameters per token activeert en goed genoeg is in een identiteitstaak met vier mogelijkheden om erop te vertrouwen. Een kattenvoerbak is een vreemde plek om dat te bewijzen, maar het is een echte plek.

A generated eight-tile figures card reading 1.5 seconds between frame checks, 15 percent foreground to wake the 1B, 3 and 4 consecutive votes to open and close an event, 641 MB (641 MiB, 672 MB decimal) for the 1B as a Q4_K_M GGUF, 4 cats in the closed identity set, 3 days of run, 89 drinking events verified, and 89 of 89 identities correct per OpenBMB.

Als je het wilt reproduceren, bevat de repository de camerafirmware, de AMOLED-firmware, de FastAPI-server en de modeltestscripts, en de enige account die je nodig hebt is een ModelBest-sleutel voor de identity leg. Als je het model wilt lezen in plaats van de kat te draaien, zijn de cijfers van de leverancier het startpunt en staan de voorbehouden in de repo.