Instance Segmentation für Luft- und Satellitenbildaufnahmen

Die Theorie
Die Instance Segmentation (Instanzen Segmentierung) ist eine Methode der Bildverarbeitung im Bereich der Computer Vision. Sie ist eine Kombination aus Objekterkennung und Semantic Segmentation (semantischer Segmentierung).
Die Aufgabe der Semantic Segmentation ist es, ein Bildverständnis auf Pixelebene zu erhalten, d.h. jedem Pixel eine Objektklasse zuzuordnen. Die Objekterkennung befasst sich damit, Objekte in Bilddaten zu identifizieren. Zusätzlich wird ein Begrenzungsrahmen (Bounding Box, siehe Kästen im Bild) berechnet. Dieser ist das kleinstmögliche achsparallele Rechteck, das das Objekt vollständig enthält.
Die Instance Segmentation stellt eine fortgeschrittene Form der Objekterkennung dar, bei der mehrere Instanzen einer Objektklasse identifiziert werden können. Außerdem können den Instanzen die genauen Pixelwerte zugeordnet werden. Das verwendete Machine-Learning-Modell muss also ein sehr gutes Verständnis für den Bildinhalt erlangen. Zum besseren Verständnis sind in Abbildung 1 die verschiedenen Formen der Klassifikations- und Segmentierungsaufgaben zu sehen, wobei die Instance Segmentation den größten Informationsgehalt bereitstellt.

Abbildung 1: Ein Überblick über die verschiedenen Klassifikations- und Segmentierungsaufgaben [1].
Der Weg zum Mask R-CNN
Für die hier vorgestellte Instance Segmentation wird eine Netzwerkarchitektur namens Mask R-CNN benutzt. Lesen Sie dazu auch unsere Blogpostreihe über Semantic Segmentation.
Die Entstehung des Mask R-CNN beginnt mit dem Netzwerk R-CNN, ein Machine-Learning-Modell zur Objekterkennung. Dabei werden in einem ersten Schritt sogenannte Region Proposals für das Eingabebild erstellt. Diese werden anschließend in eine einheitliche Größe transformiert und in einem letzten Schritt werden durch ein Convolutional Neural Network (CNN) in Kombination mit einer Support Vector Machine (SVM) die Region Proposals klassifiziert. Das R-CNN ist eines der ersten Modelle, das ein CNN für die Objekterkennung verwendet hat und erzielte dadurch deutlich bessere Ergebnisse als die bisherigen Vorgänger.
Das Netzwerk R-CNN erlangte große Aufmerksamkeit und wurde weiterentwickelt: Beim Fast R-CNN, wie der Name schon vermuten lässt, handelt es sich um eine Verbesserung der Klassifikationszeit. Durch die Einführung einer Region of Interest (RoI) Pooling Schicht kann das Modell durchgehend mit dem Einsatz von Backpropagation trainiert werden. Außerdem verbessert diese Neuerung die Qualität der Klassifizierung sowie die Klassifikationszeit.
Das Fast R-CNN konnte nochmals verbessert werden, sodass das Faster R-CNN entstand. Die Grundidee ist das Einführen eines eigenen Region Proposal Network (RPN), welches innerhalb einer Netzwerk-in-Netzwerk-Struktur Vorschläge für potentielle Objektbereiche erstellt. Das Region Proposal Network arbeitet mit denselben Feature Maps wie das eigentliche Klassifikationsnetzwerk. Dadurch wird der gesamte Prozess um ein Vielfaches beschleunigt.
Das aktuellste Netzwerk aus dieser Familie ist das Mask R-CNN. Es verwendet das Faster R-CNN als Basisnetzwerk und erweitert es um einen Zweig zur Maskenerzeugung. Dabei wird ein Fully Convolutional Network (FCN) eingesetzt. Das Hauptmerkmal der FCN ist die Ersetzung der Fully Connected Schichten durch 1×1 Convolution-Schichten. Das Vorgehen des Mask R-CNN kann wie folgt beschrieben werden: parallel zu der Vorhersage der Klasse und der Bounding-Box-Koordinaten wird für jede RoI eine binäre Maske ausgegeben. Das Besondere an diesem Vorgehen ist, dass die Klassifizierung nicht von der Masken-Vorhersage abhängt, sondern parallel zu dieser läuft. Zur Erstellung der Maske wird die Convolution-Operation benutzt. Da in einem FCN die Feature-Map nicht durch FC-Schichten in einen Feature-Vektor umgewandelt wird, geht die räumliche Dimension nicht verloren und kann benutzt werden, um die Maske vorherzusagen. Da für jede RoI eine Maske berechnet wird, müssen die RoIs selbst sehr genau sein und das Objekt komplett enthalten. Daher wurde die RoI-Pooling-Schicht des Faster R-CNN durch eine RoI-Align-Schicht ersetzt. Das RoI-Pooling bedient sich einiger Rundungsverfahren, die die Maskengenauigkeit beeinflussen. Im Gegensatz dazu verwendet das RoI-Align keinerlei Rundungsverfahren und behält somit die exakten räumlichen Informationen der Objekte im Ursprungsbild.
Die Anwendung
Was mit der vorgestellte Netzwerkarchitektur Mask R-CNN möglich ist, wollen wir anhand eines praktischen Beispiels aufzeigen.
Für viele Bereiche sind inzwischen hochauflösende Luft- und Satellitenbilder verfügbar. Zwar schwankt die Qualität von Region zu Region, dennoch lassen sich frei verfügbare Ressourcen (z.B. Google Maps oder Bing-Maps) nutzen, um Informationen über die Auslastung von Parkplätzen (oder Häfen, Abstellgleise, Containerplätze, etc) zu gewinnen. Im Rahmen dieses PoCs haben wir statische Bilder verwendet, denkbar sind jedoch auch wochen- oder tagesaktuelle Bilder, die von Städten und Kommunen erfasst werden. Dies eröffnet ganz neue Möglichkeiten bei der Verkehrsplanung und Überwachung der Auslastungen. Auch ganz andere Szenarien sind möglich, erfordern allerdings ein entsprechendes Training der KI.
In den nachfolgenden Bildern ist ein Screenshot von Bing-Maps eines Parkplatzes und die Ergebnisse der Klassifikation des eigens trainierten Netzwerkes zu sehen.

