
2GIS est fier de l'exactitude des données. Chaque jour ouvrable dans chaque ville, nos experts parcourent des zones entières pour corriger tous les changements sur la carte - nouvelles maisons, routes et même chemins. Et ils collectent et mettent également des panneaux routiers dessus, ce qui aide à construire correctement des routes et des itinéraires pédestres. Dans cet article, je vais vous expliquer comment nous avons décidé d'aider les cartographes et commencé à collecter automatiquement les panneaux de signalisation.
Qu'est-ce que Fidji et pourquoi y a-t-il des signes
Fidji est un éditeur de cartes que nous développons pour nos spécialistes SIG. Il s'agit d'une application client-serveur classique. Il y a déjà plusieurs articles sur le hub: dans lesquels on parle des Fidji:
Comment collecter des signes avant
Les Fidji ont un mode de fonctionnement spécial pour la collecte et la mise à jour des panneaux. Dans ce mode, le mappeur peut ouvrir la vidéo enregistrée par le DVR. La vidéo elle-même est affichée dans une fenêtre séparée et sa trace est affichée sur la carte. Le marqueur indique la position actuelle.

Une grille est appliquée au-dessus de la vidéo - elle vous permet de déterminer la distance jusqu'au panneau. Dès que le personnage prend la taille d'une cellule, le cartographe marque une pause et crée le personnage. À ce moment, nous connaissons la position actuelle et la distance au signe, nous le déplaçons donc vers l'avant et le dessinons sur le lien. Le lien dans notre terminologie est une représentation schématique d'une section de route. Chaque personnage a son propre code numérique, son cartographe entre dans un champ spécial.
Si nous avons déjà entré un caractère, nous le chargeons dans l'éditeur de caractères. Le cartographe vérifie la vidéo et, si nécessaire, apporte des modifications en utilisant les mêmes codes numériques. Ou, si le signe est correct, le marque comme mis à jour.
Bien sûr, cette méthode nécessite que le cartographe visionne chaque vidéo - puis passe également du temps à saisir chaque personnage. De plus, la position du panneau sur la carte n'est pas déterminée avec précision: nous nous écartons simplement de la position actuelle d'une distance qui est déterminée par la grille, puis nous dessinons le point résultant sur la route la plus proche. Par conséquent, les signes peuvent ne pas être créés exactement là (ou même pas du tout) si nécessaire. Cela signifie que le cartographe doit également le déplacer au bon endroit, ce qui consomme également son temps. De plus, la vidéo peut ne présenter aucun signe, mais le cartographe est toujours obligé de la visionner. Bien sûr, le programme vous permet d'augmenter la vitesse de la vidéo, mais le coût en temps sera dans tous les cas supérieur à zéro. Par conséquent, nous avons décidé d'automatiser ce processus.
Comment collecter maintenant
Nous avons encore besoin de vidéos de registraire. Mais maintenant, au lieu de regarder chacun, le cartographe sélectionne simplement les fichiers nécessaires et appuie sur le bouton "Télécharger". Après cela, il peut faire d'autres choses - la vidéo sera traitée et des panneaux de signalisation apparaîtront sur la carte. Divers cas douteux seront spécifiquement notés. Il ne reste donc au cartographe qu'à passer en revue ces cas et à les corriger.
L'architecture

