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.
58 lines
2.4 KiB
Docker
58 lines
2.4 KiB
Docker
# Der Detector als Image — fuer alle, die nicht erst einen Host einrichten
|
|
# wollen (venv, Modelle, systemd). Fuer den Dauerbetrieb auf einem eigenen
|
|
# Erkennungs-Host ist scripts/setup_detector_host.sh weiterhin der direktere
|
|
# Weg; dieses Image ist der kurze Einstieg.
|
|
#
|
|
# Achtung Architektur: ai-edge-litert liefert Wheels fuer x86_64 und arm64.
|
|
# Ein Raspberry Pi 4/5 mit 64-Bit-System geht damit, ein Pi Zero nicht — dem
|
|
# fehlt nicht das Wheel, sondern die Rechenleistung.
|
|
FROM python:3.13-slim
|
|
|
|
WORKDIR /app
|
|
|
|
# curl fuer fetch_models.sh. Bleibt drin, damit sich die Modelle in einem
|
|
# laufenden Container nachladen lassen, wenn eine Datei kaputt ist.
|
|
RUN apt-get update \
|
|
&& apt-get install -y --no-install-recommends curl ca-certificates \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
COPY requirements-detector.txt .
|
|
RUN pip install --no-cache-dir -r requirements-detector.txt
|
|
|
|
# Die Modelle liegen nicht im Repo (zusammen rund 10 MB) und aendern sich nie
|
|
# — deshalb beim Bauen holen und nicht bei jedem Start. Eigene Schicht: an den
|
|
# Modellen aendert sich nichts, wenn sich der Code aendert.
|
|
COPY scripts/fetch_models.sh scripts/
|
|
RUN bash scripts/fetch_models.sh
|
|
|
|
# Beispielfotos fuer 'detector karte' und 'detector test'.
|
|
#
|
|
# 🔴 Hier stand bis zum 09.10.2026 "COPY testdata/ ./testdata/" — und damit
|
|
# liess sich dieses Image aus einem frischen Klon ueberhaupt nicht bauen:
|
|
# testdata/ steht in .gitignore. Gemerkt hat es niemand, weil immer aus einer
|
|
# Arbeitskopie gebaut wurde, in der der Ordner lag.
|
|
#
|
|
# Die Fotos bleiben aus einem guten Grund draussen: Sie stammen von Wikimedia
|
|
# Commons, stehen unter CC-Lizenzen und verlangen Namensnennung. Das Skript
|
|
# holt sie samt Urheber und Lizenz.
|
|
#
|
|
# Mit '|| echo', weil ein Bauvorgang nicht daran scheitern soll, dass
|
|
# Wikimedia gerade drosselt. Ohne die Fotos fehlt nur der Standardwert von
|
|
# 'detector karte' — die Erkennung selbst braucht sie nicht.
|
|
COPY scripts/fetch_testdata.sh scripts/
|
|
RUN bash scripts/fetch_testdata.sh \
|
|
|| echo "WARNUNG: Beispielfotos nicht geholt — 'detector karte' braucht dann --vogel"
|
|
|
|
COPY detector/ ./detector/
|
|
|
|
# Sonst haengen die Ausgaben im Blockpuffer und 'docker logs' ist erst nach
|
|
# Stunden lesbar — genau dann, wenn man es nicht braucht.
|
|
ENV PYTHONUNBUFFERED=1
|
|
|
|
# Rohbilder und Protokoll gehoeren auf ein Volume, sonst sind sie nach dem
|
|
# naechsten 'docker compose up --build' weg.
|
|
VOLUME ["/daten"]
|
|
|
|
ENTRYPOINT ["python", "-m", "detector"]
|
|
CMD ["watch"]
|