Conducción autónoma en la acera con OpenCV y Tensorflow

La creación de automóviles autónomos es ahora un tema popular y muchas cosas interesantes están sucediendo aquí a nivel de aficionados.

El curso más antiguo y famoso fue un título en línea de Udacity .

Por lo tanto, en las máquinas autónomas hay un enfoque muy de moda: la clonación conductual, cuya esencia es que la computadora aprende a comportarse como una persona (al volante), basándose solo en datos de entrada y salida grabados. En términos generales, hay una base de imágenes de la cámara y el ángulo de dirección correspondiente.

En teoría, habiendo entrenado una red neuronal en estos datos, podemos dejar que conduzca una máquina.
Este enfoque se basa en un artículo de Nvidia .

Hay muchas implementaciones hechas principalmente por estudiantes de Udacity:


Aún más interesante es la aplicación en proyectos reales. Por ejemplo, el Donkey Car está controlado por una red neuronal especialmente entrenada.

Tal infosfera saturada impulsa directamente la acción, especialmente desde que mi tanque robot ha llegado a un punto muerto en su desarrollo desde el último artículo , y necesitaba urgentemente nuevas ideas. Había un sueño audaz: caminar en el parque con su tanque, que, en general, no es peor que un perro doméstico. El punto es pequeño: enseñarle al tanque a andar en la acera del parque.

Entonces, ¿qué es una acera en términos de una computadora?

Alguna área en la imagen que es diferente en color de otras áreas.

Dio la casualidad de que en los parques accesibles para mí, la acera resultó ser el objeto más gris de la imagen.

(El más gris se refiere a la diferencia mínima entre los valores RGB). Esta es una propiedad gris y será clave en el reconocimiento del pavimento.

Otro parámetro importante del gris es el brillo. Las fotos de otoño consisten en gris un poco menos que completamente, por lo que las diferencias entre la carretera y la acera son solo en sombras.

tanque en un parque

Algunos de los enfoques más obvios son precalibrar: colocar el robot de modo que la carretera ocupe la mayor parte de la pantalla y

  • tomar brillo promedio (en formato HSV)
  • o una pieza RGB promedio, garantizada para estar hecha de carretera (en cuyo caso será la esquina inferior izquierda).

Habiendo establecido tales criterios para reconocer la acera, corremos a través de la imagen y obtenemos alguna forma de la carretera.


El siguiente paso es convertir el lugar espeluznante en acción: siga recto o gire a la derecha o izquierda.

Conducimos en línea recta si el borde derecho es visible y el ángulo está a menos de 45 grados de la vertical.

Giramos a la izquierda si el borde derecho es visible y el ángulo se desvía de la vertical hacia abajo.
Gire a la derecha si no vemos el borde derecho.

El borde derecho del punto espeluznante: usar la geometría para resolver este problema es bastante divertido. Mejor si la mente artificial está buscando patrones de inclinación en estos desechos.

Aquí es donde las redes neuronales vienen al rescate.

Las imágenes originales se lavan, se exprimen y se recortan, seleccionamos reconocer la acera gris y obtener máscaras en blanco y negro de 64x64.

Descomponemos estas máscaras en 3 grupos: Izquierda, Derecha, Recta y entrenamos el clasificador de la red neuronal en ellas.

Recopilar y preparar datos es una tarea tediosa, tomó un par de meses.

Aquí hay máscaras de muestra:

A la izquierda:


A la derecha:


Recta:


Para trabajar con una red neuronal, utilicé Keras + Tensorflow.

Al principio surgió la idea de tomar la estructura de la red neuronal de Nvidia, pero, obviamente, está diseñada para varias otras tareas y no se adapta muy bien a la clasificación. Como resultado, resultó que la red neuronal más simple de cualquier tutorial de clasificación multicategoría da resultados bastante aceptables.

model = Sequential() activation = "relu" model.add(Conv2D(20, 5, padding="same", input_shape=input_shape)) model.add(Activation(activation)) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Conv2D(50, 5, padding="same")) model.add(Activation(activation)) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Flatten()) model.add(Dense(500)) model.add(Activation(activation)) model.add(Dense(cls_n)) opt = SGD(lr=0.01) model.add(Activation("softmax")) model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) 

Habiendo entrenado la primera versión de la red, me encontré con su incompatibilidad con la Raspberry Pi. Antes de eso, utilicé Tensorflow versión 1.1, utilizando el chamanismo recopilado por una persona muy inteligente .

Desafortunadamente, esta versión está desactualizada y no pudo leer los modelos de Keras.

Sin embargo, recientemente la gente de Google finalmente bajó y recolectó TF bajo Raspberry Pi, aunque bajo la nueva versión de Raspbian - Stretch. Stretch fue bueno para todos, pero hace un año no tenía OpenCV para eso, así que el tanque fue a Jessie.

Ahora, bajo la presión del cambio, tuve que cambiar a Estirar. Tensorflow se levantó sin problemas (aunque tomó varias horas). OpenCV durante un año tampoco se detuvo y la versión 4.0 ya se lanzó. Así que logró recolectarlo bajo Estiramiento, para que no hubiera obstáculos para la migración.

Hubo dudas sobre cómo Raspberry atraería a un monstruo como Tensorflow en tiempo real, pero todo resultó ser generalmente aceptable: a pesar de la carga de red inicial de unos pocos segundos, la clasificación en sí puede funcionar varias veces por segundo sin un consumo significativo de memoria y CPU.

Como resultado, la mayoría de los problemas y errores ocurren precisamente en la etapa de reconocimiento del camino.
La red neuronal falla muy raramente, a pesar de la simplicidad de la estructura.

Con el firmware actualizado, el tanque atraviesa el parque.

Debido a las lesiones sufridas, el robot golpea constantemente hacia la derecha, de modo que sin inteligencia artificial se va rápidamente al césped.


Ahora puede pasearlo por la mañana y detectar perros que se aproximan.

Referencias

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


All Articles