
Die automatische Erkennung von Satelliten- oder Luftbildern ist der vielversprechendste Weg, um Informationen ĂŒber die Position verschiedener Objekte auf dem Boden zu erhalten. Die Ablehnung der manuellen Bildsegmentierung ist besonders wichtig, wenn groĂe Bereiche der ErdoberflĂ€che in kurzer Zeit bearbeitet werden sollen.
Vor kurzem hatte ich die Möglichkeit, theoretische FÀhigkeiten anzuwenden und mich im Bereich des maschinellen Lernens in einem realen Bildsegmentierungsprojekt zu versuchen. Ziel des Projekts ist die Erkennung von WaldbestÀnden, nÀmlich Baumkronen in hochauflösenden Satellitenbildern. Unter dem Schnitt werde ich meine Erfahrungen und Ergebnisse teilen.
Wenn es um die Bildverarbeitung geht, kann die Segmentierung wie folgt definiert werden - dies ist das Vorhandensein charakteristischer Bereiche auf dem Bild, die in diesem Merkmalsraum gleichermaĂen beschrieben werden.
Unterscheiden Sie zwischen Helligkeit, Kontur, Textur und semantischer Segmentierung.
Semantische (oder semantische) Bildsegmentierung dient zum Hervorheben von Bereichen auf dem Bild, von denen jeder einem bestimmten Attribut entspricht. Im Allgemeinen sind Probleme der semantischen Segmentierung schwer zu algorithmisieren, so dass Faltungs-Neuronale Netze, die gute Ergebnisse zeigen, derzeit hĂ€ufig fĂŒr die Bildsegmentierung verwendet werden.
ErklÀrung des Problems
Das Problem der binĂ€ren Segmentierung wird gelöst - Farbbilder (hochauflösende Satellitenbilder) werden dem Eingang des neuronalen Netzwerks zugefĂŒhrt, auf dem die Bereiche von Pixeln hervorgehoben werden mĂŒssen, die zu denselben KlassenbĂ€umen gehören.
Ausgangsdaten
Zu meiner VerfĂŒgung gab es eine Reihe von Satellitenbildkacheln mit einem rechteckigen Bereich, in den das Polygon passt. Darin mĂŒssen Sie nach BĂ€umen suchen. Das Polygon oder Multipolygon wird als GeoJSON-Datei dargestellt. In meinem Fall hatten die Kacheln ein PNG-Format mit einer GröĂe von 256 x 256 Pixel in Echtfarbe. (leider ohne IR) Nummerierung der Kacheln in der Form /zoom/x/y.png.
Es ist garantiert, dass alle Kacheln im Set aus Satellitenbildern stammen, die ungefĂ€hr zur gleichen Jahreszeit (SpĂ€tfrĂŒhling - FrĂŒhherbst, abhĂ€ngig vom Klima einer bestimmten Region) und an einem Tag in einem Ă€hnlichen Winkel zur OberflĂ€che aufgenommen wurden, an dem eine leichte Wolkendecke zulĂ€ssig war.
Datenaufbereitung
Da die FlĂ€che des gewĂŒnschten Polygons kleiner sein kann als diese rechteckige FlĂ€che, mĂŒssen zunĂ€chst die Kacheln ausgeschlossen werden, die ĂŒber die Grenzen des Polygons hinausgehen. Zu diesem Zweck wurde ein einfaches Skript geschrieben, das die erforderlichen Kacheln aus dem GeoJSON-Dateipolygon auswĂ€hlt. Es funktioniert wie folgt. ZunĂ€chst werden die Koordinaten aller Eckpunkte des Polygons in Kachelnummern
konvertiert und einem Array hinzugefĂŒgt. Es gibt auch einen Versatz relativ zum Ursprung. Zur visuellen PrĂŒfung wird ein Bild erzeugt, bei dem ein Pixel einer Kachel entspricht. Das Polygon im Bild wird bereits unter BerĂŒcksichtigung des Versatzes mit PIL ausgefĂŒllt. Danach wird das Bild in ein Array ĂŒbertragen, aus dem die erforderlichen Kacheln ausgewĂ€hlt werden, die in das Polygon fallen.
from PIL import Image, ImageDraw
Visuelles Ergebnis der Konvertierung eines Polygons in eine Reihe von KachelnNetzwerkmodell
Um die Probleme der Bildsegmentierung zu lösen,
gibt es eine Reihe von Modellen fĂŒr Faltungs-Neuronale Netze. Ich habe mich fĂŒr
U-Net entschieden , das sich bei der Segmentierung von BinĂ€rbildern bewĂ€hrt hat. Die U-Net-Architektur besteht aus den sogenannten Kontraktions- und Expansionspfaden, die durch Probros in den entsprechenden GröĂenstufen verbunden sind. Sie reduzieren zuerst die Auflösung des Bildes und erhöhen es dann, indem sie es zuvor mit den Bilddaten kombinieren und andere Ebenen durchlaufen Faltung. Somit wirkt das Netzwerk als eine Art Filter. Das Komprimieren und Dekomprimieren von Blöcken wird als Satz von Blöcken einer bestimmten Dimension dargestellt. Und jeder Block besteht aus grundlegenden Operationen: Faltung, ReLu und Max-Pooling. Es gibt Implementierungen des U-Net-Modells fĂŒr Keras, Tensorflow, Caffe und PyTorch. Ich habe Keras benutzt.
Trainingsset erstellen
Um dieses Unet-Modell zu lernen, benötigen Sie Bilder. Das erste, was mir in den Sinn kam, war die Idee, OpenStreetMap-Daten zu nehmen und darauf basierend Masken fĂŒr das Training zu generieren. Aber wie sich in meinem Fall herausstellte, lĂ€sst die Genauigkeit der Polygone, die ich benötige, zu wĂŒnschen ĂŒbrig. Ich brauchte auch die Anwesenheit einzelner BĂ€ume, die nicht immer kartiert sind. Deshalb musste ich ein solches Unternehmen aufgeben. Es ist jedoch erwĂ€hnenswert, dass dieser Ansatz fĂŒr andere Objekte wie StraĂen oder GebĂ€ude
effektiv sein kann .

