Ett genererat titelkort för esp32-eye med undertexten "Två ESP32-S3-kort, en MacBook, två storlekar av MiniCPM-V 4.7" och chips med texten "1B-grind var 1,5 s", "35B-identitetskontroll" och "89 verifierade händelser", över en platt illustration av en katt vid en vattenskål, ett kamerakort på kanten, en laptop och ett runt AMOLED-kort.
Engineering & Research

esp32-eye: Kattens vattenskålsmonitor som anropar MiniCPM-V 4.7 två gånger

Författare

Gideon Frost

Publiceringsdatum

Senaste modellerna · 20Visa alla modeller →
Benchmarks: Artificial Analysis · uppdateras dagligen
Tillbaka till alla inlägg

Två ESP32-S3-kort, en MacBook och två olika storlekar av MiniCPM-V 4.7 håller nu en logg över vilken katt som drack ur vattenskålen och när. Ett kamerakort bevakar skålen, en MacBook kör den lilla modellen lokalt för att svara på en enda snäv fråga, och den stora modellen anropas först efter att en händelse redan har inträffat. Bygget heter esp32-eye, finns på github.com/emwstudio/esp32-eye och blev offentligt den 25 oktober 2026. OpenBMB visade upp det under första veckan i november, vilket är hur de flesta stötte på det.

Modellen bakom är den del där det är värt att vara noggrann. OpenBMB laddade upp MiniCPM-V 4.7 till Hugging Face den 6 och 7 oktober 2026, publicerade modellkortet och Apache-2.0-licensen den 12 oktober och skickade ut ett engelskt pressmeddelande via PR Newswire den 15 oktober. Så det här är inte en lanseringsnyhet, och kattmonitorn är inte ett leverantörsbenchmark. Det är den mest detaljerade offentliga driftsättningen av modellen som någon utanför labbet har dokumenterat hittills, och den råkar vara en hushållsapparat.

Vad bygget faktiskt gör

Hårdvaran är avsiktligt billig och lite klumpig. En Waveshare ESP32-S3-CAM-OV5640 sitter på skålens kant och strömmar 1024×768 JPEG-bilder plus mikrofonljud över Wi-Fi. Ett andra kort, en Waveshare ESP32-S3-Touch-AMOLED-2.16, är skrivbordsdisplayen: en 480×480-panel som visar en livevideostrimla, fyra kattkort, ett dagligt antal mot ett mål på åtta drycker och en liten markeringsanimation när en katt bekräftas. MacBook är hjärnan. En FastAPI-server tar emot strömmen, kör detektionslogiken, skriver till SQLite och klipper ut ett MP4-klipp för varje händelse med fem sekunders inledning, tre sekunders avslutning och originalljudet.

Kamerans placering är det första man måste förstå, eftersom den förklarar hela detektionsdesignen. Linsen tittar upp mot kattens ansikte från skålens kant, vilket innebär att vattenytan inte finns med i bild. Systemet kan inte se en katt dricka. Det kan bara se en katt som befinner sig i skålområdet, och resten härleder det från persistens och identitet. Alla som har byggt ett kameraprojekt vet att det är här ärligheten brukar lämna rummet; här står det skrivet i README.

Pipelinen innan någon modell körs är en gråskalig bakgrundsdifferens mot en referensbild av en tom skål. Om förgrundsandelen är under 15 procent kastas bildrutan utan att något neuralt nätverk används. Över 15 procent får den lokala MiniCPM-V 4.7 1B en fråga: finns det en katt i den här bilden? Ett positivt svar plus en förgrundsandel över 35 procent blir en jakande röst. Tre jakande röster i följd öppnar en händelse; fyra nekande röster i följd stänger den.

Uppdelningen i två modeller är det intressanta ingenjörsarbetet

Att köra en visionsmodell var 1,5 sekund i evighet är en dålig idé, och bygget behandlar det som en sådan. 1B:n körs lokalt via llama.cpp som en Q4_K_M-kvantisering på en OpenAI-kompatibel llama-server på port 8080. Den är tillräckligt billig för att projektet ska ha råd att anropa den upprepade gånger, men den villkoras fortfarande av bakgrundsdifferensen så att ett tomt rum inte kostar något. 1B:ns uppgift är medvetet snäv: närvaro, inte identitet, inte beteende.

Identitet är den dyra frågan, och den ställs en gång per händelse. När en händelse avslutas samplar servern bildrutor från klippet och skickar dem till MiniCPM-V 4.7 35B-A3B via ModelBests moln-API, med ett referensfoto för var och en av de fyra katterna. Den stora modellen returnerar en kattidentifierare, ett konfidensvärde och ett ja/nej på om scenen är en drickscen. Bildrutor som inte klarar drickskontrollen kastas och räknas inte. Tvetydiga identiteter lagras som okända i stället för att tvingas till den närmaste katten, och om molnanropet misslyckas går händelsen in i en återförsöksväg i stället för att fyllas i efteråt med 1B:s gissning.

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.

Den arbetsfördelningen är samma argument som litteraturen om på enheten har framfört i två år, nu med ett kvitto. En liten modell är en sensor. En stor modell är en domare. Kostnadsmodellen följer direkt: 1B-modellen betalas i millisekunder och batteri, 35B-modellen betalas i tokens, och tokenräkningen skalar med antalet drickhändelser snarare än med antalet bildrutor. I ett hushåll med fyra katter är det en handfull anrop om dagen.

