Object Detection in Docker

Online Angebote für das Labeln von Bildern und Trainieren von Modellen gibt es inzwischen viele. Aber geht das auch lokal?

In diesem Artikel wird beschrieben, wie verschiedene Docker-Container in einer Docker-Compose-Datei erstellt werden können, wie man einen Objektspeicher aufsetzt, Bilder labelt und das Trainieren von Object Detektion Modellen ermöglicht. Die passende Infrastruktur besteht aus mehreren Containern:

  • MinIO zum Speichern von Video-Dateien
  • Jupyter Tensorflow Notebook zum Bearbeiten der Dateien und Training von Yolov8-Modellen
  • CVAT zum Labeln der Videos

Die Grundlage bildet das OS Ubuntu. Hierbei spielt es keine Rolle, ob es sich um einen physischen PC, eine virtuellen Maschine oder um einen Cloud Dienst handelt.

Docker-Compose-Installation auf Ubuntu

Um Docker-Compose auf einem Ubuntu 22.04-System zu installieren, wird zuerst sichergestellt, dass Docker-Compose bereits installiert ist. Docker-Compose ist ein Tool, mit dem mehrere Docker-Container als eine Anwendung definiert und ausgeführt werden können. Die Installation erfolgt über das Terminal mit den entsprechenden Befehlen:

sudo apt-get update
sudo apt-get install docker-compose

Konfigurieren der Container

Anschließend werden die Container in einer Docker-Compose-Datei konfiguriert und abgespeichert in docker-compose.yml

version: ‚3‘
services:
minio:
image: minio/minio
volumes:
– ./data:/data
environment:
– MINIO_ACCESS_KEY=minio
– MINIO_SECRET_KEY=minio123
ports:
– „9000:9000“
jupyter:
image: jupyter/tensorflow-notebook
deploy:
resources:
reservations:
devices:
– driver: nvidia
count: 1
capabilities: [gpu]
volumes:
– ./notebooks:/home/jovyan/work
ports:
– „8888:8888“
cvat:
image: openvino/cvat
environment:
– CVAT_ADMIN_USERNAME=admin
– CVAT_ADMIN_PASSWORD=admin123
ports:
– „8080:8080“

Der MinIO-Service bindet das Verzeichnis „data“ des Hosts in das „/data“-Verzeichnis im Container ein. Dies ist notwendig, um die von MinIO gespeicherten Daten auf dem Host-System zu speichern. Zusätzlich werden zwei Umgebungsvariablen „MINIO_ACCESS_KEY“ und „MINIO_SECRET_KEY“ definiert, die die Anmeldeinformationen für den Zugriff auf das MinIO-Objektspeichersystem steuern. Über den Port „9000“ des Containers kann auf die MinIO UI zugegriffen werden.

Der Jupyter-Service bindet das Verzeichnis Notebooks des Hosts in das „/home/jovyan/work“-Verzeichnis im Container ein . Dies ermöglicht den Zugriff auf die Jupyter-Notebooks, die im Host-Verzeichnis gespeichert werden und die Ausführung von TensorFlow-Code innerhalb des Containers. Über den Port „8888“ kann auf die UI des Jupyter Notebooks zugegriffen werden. Die Treiberweitergabe „driver:nvidia“ ermöglicht die Nutzung einer Grafikkarte in Docker.

Der CVAT-Service  generiert  die Umgebungsvariablen „CVAT_ADMIN_USERNAME“ und „CVAT_ADMIN_PASSWORD“, um den Benutzernamen und das Kennwort des CVAT-Administrators festzulegen. Der Port „8080“ verweist auf die UI von CVAT.

Starten der Container

Nach der Konfiguration der Docker-Compose-Datei können die Container gestartet werden, indem der entsprechende Befehl im Terminal eingegeben wird. Es ist wichtig, dass der entsprechende Befehl in dem Verzeichnis in welchem die „docker-compose.yml“-Datei gespeichert wurde, eingegeben wird. Der Befehl lautet:

docker-compose up -d

Dieser Befehl startet alle in der „docker-compose.yml“-Datei definierten Container im Hintergrund.

Labeln und trainieren

Unter der Adresse „http://localhost:8080“ kann CVAT erreicht werden. CVAT kann auf MinIO zugreifen. Es empfielt sich, für jedes Dataset einen separaten Task zu erstellen. Nach dem Labeln der Bilder, wird das Dataset im gewünschten Format exportiert.

Das Juypter Notebook ist unter der Adresse „http://localhost:8888“ erreichbar. Die meisten Bibliotheken für ein Yolo Training sind bereits im Tesnorflow-Notebook vorinstalliert. Der Rest wird nachinstalliert:

!pip install ultralytics

 

Ein Yolov8 Model wird mit Hilfe des gelabelten Bildes trainiert.

from ultralytics import YOLO
model = YOLO(„yolov8x“) #lade Model
model.train(data=“data.yaml“, epochs=10, batch=2, device=0)

Mit dem trainierten Model lassen sich nun Vorhersagen auf Bilder oder Videos ausführen.

model = YOLO(„pfad/zu/Model/best.pt“) # load own model
model.predict(„Pfad/zu/Bild.jpg“, save=True)

 

Der Anfang ist gemacht. Von hier an gibt es viel zu entdecken.

Beitrag teilen

Schreibe einen Kommentar