Automatische Baumartenerkennung anhand des SwissimageRS: Unterschied zwischen den Versionen

Aus Waldmonitoring Wiki
 
Zeile 5: Zeile 5:
 
|Einsatzbeispiel_Datum=2021/03/30
 
|Einsatzbeispiel_Datum=2021/03/30
 
}}
 
}}
 +
[[File:example.png|mini|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).
 
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 ==
 
== 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.
+
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 ===
 
=== Kronensegmentierung ===
Zeile 20: Zeile 21:
 
Als Trainingsdaten wurden 3500 Bäume im Wald manuell erfasst.
 
Als Trainingsdaten wurden 3500 Bäume im Wald manuell erfasst.
 
Der Algorithmus unterscheidet folgende Klassen von Baumarten:
 
Der Algorithmus unterscheidet folgende Klassen von Baumarten:
    - Ahorne (Acer spp.)
+
* Ahorne (Acer spp.)
    - Buche (Fagus sylvatica)
+
* Buche (Fagus sylvatica)
    - Douglasie (Pseudotsuga menziesii)
+
* Douglasie (Pseudotsuga menziesii)
    - Eichen (Querqus robur + petraea)
+
* Eichen (Querqus robur + petraea)
    - Gemeine Esche (Fraxinus excelsior)
+
* Gemeine Esche (Fraxinus excelsior)
    - Fichte (Picea abies)
+
* Fichte (Picea abies)
    - Waldföhre (Pinus sylvestris)
+
* Waldföhre (Pinus sylvestris)
    - Kirschen (Prunus avium + padus)
+
* Kirschen (Prunus avium + padus)
    - Lärche (Larix decidua)
+
* Lärche (Larix decidua)
    - Linden (Tilia cordata + platyphyllos)
+
* Linden (Tilia cordata + platyphyllos)
    - Roteiche (Quercus rubra)
+
* Roteiche (Quercus rubra)
    - Tanne (Abies alba)
+
* Tanne (Abies alba)
    - Übriges Laubholz
+
* Übriges Laubholz
    - Übriges Nadelholz
+
* Übriges Nadelholz
 
 
  
 
== Anwendung ==
 
== Anwendung ==
Zeile 40: Zeile 40:
  
 
=== Repository und Testdaten herunterladen ===
 
=== Repository und Testdaten herunterladen ===
git clone https://github.com/RaffiBienz/arborizer.git
+
Repository herunterladen:
 +
  git clone https://github.com/RaffiBienz/arborizer.git
  
 
Die Testdaten können unter folgendem Link heruntergeladen werden:  
 
Die Testdaten können unter folgendem Link heruntergeladen werden:  
 
https://drive.google.com/file/d/1VJGAITIG_-k09earWOdKSjAnBkIJNyoO/view?usp=sharing
 
https://drive.google.com/file/d/1VJGAITIG_-k09earWOdKSjAnBkIJNyoO/view?usp=sharing
 +
 
Die Daten müssen in den data-Ordner im Repository kopiert werden.
 
Die Daten müssen in den data-Ordner im Repository kopiert werden.
 +
  
 
Die Parameter können unter folgendem Link heruntergeladen werden:
 
Die Parameter können unter folgendem Link heruntergeladen werden:
 
https://drive.google.com/file/d/1sSN48YJ6Prjyg_sxfGq5fi22aMJGzagQ/view?usp=sharing
 
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.
 
Die Ordner mit Parameter müssen in den src-Ordner im Repository kopiert werden.
  
 
=== Python-Umgebung aufsetzen ===
 
=== 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.
+
# 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.
 +
# Öffne config_template.R im src-Ordner und speichere die Datei als config.R
 +
# Im config.R muss der Path zur Python- (oder auch Anaconda-) Installation angegeben werden. Oder Falls Python als Umgebungsvariable definiert wurde, reicht "python".
 +
# Installiere die Packages mxnet (1.5.0) und gluoncv (0.4.0) -> siehe auch requirements.txt
  
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.
 
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:
+
'''Beispiel für ein Setup mit Anaconda:'''
  
 
Öffne Anaconda Prompt und führe folgende Befehle aus:
 
Öffne Anaconda Prompt und führe folgende Befehle aus:
  
conda create -y -n arborizer python==3.6.7
+
  conda create -y -n arborizer python==3.6.7
 
+
  conda activate arborizer
conda activate arborizer
+
  pip install -r .\requirements.txt
 
 
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
 
Dann muss man im config.R noch den Anaconda-Pfad angeben. Typischerweise: C:/Users/USERNAME/.conda/envs/arborizer/python.exe
Zeile 83: Zeile 83:
  
 
=== Daten ===
 
=== 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:
 
Es werden folgende Daten benötigt:
- SwissimageRS (10x10 cm Raster / RGBI or IRGB / Swisstopo) in belaubtem Zustand
+
* 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.
+
* 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)
+
* Waldausscheidung (Polygon-Shapefile)
- Fischnetz (30x30m Polygon-Shapefile). Diese kann automatisch anhand der Waldausscheidung generiert werden (setze dazu new_fishnet = True in config.R)
+
* Fischnetz (30x30m Polygon-Shapefile). Diese kann automatisch anhand der Waldausscheidung generiert werden (setze dazu new_fishnet = True in config.R)
  
 
=== Skript ausführen ===
 
=== Skript ausführen ===
1. In config.R können bei Bedarf weitere Einstellungen vorgenommen werden (mindestens der Python-Pfad muss definiert werden)
+
# In config.R können bei Bedarf weitere Einstellungen vorgenommen werden (mindestens der Python-Pfad muss definiert werden)
 
+
# Öffne main.R und setze das aktuelle Arbeitsverzeichnis
2. Öffne main.R und setze das aktuelle Arbeitsverzeichnis
+
# Führe main.R aus (in einer Shell oder in RStudio)
 
+
# Überprüfe die Resultate im result-Ordner
3. Führe main.R aus (in einer Shell oder in RStudio)
 
 
 
4. Überprüfe die Resultate im result-Ordner
 
  
 
== Genauigkeit des Algorithmus ==
 
== Genauigkeit des Algorithmus ==

Aktuelle Version vom 30. März 2021, 12:41 Uhr

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.