Automatische Baumartenerkennung anhand des SwissimageRS: Unterschied zwischen den Versionen
Raffi (Diskussion | Beiträge) |
|||
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 | + | 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.) | |
− | + | * 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 == | == 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 === | ||
− | + | # 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 | ||
− | |||
− | |||
− | |||
− | |||
− | |||
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 | |
− | + | * 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 === | === Skript ausführen === | ||
− | + | # 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 | |
− | + | # Führe main.R aus (in einer Shell oder in RStudio) | |
− | + | # Ü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 |
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
- 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
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
- 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
- Führe main.R aus (in einer Shell oder in RStudio)
- Ü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.