
2GIS se enorgullece de la precisión de los datos. Todos los días hábiles en cada ciudad, nuestros expertos recorren áreas enteras para corregir todos los cambios en el mapa: casas nuevas, carreteras e incluso caminos. Y también recolectan y colocan señales de tráfico en él, ayudando a construir adecuadamente carreteras y rutas a pie. En este artículo, le contaré cómo decidimos ayudar a los cartógrafos y comenzamos a recolectar señales de tráfico automáticamente.
¿Qué es Fiji y por qué hay signos?
Fiji es un editor de mapas que desarrollamos para nuestros especialistas en SIG. Esta es una aplicación clásica de cliente-servidor. Ya hay varios artículos sobre el centro: en los que hablamos de Fiji:
Cómo recoger signos antes
Fiji tiene un modo de operación especial para recolectar y actualizar carteles. En este modo, el mapeador puede abrir el video grabado por el DVR. El video en sí se muestra en una ventana separada, y su seguimiento se muestra en el mapa. El marcador muestra la posición actual.

Se aplica una cuadrícula en la parte superior del video, que le permite determinar la distancia a la señal. Tan pronto como el personaje se convierte en el tamaño de una celda, el cartógrafo hace una pausa y crea el personaje. En este momento, conocemos la posición actual y la distancia al letrero, por lo que lo movemos hacia adelante y lo acercamos al enlace. El enlace en nuestra terminología es una representación esquemática de un tramo de carretera. Cada personaje tiene su propio código numérico, su cartógrafo ingresa en un campo especial.
Si ya hemos ingresado un carácter, lo cargamos en el editor de caracteres. El cartógrafo revisa el video y, si es necesario, realiza cambios utilizando los mismos códigos numéricos. O, si el signo es correcto, lo marca como actualizado.
Por supuesto, este método requiere que el cartógrafo vea cada video, y luego también dedique tiempo a ingresar cada personaje. Además, la posición de la señal en el mapa no se determina con precisión: simplemente nos desviamos de la posición actual por una distancia determinada por la cuadrícula, y luego dibujamos el punto resultante a la carretera más cercana. Como resultado, los signos pueden no crearse exactamente allí (o incluso nada) cuando sea necesario. Esto significa que el cartógrafo también debe moverlo al lugar correcto, lo que también consume su tiempo. Además, es posible que el video no tenga ningún signo, pero el cartógrafo aún se ve obligado a verlo. Por supuesto, el programa le permite aumentar la velocidad del video, pero el costo de tiempo en cualquier caso será más de cero. Por lo tanto, decidimos automatizar este proceso.
Cómo coleccionar ahora
Todavía necesitamos videos de registradores. Pero ahora, en lugar de mirar cada uno, el cartógrafo simplemente selecciona los archivos necesarios y presiona el botón "Descargar". Después de eso, puede hacer otras cosas: el video se procesará y las señales de tráfico aparecerán en el mapa. Varios casos dudosos serán notados específicamente. Por lo tanto, todo lo que le queda al cartógrafo es revisar estos casos y corregirlos.
Arquitectura

