Comment transformer l'imagerie satellite en cartes. Vision par ordinateur dans Yandex

L'imagerie satellite est l'une des principales sources de donnĂ©es du service Yandex.Maps. Afin de faciliter le travail avec la carte, les objets sont marquĂ©s de polygones sur les photographies: forĂȘts, Ă©tangs, rues, maisons, etc. Habituellement, les cartographes sont engagĂ©s dans le marquage. Nous avons dĂ©cidĂ© de les aider et d'apprendre Ă  l'ordinateur Ă  ajouter des polygones de maisons sans intervention humaine.

Pour les opérations avec images rencontre le domaine de l'informatique, qui est appelé vision par ordinateur. Au cours des derniÚres années, la plupart des tùches dans ce domaine ont été résolues avec succÚs en utilisant des réseaux de neurones. Aujourd'hui, nous parlerons aux lecteurs de Habr de notre expérience de l'utilisation des réseaux de neurones dans la cartographie.


Tout d'abord, nous allons former une grille neuronale, qui va s'engager dans la segmentation sémantique, c'est-à-dire déterminer si chaque point de l'image satellite est lié à la maison. Pourquoi la segmentation sémantique et pas seulement la détection d'objets? Lorsque le problÚme de détection sera résolu, on obtiendra en sortie un ensemble de rectangles, d'ailleurs spécifiques: deux cÎtés sont verticaux, deux horizontaux. Et les maisons sont généralement tournées par rapport aux axes de l'image, et certains bùtiments ont également une forme complexe.

La tùche de segmentation sémantique est désormais résolue par différents réseaux ( FCN , SegNet , UNet , etc.). Il vous suffit de choisir celui qui nous convient le mieux.

AprÚs avoir reçu le masque de l'image satellite, nous sélectionnons des groupes de points suffisamment grands appartenant aux maisons, les collectons dans les zones connectées et présentons les limites des zones sous forme vectorielle sous forme de polygones.

Il est clair que le masque ne sera pas absolument précis, ce qui signifie que les maisons voisines peuvent rester ensemble dans une zone connectée. Pour faire face à ce problÚme, nous avons décidé de poursuivre la formation du réseau. Elle trouvera dans l'image les nervures (les limites des maisons) et séparera les bùtiments collés.

Donc, un tel schéma se profilait:


Nous n'avons pas complÚtement éliminé les réseaux de détection et essayé le masque R-CNN . Son avantage par rapport à la segmentation habituelle est que le masque R-CNN détecte des objets et génÚre un masque, il n'est donc pas nécessaire de bricoler en divisant le masque commun en zones connectées. Eh bien, moins (comme sans lui) dans la résolution fixe du masque de chaque objet, c'est-à-dire pour les grandes maisons avec une bordure complexe, cette bordure se révélera évidemment simplifiée.

Les outils


Ensuite, il a fallu décider des outils. Tout était assez évident ici: OpenCV est le mieux adapté aux tùches de vision par ordinateur. Le choix des réseaux de neurones est un peu plus large. Nous nous sommes installés sur Tensorflow . Ses avantages:

  • un ensemble assez dĂ©veloppĂ© de «cubes» prĂȘts Ă  l'emploi Ă  partir desquels vous pouvez assembler vos rĂ©seaux;
  • API Python, pratique pour crĂ©er rapidement une structure de rĂ©seau et pour la formation;
  • Un rĂ©seau formĂ© peut ĂȘtre utilisĂ© dans votre programme via une interface C ++ (trĂšs pauvre en comparaison avec la partie Python, mais tout Ă  fait suffisant pour exĂ©cuter des rĂ©seaux prĂȘts Ă  l'emploi).

Pour la formation et autres calculs lourds, nous avions prévu d'utiliser Nirvana - la merveilleuse plateforme Yandex dont nous avons déjà parlé .

Datacet


Quatre-vingt pour cent de réussite dans l'utilisation d'un réseau de neurones consiste en un bon ensemble de données. Donc, pour commencer, nous aurions dû assembler un tel ensemble de données. Yandex possÚde un grand nombre d'images satellites avec des objets déjà marqués. Tout semble simple: il suffit de télécharger ces données et de les collecter dans un ensemble de données. Cependant, il y a une mise en garde.

Affiner l'ensemble de données


Lorsqu'une personne recherche une maison sur une image satellite, la premiĂšre chose qu'elle voit est le toit. Mais la hauteur des maisons varie, le satellite peut prendre le mĂȘme terrain sous diffĂ©rents angles - et si nous plaçons un polygone correspondant au toit sur la carte vectorielle, rien ne garantit que le toit ne partira pas lorsque l'image sera mise Ă  jour. Mais la fondation est enfouie dans le sol et, quel que soit l'angle sous lequel vous la retirez, elle reste tout le temps au mĂȘme endroit. C'est pourquoi les maisons sur le vecteur Yandex.Map sont marquĂ©es "sur les fondations". C'est exact, mais pour la tĂąche de segmentation des images, il est prĂ©fĂ©rable d'apprendre au rĂ©seau Ă  rechercher des toits: l'espoir que le rĂ©seau soit formĂ© pour reconnaĂźtre les fondations est trĂšs faible. Par consĂ©quent, dans l'ensemble de donnĂ©es, tout doit ĂȘtre marquĂ© sur les toits. Donc, pour crĂ©er un bon ensemble de donnĂ©es, nous devons apprendre Ă  dĂ©placer la disposition vectorielle des maisons des fondations aux toits.

Nous avons essayé de ne pas bouger, mais la qualité n'était pas trÚs bonne, et cela est compréhensible: les angles de prise de vue du satellite sont différents, les hauteurs des maisons sont différentes, en conséquence, sur les photographies, la fondation a été déplacée dans différentes directions et à différentes distances du toit. Le réseau est perdu d'une telle variété et, au mieux, s'entraßne pour quelque chose entre les deux, au pire - pour quelque chose d'incompréhensible. De plus, le réseau de segmentation sémantique produit un résultat similaire à quelque chose d'acceptable, mais lors de la recherche de bords, la qualité chute considérablement.

Approche raster


Depuis que nous sommes entrĂ©s dans le domaine de la vision par ordinateur, la premiĂšre chose que nous avons faite a Ă©tĂ© d'essayer une approche pertinente Ă  cette vision par ordinateur. Tout d'abord, la carte vectorielle est tramĂ©e (les polygones des maisons sont dessinĂ©s avec des lignes blanches sur fond noir), le filtre Sobel sĂ©lectionne les bords de l'image satellite. Et puis il y a un dĂ©calage de deux images l'une par rapport Ă  l'autre, ce qui maximise la corrĂ©lation entre elles. Les bords aprĂšs le filtre Sobel sont assez bruyants, par consĂ©quent, si cette approche est appliquĂ©e Ă  un bĂątiment, un rĂ©sultat acceptable n'est pas toujours obtenu. Cependant, la mĂ©thode fonctionne bien dans les territoires avec des bĂątiments de mĂȘme hauteur: si vous recherchez un dĂ©calage immĂ©diatement sur une grande zone de l'image, le rĂ©sultat sera plus stable.


Approche "géométrique"


Si le territoire n'est pas construit avec le mĂȘme type, mais avec diffĂ©rentes maisons, la mĂ©thode prĂ©cĂ©dente ne fonctionnera pas. Heureusement, nous connaissons parfois la hauteur des bĂątiments sur la carte vectorielle Yandex et la position du satellite lors du tournage. Ainsi, nous pouvons utiliser les connaissances scolaires de la gĂ©omĂ©trie et calculer oĂč et Ă  quelle distance le toit se dĂ©placera par rapport Ă  la fondation. Cette mĂ©thode a amĂ©liorĂ© l'ensemble de donnĂ©es dans les zones avec des immeubles de grande hauteur.



Approche "manuelle"


Le moyen le plus long: retroussez vos manches, dĂ©couvrez la souris, regardez le moniteur et dĂ©placez manuellement la disposition vectorielle des maisons des fondations aux toits. La technique apporte un rĂ©sultat tout simplement incroyable en qualitĂ©, mais il n'est pas recommandĂ© de l'utiliser en grande quantitĂ©: les dĂ©veloppeurs qui sont engagĂ©s dans de telles tĂąches tombent rapidement dans l'apathie et perdent tout intĂ©rĂȘt pour la vie.

RĂ©seau de neurones


Au final, nous avons obtenu suffisamment d'images satellites bien marquées sur les toits. Ainsi, il y avait une chance de former le réseau neuronal (pour l'instant, cependant, pas pour la segmentation, mais pour améliorer la disposition d'autres images satellite). Et nous l'avons fait.

Les données d'entrée du réseau neuronal convolutif étaient une image satellite et un marquage tramé décalé. En sortie, nous avons reçu un vecteur bidimensionnel: les déplacements verticaux et horizontaux.


A l'aide d'un réseau neuronal, nous avons trouvé le déplacement nécessaire, ce qui nous a permis d'obtenir de bons résultats sur des bùtiments dont la hauteur n'est pas indiquée. Par conséquent, nous avons considérablement réduit la correction manuelle du balisage.


Différents territoires - différentes maisons


Il existe de nombreux territoires et États intĂ©ressants sur Yandex.Maps. Mais mĂȘme en Russie, les maisons sont extrĂȘmement diverses, ce qui affecte leur apparence dans l'imagerie satellite. Vous devez donc reflĂ©ter la diversitĂ© de l'ensemble de donnĂ©es. Et au dĂ©but, nous ne comprenions pas vraiment comment faire face Ă  toute cette splendeur. Collecter un Ă©norme ensemble de donnĂ©es puis former un rĂ©seau dessus? CrĂ©er votre propre ensemble de donnĂ©es pour chaque type de dĂ©veloppement (conditionnel) et former un rĂ©seau distinct? Former un certain rĂ©seau central puis le former Ă  un type de dĂ©veloppement spĂ©cifique?


Empiriquement, nous avons constaté que:

  1. Sans aucun doute, il est nécessaire d'élargir l'ensemble de données pour différents types de bùtiments sur lesquels il est prévu d'utiliser l'outil. Un réseau formé sur un type est capable de distinguer des bùtiments d'un autre type, bien que trÚs mal.
  2. Il est prĂ©fĂ©rable de former un grand rĂ©seau sur l'ensemble des donnĂ©es. Il se gĂ©nĂ©ralise assez bien Ă  divers territoires. Si vous formez des rĂ©seaux distincts pour chaque type de dĂ©veloppement, la qualitĂ© restera la mĂȘme ou s'amĂ©liorera Ă  peine. Il est donc inutile de mettre en Ɠuvre diffĂ©rents rĂ©seaux pour diffĂ©rents territoires. De plus, cela nĂ©cessite plus de donnĂ©es et un classificateur supplĂ©mentaire de type de dĂ©veloppement.
  3. Si vous utilisez d'anciens rĂ©seaux lors de l'ajout de nouveaux territoires aux donnĂ©es, les rĂ©seaux apprennent beaucoup plus rapidement. Le recyclage des anciens rĂ©seaux sur des donnĂ©es Ă©tendues conduit Ă  peu prĂšs au mĂȘme rĂ©sultat que la formation d'un rĂ©seau Ă  partir de zĂ©ro, mais cela nĂ©cessite beaucoup moins de temps.


Options de solution


Segmentation sémantique


La segmentation sémantique est une tùche assez bien étudiée. AprÚs la parution de l'article Réseaux entiÚrement convolutionnels , il est principalement résolu à l'aide de réseaux de neurones. Il ne reste plus qu'à choisir un réseau (nous avons considéré FCN , SegNet et UNet ), à réfléchir si nous avons besoin de trucs supplémentaires comme CRF à la sortie, et à décider comment et avec quelle fonction d'erreur la formation sera formée.


En consĂ©quence, nous avons optĂ© pour une architecture de type U-Net avec une fonction gĂ©nĂ©ralisĂ©e d'intersection sur union comme fonction d'erreur. Pour la formation, nous avons dĂ©coupĂ© des images satellites et leurs marquages ​​correspondants (bien sĂ»r, tramĂ©es) en carrĂ©s et assemblĂ©s en ensembles de donnĂ©es. Cela s'est avĂ©rĂ© assez agrĂ©able, et parfois trĂšs bien.


Dans les territoires à bùtiments uniques, la segmentation sémantique était suffisante pour passer à l'étape suivante - la vectorisation. Lorsque le bùtiment est dense, les maisons sont parfois collées ensemble dans une zone cohésive. Il a fallu les séparer.

DĂ©tection des contours


Pour faire face Ă  cette tĂąche, vous pouvez trouver les bords de l'image. Pour dĂ©tecter les bords, nous avons Ă©galement dĂ©cidĂ© de former le rĂ©seau (les algorithmes de recherche de bords qui n'utilisent pas de rĂ©seaux de neurones appartiennent clairement au passĂ©). Formation d'un rĂ©seau de type HED, qui est dĂ©crit dans Holistically-Nested Edge Detection . Dans l'article d'origine, le rĂ©seau a Ă©tĂ© formĂ© sur l'ensemble de donnĂ©es BSDS-500, dans lequel tous les bords sont marquĂ©s sur les images. Un rĂ©seau formĂ© trouve tous les bords prononcĂ©s: les limites des maisons, des routes, des lacs, etc. C'est dĂ©jĂ  suffisant pour sĂ©parer les bĂątiments voisins. Mais nous avons dĂ©cidĂ© d'aller plus loin et d'utiliser le mĂȘme ensemble de donnĂ©es pour la formation que pour la segmentation sĂ©mantique, mais lors de la pixellisation, ne peignez pas tous les polygones des bĂątiments, mais dessinez uniquement leurs limites.

Le résultat était si incroyablement beau que nous avons décidé de vectoriser les bùtiments directement par les bords reçus du réseau. Et c'est tout à fait arrivé.


DĂ©tection de sommet


Puisqu'un rĂ©seau comme HED a donnĂ© un excellent rĂ©sultat sur les bords, nous avons dĂ©cidĂ© de l'entraĂźner Ă  dĂ©tecter les sommets. En fait, nous avons un rĂ©seau avec des poids gĂ©nĂ©raux sur les couches convolutives. Elle avait deux sorties en mĂȘme temps: pour les bords et pour les pics. En consĂ©quence, nous avons fait une autre version de la vectorisation des bĂątiments, et dans certains cas, elle a donnĂ© des rĂ©sultats assez raisonnables.


Masque r-cnn


Mask R-CNN est une extension relativement nouvelle de réseaux tels que Faster R-CNN. Masque R-CNN recherche des objets et sélectionne un masque pour chacun d'eux. En conséquence, pour les maisons, nous obtenons non seulement des rectangles de délimitation, mais également une structure raffinée. Cette approche se compare favorablement à la détection simple (nous ne savons pas comment le bùtiment est situé à l'intérieur du rectangle) et à la segmentation normale (plusieurs maisons peuvent se coller en une seule, et il n'est pas clair comment les séparer). Avec Mask R-CNN, plus besoin de penser à des astuces supplémentaires: il suffit de vectoriser la bordure du masque pour chaque objet et d'obtenir immédiatement le résultat. Il y a aussi un inconvénient: la taille du masque pour l'objet est toujours fixe, c'est-à-dire que pour les grands bùtiments, la précision de la disposition des pixels sera faible. Le résultat du masque R-CNN ressemble à ceci:


Nous avons essayé le Mask R-CNN en dernier et nous nous sommes assurés que pour certains types de bùtiments, cette approche surpasse d'autres.

Vectorisation


Vectorisation rectangle


Avec toute la diversitĂ© architecturale moderne, les maisons sur images satellite ressemblent encore le plus souvent Ă  des rectangles. De plus, pour la masse des territoires, le marquage avec des polygones complexes n'est pas nĂ©cessaire. Mais je veux quand mĂȘme que les maisons sur la carte soient marquĂ©es. (Eh bien, par exemple, un partenariat horticole: il y a gĂ©nĂ©ralement beaucoup de maisons lĂ -bas, le marquage manuel n'est pas si important, mais le marquage avec des rectangles sur la carte est trĂšs bon.) Par consĂ©quent, la premiĂšre approche de la vectorisation Ă©tait extrĂȘmement simple.

  1. Prenez la région raster correspondant à la "maison".
  2. Recherchez le rectangle de la zone minimale qui contient cette zone (par exemple, comme ceci: OpenCV :: minAreaRect ). Le problÚme est résolu.

Il est clair que la qualitĂ© de cette approche est loin d'ĂȘtre idĂ©ale. Cependant, l'algorithme est assez simple et fonctionne dans de nombreux cas.

Vectorisation de polygone


Si la qualité de la segmentation est assez bonne, vous pouvez recréer plus précisément le contour de la maison. Dans la plupart des bùtiments de forme complexe, les angles sont généralement droits, nous avons donc décidé de réduire le problÚme à la construction d'un polygone à cÎtés orthogonaux. Pour le résoudre, nous voulons atteindre deux objectifs à la fois: trouver le polygone le plus simple et répéter la forme des bùtiments aussi précisément que possible. Ces objectifs sont en conflit les uns avec les autres, vous devez donc introduire des conditions supplémentaires: pour limiter la longueur minimale des murs, l'écart maximal par rapport à la zone raster, etc.

L'algorithme qui nous est venu à l'esprit pour la premiÚre fois était basé sur la construction de la projection de points sur des lignes droites:

  1. Trouvez le contour de la région raster correspondant à une maison.
  2. RĂ©duisez le nombre de points dans le circuit en le simplifiant, par exemple, avec l'algorithme Douglas-Pecker .
  3. Trouvez le cÎté le plus long dans le contour. C'est son angle d'inclinaison qui déterminera l'angle de tout le futur polygone orthogonal.
  4. Construisez une projection du point de contour suivant au cÎté précédent.
  5. Étendez le cĂŽtĂ© jusqu'au point de projection. Si la distance entre le point et sa projection est supĂ©rieure au mur le plus court du bĂątiment, ajoutez le segment rĂ©sultant au contour du bĂątiment.
  6. Répétez les étapes 4 et 5 jusqu'à la fermeture du circuit.


