Vogelalbum 1.0.0

Eine Kamera am Vogelhaus, ein Rechner der erkennt wer da war — und eine
Sammlung, die sich von allein fuellt.

Zwei neuronale Netze: eines findet den Vogel im Bild, eines bestimmt die
Art. 148 heimische Arten, auf Deutschland eingeschraenkt und neu normiert —
ohne diese Einschraenkung wird aus einer Kohlmeise eine nordamerikanische
Schwesterart. Daraus entsteht ein Sammelalbum: nummerierte Seiten,
gefundene Arten in Farbe, fehlende als Schatten, dazu Erstfang, Punkte,
Stufen und 15 Abzeichen.

Laeuft vollstaendig auf eigener Hardware. Kein Cloud-Dienst, kein Konto,
keine Telemetrie; die Bilder verlassen das eigene Netz nicht.

Zwei getrennt deploybare Teile: die Sammlung als Django-Anwendung, die
Erkennung als eigener Dienst. Der Erkennungs-Dienst fragt selbst an und
braucht deshalb weder eine erreichbare Adresse noch einen offenen Port —
er laeuft hinter einem gewoehnlichen Router.

Dabei: Firmware fuer Raspberry Pi und ESP32-S3, Anbindung an Home
Assistant ueber MQTT, Oberflaeche auf Deutsch und Englisch, Einstellungen
je Kamera aus dem Browser, und ein Weg fuer Fotos von unterwegs.

AGPL-3.0.
This commit is contained in:
christian committed 2026-10-14 18:55:23 +00:00
commit cc9e0786c2
189 files changed
+29792

No files matched your search

