Es gibt bei der Beobachtung von Bienen und allgemein in der Imkerei einige Szenarien, bei denen wir aus Bild- oder Videodaten Informationen möglichst automatisiert extrahieren wollen. Beispiel kann hier ein visueller Bee Counter sein oder eine Anwendung, die auf Varroa-Windeln die Varroen zählt.
Daher schauen wir uns YOLO (You only look once) an, ein framework, das in real time Videos oder Bilder in Klassen einteilen kann oder Objekte identifizieren, optisch segmentieren oder auch in einem Videostream tracken kann. Einen Überblick zur Historie seit 2016 bis 2024 gibt es im Roboflow Blog von dort ist auch diese Abbildung zur Objekt-Erkennung:
Die verwendeten Modelle und Datensätze sind nicht für Imker:innen entwickelt :-) daher wird z.B. die Waage im Bild auch nicht erkannt (kleiner Scherz!). Genauso wie Bienen und Varroen für die meisten user von Yolo nicht so interessant sein dürften, daher müssen wir die Standard-Installation noch etwas tweaken, dazu aber später weiter unten mehr.
Installation
Siehe Quickstart - Ultralytics YOLO Docs – es gibt auch eine deutsche Version der Doku, die ist aber schlecht (auto-)übersetzt.
Windows
-
Python installieren, hier das neueste stable release auswählen:
Python Releases for Windows | Python.org
– falls man wissen möchte, ob oder welche Version bereits installiert ist, mitpython --version
prüfen -
ultralytics stack mit
pip
über die Eingabeaufforderung installieren:
pip install ultralytics
-
PyTorch installieren
pip install torch torchvision torchaudio
(torchaudio
kann auch weggelassen werden)
– PyTorch ist ein Framework, das spezielle KI-Berechnungen ermöglicht und beschleunigt, ein Überblick bei techtarget.com > Was ist PyTorch?
– weiter bietet PyTorch mit der Unterstützung des CUDA-toolkits von NVIDIA die Möglichkeit, rechenintensive Operationen auf die Grafikkarte outzusourcen. Hat der Rechner eine NVIDIA-GPU kann die Unterstütung von PyTorch mit CUDA 12.4 so installiert werden:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
Auf der Startseite von https://pytorch.org/ kann man sich den Installations-Syntax je nach OS / packages / usw. … auch zusammenklicken. Wer eine Intel-GPU hat: Hier gibt es auch noch einen Hinweis zu Intels Arc-Grafikkarten: Solved: Re: How to train yolov8 using intel arc 770 gpu? - Intel Community.
– Exkurs: Intel Core Ultra Prozessor statt NVIDIA GPU: Neuere Prozessoren bieten die Möglichkeit statt auf der Grafikkarte auf einer dezidierten NPU zu rechnen, z.B. haben die neuen Intel Core Ultra CPUs, eine integrierte NPU-Einheit (Neural Processing Unit). Diese laufen nicht “einfach so”, sondern brauchen auch entsprechende Software-Unterstützung. Für torch gibt es die Intel NPU Acceleration Library, bisher habe ich aber noch nicht geschaut, ob die uns etwas bringt oder wie / ob man die zusammen mit Yolo nutzen kann.
Raspberry Pi OS / Linux
Ein dezidiertes Installations-Tutorial für den RasPi gibt es unter Raspberry Pi - Ultralytics YOLO Docs Hier die Installation ohne Docker:
## ggf. Paketliste aktualisieren
sudo apt update
## Python installieren
sudo apt install python3-pip -y
## ggf. pip aktualisieren
pip install -U pi
## ultralytics mit zusätzlichen Abhängigkeiten (Option '[export]') installieren
pip install ultralytics[export]
## ggf. rebooten
sudo reboot
Bei mir meckert das System mit
error: externally-managed-environment
Daher installiere ich das ganze in einer virtuellen Umgebung!
## in home Verzeichnis "yolo" anlegen
cd
mkdir yolo
## Virtuelle Umgebung "venv-yolo" installieren
python -m venv venv-yolo
## ultralytics installieren
venv-yolo/bin/pip install ultralytics
In der ultralytics-Anleitung steht man möge das framework mit zusätzlichen Abhängigkeiten (Option ‘[export]’) installieren, allerdings installiert das recht viel und braucht gut Platz, daher würde ich das erst machen, wenn man spezielle Funktionen benötigt.
venv-yolo/bin/python test-yolo.py
venv-yolo/bin/pip install --no-cache-dir “ncnn”
venv-yolo/bin/pip install --no-cache-dir “pytubefix>=6.5.2”
Für die spätere object detection muss das unter Windows / Mac verwendete .pt
-Modell nach .ncnn
konvertiert werden, aus Raspberry Pi - Ultralytics YOLO Docs
Out of all the model export formats supported by Ultralytics, NCNN delivers the best inference performance when working with Raspberry Pi devices […]. Therefor our recommendation is to use NCNN with Raspberry Pi.
Wir machen das mal mit der shell:
# venv aktivieren
source venv-yolo/bin/activate
# Modell als NCNN exportieren
yolo export model=yolo11n.pt format=ncnn
Aus der virtuellen Umgebung kommen wir übrigens mit der Eingabe von deactivate
raus!
Exkurs: AI-Hats für den RasPi
Aktuell gibt es verschiedenen hardware-Erweiterungen für den RasPi, die die schwache performance über USB-dongles oder Hats auszugleichen versuchen.
- Google hat etwa den Coral USB Accelerator als USB-dongle im Angebot, der speziell für die Beschleunigung von TensorFlow-Anwendungen entwickelt wurde (vermutlich daher auch der Name TPU (Tensor Processing Unit) statt NPU bei anderen.
- von Hailo gibt es den Hailo-8 Accelerator als RasPi-Hat der mit 26 TOPS deutlich leistungsstärker ist als der Coral USB Accelerator mit nur 4 TOPS
Von ultralytics selbst gibt es momentan nur ein Tutorial für die Coral TPU und den RasPi, zu Hailo und Yolo habe ich z.B. das gefunden: Tutorial of AI Kit with Raspberry Pi 5 about YOLOv8n object detection | Seeed Studio Wiki hier muss das .pt
-Modell nach .onnx
konvertiert werden und man braucht diverse Hailo-spezifische software und Anpassungen [noch nicht genauer gecheckt was]. Auch das geht in die Richtung:https://www.youtube.com/watch?v=UH7CuiFEc3Q und könnte als Hardware interessant sein.
MacOS
-
Python installiern, hier das neueste stable releases auswählen:
Python Releases for macOS | Python.org
– falls man wissen möchte, ob oder welche Version bereits installier ist, mitpython3 --version
prüfen -
ultralytics stack mit
pip
über die Konsole installiern:
# Install the ultralytics package from PyPI
pip3 install ultralytics
-
PyTorch installiern
pip3 install torch torchvision torchaudio
CUDA gibt es nicht für MacOS, daher können wir die Standard-Installation nutzen, auch wenn eine NVIDIA GPU vorhanden sein sollte.
Objekt-Erkennung
Yolo kann verschiedenen tasks ausführen, z.B. die Klassifikation (“classification”) ganzer Bilder, etwa bei der Beurteilung von Hirn-MRT- oder CT-Scans mit und ohne Tumore.
Uns interessiert hier allerdings die Objekt-Erkennung (“detection”), die es z.B. ermöglicht, in einem Video-Einzelbild oder Foto eine Vespa velutina zu erkennen und im besten Fall sicher von einer Biene oder einheimischen Hornisse unterscheiden zu können.
Python-Skript (oder Konsole)
Da Yolo im Betrieb einige Dateien in den gerade verwendeten Ordner herunterlädt und dort auch Ergebnisse speichert, macht es Sinn sich einen eigenen Ordner dafür anzulegen und dort zu arbeiten.
mkdir yolo11
Man kann Yolo direkt über die Eingabeaufforderung befüttern oder über ein Python-Skript. Anfangs mag die direkte Konsole-Eingabe ganz nett zu sein, wenn man später umfangreichere Spezifikationen hat, ist ein Python-Skript übersichtlicher und sorgt für leichter reproduzierbare Ergebnisse.
Bei der Doku nicht von verschiedenen Begriffen wie prediction, inference oder detection usw. verwirren lassen. Oft sind es Begriffe, die unterschiedliche Phase im Ablauf der Objekterkennung beschreiben.
Beispiel-Code
Für die ersten Schritte erstellen wir mit
nano yolo-for-bees_v0.1.py
eine py
-Datei und kopieren diesen code hinein:
# import YOLO
from ultralytics import YOLO
# load the YOLO11 medium model
model = YOLO("yolo11m.pt")
# define inference source / path to video file / YT URL ...
#source = "vespa-velutina.jpg" # lokales Bild
#source = "hive-entrance.mp4" # lokales Video
#source = 0 # lokale Webcam
#source = "https://www.youtube.com/watch?v=-2RCPpdmSVg" # YT, Strassenverkehr
source = "https://www.youtube.com/watch?v=E1jV9clHYMk" # YT, Bienen
# run inference on the source
# - use the source defined above
# - show the detection live
# - confidence score 0.4 or higher
# - save the results, see runs/ folder
results = model(source, show=True, conf=0.4, save=True)
Code ausführen und Ergebnisse sichten
Nun können wir mit
py yolo-for-bees_v01.py
die Objekterkennung starten. Auf dem Mac verwenden wir statt dem shortcut py
den ausgeschriebenen Befehlt python3
. Auf dem RasPi vorher ggf. in die virtuelle Umgebung wechseln.
Nun sollte ein pop-up-Fenster mit der spezifizierten Quelle erscheinen und bounding boxes um die erkannten Objekte herum mit labels erscheinen. Weiter wird im Unterordner runs/detect/
ein Ordner predict[xx]
erstellt in dem z.B. ein Zeitraffervideo mt den erkannten Objekten gespeichert wird.
Wenn wir den object detection-Prozess abbrechen wollen können wir das im Terminal-Fenster des Pythons-Skripts (nicht im Fenster mit der Vorschau!) mit Strg + C machen.
Magazine werden zwar als suitcases klassifiziert, ab und an taucht auch eine als elephant verkleidete Biene auf und alle erkannten Bienen werden als birds klassifiziert, nicht ganz was wir wollen, aber als erster Versuch gar nicht sooo schlecht!
Schauen wir uns den code nochmal etwas genauer an:
Modellgrößen
Yolo bietet verschiedene Modellgrößen an nano, small, medium, large und x-large, die auch in den Dateinamen als n, s, m, l und x wieder referenziert werden.
model = YOLO("yolo11
m
.pt")
bindet also das medium Modell ein. Wie bei vielen KI-Anwendungen liefert dabei ein kleineres Modell schnelle, aber ungenauere Ergebnisse, ein großes Modell genauere Ergebnisse, das aber mit mehr Zeit- und Ressourcenaufwand, siehe dazu https://docs.ultralytics.com/models/yolo11/#performance-metrics.
Datenquellen
Yolo unterstützt einige Datenquellen, in der Doku auch inference sources genannt. Das geht von einem einfachen Foto, über lokale Videos bis hin zu YouTube-Videos oder der eigenen Webcam.
source = "https://www.youtube.com/watch?v=E1jV9clHYMk" # YT, Bienen
spezifiziert als Quelle ein YouTube-Video von Detlev Helmerich mit einem Bienenstand. YouTube-Videos sind als Quelle ganz nett zum Testen, ich habe beobachtet, dass einige Videos aber gar nicht funktionieren, auch replizierbar, ggf. hat es mit den von den Autor:innen eingeräumten Rechten der zu tun.
source = "hive-entrance.mp4" # lokales Video
bindet ein lokales Video ein und mit …
source = 0 # lokale Webcam
wird die lokal am Rechner angeschlossene Webcam als Quelle verwendet.
Weitere Infos unter https://docs.ultralytics.com/modes/predict/#inference-sources, dort gibt es auch konkrete code-snippets für jeden source type!
In diesen Beispielen wird bei Videos die Verarbeitung als stream aktiviert mit stream=True
. Allerdings funktioniert der syntax oben dann nicht mehr, s. stream = True not working in video predict for long videos · Issue #2930 · ultralytics/ultralytics · GitHub . Damit es auch mit dem stream funktioniert muss der Funktionsaufruf in eine Schleife verwendet werden:
for r in model(source, stream=True, show=True, conf=0.4, save=True):
pass
Segmentation
Bisher haben wir nur bounding boxes um die erkannten Objekte herum. Wenn man zusätzlich zu diesem Rechteck noch das genaue Objekt im Video oder Foto eingefärbt haben möchte, kann man das machen, indem man das Modell z.B. yolo11m.pt
mit yolo11m
-seg.pt
tauscht, sprich beim Dateinamen noch ein -seg
hinzufügen. In unserem Code wäre das dann:
model = YOLO("yolo11m-seg.pt")
Die Dateien landen nun im Ordner runs/segment/
(statt runs/detect/
) und dann wieder in predict[xx]
und wir bekommen diese hübschen eingefärbten Abbildungen:
Jetzt mit segmentation des Objekts erkennt man mit viel Fantasie einen elephant – oder doch nicht! Jedenfalls stimmt’s auch hier noch nicht ganz! :)
Die Doku zur segmentation bei Yolo / Ulatralytics unter: Segment - Ultralytics YOLO Docs
Tracking
Mit dem Beispielcode oben wird jedes Einzelbild eines Videos analysiert und wir können damit etwa herausfinden wie viele Bienen sich pro Bild zählen lassen. Wir können so allerdings noch keine individuelle Biene zählen, die über mehrere Sekunden auf verschiedenen Einzelbildern sichtbar ist.
Dafür müssen wir statt dem bisher verwendeten model.predict()
(ist identisch mit model()
) jetzt model.track()
verwenden, unsere Codzeile schaut nun so aus:
results = model
.track(source, show=True, conf=0.4, save=True)
Jetzt bekommt jedes Objekt eine eindeutige ID, die über mehrere Einzelbilder identisch bleibt. Nur wenn die Erkennung einmal nicht funktioniert bzw. das Objekt “verschwindet” und “wieder auftaucht”, bekommt es eine neue ID:
Ich wechsele wieder auf das Modell yolo11m.pt
(ohne -seg
, das ginge aber auch in Zusammenhang mit track), damit landen die Videos wieder im Dateieordner runs/detect/
nun aber im neuen Unterordner track[xx]
(statt predict[xx]
).
Das scheint hier etwas buggy zu sein: Unsere Bienen (aka birds
) werden fast nie mit einer ID versehen, nur in wenigen Fällen wird eine vergeben. Entweder ein bug oder es sind birds
nicht zählenswert in Yolo oder es gibt noch weitere Parameter (Länge im Video, confidence o.ä.? ggf. Kombinationen daraus) die entscheiden, ob eine ID vergeben wird oder nicht.
Bei anderen Videos scheint das tracking aber stabiler zu laufen und IDs werden zuverlässig bei Erkennung vergeben.
Siehe zum tracking mit Yolo auch: Track - Ultralytics YOLO Docs .
Modell wechseln
Das default eingebundene Modell bei Yolo11 basiert auf dem COCO-Datensatz mit nur ca. 80 Objekt-Kategorien. Die unterstützten Objekte findet man weiter unten auf der verlinten Seite in der YAML-Datei:
# Classes
names:
0: person
1: bicycle
2: car
[...]
In diesem Datensatz gibt es keine Bienen und auch keine Insekten, nur frisbee
s. :-) Daher schauen wir uns mal nach anderen Datensätzen um. Eine Übersicht gibt es unter: Datasets Overview - Ultralytics YOLO Docs. Von den Datensätzen haben diese Bienen bzw. Insekten als Objektkategorie:
Open Images V7
Ein für uns interessanter Datensatzt ist
- Open Images V7 Dataset
OpenImagesV7 - Ultralytics YOLO Docs
Hier gibt es in der YAML-Datei einige interessante Objekt-Kategorien für Imker:innen:
8: Ant
[...]
35: Bee
36: Beehive
[oh, beehive auch und auch]
37: Beer
38: Beetle
[...]
75: Butterfly
[...]
276: Insect
Auf der oben verlinkten Seite können auch die vortrainierten Modell-/Dateinamen eingesehen werden – wir müssen uns den Download-Link ansehen, nicht den auf der Website angezeigten Namen! Der Dateiname beginnen immer mit yolov8
, dann kommt n
, s
oder m
usw. für die Modellgröße, und am Ende -oiv7.pt
, das mittlere Modell hat damit den Dateinamen yolov8m-oiv7.pt
, diesen Namen können wir einfach in unserem Code verwenden:
# load the YOLO8 Open Images V7 medium model
model = YOLO("yolov8m-oiv7.pt")
Das Modell wird bei der ersten Verwendung automatisch heruntergeladen und wir können es nutzen. Auch wenn wir bisher ultralytics mit Yolo11 verwendet haben, ist der code auch für Yolo8-Modelle kompatibel.
Cool! Wir sehen schon mal Bienen und nicht mehr als Vögel getarnte Bienen, sehr schön!! Eine Biene wird auch als insect
klassifiziert. Der screenshot oben hat viele detections, in anderen Bereichen des Videos ist das deutlich schwacher.
Gut, dann gehen wir einmal von der bisher geforderten conficende runter und ändern conf=0.4
in conf=0.2
: Nur wenige Bienen werden mehr erkannt, ups und wir haben eine Ente im Bild:
Ahh, und einen beehive
haben wir nun auch mit niedriger confidence. Die Magazinbeuten am Anfang des Videos werden allerdings immer noch als waste container
klassifiziert, mit dem COCO-Datensatz waren es übrigens suitcases
Bisher habe ich noch nicht herausgefunden, ob yolov8m-oiv7.pt
auch segmentation unterstützt.
Roboflow 100
Interessant ist noch ein Blick auf das
- Roboflow 100 Dataset
RF100 - Ultralytics YOLO Docs
Der Roboflow 100-Datensatz selbst besteht wiederum aus 100 unterschiedlichen Datensätzen über verschiedene Domänen hinweg. eine Domäne ist hier: Real world. In dieser Kategorie gibt es einen dezidierten Bienen-Datensatz!
Auf der ultralytics-Seite zu RF100 gibt es keine YAML-Datei und auch keinen link zu einem vortrainierten Modell. Daher schauen wir uns die Roboflow 100 GitHub-Seite an.
Dort wird im Abschnitt Samples auf den Bienen-Datensatz verwiesen: bees Computer Vision Project mit 8.080 Bildern vom November 2022 verwiesen. Bei den Credits findet sich ein weiterer Link zu einem ander Projekt Bee Detection Computer Vision Project. Dort sind es zwar 9.664 Bilder, ein Teil davon ist aber noch nicht annotiert: “905 missing annotations”. Vermutlich ist es eine neuere, erweiterte Version des Datensatzes oben, was zu überprüfen wäre.