Afin d'obtenir des objets des classes requises avec les attributs nécessaires de la vidéo, nous avons écrit plusieurs services.
Le premier est VideoPreprocessingService - c'est là que le fichier vidéo est téléchargé. Le service envoie le fichier au référentiel, en fait un enregistrement dans la base de données et crée des tâches pour son traitement. Vous devez couper des images de la vidéo avec une certaine fréquence, sélectionner des points GPS pour eux à partir de la piste pour eux, envoyer le résultat au service de traitement des images.
Les deux premières tâches ne sont pas effectuées par le service lui-même, mais par Worker. Ceci est fait de sorte que vous puissiez facilement changer le nombre de ces travailleurs. Augmentant ainsi la productivité, s'il y a un tel besoin.
FrameProcessingService enregistre lui-même toutes les trames et tous les points reçus. Il télécharge également des images dans la file d'attente. Il est lu par un service écrit par nos collègues experts en apprentissage automatique. Il reconnaît les panneaux de signalisation. Bien sûr, FrameProcessingService lit les réponses de ce service - ce sont les codes de caractères, s'ils sont sur le cadre, et les rectangles dans lesquels ce caractère est inscrit. Connaissant la taille du rectangle, nous comprenons la distance au signe. Et lorsque toutes les images de la vidéo sont traitées, il les envoie à notre serveur de carte.
Le serveur de carte est la partie la plus importante du système. Les clients reçoivent de lui toutes les données que nous stockons (à l'
exception des tuiles ). Il enregistre ces données et exécute toute la logique métier.
Description générale
Nos données cartographiques sont des objets géographiques. Un géo-objet est une géométrie (c'est-à-dire l'emplacement d'un objet dans l'espace) et un ensemble d'attributs. Nous les stockons dans la base de données et les exploitons. Mais de FrameProcessingService, nous obtenons uniquement le code du signe, les coordonnées du point à partir duquel le signe a été reconnu, le cadre lui-même et le masque de signe sur ce cadre. Nous devons donc transformer cet ensemble de données en un objet géographique. Chaque objet géographique appartient à une classe. Chaque type de panneau routier est une classe distincte. Nous pouvons facilement l'obtenir à partir du code de signe. Du code de signe, nous pouvons obtenir des attributs spécifiques à cette classe. Par exemple, nous avons reçu le code 3_24_60. 3_24 - dit qu'il s'agit d'une limite de vitesse (signe 3.24 dans les règles de circulation). La valeur de restriction doit être indiquée pour ces caractères. Il nous raconte la troisième partie du code - ici ce sera 60 km / h.
Ainsi, la classe d'objets géo est définie, ses attributs sont également spécifiques. Il semblerait que vous puissiez déjà créer un objet géographique. Mais c'est trop tôt. Premièrement, chaque signe a un attribut «Direction», qui indique dans quelle direction le signe agit. Deuxièmement, nous n'avons toujours pas de géométrie pour cet objet géo. Nous avons un point à partir duquel nous avons vu un signe. Ainsi, le signe lui-même est à une certaine distance de nous. De plus, sa géométrie affecte la valeur de l'attribut Direction.