Vad de 89 händelserna bevisar och inte bevisar

OpenBMB:s inlägg rapporterar att man i ett hushåll med fyra katter under tre dagar manuellt kontrollerade 89 drickhändelser och att varje katts identitet var korrekt. Det är ett verkligt resultat, och det är också ett snävt sådant. Identitetsuppgiften är ett slutet val mellan fyra alternativ bland katter som systemet redan har referensfoton på. Det är inte re-identifiering med öppen uppsättning, det är inte ett påstående om hundra katter, och det är inte ett påstående att systemet fungerar i ett hus som det aldrig har sett.

Åttionio händelser under tre dagar är ungefär trettio om dagen för fyra katter, eller cirka sju och en halv per katt och dag, vilket är rimligt för en studie av vattenintag och alldeles för litet för att uppskatta en felfrekvens med någon säkerhet. Ett system som har rätt 89 gånger av 89 kan fortfarande ha fel en gång av femtio. Siffran att hålla fast vid är inte 100 procent; det är att ingen behövde rätta det under tre dagars normal användning.

Det finns också ett förbehåll om härkomst. Författaren är ambassadör för OpenBMB-gemenskapen och demonstrationen kördes på OpenBMB:s eget konto. Det gör inte resultatet falskt, men det innebär att valideringen inte utformades av en skeptiker, och ingen tredje part har upprepat den.

Varför 1B inte identifierar katten

README-filen innehåller den mest användbara meningen i hela projektet, och det är ett negativt resultat: med tre ljusfärgade katter som ser likadana ut var den lokala MiniCPM-V 4.7 1B inte tillförlitlig när det gällde att välja en av fyra. Teamet provade det, fann att särskiljningen mellan de fyra var otillförlitlig och flyttade identitetshanteringen till 35B i stället för att leverera en gissning.

Det här är värt att fundera över, eftersom det går emot hur små bildmodeller vanligtvis säljs. En modell med 1,55 miljarder parametrar som presterar bra på benchmarks för OCR och diagram är inte automatiskt bra på att skilja två liknande djur åt i en fast kameravy. Finmaskig identitet är precis den typ av uppgift där en komprimerad budget för visuella token skadar: skillnaderna mellan två tabbykatter är små, lokala och lätta att medelvärdesbilda bort. Byggets svar – använd den lilla modellen för den enkla frågan och betala för den svåra – är mer användbart än vilken rad som helst på en resultattavla.

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.

Vad det kostar att driva, och vad som händer när molnbenet fallerar

Endast ett ben i den här pipeline har en faktura. 1B är en lokal GGUF-fil på en bärbar dator, så marginalkostnaden för en bildruta är el. 35B är ett hostat anrop mot ModelBests API, som är leverantörens egen slutpunkt snarare än en tredjepartsvärd, och projektet behöver en nyckel för det. README:n är tydlig med att 35B inte körs lokalt: MacBooken rymmer inte 35 miljarder parametrar, den rymmer en klient.

Den uppdelningen skapar ett felläge som projektet hanterar i stället för att dölja. Om molnanropet misslyckas görs händelsen om; 1B-resultatet befordras aldrig till en identitet. För ett hobbyprojekt är det ovanligt disciplinerat. För något produktionsliknande sätter samma design en enda extern slutpunkt på den kritiska vägen för ett system vars hela syfte är att registrera händelser obevakat.

Det här är luckan som en router fyller, och det är värt att vara precis om vad en router kan och inte kan göra här. OrcaRouter ger ett API över fler än 200 modeller med leverantörens listpris vidarebefordrat till 0 % påslag, plus automatiskt failover mellan uppströmsleverantörer, vilket är rätt utformning för en pipeline som den här. Det har för närvarande inte MiniCPM-V 4.7, så 35B-delen i esp32-eye skulle fortfarande köras mot leverantörens eget API. Den ärliga versionen av rådet är: behåll återförsöksvägen, och om identitetssteget blir avgörande, sätt en andra modell som du faktiskt kan nå bakom samma anrop.

Vad är fortfarande obekräftat

Tre saker skulle förändra hur mycket tyngd det här bygget förtjänar. Den första är ett andra hushåll. Allt som rapporterats hittills kommer från ett enda hem med fyra kända katter och en fast kamera. Den andra är en längre körning: tre dagar kan inte skilja ett system som fungerar från ett system som fungerar tills en katt byter päls, ljuset skiftar eller en besökare anländer. Den tredje är en oberoende kontroll av de 89 händelserna, som för närvarande vilar på byggarens egen manuella granskning.

Det som redan är etablerat är mer blygsamt och mer användbart. MiniCPM-V 4.7 finns i två storlekar som kan kombineras: en dense modell på 1,55B som körs i en Q4_K_M-fil på en bärbar dator, och en sparse mixture-of-experts på 35,2B som aktiverar ungefär 3 miljarder parametrar per token och är tillräckligt bra på en fyrvägsidentitetsuppgift för att man ska kunna lita på den för den uppgiften. En kattmatsskål är en märklig plats att bevisa det på, men det är en verklig sådan.

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.

Om du vill reproducera det innehåller arkivet kamerafirmware, AMOLED-firmware, FastAPI-servern och modellens testskript, och det enda konto du behöver är en ModelBest-nyckel för identitetsdelen. Om du vill läsa modellen i stället för att köra katten är leverantörens siffror utgångspunkten, och förbehållen finns i repoet.