Automatische Baumartenerkennung anhand des SwissimageRS

From Waldmonitoring Wiki
Revision as of 12:41, 30 March 2021 by Raffi (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Automatische Baumartenerkennung anhand des SwissimageRS
Autor* Raffael Bienz
Kontakt raffael.bienz@ag.ch
Link https://github.com/RaffiBienz/arborizer
Ort
Datum 2021/03/30
Baumkronensegmentierung mit Zuordnung der Baumart

Die Abteilung Wald des Kantons Aargau hat einen Algorithmus entwickelt, der basierend auf dem SwissimageRS von 2018 zuerst eine Baumkronenabgrenzung vornimmt und die gefundenen Baumkronen dann in 14 Baumartenklassen klassifiziert. Der Algorithmus wurde für Bäume ab dem Baumholz entwickelt (Vegetationshöhe > 21m).

Algorithmus

Es werden zwei verschiedene künstliche neurale Netzwerke verwendet: Das Erste segmentiert das Luftbild nach Baumkronen. Das Zweite nimmt eine Klassifikation der gefundenen Baumkronen vor.

Kronensegmentierung

Modell: resnet50_v1b trainiert auf dem coco Datensatz

Als Trainingsdaten wurden 260 Flächen mit manuell segmentierten Baumkronen verwendet.

Klassifikation der Baumkronen

Modell: mobilenet1.0 trainiert auf dem ImageNet Datensatz

Als Trainingsdaten wurden 3500 Bäume im Wald manuell erfasst. Der Algorithmus unterscheidet folgende Klassen von Baumarten:

  • Ahorne (Acer spp.)
  • Buche (Fagus sylvatica)
  • Douglasie (Pseudotsuga menziesii)
  • Eichen (Querqus robur + petraea)
  • Gemeine Esche (Fraxinus excelsior)
  • Fichte (Picea abies)
  • Waldföhre (Pinus sylvestris)
  • Kirschen (Prunus avium + padus)
  • Lärche (Larix decidua)
  • Linden (Tilia cordata + platyphyllos)
  • Roteiche (Quercus rubra)
  • Tanne (Abies alba)
  • Übriges Laubholz
  • Übriges Nadelholz

Anwendung

Der Algorithmus kann von Github heruntergeladen werden: https://github.com/RaffiBienz/arborizer

Repository und Testdaten herunterladen

Repository herunterladen:

 git clone https://github.com/RaffiBienz/arborizer.git

Die Testdaten können unter folgendem Link heruntergeladen werden: https://drive.google.com/file/d/1VJGAITIG_-k09earWOdKSjAnBkIJNyoO/view?usp=sharing

Die Daten müssen in den data-Ordner im Repository kopiert werden.


Die Parameter können unter folgendem Link heruntergeladen werden: https://drive.google.com/file/d/1sSN48YJ6Prjyg_sxfGq5fi22aMJGzagQ/view?usp=sharing

Die Ordner mit Parameter müssen in den src-Ordner im Repository kopiert werden.

Python-Umgebung aufsetzen

  1. Python 3.6.7 installieren (https://www.python.org/ftp/python/3.6.7/python-3.6.7-amd64.exe). Auf Windows haben höhere Python-Versionen zu Problemen geführt. Auf Linux funktionieren auch höhere Versionen.
  2. Öffne config_template.R im src-Ordner und speichere die Datei als config.R
  3. Im config.R muss der Path zur Python- (oder auch Anaconda-) Installation angegeben werden. Oder Falls Python als Umgebungsvariable definiert wurde, reicht "python".
  4. Installiere die Packages mxnet (1.5.0) und gluoncv (0.4.0) -> siehe auch requirements.txt

Falls eine geeignete Grafikkarte auf dem Gerät installiert ist und CUDA eingerichtet wurde, wird automatisch die Grafikkarte für die Berechnungen verwendet. Ansonsten laufen die Berechnungen über den CPU, was viel langsamer ist. Falls Probleme auftreten, kann man in predict_masks_folder.py (Linie 13) mit ctx=[mx.cpu(0)] die Verwendung des CPUs manuell einstellen.

Beispiel für ein Setup mit Anaconda:

Öffne Anaconda Prompt und führe folgende Befehle aus:

 conda create -y -n arborizer python==3.6.7
 conda activate arborizer
 pip install -r .\requirements.txt

Dann muss man im config.R noch den Anaconda-Pfad angeben. Typischerweise: C:/Users/USERNAME/.conda/envs/arborizer/python.exe

R-Umgebung aufsetzen

Installiere R und falls gewünscht R-Studio.

Benötigte Libraries: rgdal, rgeos, raster, imager, doParallel, foreach, sf (siehe install_packages.R)

Diese werden automatisch beim ersten ausführen von main.R installiert.

Docker

Alternativ zum oben beschriebenen Setup kann auch das auf Github zur Verfügung gestellte Docker-File verwendet werden.

Daten

Das Orthofoto des Testgebiets (test_area.tif) wurde von der Swisstopo zur Verfügung gestellt (©swisstopo).

Die übrigen Testdaten wurden vom Kanton Aargau zur Verfügung gestellt.

Es werden folgende Daten benötigt:

  • SwissimageRS (10x10 cm Raster / RGBI or IRGB / Swisstopo) in belaubtem Zustand
  • Vegetationshöhenmodell (1x1m Raster) in welchem Zellen mit einer Vegetationshöhe > 21m als 1 klassiert sind und die anderen Zellen mit 0.
  • Waldausscheidung (Polygon-Shapefile)
  • Fischnetz (30x30m Polygon-Shapefile). Diese kann automatisch anhand der Waldausscheidung generiert werden (setze dazu new_fishnet = True in config.R)

Skript ausführen

  1. In config.R können bei Bedarf weitere Einstellungen vorgenommen werden (mindestens der Python-Pfad muss definiert werden)
  2. Öffne main.R und setze das aktuelle Arbeitsverzeichnis
  3. Führe main.R aus (in einer Shell oder in RStudio)
  4. Überprüfe die Resultate im result-Ordner

Genauigkeit des Algorithmus

Die Kronensegmentierung erreichte einen mAP (mean average precision) von 33.4 auf den Testdaten. Nadelbaumarten wurden dabei nicht so gut erkannt wie Laubbaumarten. Dies könnte an den relativ kleinen Kronen der Nadelbaumarten liegen. Bei Laubbaumarten wurden teilweise mehrere Baumkronen zu einer zusammengefasst.

Die Baumartenklassifikation erreichte eine Genauigkeit von 85 Prozent auf den Testdaten. Allerdings funktionierte die Klassifizierung der Nadelhölzer einiges besser, als die Klassifizierung der Laubhölzer.