Da die Idee, automatisch ein Trainingsmuster basierend auf OSM-Daten zu generieren, aufgegeben werden musste, habe ich beschlossen, einen kleinen Bereich manuell zu markieren. Zu diesem Zweck habe ich den JOSM-Editor verwendet, in dem ich verfĂŒgbare GelĂ€ndebilder als Substrat verwendet habe, das ich auf einem lokalen Server platziert habe. Dann tauchte ein anderes Problem auf - ich fand keine Gelegenheit, die Anzeige des Kachelrasters mit normalen JOSM-Werkzeugen einzuschalten. Aus diesem Grund haben einige einfache Zeilen in .htaccess auf demselben Server aus einem anderen Verzeichnis eine leere Kachel mit einem Pixelrand fĂŒr jede Anforderung des Formulars grid_tile / z / x / y.png ausgegeben und JOSM eine solche spontane Ebene hinzugefĂŒgt. So ein Fahrrad.

Zuerst habe ich ungefĂ€hr 30 Kacheln markiert. Mit einem Grafiktablett und dem âSchnellzeichnungsmodusâ in JOSM dauerte es nicht lange. Ich habe verstanden, dass eine solche Menge fĂŒr ein vollwertiges Training nicht ausreicht, aber ich habe mich entschlossen, damit zu beginnen. DarĂŒber hinaus wird das Training mit so vielen Daten schnell genug sein.
Training und erstes Ergebnis
Das Netzwerk wurde fĂŒr 15 Epochen ohne vorherige Datenerweiterung trainiert. Die Grafik zeigt die Werte fĂŒr Verluste und Genauigkeit der Testprobe:

Das Ergebnis der Erkennung von Bildern, die sich weder im Training noch in der Testprobe befanden, erwies sich als recht vernĂŒnftig:

Nach einer grĂŒndlicheren Untersuchung der Ergebnisse wurden einige Probleme deutlich. Viele Fehler befanden sich in den Schattenbereichen der Bilder - das Netzwerk fand entweder BĂ€ume im Schatten, wo sie nicht waren, oder genau das Gegenteil. Dies wurde erwartet, da das Trainingsset nur wenige solcher Beispiele enthielt. Ich hatte aber nicht erwartet, dass einige Teile der WasseroberflĂ€che und dunkle DĂ€cher des Metallprofils (vermutlich) als BĂ€ume erkannt wĂŒrden. Es gab auch Ungenauigkeiten bei RasenflĂ€chen. Es wurde beschlossen, die Stichprobe zu verbessern, indem eine gröĂere Anzahl von Bildern mit kontroversen Abschnitten hinzugefĂŒgt wurde, sodass die Trainingsstichprobe fast verdoppelt wurde.
Datenerweiterung
Um die Datenmenge weiter zu erhöhen, habe ich beschlossen, das Bild in einem beliebigen Winkel zu drehen. ZunĂ€chst habe ich das Standardmodul keras.preprocessing.image.ImageDataGenerator ausprobiert. Wenn Sie unter Beibehaltung des MaĂstabs drehen, verbleiben leere Bereiche an den BildrĂ€ndern, deren FĂŒllung durch den Parameter
fill_mode festgelegt wird. Sie können diese Bereiche einfach mit Farbe fĂŒllen, indem Sie sie in
cval angeben . Ich wollte jedoch eine vollstĂ€ndige Drehung, in der Hoffnung, dass die Auswahl vollstĂ€ndiger ist, und habe den Generator selbst implementiert. Dadurch konnte die GröĂe um mehr als das Zehnfache erhöht werden.
fill_mode = am nĂ€chstenMein Datengenerator klebt vier benachbarte Kacheln in eine einzige Quellkachel mit einer GröĂe von 512 x 512 Pixel. Der Drehwinkel wird zufĂ€llig ausgewĂ€hlt, wobei berĂŒcksichtigt wird, dass die zulĂ€ssigen Intervalle von x und y fĂŒr die Mitte der resultierenden Kachel berechnet werden, in der er nicht ĂŒber die ursprĂŒngliche Kachel hinausgeht. Die Koordinaten des Zentrums werden unter BerĂŒcksichtigung der zulĂ€ssigen Intervalle zufĂ€llig ausgewĂ€hlt. NatĂŒrlich gelten alle diese Transformationen fĂŒr das Kachelmaskenpaar. All dies wird fĂŒr verschiedene Gruppen benachbarter Kacheln wiederholt. Aus einer Gruppe können Sie mehr als ein Dutzend Kacheln mit verschiedenen Abschnitten des GelĂ€ndes erhalten, die in verschiedenen Winkeln gedreht werden.
Ein Beispiel fĂŒr das Ergebnis des GeneratorsLernen mit mehr Daten
Infolgedessen betrug die GröĂe des Trainingsmusters 1881 Bilder, und ich erhöhte auch die Anzahl der Epochen auf 30:

Nach dem Training des Modells mit einem neuen Datenvolumen wurden keine Probleme mit der fehlerhaften Segmentierung von DĂ€chern und Wasser mehr festgestellt. Es war ĂŒberhaupt nicht möglich, Fehler im Schatten loszuwerden, aber sie wurden im Auge weniger, ebenso wie Fehler bei RasenflĂ€chen. Es ist zu beachten, dass die ĂŒberwiegende Mehrheit der Fehler darin besteht, dass das Netzwerk BĂ€ume dort sieht, wo sie nicht sind, und nicht umgekehrt. Die erreichte Genauigkeit kann verbessert werden, indem Satellitenbilder mit einer groĂen Anzahl von KanĂ€len verwendet und die Netzwerkarchitektur fĂŒr eine bestimmte Aufgabe geĂ€ndert werden.

Im Allgemeinen war ich mit dem Ergebnis der geleisteten Arbeit zufrieden, und der geschulte Netzwerkprototyp wurde angewendet, um echte Probleme zu lösen. Zum Beispiel die Berechnung der Dichte von WaldbestÀnden in Moskau:
