Files
vogelalbum/Dockerfile.detector
christian c11fe9ab04 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.
2026-10-15 14:30:02 +00:00

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"]