So verwandeln Sie Satellitenbilder in Karten. Computer Vision in Yandex

Eine der Hauptdatenquellen fĂŒr den Yandex.Maps-Dienst sind Satellitenbilder. Um die Arbeit mit der Karte zu vereinfachen, sind Objekte: WĂ€lder, Teiche, Straßen, HĂ€user usw. auf den Fotos mit Polygonen gekennzeichnet. In der Regel sind Kartografen mit der Kennzeichnung beschĂ€ftigt. Wir beschlossen, ihnen zu helfen und dem Computer beizubringen, Polygone von HĂ€usern ohne die Beteiligung von Menschen hinzuzufĂŒgen.

FĂŒr Operationen mit Bildern trifft der Bereich der IT, der als Computer Vision bezeichnet wird. In den letzten Jahren wurden die meisten Aufgaben in diesem Bereich mithilfe neuronaler Netze sehr erfolgreich gelöst. Heute werden wir den Lesern von Habr ĂŒber unsere Erfahrungen mit der Verwendung neuronaler Netze beim Mapping berichten.


ZunĂ€chst werden wir ein neuronales Gitter trainieren, das sich mit der semantischen Segmentierung befasst, d. H. Bestimmt, ob jeder Punkt im Satellitenbild mit dem Haus zusammenhĂ€ngt. Warum ist semantische Segmentierung und nicht nur Objekterkennung? Wenn das Erkennungsproblem gelöst ist, erhalten wir am Ausgang eine Reihe von Rechtecken, die außerdem spezifisch sind: Zwei Seiten sind vertikal, zwei sind horizontal. Und HĂ€user werden normalerweise relativ zu den Bildachsen gedreht, und einige GebĂ€ude haben auch eine komplexe Form.

Die Aufgabe der semantischen Segmentierung wird nun von verschiedenen Netzwerken ( FCN , SegNet , UNet usw.) gelöst. Sie mĂŒssen nur auswĂ€hlen, welches fĂŒr uns am besten geeignet ist.

Nachdem wir die Maske vom Satellitenbild erhalten haben, wĂ€hlen wir ausreichend große Gruppen von Punkten aus, die zu den HĂ€usern gehören, sammeln sie in verbundenen Bereichen und prĂ€sentieren die Grenzen der Bereiche in Vektorform in Form von Polygonen.

Es ist klar, dass die Maske nicht absolut genau ist, was bedeutet, dass HÀuser in der NÀhe in einem verbundenen Bereich zusammenkleben können. Um dieses Problem zu lösen, haben wir beschlossen, das Netzwerk weiter auszubilden. Sie findet im Bild die Rippen (die Grenzen der HÀuser) und trennt die zusammengeklebten GebÀude.

Ein solches Schema zeichnete sich ab:


Wir haben die Erkennungsnetzwerke nicht vollstĂ€ndig verworfen und Mask R-CNN ausprobiert. Das Plus im Vergleich zur ĂŒblichen Segmentierung besteht darin, dass die Maske R-CNN Objekte erkennt und eine Maske generiert, sodass die gemeinsame Maske nicht in verbundene Bereiche unterteilt werden muss. Nun, minus (wie ohne) in der festen Auflösung der Maske jedes Objekts, d. H. FĂŒr große HĂ€user mit einer komplexen Grenze, wird sich diese Grenze offensichtlich als vereinfacht herausstellen.

Die Werkzeuge


Dann musste man sich fĂŒr die Werkzeuge entscheiden. Hier war alles ziemlich offensichtlich: OpenCV eignet sich am besten fĂŒr Computer Vision-Aufgaben. Die Auswahl an neuronalen Netzen ist etwas grĂ¶ĂŸer. Wir haben uns fĂŒr Tensorflow entschieden . Seine Vorteile:

  • ein ziemlich entwickelter Satz vorgefertigter „WĂŒrfel“, aus denen Sie Ihre Netzwerke zusammenstellen können;
  • Python-API, praktisch zum schnellen Erstellen einer Netzwerkstruktur und zum Trainieren;
  • Ein trainiertes Netzwerk kann in Ihrem Programm ĂŒber eine C ++ - Schnittstelle verwendet werden (im Vergleich zum Python-Teil sehr schlecht, aber ausreichend, um vorgefertigte Netzwerke auszufĂŒhren).