Para obtener objetos de las clases requeridas con los atributos necesarios del video, escribimos varios servicios.
El primero es VideoPreprocessingService: aquí es donde se carga el archivo de video. El servicio envía el archivo al repositorio, realiza un registro al respecto en la base de datos y crea tareas para su procesamiento. Debe cortar fotogramas del video con una cierta frecuencia, seleccionar puntos GPS para ellos de la pista para ellos, enviar el resultado al servicio de Procesamiento de cuadros.
Las dos primeras tareas las realiza no el servicio en sí, sino el trabajador. Esto se hace para que pueda cambiar fácilmente el número de estos trabajadores. Incrementando así la productividad, si existe tal necesidad.
FrameProcessingService guarda todos los marcos y puntos recibidos. También sube fotogramas a la cola. Es leído por un servicio escrito por nuestros colegas expertos en Machine Learning. Reconoce las señales de tráfico. Por supuesto, FrameProcessingService lee las respuestas de este servicio: estos son los códigos de caracteres, si están en el marco, y los rectángulos en los que se inscribe este carácter. Conociendo el tamaño del rectángulo, entendemos la distancia al signo. Y cuando se procesan todos los cuadros del video, los envía a nuestro servidor de mapas.
El servidor de mapas es la parte más importante del sistema. Los clientes reciben de él todos los datos que almacenamos (
excepto los mosaicos ). Guarda estos datos y ejecuta toda la lógica empresarial.
Descripción general
Nuestros datos de mapas son geo objetos. Un objeto geo es una geometría (es decir, la ubicación de un objeto en el espacio) y un conjunto de atributos. Los almacenamos en la base de datos y los operamos. Pero de FrameProcessingService obtenemos solo el código del signo, las coordenadas del punto desde el cual se reconoció el signo, el marco en sí y la máscara de signos en este marco. Por lo tanto, debemos convertir este conjunto de datos en un objeto geográfico. Cada objeto geográfico pertenece a alguna clase. Cada tipo de señal de tráfico es una clase separada. Podemos obtenerlo fácilmente del código de señal. Del código de signo podemos obtener atributos específicos de esta clase. Por ejemplo, recibimos el código 3_24_60. 3_24: dice que este es un límite de velocidad (señal 3.24 en las reglas de tráfico). El valor de restricción debe indicarse para estos caracteres. Nos dice la tercera parte del código: aquí será de 60 km / h.
Entonces, la clase de objeto geo está definida, sus atributos también son específicos. Parece que ya puedes crear un objeto geo. Pero es muy temprano. En primer lugar, cada signo tiene un atributo "Dirección", que dice en qué dirección actúa el signo. En segundo lugar, todavía no tenemos geometría para este objeto geográfico. Tenemos un punto desde el cual vimos una señal. Entonces, el signo en sí está a cierta distancia de nosotros. Además, su geometría afecta el valor del atributo Dirección.

