Automatische Baumartenerkennung anhand des SwissimageRS: Unterschied zwischen den Versionen

Aus Waldmonitoring Wiki
(Die Seite wurde neu angelegt: „{{Einsatzbeispiel Vorlage |Einsatzbeispiel_Autor=Raffael Bienz |Einsatzbeispiel_Kontakt=raffael.bienz@ag.ch |Einsatzbeispiel_Link=https://github.com/RaffiBienz…“)
 
Zeile 6: Zeile 6:
 
}}
 
}}
 
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 ==
 +
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 ===
 +
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 ===
 +
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.

Version vom 30. März 2021, 12:21 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

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

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

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.