FĂŒr Schulungen und andere schwere Computer wollten wir Nirvana verwenden - die wunderbare Yandex-Plattform , ĂŒber die wir bereits gesprochen haben .

Datacet


Achtzig Prozent Erfolg bei der Arbeit mit einem neuronalen Netzwerk bestehen aus einem guten Datensatz. FĂŒr den Anfang hĂ€tten wir also einen solchen Datensatz zusammenstellen sollen. Yandex hat eine große Anzahl von Satellitenbildern mit bereits markierten Objekten. Alles scheint einfach zu sein: Laden Sie diese Daten einfach hoch und sammeln Sie sie in einem Datensatz. Es gibt jedoch eine EinschrĂ€nkung.

Datensatz verfeinern


Wenn eine Person in einem Satellitenbild nach einem Haus sucht, sieht sie als erstes das Dach. Die Höhe der HĂ€user variiert jedoch, der Satellit kann dasselbe GelĂ€nde aus verschiedenen Winkeln aufnehmen - und wenn wir ein dem Dach entsprechendes Polygon auf einer Vektorkarte platzieren, gibt es keine Garantie dafĂŒr, dass das Dach beim Aktualisieren des Bildes nicht verlĂ€sst. Aber das Fundament wird in den Boden gegraben und bleibt aus jedem Winkel, den Sie abnehmen, die ganze Zeit an einem Ort. Deshalb sind die HĂ€user auf dem Vektor Yandex.Map "auf den Fundamenten" markiert. Dies ist richtig, aber fĂŒr die Segmentierung von Bildern ist es besser, dem Netzwerk das Suchen nach DĂ€chern beizubringen: Die Hoffnung, dass das Netzwerk darauf trainiert ist, die Fundamente zu erkennen, ist sehr gering. Daher sollte im Datensatz alles auf den DĂ€chern markiert sein. Um einen guten Datensatz zu erstellen, mĂŒssen wir lernen, wie das Vektorlayout von HĂ€usern von Fundamenten auf DĂ€cher verschoben wird.

Wir haben versucht, uns nicht zu verschieben, aber die QualitĂ€t war nicht sehr gut, und das ist verstĂ€ndlich: Die Aufnahmewinkel des Satelliten sind unterschiedlich, die Höhen der HĂ€user sind unterschiedlich, daher wurde das Fundament auf den Fotos in verschiedene Richtungen und in unterschiedlichen AbstĂ€nden vom Dach verschoben. Das Netzwerk geht durch eine solche Vielfalt verloren und trainiert bestenfalls fĂŒr etwas dazwischen, im schlimmsten Fall fĂŒr etwas UnverstĂ€ndliches. DarĂŒber hinaus liefert das Netzwerk fĂŒr die semantische Segmentierung ein Ergebnis, das einem akzeptablen Ă€hnelt, aber bei der Suche nach Kanten sinkt die QualitĂ€t dramatisch.

Raster-Ansatz


Seit wir auf dem Gebiet der Computer Vision tĂ€tig sind, haben wir als erstes einen Ansatz ausprobiert, der fĂŒr diese Computer Vision relevant ist. Zuerst wird die Vektorkarte gerastert (die Polygone der HĂ€user werden mit weißen Linien auf schwarzem Hintergrund gezeichnet), der Sobel-Filter wĂ€hlt die Kanten im Satellitenbild aus. Und dann gibt es einen Versatz von zwei Bildern relativ zueinander, wodurch die Korrelation zwischen ihnen maximiert wird. Die Kanten nach dem Sobel-Filter sind ziemlich verrauscht. Wenn dieser Ansatz auf ein GebĂ€ude angewendet wird, wird daher nicht immer ein akzeptables Ergebnis erzielt. Die Methode funktioniert jedoch gut in Gebieten mit GebĂ€uden gleicher Höhe: Wenn Sie sofort nach einem Versatz ĂŒber einen großen Bereich des Bildes suchen, ist das Ergebnis stabiler.