Cet algorithme est extrĂȘmement simple et donne rapidement des rĂ©sultats, mais le contour du bĂątiment se rĂ©vĂšle cependant parfois assez bruyant. En essayant de faire face Ă  ce problĂšme, nous sommes tombĂ©s sur une solution plutĂŽt intĂ©ressante au problĂšme, qui utilise une grille carrĂ©e dans l'espace pour approximer le polygone. En bref, l'algorithme se compose de trois actions:

  1. Construisez une grille carrée dans l'espace centrée sur zéro.
  2. Aux points de la grille situés à une certaine distance du contour d'origine, construisez différents polygones.
  3. SĂ©lectionnez un polygone avec un nombre minimum de sommets.


L'angle de rotation requis de la grille n'étant pas connu à l'avance, il est nécessaire de trier plusieurs valeurs, ce qui affecte mal les performances. Cependant, l'algorithme vous permet d'obtenir des résultats visuellement plus beaux.


Amélioration de la vectorisation


Alors que nous travaillions avec chaque maison séparément. Lorsque la premiÚre étape est terminée, vous pouvez déjà travailler avec l'image dans son ensemble et améliorer le résultat. Pour cela, un algorithme de post-traitement d'un ensemble de polygones a été ajouté. Nous avons utilisé les heuristiques suivantes:

  • Habituellement, les murs des maisons adjacentes sont parallĂšles. De plus: le plus souvent, les maisons peuvent ĂȘtre combinĂ©es en ensembles, Ă  l'intĂ©rieur desquels tous les Ă©lĂ©ments sont alignĂ©s.
  • Si les rues sont dĂ©jĂ  marquĂ©es sur l'image, il est trĂšs probable que les cĂŽtĂ©s des polygones soient parallĂšles aux rues.
  • Si les polygones se croisent, il est trĂšs probable qu'il soit logique de dĂ©placer les murs afin que l'intersection disparaisse.

En conséquence, l'algorithme suivant est apparu:

  1. Nous regroupons les maisons trouvées par la distance entre elles et l'angle de rotation. Nous faisons la moyenne des tours de bùtiments dans chaque cluster. Nous répétons jusqu'à ce que la position des bùtiments cesse de changer ou jusqu'à ce que les maisons commencent à s'écarter trop de la position initiale.
  2. Nous choisissons des maisons prÚs des routes, nous trouvons les plus longues et les plus proches du bord de la route. Nous transformons la maison au parallélisme du cÎté sélectionné et de la route.
  3. Nous supprimons les intersections entre les polygones, en décalant les cÎtés de deux bùtiments qui se croisent proportionnellement à la taille des cÎtés.

RĂ©sultat


En conséquence, nous avons obtenu un outil qui peut reconnaßtre les bùtiments de différents types de bùtiments. Il aide les cartographes dans leur travail acharné: accélÚre considérablement la recherche de maisons manquantes et remplit de nouvelles zones non encore cultivées. Actuellement, plus de 800 000 nouveaux objets ont été ajoutés à la carte des personnes à l'aide de cet outil.

Ci-dessous, vous verrez quelques exemples de reconnaissance.








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


All Articles