Aquí haremos una pequeña digresión. Por supuesto, tenemos una red de carreteras. Consiste en enlaces individuales. Cada enlace es una línea. En la primera parte de la figura acabamos de dibujar dos enlaces. Las flechas muestran la dirección en que fueron dibujadas, es decir la izquierda se dibujó de abajo hacia arriba y la derecha, de arriba a abajo.
Cada enlace contiene información sobre en qué dirección puede moverse. La dirección del movimiento es un atributo separado; no es igual a la dirección del renderizado. Este atributo nos dice en qué dirección puede moverse a lo largo del enlace, en relación con la dirección del dibujo. En la segunda parte de la figura, ambos enlaces tienen el mismo valor para este atributo, y en la tercera figura, valores opuestos.
¿Cómo se relaciona esto con los signos? Entonces, nos movemos a lo largo de los enlaces de abajo hacia arriba, y vemos algún tipo de señal. Entonces, en el enlace izquierdo, el letrero tendrá la dirección "Solo recto", a la derecha - "Solo atrás", es decir igual que los enlaces en la tercera figura. Aquí todo resultó simple, pero esto se debe a que nuestros enlaces son unidireccionales. En realidad, una gran cantidad de enlaces son bilaterales, es decir su dirección tiene el significado de "en ambas direcciones". Y la señal siempre se dirige en una dirección, y debemos entender en qué dirección.
Correspondencia de mapas
Antes de comenzar a colocar letreros en el mapa, debemos entender qué caminos condujimos cuando grabamos el video. Los datos de GPS no son suficientes para esto: a menudo se confunden con decenas de metros. Además, los mapas siguen siendo esquemas y pueden no coincidir con el terreno real. Por ejemplo, en carreteras anchas de varios carriles.
Esto resolverá varios problemas a la vez:
- Ya se pueden crear carteles en estos caminos, por lo que podemos hacer cambios en ellos, si los hay;
- Es posible que algunos de estos signos no aparezcan en el video, y podemos encontrarlos y ponerles una etiqueta especial;
- Podemos entender en qué camino estábamos cuando vimos una señal reconocida, que, a su vez, nos ayudará a colocar esta señal en el lugar correcto en el mapa.
Algoritmo
El algoritmo que utilizamos es bastante simple. Ya hay un
artículo sobre Habré con su descripción. En términos generales, suena así: tenemos una carretera seleccionada, tome el punto GPS más cercano a su final desde la pista. Y con respecto a este punto, evaluamos los caminos que se unen a nuestro camino, es decir, evaluamos la probabilidad de que nuestro punto se refiera a este camino en particular. Cada camino recibe puntos, se selecciona el que tiene más puntos. Repita hasta que la pista termine.
En el proceso, realizamos varias adiciones al algoritmo. El algoritmo no tuvo en cuenta las direcciones en los enlaces de carretera, por lo que lo primero que hicimos fue comenzar a tenerlos en cuenta: ahora, si el enlace es unidireccional, entendemos en qué dirección debemos avanzar. Y si esta dirección no coincide con la dirección del enlace, descartamos este enlace.
Inicialmente, nos pareció que esto sería suficiente, y las primeras pruebas lo confirmaron. Pero luego comenzamos a revisar los videos grabados en vecindarios residenciales, y todo resultó no tan atractivo. El hecho es que tenemos una precisión de datos muy alta, incluso en carreteras. En consecuencia, hemos dibujado todas las entradas de vehículos dentro del trimestre, hasta el más mínimo detalle. Por otro lado, como dije, el GPS puede no ser muy preciso o incluso muy inexacto. Y si vas por un camino alrededor del cual hay edificios altos, entonces los puntos en la pista pueden salir con bastante fuerza. Solía suceder que los puntos se movían hacia más de 20 metros. Como resultado, resulta que muchos puntos están cerca de esos caminos en los que no fuimos. El resultado de la reducción de tales pistas fue esta imagen:

El sentido común nos dijo que hay pocas señales en tales caminos, y por lo tanto no hay una razón particular para recogerlos allí. Por lo tanto, lo más probable, en la mayoría de los casos, el automóvil se movió por las calles principales. Por lo tanto, para las entradas de vehículos dentro del trimestre, introdujimos una multa. Por multa nos referimos a una disminución en el número de puntos a lo largo del camino. Como resultado, el problema con las entradas de vehículos dentro del trimestre se resolvió: no salieron cuando no los recorrimos, y cuando realmente los recorrimos, incluso a pesar de la multa, resultan ser la mejor opción y luego los elegimos.
Después de eso, los resultados ya fueron muy buenos. Y nos pareció que la correspondencia de mapas había terminado. Pero el problema vino, de donde no esperaron. De repente, resultó que hay casos en que otro camino se bifurca y lo hace sin problemas. Y todo se vio agravado por el hecho de que el ramal también puede ir en paralelo con el nuestro, al menos por un tiempo. Al mismo tiempo, le recuerdo, la pista GPS casi nunca se encuentra en la parte superior de los enlaces a los que viajamos, está ligeramente desplazada hacia algún lado. Y, por supuesto, gracias a todo esto, el algoritmo comenzó a aferrarse a estas ramas. Debido a lo cual, en el mejor de los casos, recibimos varios enlaces por los que no pasamos realmente. Y en el peor de los casos, asentaron la pista bastante equivocada.

Por lo tanto, se nos ocurrió una evaluación adicional del camino. Tomamos los puntos anteriores y siguientes de la pista GPS en relación con el punto desde el que seleccionamos el enlace. Y vemos que el acimut en estos puntos no difiere demasiado del acimut de movimiento a lo largo de este enlace. Si difiere mucho, ajustamos este enlace.
Como resultado, obtuvimos un resultado que nos conviene, aunque a veces todavía ocurren pequeños errores (a veces se puede elegir un enlace adicional que no pasamos). Pero son bastante raros y, por lo tanto, no son críticos para nosotros.
Colocación de personajes
Ahora tenemos un conjunto de enlaces de carretera en los que condujimos, y un conjunto de marcos con señales. Además de la información sobre qué personaje está en este cuadro, desde qué punto de la pista se obtiene este cuadro y la máscara del personaje (un rectángulo que describe el personaje en este cuadro). Para que pueda colocar estos signos en el mapa.
El primer paso es obtener información adicional que nos ayudará a colocar el letrero en el lugar correcto:
- Signo de acimut. Si la marca se encuentra exactamente en el centro del cuadro, coincide con el acimut en el punto GPS. Si el signo no está centrado, este es el acimut en el punto + el ángulo entre el centro del marco y el signo. Ya tenemos el acimut del punto GPS, y podemos calcular el ángulo entre el centro del marco y el signo, porque sabemos dónde se encuentra la máscara de señal en el marco y sabemos el ángulo de visión con el que se grabó el video.
- La distancia a la marca desde el punto GPS. Podemos calcularlo porque Conocemos el tamaño de la máscara de señal, la resolución del marco y el ángulo de visión con el que se graba el video.
Ahora puede ir directamente a la instalación del letrero. Porque los puntos en la pista no siempre (pero en realidad nunca) se encuentran en los enlaces de la carretera, primero debemos poner nuestro punto de detección de señales en el enlace. Lo hacemos de la siguiente manera:
- Entre las carreteras en las que estaba asentada la pista, dejamos solo aquellas que cruzan algún tipo de amortiguación alrededor de nuestro punto GPS;
- Calculamos la distancia a cada carretera seleccionada y las clasificamos por su aumento;
- Tomamos el camino, calculamos la proyección del punto GPS en él;
- Obtenemos la dirección con la que nos movemos en este punto a lo largo de este camino;
- Si la dirección del ítem 4 es inaceptable en este camino, entonces volvemos al ítem 3 y tomamos el siguiente camino allí;
- Si la dirección es aceptable, entonces deténgase.
Ahora tenemos el camino que tomamos cuando configuramos el punto GPS, y la proyección de este punto en nuestro camino. De hecho, este camino, y de ahí el punto, puede no elegirse correctamente. Por ejemplo, en las curvas, es muy fácil cometer un error.