"Geometrischer" Ansatz


Wenn das Gebiet nicht mit demselben Typ, sondern mit verschiedenen HĂ€usern aufgebaut ist, funktioniert die vorherige Methode nicht. GlĂŒcklicherweise kennen wir manchmal die Höhe von GebĂ€uden auf der Yandex-Vektorkarte und die Position des Satelliten wĂ€hrend der Aufnahme. Auf diese Weise können wir schulische Kenntnisse der Geometrie nutzen und berechnen, wo und in welcher Entfernung sich das Dach relativ zum Fundament bewegt. Diese Methode hat den Datensatz in Gebieten mit HochhĂ€usern verbessert.



"Manueller" Ansatz


Der zeitaufwĂ€ndigste Weg: Krempeln Sie die Ärmel hoch, decken Sie die Maus auf, starren Sie auf den Monitor und verschieben Sie das Vektorlayout der HĂ€user manuell von den Fundamenten auf die DĂ€cher. Die Technik fĂŒhrt zu einem Ergebnis, das von erstaunlicher QualitĂ€t ist, aber es wird nicht empfohlen, es in großen Mengen zu verwenden: Entwickler, die mit solchen Aufgaben beschĂ€ftigt sind, geraten schnell in Apathie und verlieren das Interesse am Leben.

Neuronales Netz


Am Ende haben wir genug Satellitenbilder, die auf den DÀchern gut markiert sind. Es bestand also die Möglichkeit, das neuronale Netzwerk zu trainieren (vorerst jedoch nicht zur Segmentierung, sondern zur Verbesserung des Layouts anderer Satellitenbilder). Und wir haben es geschafft.

Die Eingabedaten des Faltungsnetzwerks waren ein Satellitenbild und eine verschobene rasterisierte Markierung. Am Ausgang erhielten wir einen zweidimensionalen Vektor: vertikale und horizontale Verschiebungen.


Mit Hilfe eines neuronalen Netzwerks fanden wir die notwendige Verschiebung, die es uns ermöglichte, gute Ergebnisse bei GebĂ€uden zu erzielen, fĂŒr die die Höhe nicht angegeben ist. Infolgedessen haben wir die manuelle Markup-Korrektur erheblich reduziert.


Unterschiedliche Gebiete - unterschiedliche HĂ€user


Es gibt viele interessante Gebiete und Staaten auf Yandex.Maps. Aber auch in Russland sind die HĂ€user Ă€ußerst unterschiedlich, was sich auf das Aussehen in Satellitenbildern auswirkt. Sie mĂŒssen also die Vielfalt im Datensatz widerspiegeln. Und anfangs haben wir nicht wirklich verstanden, wie wir mit all dieser Pracht umgehen sollen. Einen riesigen Datensatz sammeln und dann ein Netzwerk darauf trainieren? Erstellen Sie Ihren eigenen Datensatz fĂŒr jede (bedingte) Art der Entwicklung und trainieren Sie ein separates Netzwerk? Ein bestimmtes Kernnetzwerk trainieren und es dann fĂŒr eine bestimmte Art von Entwicklung trainieren?


Empirisch fanden wir Folgendes:

  1. Zweifellos ist es notwendig, den Datensatz fĂŒr verschiedene GebĂ€udetypen zu erweitern, fĂŒr die das Tool verwendet werden soll. Ein auf einen Typ geschultes Netzwerk kann GebĂ€ude eines anderen Typs unterscheiden, wenn auch sehr schlecht.
  2. Es ist besser, ein großes Netzwerk fĂŒr den gesamten Datensatz zu trainieren. Es verallgemeinert sich recht gut auf verschiedene Gebiete. Wenn Sie fĂŒr jede Art von Entwicklung separate Netzwerke trainieren, bleibt die QualitĂ€t entweder gleich oder verbessert sich kaum. Es ist daher sinnlos, unterschiedliche Netzwerke fĂŒr unterschiedliche Gebiete zu implementieren. DarĂŒber hinaus erfordert dies mehr Daten und einen zusĂ€tzlichen Klassifikator fĂŒr die Art der Entwicklung.
  3. Wenn Sie beim HinzufĂŒgen neuer Gebiete zu den Daten alte Netzwerke verwenden, lernen die Netzwerke viel schneller. Die Umschulung alter Netzwerke in erweiterte Daten fĂŒhrt zu ungefĂ€hr dem gleichen Ergebnis wie das Training eines Netzwerks von Grund auf neu, erfordert jedoch viel weniger Zeit.