+11
View File
@@ -0,0 +1,11 @@
blank_issues_enabled: true
contact_links:
- name: 🔒 Sicherheitslücke
url: https://gitea.gaertner.onl/christian/vogelalbum/src/branch/main/SECURITY.md
about: Bitte nicht als Issue — Meldeweg steht in SECURITY.md
- name: 📖 Dokumentation
url: https://gitea.gaertner.onl/christian/vogelalbum/src/branch/main/docs
about: Installation, Kameraaufbau, Einstellungen, Betrieb
- name: 🐦 Die laufende Instanz
url: https://vogelalbum.gaertner.onl
about: So sieht es aus, wenn es läuft
+48
View File
@@ -0,0 +1,48 @@
---
name: "🐦 Art falsch bestimmt"
about: "Der Vogel war ein anderer, als Vogelalbum sagt"
title: ""
labels:
- erkennung
---
<!--
Das ist die nützlichste Rückmeldung, die dieses Projekt bekommen kann: Das
Modell ist nordamerikanisch trainiert, und welche heimischen Arten es
verwechselt, lässt sich nur im Garten herausfinden.
-->
## Welche Art war es wirklich
## Was Vogelalbum gesagt hat
<!-- Name und Prozentzahl, beides steht an der Sichtung -->
## Das Bild
<!--
Wenn möglich das Sichtungsfoto anhängen — ohne Bild lässt sich kaum etwas
machen. Es liegt unter `media/sightings/`, der Ausschnitt unter `media/crops/`.
Beide dürfen gern mit.
-->
## Wie oft
- [ ] einmalig
- [ ] kommt immer wieder bei dieser Art
## Deine Einstellungen
| | |
|---|---|
| `VOGELALBUM_REGION` | Vorgabe ist `de` |
| `min_bird_score` | Vorgabe ist 0.05 |
| `detect_threshold` | Vorgabe ist 0.4 |
<!--
Bekannt und nicht meldenswert: Acht heimische Arten kennt das Modell gar nicht
und ordnet sie Verwandten zu — Sumpf-, Weiden- und Haubenmeise,
Gartenbaumläufer, Kleinspecht, Bluthänfling, Kernbeißer, Waldkauz. Siehe
docs/erkennung.md. Eine Meldung lohnt sich trotzdem, wenn die Verwechslung
eine andere ist als die dort genannte.
-->
+60
View File
@@ -0,0 +1,60 @@
---
name: "🐞 Fehler melden"
about: "Etwas tut nicht, was es soll"
title: ""
labels:
- fehler
---
<!--
Danke fürs Melden. Je konkreter, desto eher ist es behoben — Zahlen und
Logzeilen helfen mehr als Adjektive.
-->
## Was passiert
<!-- Was hast du gesehen? -->
## Was du erwartet hättest
## Wie man es auslöst
1.
2.
3.
## Wo es passiert
- [ ] Web-App (die Sammlung)
- [ ] Detector (die Erkennung)
- [ ] Kameraseite Raspberry Pi (`pi/`)
- [ ] Kameraseite ESP32 (`esp32cam/`)
- [ ] Anbindung an Home Assistant
## Dein Aufbau
| | |
|---|---|
| Installiert per | Docker / ohne Docker |
| Stand | Ausgabe von `git rev-parse --short HEAD` |
| Betriebssystem | |
| Kamera | z.B. Pi Zero W + OV5647, ESP32-S3 + OV2640 |
## Ausgaben
<!--
Hilfreich, je nachdem wo es klemmt:
docker compose -f docker-compose.heim.yml logs --tail=50 detector
curl -s http://<kamera>:8080/status # Raspberry Pi
curl -s http://<kamera>:8081/status # ESP32 — eigener Port, siehe esp32cam/README.md
⚠️ Bitte vorher Token und Passwörter herausnehmen.
⚠️ Und: NICHT mit `curl` am laufenden Stream (`/stream`) messen. Ein zweiter
Zuschauer sättigt die Funkstrecke und erzeugt genau die Timeouts, die du
vielleicht gerade suchst. `/status` fasst den Stream nicht an.
-->
```
```
+31
View File
@@ -0,0 +1,31 @@
---
name: "💡 Idee oder Wunsch"
about: "Etwas, das Vogelalbum können sollte"
title: ""
labels:
- idee
---
## Worum geht es
## Was du damit vorhast
<!--
Der wichtigste Teil. Eine Funktion ist leichter zu bauen, wenn klar ist, wofür
sie da ist — oft gibt es für denselben Zweck einen einfacheren Weg.
-->
## Wie du es heute löst
<!-- Falls es einen Umweg gibt: welchen? -->
## Würdest du daran mitarbeiten?
- [ ] Ja, ich würde es selbst bauen
- [ ] Ja, beim Testen
- [ ] Nein, ich melde es nur
<!--
Zur Einordnung, bevor du tippst: Ein Artenkatalog für eine andere Region ist
ausdrücklich erwünscht und reine Datenarbeit — siehe docs/erkennung.md.
-->
+33
View File
@@ -0,0 +1,33 @@
<!--
Danke. Die Spielregeln stehen in CONTRIBUTING.md — darin auch die
Rechteeinräumung, ohne die dieses Projekt nicht doppelt lizenziert werden
kann.
-->
## Was sich ändert
## Warum
<!--
Das Interessantere von beidem. Der Code sagt, was passiert; die
Commit-Nachricht soll sagen, warum es nötig war.
-->
## Geprüft durch
- [ ] `./venv/bin/python -m unittest discover tests` (Detector)
- [ ] `cd web && ../venv/bin/python manage.py test` (Web-App)
- [ ] Seite im Browser angesehen — bei allem, was die Oberfläche berührt
- [ ] an echter Hardware ausprobiert — bei allem unter `pi/` oder `esp32cam/`
<!--
Der dritte Punkt steht hier, weil er sich verdient hat: Zwei Fehler in diesem
Projekt sind durch alle Tests gekommen und erst beim Hinsehen aufgefallen.
Neue sichtbare Texte brauchen eine englische Fassung, sonst wird der
Übersetzungstest rot. Er druckt die fehlende Zeile kopierfertig aus.
-->
## Bezug
<!-- "Closes #123", falls es ein Issue schließt -->