Ici, nous allons faire une petite digression. Bien sûr, nous avons un réseau routier. Il se compose de liens individuels. Chaque lien est une ligne. Dans la première partie de la figure, nous venons de tracer deux liens. Les flèches indiquent la direction dans laquelle elles ont été dessinées, c'est-à-dire la gauche a été dessinée de bas en haut, et la droite - de haut en bas.
Chaque lien contient des informations sur la direction dans laquelle vous pouvez vous déplacer. La direction du mouvement est un attribut distinct; elle n'est pas égale à la direction du rendu. Cet attribut nous indique dans quelle direction vous pouvez vous déplacer le long du lien, par rapport à la direction du dessin. Dans la deuxième partie de la figure, les deux liens ont la même valeur pour cet attribut, et dans la troisième figure - des valeurs opposées.
Comment est-ce lié aux signes? Donc, nous nous déplaçons le long des liens de bas en haut, et nous voyons une sorte de signe. Ainsi, sur le lien de gauche, le panneau aura la direction «Seulement droit», à droite - «Seulement en arrière», c'est-à-dire mêmes que les liens de la troisième figure. Tout s'est avéré simple ici, mais c'est parce que nos liens sont à sens unique. En réalité, un très grand nombre de liens sont bilatéraux, c'est-à-dire leur direction a le sens de "Dans les deux sens". Et le signe est toujours dirigé dans une direction, et nous devons comprendre dans quelle direction.
Correspondance de carte
Avant de commencer à placer des panneaux sur la carte, nous devons comprendre quelles routes nous avons conduites lorsque nous avons enregistré la vidéo. Les données GPS ne suffisent pas pour cela: elles sont souvent confondues avec des dizaines de mètres. De plus, les cartes sont toujours des schémas et peuvent également ne pas coïncider avec le terrain réel. Par exemple, sur de larges routes à plusieurs voies.
Cela résoudra un certain nombre de problèmes à la fois:
- Des panneaux peuvent déjà être créés sur ces routes, nous pouvons donc y apporter des modifications, le cas échéant;
- Certains de ces signes peuvent ne pas apparaître sur la vidéo, et nous pouvons trouver de tels signes - et leur mettre une étiquette spéciale;
- Nous pouvons comprendre sur quelle route nous nous trouvions lorsque nous avons vu un panneau reconnu, ce qui, à son tour, nous aidera à placer ce panneau au bon endroit sur la carte.
Algorithme
L'algorithme que nous avons utilisé est assez simple. Il y a déjà un
article sur Habré avec sa description. De manière générale, cela ressemble à ceci: nous avons une route sélectionnée, prenez le point GPS le plus proche de son extrémité de la piste. Et concernant ce point, nous évaluons les routes qui joignent notre chemin - c'est-à-dire, nous évaluons la probabilité que notre point se réfère à cette route particulière. Chaque route reçoit des points, celle avec le plus de points est sélectionnée. Répétez jusqu'à la fin de la piste.
Dans le processus, nous avons fait plusieurs ajouts à l'algorithme. L'algorithme n'a pas pris en compte la direction sur les liaisons routières, donc la première chose que nous avons faite a commencé à les prendre en compte: maintenant, si la liaison est à sens unique, nous comprenons quelle direction nous devons suivre. Et si cette direction ne coïncide pas avec la direction du lien, nous rejetons ce lien.
Au départ, il nous semblait que cela suffirait, et les premiers tests l'ont confirmé. Mais ensuite, nous avons commencé à vérifier les vidéos enregistrées dans les quartiers résidentiels, et tout s'est avéré moins rose. Le fait est que nous avons une très grande précision des données, y compris sur les routes. En conséquence, nous avons tracé toutes les allées intra-quartier, dans les moindres détails. D'un autre côté - comme je l'ai dit, le GPS peut ne pas être très précis ni même très imprécis. Et si vous empruntez une route autour de laquelle se trouvent de hauts bâtiments, les points de la piste peuvent partir assez fortement. Il arrivait que les points se déplacent vers plus de 20 mètres. En conséquence, il s'avère que de nombreux points sont proches de ces routes sur lesquelles nous ne sommes pas allés. Le résultat du rétrécissement de ces pistes a été cette image:

Le bon sens nous a dit qu'il y a peu de panneaux sur ces routes et qu'il n'y a donc aucune raison particulière de les collecter là-bas. Par conséquent, très probablement, dans la plupart des cas, la voiture s'est déplacée le long des rues principales. Par conséquent, pour les voies d'accès intra-quartier, nous avons introduit une amende. Par amende, nous entendons une diminution du nombre de points le long de la route. En conséquence, le problème des entrées de rue intra-quartier a été résolu - elles ne sortaient pas lorsque nous ne les suivions pas, et lorsque nous les suivions vraiment, même malgré l'amende, elles s'avéraient être la meilleure option, puis nous les choisissions.
Après cela, les résultats étaient déjà très bons. Et il nous a semblé que la cartographie était terminée. Mais le problème est venu, d'où ils n'ont pas attendu. Tout à coup, il s'est avéré qu'il y a des cas où une autre route se détache de la route et le fait très facilement. Et tout a été aggravé par le fait que la route secondaire peut également aller en parallèle avec la nôtre, du moins pendant un certain temps. Dans le même temps, je vous rappelle que la trace GPS n'est presque jamais située au-dessus des liens vers lesquels nous avons voyagé, elle est légèrement décalée d'un côté. Et bien sûr, grâce à tout cela, l'algorithme a commencé à s'accrocher à ces branches. À cause de cela, au mieux, nous avons reçu plusieurs liens que nous n'avons pas réellement parcourus. Et dans le pire des cas, ils ont mal placé la piste.