Lösungsoptionen


Semantische Segmentierung


Die semantische Segmentierung ist eine ziemlich gut erforschte Aufgabe. Nach dem Erscheinen des Artikels Fully Convolutional Networks wird dieser meist mithilfe neuronaler Netze gelöst. Es bleibt nur die Auswahl eines Netzwerks (wir haben FCN , SegNet und UNet in Betracht gezogen ), die Überlegung, ob wir zusĂ€tzliche Tricks wie CRF am Ausgang benötigen, und die Bestimmung, wie und mit welcher Fehlerfunktion das Training trainiert wird.


Infolgedessen haben wir uns fĂŒr eine U-Net-Ă€hnliche Architektur mit einer verallgemeinerten Intersection Over Union- Funktion als Fehlerfunktion entschieden. FĂŒr das Training schneiden wir Satellitenbilder und ihre entsprechenden Markierungen (natĂŒrlich gerastert) in Quadrate und setzen sie zu DatensĂ€tzen zusammen. Es stellte sich als ziemlich schön heraus und manchmal ganz gut.


In Gebieten mit einzelnen GebĂ€uden reichte die semantische Segmentierung aus, um zur nĂ€chsten Stufe ĂŒberzugehen - der Vektorisierung. Wo das GebĂ€ude dicht ist, kleben HĂ€user manchmal in einem zusammenhĂ€ngenden Bereich zusammen. Es dauerte, um sie zu trennen.

Kantenerkennung


Um diese Aufgabe zu bewĂ€ltigen, finden Sie die Kanten im Bild. Um Kanten zu erkennen, haben wir uns auch entschlossen, das Netzwerk zu trainieren (Kanten-Suchalgorithmen, die keine neuronalen Netzwerke verwenden, gehören eindeutig der Vergangenheit an). Schulung eines Netzwerks vom Typ HED, das unter Ganzheitlich verschachtelte Kantenerkennung beschrieben wird . Im Originalartikel wurde das Netzwerk auf den BSDS-500-Datensatz trainiert, in dem alle Kanten auf den Bildern markiert sind. Ein geschultes Netzwerk findet alle ausgeprĂ€gten Kanten: die Grenzen von HĂ€usern, Straßen, Seen usw. Dies reicht bereits aus, um die nahe gelegenen GebĂ€ude zu trennen. Wir haben uns jedoch entschlossen, weiter zu gehen und denselben Datensatz fĂŒr das Training wie fĂŒr die semantische Segmentierung zu verwenden. Malen Sie jedoch beim Rastern nicht die gesamten Polygone von GebĂ€uden, sondern zeichnen Sie nur deren Grenzen.

Das Ergebnis war so ĂŒberwĂ€ltigend schön, dass wir beschlossen, die GebĂ€ude direkt an den vom Netzwerk empfangenen Kanten zu vektorisieren. Und es ist ganz passiert.


Scheitelpunkterkennung


Da ein Netzwerk wie HED an Kanten ein hervorragendes Ergebnis liefert, haben wir beschlossen, es so zu trainieren, dass es Scheitelpunkte erkennt. TatsĂ€chlich haben wir ein Netzwerk mit allgemeinen Gewichten fĂŒr Faltungsschichten. Sie hatte zwei AusgĂ€nge gleichzeitig: fĂŒr Kanten und fĂŒr Spitzen. Infolgedessen haben wir eine andere Version der GebĂ€udevektorisierung erstellt, und in einigen FĂ€llen wurden recht vernĂŒnftige Ergebnisse erzielt.


Maske r-cnn


