226 lines
5.7 KiB
Markdown
226 lines
5.7 KiB
Markdown
# Drohnen KI
|
|
|
|
Dieses Projekt widmet sich der Erkennung von Flächenbelägen auf Drohnenbildern.
|
|
|
|
## Installation
|
|
|
|
Die Installation einer virtuellen Umgebung lässt sich durch folgende Zeilen Konsolencode bewerkstelligen.
|
|
|
|
```shell
|
|
python3 -m venv venv
|
|
source venv/bin/activate
|
|
pip install 'git+https://github.com/facebookresearch/detectron2.git'
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
Da sich Detectron2 nicht in den Standard pip-Bibliotheken verfügbar ist, muss dieses Modul separat installiert werden.
|
|
|
|
Nach Abschluss dieser Befehle ist die virtuelle Umgebung einsatzbereit.
|
|
Durch Ansprechen des Befehls `deactivate` gelangt man wieder aus der Umgebung heraus.
|
|
Um eine erneute Nutzung dieser virtuellen Umgebung durchzuführen, reicht es, den Befehl `source venv/bin/activate`
|
|
auszuführen.
|
|
|
|
## Nutzung
|
|
|
|
Dieser Abschnitt geht davon aus, dass die Umgebung korrekt installiert ist.
|
|
|
|
### Vorverarbeitung der GIS-Daten
|
|
|
|
Da die Daten aus dem stadteigenen GIS nicht direkt von der KI erstanden werden, benötigt es einer Vorverarbeitung.
|
|
Diese passiert in der Datei [`belag.py`](preprocessing/belag.py).
|
|
|
|
Voraussetzung hierfür ist, dass eine Datei `Fleachenbelaege.json` und eine `Referenzpunkte.csv` vorhanden sind.
|
|
Sollten die Namen oder Pfade abweichen, kann dies in der Datei `belag.py` angepasst werden.
|
|
|
|
In der Datei `Flaechenbelaege.json` werden Flächendefinitionen im [GeoJSON](https://geojson.org/)-Format erwartet.
|
|
Diese Datei enthält alle Flächen, die zum Training verwendet werden sollen.
|
|
|
|
Die Datei `Referenzpunkte.csv` gibt in den ersten 4 Reihen die Eckpunkte des zu verarbeitenden Bildes aus.
|
|
Diese werden verwendet, um die Koordinaten aus der Flächenbeschreibung den Pixel-Koordinaten im Bild zuzuweisen.
|
|
|
|
Sobald alle Dateien vorhanden sind, kann das Skript mit folgendem Befehl ausgeführt werden:
|
|
|
|
```shell
|
|
python belag.py
|
|
```
|
|
|
|
Das Resultat daraus ist zum einen ein Ordner mit allen 1000x1000 Pixel großen Bildern und zum anderen eine
|
|
Datei `belaege.json`.
|
|
Diese beiden Dateien können anschließend zum Training genutzt werden.
|
|
|
|
### Erkennung
|
|
|
|
Zur Erkennung einzelner Bilder kann die Datei `predict.py` verwendet werden.
|
|
|
|
```shell
|
|
python predict.py \
|
|
--source data/images/westend/cropped \
|
|
--output_dir data/images/Markierungen
|
|
```
|
|
|
|
Die Parameter können beliebig angepasst und in allen Kombinationen übergeben werden.
|
|
|
|
| Parameter | Standardwert | Beschreibung |
|
|
|---------------|-----------------------|-------------------------------------------------------------------------|
|
|
| category_json | | Falls andere Klassen verwendet werden, können sie hier übergeben werden |
|
|
| source | data/images/original | Ein Ordner, in dem sich alle zu bearbeitenden Bilder befinden |
|
|
| output_dir | data/images/predicted | Ein Ordner in dem alle erkannten Bilder abgelegt werden |
|
|
|
|
### Training
|
|
|
|
Zur Nutzung des Trainingsskripts wird eine GPU empfohlen.
|
|
|
|
Das Training lässt sich über die Datei `train.py` starten.
|
|
Dazu dient folgender Befehl:
|
|
|
|
```shell
|
|
python train.py --data_json data/json/train_data.json
|
|
```
|
|
|
|
Der Pfad `data/json/train_data.json` kann hierbei durch eine andere Trainingsdatei ersetzt werden.
|
|
Zur Anpassung weiterer Einstellungen (wie die Anzahl der zu trainierenden Epochen) stehen Konfigurationsoptionen direkt
|
|
in der `train.py`-Datei bereit.
|
|
|
|
#### Trainingsdaten
|
|
|
|
Die Trainingsdaten werden im folgenden JSON-Format erwartet:
|
|
|
|
```JSON
|
|
{
|
|
"train_images": [],
|
|
"test_images": [],
|
|
"categories": []
|
|
}
|
|
```
|
|
|
|
Der Bereich `categories` ist ein Array von Strings.
|
|
Dies sind die Namen der Klassen, auf die in den image-Objekten referenziert werden.
|
|
Beispiel:
|
|
|
|
```JSON
|
|
[
|
|
"Baumbestand",
|
|
"Festweg",
|
|
"Pflaster",
|
|
"Wiese",
|
|
"Wasser",
|
|
"Gullydeckel"
|
|
]
|
|
```
|
|
|
|
Sowohl `train_images`, als auch `test_images` halten Bilddaten in dem folgenden Format vor:
|
|
|
|
```JSON
|
|
{
|
|
"image_id": 0,
|
|
"width": 1000,
|
|
"height": 1000,
|
|
"file_name": "data/images/westend/cropped/WestendDOP2_0_9000.tif",
|
|
"annotations": []
|
|
}
|
|
```
|
|
|
|
Der Parameter `annotations` ist eine Liste aus Objekten:
|
|
|
|
```JSON
|
|
{
|
|
"category_name": "Gullydeckel",
|
|
"ignore": 0,
|
|
"iscrowd": 0,
|
|
"area": 1256.6370614359173,
|
|
"bbox": [
|
|
878.0,
|
|
526.0,
|
|
918.0,
|
|
566.0
|
|
],
|
|
"bbox_mode": 0,
|
|
"segmentation": [
|
|
[
|
|
918.0,
|
|
546.0,
|
|
917.61571,
|
|
549.90181,
|
|
916.47759,
|
|
553.65367,
|
|
914.62939,
|
|
557.1114,
|
|
912.14214,
|
|
560.14214,
|
|
909.1114,
|
|
562.62939,
|
|
905.65367,
|
|
564.47759,
|
|
901.90181,
|
|
565.61571,
|
|
898.0,
|
|
566.0,
|
|
894.09819,
|
|
565.61571,
|
|
890.34633,
|
|
564.47759,
|
|
886.8886,
|
|
562.62939,
|
|
883.85786,
|
|
560.14214,
|
|
881.37061,
|
|
557.1114,
|
|
879.52241,
|
|
553.65367,
|
|
878.38429,
|
|
549.90181,
|
|
878.0,
|
|
546.0,
|
|
878.38429,
|
|
542.09819,
|
|
879.52241,
|
|
538.34633,
|
|
881.37061,
|
|
534.8886,
|
|
883.85786,
|
|
531.85786,
|
|
886.8886,
|
|
529.37061,
|
|
890.34633,
|
|
527.52241,
|
|
894.09819,
|
|
526.38429,
|
|
898.0,
|
|
526.0,
|
|
901.90181,
|
|
526.38429,
|
|
905.65367,
|
|
527.52241,
|
|
909.1114,
|
|
529.37061,
|
|
912.14214,
|
|
531.85786,
|
|
914.62939,
|
|
534.8886,
|
|
916.47759,
|
|
538.34633,
|
|
917.61571,
|
|
542.09819
|
|
]
|
|
],
|
|
"category_id": 5
|
|
}
|
|
```
|
|
|
|
`segmentation` folgt dem xyxy-Muster. Das bedeutet, dass ein Objekt, welches von (0, 10) über (0, 50) zu (20, 30) geht,
|
|
diese Liste generieren würde:
|
|
|
|
```JSON
|
|
[
|
|
0,
|
|
10,
|
|
0,
|
|
50,
|
|
20,
|
|
30
|
|
]
|
|
```
|
|
|
|
## Contributors
|
|
Dieses Projekt wurde entwickelt von [Masasana AI](https://masasana.ai) in Zusammenarbeit mit dem Smart City Team der Stadt
|
|
Mönchengladbach. |