Par conséquent, nous avons proposé une évaluation supplémentaire de la route. Nous prenons les points précédent et suivant de la trace GPS par rapport au point à partir duquel nous avons sélectionné le lien. Et nous voyons que l'azimut en ces points ne diffère pas trop de l'azimut du mouvement le long de ce lien. S'il diffère considérablement, nous affinons ce lien.
En conséquence, nous avons obtenu un résultat qui nous convient, bien que parfois de petites erreurs se produisent encore (parfois un lien supplémentaire peut être choisi que nous n'avons pas parcouru). Mais ils sont assez rares et ne sont donc pas critiques pour nous.
Placement des personnages
Nous avons maintenant un ensemble de liaisons routières sur lesquelles nous avons roulé et un ensemble de cadres avec des panneaux. Ainsi que des informations sur quel personnage se trouve sur cette image, à partir de quel point sur la piste cette image et le masque du personnage sont obtenus (un rectangle qui décrit le personnage sur cette image). Vous pouvez donc placer ces panneaux sur la carte.
La première étape consiste à obtenir des informations supplémentaires qui nous aideront à placer l'enseigne au bon endroit:
- Signe d'azimut. Si la marque est située exactement au centre du cadre, elle coïncide avec l'azimut au point GPS. Si le signe n'est pas centré, c'est l'azimut au point + l'angle entre le centre du cadre et le signe. Nous avons déjà l'azimut du point GPS, et nous pouvons calculer l'angle entre le centre du cadre et le signe, car nous savons où se trouve le masque de signalisation sur le cadre et nous connaissons l'angle de vision avec lequel la vidéo a été enregistrée.
- La distance à la marque du point GPS. Nous pouvons le calculer, car nous connaissons la taille du masque de signe, la résolution de l'image et l'angle de vision avec lequel la vidéo est enregistrée.
Vous pouvez maintenant passer directement à l'installation de l'enseigne. Parce que les points sur la piste ne se trouvent pas toujours (mais en fait jamais) sur les liaisons routières, nous devons d'abord placer notre point de détection de signe sur la liaison. Nous le faisons comme suit:
- Parmi les routes sur lesquelles la piste était assise, nous ne laissons que celles qui traversent une sorte de tampon autour de notre point GPS;
- Nous calculons la distance à chaque route sélectionnée et les trions par son augmentation;
- Nous prenons la route, calculons la projection du point GPS dessus;
- Nous obtenons la direction avec laquelle nous nous déplaçons à ce point le long de cette route;
- Si la direction du point 4 est inacceptable sur cette route, alors nous revenons au point 3 et prenons la route suivante;
- Si la direction est acceptable, arrêtez-vous.
Nous avons maintenant la route que nous avons empruntée lorsque nous avons défini le point GPS et la projection de ce point sur notre route. En fait, cette route, et donc le point, peut ne pas être choisie correctement. Par exemple, dans les virages, il est très facile de se tromper.

Par conséquent, avant de continuer, vous devez vous assurer que nous ne nous trompons pas. Ou, si vous faites une erreur, remplacez la route par la bonne et obtenez une projection dessus. Pour ce faire, prenez les routes qui relient à notre route et évaluez-les par distance et azimut. En conséquence, nous obtenons la route qui convient le mieux à un point donné et construisons une projection sur celui-ci.
Maintenant que notre point GPS est tiré sur la route, nous pouvons calculer l'emplacement du panneau par rapport à celui-ci. Pour ce faire, construisez un vecteur à partir de ce point avec une longueur égale à la distance au signe dans la direction coïncidant avec l'azimut du signe. Après cela, nous essayons de tirer le panneau vers l'une des routes sur lesquelles notre piste était assise. Dans ce cas, nous prenons en compte la direction des routes et la direction du panneau, qui est calculée pour chaque route à travers l'azimut du panneau.
À ce stade, il peut s'avérer qu'il n'y avait pas de route appropriée. Par exemple, du fait que le panneau aura une direction inacceptable sur ces routes (c'est-à-dire qu'elles sont à sens unique). Dans ce cas, ce panneau est situé sur une route voisine sur laquelle nous n'avons pas passé, ce qui signifie que nous ne le créerons tout simplement pas.
Maintenant que nous avons les coordonnées du panneau tracées sur la route, il reste à vérifier qu'il est correctement réglé, car parfois nous pouvons faire une erreur. Pour ce faire, nous vérifions que le signe n'est pas trop éloigné du point GPS d'origine en comparant cette distance avec la distance au signe obtenu à travers le cadre, avec une certaine hypothèse. Vérifiez également que la marque n'est pas derrière le point GPS. Si les validations sont réussies, nous avons obtenu les coordonnées du panneau sur la route et sa direction, ce qui signifie que notre géo-objet a la géométrie et tous les attributs nécessaires. Vous pouvez procéder à sa sauvegarde.
Fusionner les signes
En fait, il est trop tôt pour passer à la conservation. Le fait est que chaque panneau peut être vu à partir de plusieurs cadres, à l'exception de certains cas particuliers, lorsque pour certaines parties du cadre, le panneau est caché derrière un obstacle, par exemple derrière un camion.
De chacun de ces cadres, nous avons obtenu un objet géo pour le signe, ils ont les mêmes attributs et ils sont situés à peu près au même point. Cela signifie que nous devons n'en laisser qu'un seul. De plus, si ce signe n'est pas nouveau, nous l'avons déjà dans la base de données, ce qui signifie que nous devons le marquer comme étant mis à jour et ne pas créer un nouvel objet géographique.
Pour cela, nous réalisons la fusion de nouveaux objets géographiques entre nous et avec les objets existants.
Tout d'abord, nous obtenons tous les signes que nous avons déjà créés, sur les liens sur lesquels nous avons roulé. À eux, nous ajoutons tous les caractères que nous avons reconnus dans les cadres.
Ce que nous devons faire avec eux: nous devons comprendre à partir de leurs classes, attributs et géométries qu'un ensemble de ces objets géographiques est le même signe. S'il existe un objet géo existant dans cet ensemble, ne le laissez que et notez qu'il a été mis à jour. Si l'ensemble ne contient que de nouveaux objets géographiques, n'en laissez qu'un seul.
Nous le faisons en quatre étapes:
- Regroupez les objets géographiques par classe;
- Dans chaque groupe de l'étape 1, nous obtenons des groupes par attributs;
- Pour chaque groupe de l'étape 2, nous collectons les groupes par géométrie;
- S'il y a un signe existant dans le groupe de l'étape 3, nous le laissons seulement (s'il y en a plusieurs, alors laissez-les tous), et s'il n'y a pas de signe existant dans le groupe, nous laissons celui qui est au milieu.
Après cela, nous avons le nombre souhaité de caractères qui peuvent enfin être enregistrés.

Bien sûr, il se peut que nous ayons une sorte de signe, mais nous ne l'avons pas reconnu avec la vidéo. Dans ce cas, ce symbole ne sera pas mis à jour. Malheureusement, nous ne pouvons pas être sûrs que ce signe n’est plus sur le sol, car il pourrait simplement être couvert par une sorte d'obstacle lors de l'enregistrement d'une vidéo. Par conséquent, nous ne supprimons pas ce signe immédiatement, mais le marquons comme manquant sur la vidéo. Si ce signe est visible sur une autre vidéo, nous supprimons simplement cette marque et la mettons à jour. S'il n'est toujours pas visible - le cartographe devra faire face à ce signe. Et supprimez-le s'il ne l'est plus.
Plans immédiats
Signalisation des routes secondaires
Les signes sur la vidéo proviennent non seulement des routes que nous conduisons, mais aussi des routes secondaires: il peut s'agir de routes qui traversent la nôtre ou qui sont adjacentes à la nôtre. Ou vice versa - des routes qui bifurquent sur la nôtre. Il peut même s'agir de routes parallèles aux nôtres. Il est très difficile de distinguer les panneaux qui se trouvent sur ces routes des panneaux dont nous avons besoin. Après tout, ils sont souvent proches de notre route.
Pour résoudre le problème, nous prévoyons d'utiliser un certain nombre de règles sémantiques lors du placement d'un signe sur un lien. Par exemple, une limite de vitesse de 5 km / h est peu probable sur l'autoroute, mais très probablement à l'entrée de la station-service.
Signes de suivi
Parfois, nous ne gardons pas de panneaux, et parfois vice versa - nous détenons des panneaux qui n'ont pas besoin d'être fusionnés. Par conséquent, nous prévoyons de suivre les personnages par images - afin de reconnaître le même caractère sur différentes images avant même de les transformer en objets géo. Et utilisez ces connaissances avec la fusion.
Conclusion
La version actuelle est essentiellement bêta. Par conséquent, il est imparfait. Il y a des problèmes que nous allons résoudre dans un avenir proche. Il y a des problèmes qui ne sont pas encore clairement résolus. , . , GPS- . , — , . , , .
. , . , , - .