Mask R-CNN ist eine relativ neue Erweiterung von Netzwerken wie Faster R-CNN. Maske R-CNN sucht nach Objekten und wĂ€hlt fĂŒr jedes eine Maske aus. Als Ergebnis erhalten wir fĂŒr HĂ€user nicht nur Begrenzungsrechtecke, sondern auch eine raffinierte Struktur. Dieser Ansatz ist im Vergleich zu einer einfachen Erkennung (wir wissen nicht, wie sich das GebĂ€ude innerhalb des Rechtecks ​​befindet) und einer normalen Segmentierung (mehrere HĂ€user können zu einem zusammenkleben, und es ist nicht klar, wie sie getrennt werden sollen) gĂŒnstig. Mit Mask R-CNN mĂŒssen Sie nicht mehr ĂŒber zusĂ€tzliche Tricks nachdenken: Es reicht aus, den Maskenrand fĂŒr jedes Objekt zu vektorisieren und sofort das Ergebnis zu erhalten. Es gibt auch ein Minus: Die GrĂ¶ĂŸe der Maske fĂŒr das Objekt ist immer festgelegt, d. H. Bei großen GebĂ€uden ist die Genauigkeit des Pixellayouts gering. Das Ergebnis von Mask R-CNN sieht folgendermaßen aus:


Wir haben zuletzt Mask R-CNN ausprobiert und sichergestellt, dass dieser Ansatz bei einigen GebĂ€udetypen andere ĂŒbertrifft.

Vektorisierung


Rechteckvektorisierung


Bei aller modernen architektonischen Vielfalt sehen HĂ€user auf Satellitenbildern immer noch meistens wie Rechtecke aus. DarĂŒber hinaus ist fĂŒr die Masse der Gebiete eine Kennzeichnung mit komplexen Polygonen nicht erforderlich. Trotzdem möchte ich, dass HĂ€user auf der Karte markiert werden. (Nun, zum Beispiel eine Gartenbaupartnerschaft: Es gibt dort normalerweise viele HĂ€user, manuelles Markieren ist nicht so wichtig, aber das Markieren mit Rechtecken auf der Karte ist sehr gut.) Daher war der erste Ansatz zur Vektorisierung Ă€ußerst einfach.

  1. Nehmen Sie die Rasterregion, die dem "Haus" entspricht.
  2. Suchen Sie das Rechteck des Mindestbereichs, der diesen Bereich enthÀlt (z. B. OpenCV :: minAreaRect ). Das Problem ist gelöst.

Es ist klar, dass die QualitÀt dieses Ansatzes alles andere als ideal ist. Der Algorithmus ist jedoch recht einfach und funktioniert in vielen FÀllen.

Polygonvektorisierung


Wenn die QualitĂ€t der Segmentierung gut genug ist, können Sie die Kontur des Hauses genauer nachbilden. In den meisten GebĂ€uden mit komplexer Form sind die Winkel grĂ¶ĂŸtenteils richtig, daher haben wir beschlossen, das Problem auf die Aufgabe zu reduzieren, ein Polygon mit orthogonalen Seiten zu konstruieren. Um dies zu lösen, möchten wir zwei Ziele gleichzeitig erreichen: das einfachste Polygon finden und die Form von GebĂ€uden so genau wie möglich wiederholen. Diese Ziele stehen in Konflikt miteinander, daher mĂŒssen Sie zusĂ€tzliche Bedingungen einfĂŒhren: um die minimale LĂ€nge der WĂ€nde, die maximale Abweichung von der Rasterregion usw. zu begrenzen.

Der Algorithmus, der uns zuerst einfiel, basierte auf der Konstruktion der Projektion von Punkten auf geraden Linien:

  1. Finden Sie den Umriss der Rasterregion, die einem Haus entspricht.
  2. Reduzieren Sie die Anzahl der Punkte in der Schaltung, indem Sie sie beispielsweise mit dem Douglas-Pecker-Algorithmus vereinfachen.
  3. Finden Sie die lĂ€ngste Seite in der Gliederung. Es ist sein Neigungswinkel, der den Winkel des gesamten zukĂŒnftigen orthogonalen Polygons bestimmt.
  4. Konstruieren Sie eine Projektion vom nÀchsten Konturpunkt zur vorherigen Seite.
  5. Seite zum Projektionspunkt ausfahren. Wenn der Abstand vom Punkt zu seiner Projektion grĂ¶ĂŸer als die kĂŒrzeste Wand des GebĂ€udes ist, fĂŒgen Sie das resultierende Segment zur Kontur des GebĂ€udes hinzu.
  6. Wiederholen Sie die Schritte 4 und 5, bis der Stromkreis schließt.