Abbildung 2: Screenshot eines Parkplatzes von Bing-Maps.

Abbildung 3: Ergebnisse der Klassifikation durch das eigens trainierte Modell. Das Bild wurde in ein Schwarz-Weiß Bild umgewandelt, um die Ergebnisse besser hervorzuheben.
Um solch eine Anwendung zu Erstellen benötigt man einen passenden Datensatz. Für diese Anwendung wurde der Luftbilddatensatz iSAID: A Large-scale Dataset for Instance Segmentation in Aerial Images verwendet. In der nachfolgenden Abbildung sind pro Klasse drei exemplarische Bilder zu sehen.

Abbildung 4: Beispielbilder des iSAID-Datensatzes aus 15 verschiedenen Klassen [2].
Für das Training wurde eine lokaler Server speziell für das Training von Machine Learning Modellen eingesetzt. Rechner-Spezifikationen:
- 128GB RAM Arbeitsspeicher
- Intel Core i9-7920x CPU
- 2 CUDA fähige Grafikkarten: Nvidia GeForce GTX 1080 Ti
Mit dieser Hardware wurde das Modell etwas länger als 1 Tag trainiert. Dafür wurde das von Facebook Research bereitgestellte Detectron2 Framework verwendet.
Der entsprechende Docker-Container kann nach dem Erstellen des Image mit folgendem Befehl ausgeführt werden:
1 |
docker run -d -ti --runtime=nvidia -e NVIDIA_DRIVER_CAPABILITIES=compute,utility -e NVIDIA_VISIBLE_DEVICES=all docker_detectron2 |
Um den oben genannten iSAID Datensatz in Detectron2 benutzen zu können, muss dieser zuerst registriert werden. Da die Daten sich in dem gängingen COCO-Format sind, können diese sehr simpel registriert werden:
1 2 3 4 5 |
from detectron2.data.datasets import register_coco_instances register_coco_instances("isaid_train", {}, "/data/iSAID_patches/train/instancesonly_filtered_train.json", "/data/iSAID_patches/train/images/") register_coco_instances("isaid_test", {}, "/data/iSAID_patches/test/instancesonly_filtered_test.json", "/data/iSAID_patches/test/images/") |
Nach dem Konfigurieren der Netzwerk-Details kann das Training mit dem DefaultTrainer() gestartet werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# Setup detectron2 logger import detectron2 from detectron2.utils.logger import setup_logger setup_logger() # import some common libraries import numpy as np import os, json, cv2, random # import some common detectron2 utilities from detectron2 import model_zoo from detectron2.engine import DefaultPredictor from detectron2.config import get_cfg from detectron2.utils.visualizer import Visualizer from detectron2.data import MetadataCatalog, DatasetCatalog from detectron2.engine import DefaultTrainer from detectron2.data.datasets import register_coco_instances cfg = get_cfg() cfg.merge_from_file(model_zoo.get_config_file("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml")) cfg.DATASETS.TRAIN = ("isaid_train",) cfg.DATASETS.TEST = () cfg.DATALOADER.NUM_WORKERS = 2 cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url("COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml") cfg.SOLVER.IMS_PER_BATCH = 2 cfg.SOLVER.BASE_LR = 0.0025 cfg.SOLVER.MAX_ITER = 350000 cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 512 cfg.MODEL.ROI_HEADS.NUM_CLASSES = 15 # 15 classes os.makedirs(cfg.OUTPUT_DIR, exist_ok=True) trainer = DefaultTrainer(cfg) trainer.resume_or_load(resume=False) trainer.train() |
Für das fertige Modell haben wir ein Web-Service mit dem Python Framework Flask erstellt. Auf der Startseite des Web-Services können per Drag-and-drop oder mittels einer Dateiauswahl im Dateimanager Bilddaten hochgeladen werden. Diese werden anschließend durch das Mask R-CNN Modell-50 klassifiziert. Das Bild wird in ein Graubild umgewandelt und die gefundenen Instanzen werden farbig umrahmt und maskiert eingezeichnet, wie in den Beispielen oben. Dabei werden jegliche gefundenen Objekte gezählt.
Wir hoffen, Dir einen guten Einblick in die Möglichkeiten von Instance Segementation gegen zu haben. Die erstellte Anwendung kann zum Beispiel für eine Analyse von Parkplatzauslastungen mit Hilfe von Drohnenbildern verwendet werden. So kann beispielsweise perspektivisch eine prozentuale Auslastung für verschiedene Tage berechnet werden. Ebenso kann das Verfahren leicht an völlig andere Fragestellungen angepasst werden. Und wir sind noch nicht am Ende. Genauere und performantere Netzwerke werden jetzt gerade erforscht und entwickelt. Manche davon sind auf möglichst genaue Bilderkennung und manche auf möglichst schnelle Erkennung in Echtzeit (z.B. in Videostreams) spezialisiert. Wir dürfen gespannt sein, was die Zukunft bringt!
Aktuelle Beiträge






Artikel kommentieren