Por lo tanto, antes de continuar, debe asegurarse de que no nos equivoquemos. O, si comete un error, reemplace el camino con el correcto y obtenga una proyección sobre él. Para hacer esto, tome los caminos que se conectan a nuestro camino y evalúelos por distancia y acimut. Como resultado, obtenemos el camino más adecuado para un punto dado y construimos una proyección sobre él.
Ahora que nuestro punto GPS se encuentra en la carretera, podemos calcular la ubicación de la señal relativa a él. Para hacer esto, construya un vector desde este punto con una longitud igual a la distancia al signo en la dirección que coincida con el acimut del signo. Después de eso, tratamos de tirar de la señal a una de las carreteras en las que estaba sentada nuestra pista. En este caso, tenemos en cuenta la dirección de las carreteras y la dirección de la señal, que se calcula para cada carretera a través del acimut de la señal.
En esta etapa, puede resultar que no había un camino adecuado. Por ejemplo, debido al hecho de que el letrero tendrá una dirección que es inaceptable en estos caminos (es decir, son unidireccionales). En este caso, esta señal se encuentra en una carretera vecina por la que no pasamos, lo que significa que simplemente no la crearemos.
Ahora que tenemos la coordenada de la señal dibujada en la carretera, queda por verificar que esté configurada adecuadamente, porque a veces podemos cometer un error. Para hacer esto, verificamos que la señal no está demasiado lejos del punto GPS original comparando esta distancia con la distancia a la señal obtenida a través del marco, con cierta suposición. También verifique que la marca no esté detrás del punto GPS. Si las validaciones son exitosas, obtenemos las coordenadas de la señal en el camino y su dirección, lo que significa que nuestro objeto geográfico tiene geometría y todos los atributos necesarios. Puede proceder a guardarlo.
Fusionar signos
De hecho, es demasiado pronto para pasar a la conservación. El hecho es que cada señal puede verse desde varios marcos, con la excepción de algunos casos especiales, cuando para algunas partes del marco la señal está oculta detrás de cualquier obstáculo, por ejemplo, detrás de un camión.
De cada uno de estos cuadros obtuvimos un objeto geo para el signo, tienen los mismos atributos y se encuentran aproximadamente en el mismo punto. Esto significa que necesitamos dejar solo uno de ellos. Además, si este signo no es nuevo, entonces ya lo tenemos en la base de datos, lo que significa que debemos marcarlo como actualizado y no crear un nuevo objeto geográfico.
Para ello, realizamos la fusión de nuevos objetos geográficos entre nosotros y con los existentes.
En primer lugar, obtenemos todas las señales que ya hemos creado, en los enlaces en los que condujimos. A ellos agregamos todos los caracteres que reconocimos de los marcos.
Lo que necesitamos hacer con ellos: necesitamos entender de sus clases, atributos y geometrías que algún conjunto de estos objetos geográficos es el mismo signo. Si hay un objeto geo existente en este conjunto, déjelo solo y tenga en cuenta que se ha actualizado. Si el conjunto contiene solo nuevos objetos geográficos, deje solo uno de ellos.
Hacemos esto en cuatro pasos:
- Agrupar objetos geográficos por su clase;
- En cada grupo del paso 1 obtenemos grupos por atributos;
- Para cada grupo del paso 2, recopilamos los grupos por geometría;
- Si hay un signo existente en el grupo del paso 3, solo lo dejamos (si hay varios de ellos, déjelos a todos), y si no hay signos existentes en el grupo, dejamos el que está en el medio.
Después de eso, tenemos el número deseado de caracteres que finalmente se pueden guardar.

Por supuesto, puede resultar que tengamos algún tipo de señal, pero no lo reconocimos con el video. En este caso, este símbolo no se actualizará. Desafortunadamente, no podemos estar seguros de que este signo ya no esté en el suelo, porque podría estar cubierto por algún tipo de obstáculo mientras graba un video. Por lo tanto, no eliminamos este signo de inmediato, sino que lo marcamos como perdido en el video. Si este signo es visible en algún otro video, simplemente eliminamos esta marca y lo actualizamos. Si todavía no será visible, el cartógrafo tendrá que lidiar con este signo. Y elimínelo si realmente ya no existe.
Planes inmediatos
Señales de los caminos laterales
Las señales en el video no solo provienen de los caminos que manejamos, sino también de los caminos laterales: estos pueden ser caminos que cruzan el nuestro o que están junto al nuestro. O viceversa: caminos que se bifurcan. Incluso puede ser caminos paralelos a los nuestros. Es muy difícil distinguir las señales que se encuentran en estos caminos de las señales que necesitamos. Después de todo, a menudo están cerca de nuestro camino.
Para resolver el problema, planeamos usar una serie de reglas semánticas al colocar un signo en un enlace. Por ejemplo, es poco probable que haya un límite de velocidad de 5 km / h en la carretera, pero es muy probable que esté en la entrada de la estación de servicio.
Señales de seguimiento
A veces no guardamos signos, y a veces viceversa, tenemos signos que no necesitan fusionarse. Por lo tanto, planeamos rastrear caracteres por cuadros, para reconocer el mismo personaje en diferentes cuadros incluso antes de convertirlos en objetos geográficos. Y use este conocimiento con fusión.
Conclusión
La versión actual es esencialmente beta. Por lo tanto, es imperfecto. Hay problemas que vamos a resolver en el futuro cercano. Hay problemas que aún no están claros sobre cómo resolverlos. , . , GPS- . , — , . , , .
. , . , , - .