Dieser Algorithmus ist extrem einfach und bringt schnell Ergebnisse, aber die Kontur des GebĂ€udes ist manchmal ziemlich verrauscht. Bei dem Versuch, dieses Problem zu lösen, haben wir eine ziemlich interessante Lösung fĂŒr das Problem gefunden, bei der ein quadratisches Gitter im Raum verwendet wird, um das Polygon zu approximieren. Kurz beschrieben besteht der Algorithmus aus drei Aktionen:

  1. Erstellen Sie ein quadratisches Gitter im Raum, der auf Null zentriert ist.
  2. Konstruieren Sie an Gitterpunkten, die nicht weiter als einen bestimmten Abstand von der ursprĂŒnglichen Kontur entfernt sind, verschiedene Polygone.
  3. WĂ€hlen Sie ein Polygon mit einer Mindestanzahl von Scheitelpunkten aus.


Da der erforderliche Drehwinkel des Gitters nicht im Voraus bekannt ist, mĂŒssen mehrere Werte aussortiert werden, was sich negativ auf die Leistung auswirkt. Mit dem Algorithmus können Sie jedoch visuell schönere Ergebnisse erzielen.


Verbesserung der Vektorisierung


WĂ€hrend wir tatsĂ€chlich mit jedem Haus separat gearbeitet haben. Wenn die erste Phase abgeschlossen ist, können Sie bereits mit dem gesamten Bild arbeiten und das Ergebnis verbessern. Hierzu wurde ein Algorithmus zur Nachbearbeitung eines Satzes von Polygonen hinzugefĂŒgt. Wir haben folgende Heuristiken verwendet:

  • Normalerweise sind die WĂ€nde benachbarter HĂ€user parallel. Außerdem: Meistens können HĂ€user zu Sets zusammengefasst werden, in denen alle Elemente ausgerichtet sind.
  • Wenn auf dem Bild bereits Straßen markiert sind, ist es sehr wahrscheinlich, dass die Seiten der Polygone parallel zu den Straßen verlaufen.
  • Wenn sich die Polygone schneiden, ist es höchstwahrscheinlich sinnvoll, die WĂ€nde so zu verschieben, dass der Schnitt verschwindet.

Als Ergebnis erschien der folgende Algorithmus:

  1. Wir gruppieren die HĂ€user, die sich aus dem Abstand zwischen ihnen und dem Drehwinkel ergeben. Wir mitteln die Umdrehungen von GebĂ€uden in jedem Cluster. Wir wiederholen, bis sich die Position der GebĂ€ude nicht mehr Ă€ndert oder bis die HĂ€user zu stark von der ursprĂŒnglichen Position abweichen.
  2. Wir wĂ€hlen HĂ€user in der NĂ€he der Straßen, wir finden die lĂ€ngsten und am nĂ€chsten an der Straßenseite. Wir drehen das Haus bis zur ParallelitĂ€t der ausgewĂ€hlten Seite und der Straße.
  3. Wir entfernen die Schnittpunkte zwischen den Polygonen und verschieben die Seiten zweier sich kreuzender GebĂ€ude proportional zur GrĂ¶ĂŸe der Seiten.

Ergebnis


Als Ergebnis haben wir ein Tool erhalten, das GebĂ€ude verschiedener GebĂ€udetypen erkennen kann. Es hilft Kartographen bei ihrer harten Arbeit: Es beschleunigt die Suche nach vermissten HĂ€usern erheblich und fĂŒllt neue, noch nicht bebaute Gebiete aus. Derzeit wurden mit diesem Tool mehr als 800.000 neue Objekte zur Personenkarte hinzugefĂŒgt.

Nachfolgend sehen Sie einige Beispiele fĂŒr die Erkennung.








Source: https://habr.com/ru/post/de431108/


All Articles