1024, lo lleva a construir la primera red de detección de líneas de carril LaneNet


Inserte la descripción de la imagen aquí


Resumen de recursos:

Dirección de descarga de papel: https://arxiv.org/abs/1802.05591
Dirección del proyecto github: https://github.com/MaybeShewill-CV/lanenet-lane-detection
Recopilación de datos de LanNet: https://pan.baidu.com/ s / 17dy1oaYKj5XruxAL38ggRw Código de extracción: 1024
Traducción en papel de LanNet: LaneNet de la red de detección de líneas de carril


1. Explicación detallada del algoritmo LaneNet

1.1 Introducción a LaneNet

Los métodos tradicionales de detección de líneas de carril se basan en características extraídas manualmente para la identificación, como características de color, tensores de estructura, contornos, etc. Estas características también pueden combinarse con la transformación de Hough, varios operadores o filtros de Kalman. Después de identificar las líneas de carril, se utilizan técnicas de posprocesamiento para filtrar detecciones falsas y agruparlas para formar el carril final. Sin embargo, debido a los cambios en las escenas de la carretera, estos métodos tradicionales son propensos a problemas de robustez.

El método actualizado utiliza modelos de aprendizaje profundo que están entrenados para la segmentación de carriles a nivel de píxeles. Sin embargo, estos métodos se limitan a detectar un número fijo predefinido de carriles, como el carril actual, y no pueden hacer frente a los cambios de carril.

En base a esto, Davy Neven et al.propusieron una nueva red de detección de líneas de carril LaneNet en 2018. LaneNet hizo principalmente las dos contribuciones siguientes :

  • El problema de detección de carriles se reduce a un problema de segmentación de instancias, en el que cada carril forma su propia instancia, que puede entrenarse de un extremo a otro.
  • Se construye una nueva red H-Net para aprender los parámetros de transformación de perspectiva de una imagen de entrada dada. La transformación de perspectiva puede adaptarse bien a las líneas de carril en la carretera inclinada y superar el problema de la falta de robustez.

1.2 Análisis de estructura general

El autor propone una estructura de red de múltiples sucursales, que incluye una red de segmentación binaria (segmentación de carriles) y una red de segmentación de instancias (incorporación de carriles), para lograr de extremo a extremo, cualquier número de detección de líneas de carril. Específicamente, la red de segmentación binaria genera todos los píxeles de línea de carril y la red de segmentación de instancia distribuye los píxeles de línea de carril de salida a diferentes instancias de línea de carril. El diagrama de estructura de red general es el siguiente:
Inserte la descripción de la imagen aquí
Por otro lado, el conjunto de datos se ingresa en la red H-Net y se aprende la matriz H del parámetro de transformación de perspectiva. Para los píxeles de diferentes instancias de línea de carril, realice un ajuste de línea de carril para obtener la línea de carril continua en forma de punto que se muestra en la figura anterior.

1.3 Estructura de la red LaneNet

La estructura de red general de LaneNet es la siguiente:
Inserte la descripción de la imagen aquí
Red de segmentación binaria

Una rama de Lanenet es una red de segmentación binaria, que separa los píxeles de la línea de carril del fondo. Dado que la categoría objetivo es de 2 tipos (carril / fondo) y muy desequilibrada, se hace referencia a ENet, y la función de pérdida utiliza la función de pérdida de entropía cruzada estándar .

Red de segmentación de instancias

La red de sucursales se refiere a "Segmentación de instancia semántica con una función de pérdida discriminativa", utiliza un método basado en una sola operación para el aprendizaje de la medición de distancia e integra este método en una red neuronal de retroalimentación estándar, que se puede utilizar para el procesamiento en tiempo real. La red de sucursales genera una distancia de píxeles de línea de carril después del entrenamiento. Basado en la idea básica de que los píxeles que pertenecen al mismo carril están cerca y los píxeles de diferentes líneas de carril están lejos, cada línea de carril se agrupa mediante el uso de la función de pérdida de agrupamiento .

Función de pérdida de racimo

La función de pérdida es la siguiente:
Inserte la descripción de la imagen aquí
    [x] + = max (0, x) [x] _ + = max (0, x)[ x ]+=m una x ( 0 ,x )

     L total = L var + L dist L_ {total} = L_ {var} + L_ {dist} Lt o t un l=Lv a r+Ld i s t

Entre ellos, cada parámetro se expresa de la siguiente manera:

  • C: indica el número de instancias de líneas de carril;
  • N c N_c nortec—— El número de píxeles en cada instancia de línea de carril;
  • uc u_c tuc——El centro de píxeles de cada instancia de línea de carril;
  • L var L_ {var} Lv a rEs la pérdida de varianza, su propósito es reducir la distancia dentro de la clase ;
  • L dist L_ {dist} Ld i s tEs la pérdida de distancia, su propósito es aumentar la distancia entre clases (la distancia entre diferentes líneas de carril);

Diagrama de estructura de red

La arquitectura de LaneNet se basa en la red de codificador-decodificador ENet, que se compone de 5 etapas. Las tres primeras etapas son la red de codificadores y se realizan dos submuestreos, las dos últimas etapas son la red de decodificadores y se realizan dos upsampling.
Inserte la descripción de la imagen aquí
LaneNet se modifica en una red de sucursales dual sobre la base de esta red . Dado que el codificador de ENet contiene más parámetros que el descodificador, compartir el codificador completo por completo entre las dos tareas dará lugar a resultados insatisfactorios. Por lo tanto, LaneNet solo comparte las dos primeras etapas (1 y 2) entre las dos ramas, dejando la etapa 3 del codificador ENet y el decodificador ENet completo como la columna vertebral de cada rama individual. La última capa de la rama de segmentación genera una imagen de un solo canal para la segmentación binaria; y la última capa de la rama de segmentación de la instancia genera una imagen de canal N, donde N es la dimensión de la instancia. El término de pérdida de cada rama se pondera por igual y se propaga a través de la red.

1.4 Estructura de la red H-Net

La salida de la red LaneNet es el conjunto de píxeles de cada línea de carril. El procesamiento convencional consiste en convertir la imagen en una vista de pájaro y luego usar un segundo o tercer polinomio para ajustar la línea de carril curva. Sin embargo, los parámetros de la matriz de transformación de perspectiva que se utilizan actualmente están predeterminados y no cambiarán. El ajuste de las líneas de carril frente a la influencia de las fluctuaciones de las líneas horizontales (como las pendientes ascendentes y descendentes) no es preciso y la solidez no es buena. Fuerte. Por tanto, el autor propone el modelo H-net para aprender el parámetro H de la matriz de transformación de perspectiva.

Inserte la descripción de la imagen aquí
H tiene 6 grados de libertad y se coloca cero para imponer restricciones, es decir, la línea horizontal permanece horizontal bajo la transformación.

La arquitectura de red de H-NET es pequeña y consta de bloques continuos de convolución 3x3, capa BN y Relu. Utilice la capa de agrupación máxima para reducir la dimensionalidad y agregue 2 capas completamente conectadas al final. La estructura de red completa se muestra en la siguiente figura: el
Inserte la descripción de la imagen aquí
número de nodos en la última capa completamente conectada es 6, que corresponde a los 6 parámetros en la matriz H.

1.5 Ventajas de rendimiento de LaneNet

Velocidad de detección . Probado en una tarjeta gráfica Nvidia 1080Ti, se necesitaron 19 ms para detectar una imagen en color de 512x512, por lo que puede procesar alrededor de 50 cuadros por segundo.
Inserte la descripción de la imagen aquí
Precisión de detección. Al utilizar LaneNet combinado con el ajuste polinomial de tercer orden y la matriz de transformación de H-Net, la precisión de detección alcanzó el 96,4% en el desafío tuSimple y ganó el cuarto lugar, que es solo un 0,5% de diferencia del primer lugar. Los resultados se pueden ver en la siguiente tabla.
Inserte la descripción de la imagen aquí

En segundo lugar, tómate de la mano para realizar LaneNet

2.1 Introducción al proyecto

El proyecto fue de código abierto en github y ganó una estrella de 1.3k. Los estudiantes que quieran probarlo pueden clonarlo: https://github.com/MaybeShewill-CV/lanenet-lane-detection , si no puede abrirlo, también puede Descarga de mi disco en la nube de Baidu: recopilación de datos LaneNet, código de extracción: 1024

La estructura del código y las funciones de cada parte son las siguientes:

lanenet-lane-detection
├── config //配置文件
├── data //一些样例图片和曲线拟合参数文件
├── data_provider // 用于加载数据以及制作 tfrecords
├── lanenet_model 
│   ├── lanenet.py //网络布局 inference/compute_loss/compute_acc
│   ├── lanenet_front_end.py // backbone 布局
│   ├── lanenet_back_end.py // 网络任务和Loss计算 inference/compute_loss
│   ├── lanenet_discriminative_loss.py //discriminative_loss实现
│   ├── lanenet_postprocess.py // 后处理操作,包括聚类和曲线拟合
├── model //保存模型的目录semantic_segmentation_zoo
├── semantic_segmentation_zoo // backbone 网络定义
│   ├── __init__.py
│   ├── vgg16_based_fcn.py //VGG backbone
│   └─+ mobilenet_v2_based_fcn.py //mobilenet_v2 backbone
│   └── cnn_basenet.py // 基础 block
├── tools //训练、测试主函数
│   ├── train_lanenet.py //训练
│   ├── test_lanenet.py //测试
│   └──+ evaluate_dataset.py // 数据集评测 accuracy
│   └── evaluate_lanenet_on_tusimple.py // 数据集检测结果保存
│   └── evaluate_model_utils.py // 评测相关函数 calculate_model_precision/calculate_model_fp/calculate_model_fn
│   └── generate_tusimple_dataset.py // 原始数据转换格式
├─+ showname.py //模型变量名查看
├─+ change_name.py //模型变量名修改
├─+ freeze_graph.py//生成pb文件
├─+ convert_weights.py//对权重进行转换,为了模型的预训练
└─+ convert_pb.py //生成pb文

2.2 Configuración del entorno

Según la descripción del autor de código abierto, el entorno de prueba es:

  • ubuntu 16.04
  • python3.5
  • cuda-9.0
  • cudnn-7.0
  • GPU GTX-1070
  • tensorflow 1.12.0

El entorno y la configuración que utilizo son:

  • sistema ubuntu16.04
  • PyCharm 2020
  • python3.6
  • tensorflow1.13.1-gpu
  • milagros-10.0
  • cudnn 7.6.4
  • opencv4.0.0
  • GPU RTX 2070

Los amigos que quieran probar pueden consultar las dos configuraciones anteriores o probar otras versiones por sí mismos.

2.3 Preparación

Si desea entrenar por su cuenta, puede descargar el conjunto de datos de TuSimple para entrenar. De manera similar, también podemos usar directamente el modelo entrenado oficialmente para ingresar imágenes y ver los resultados de la prueba. Para mayor comodidad, carguemos directamente el modelo entrenado para realizar pruebas locales.

(1) Descargue el conjunto de datos de TuSimple; si no entrena, puede omitir este paso.

(2) Descargue el modelo entrenado, enlace de descarga: recopilación de datos LaneNet, código de extracción: 1024

Después de la descarga, colocamos el archivo de modelo tusimple_lanenet en el archivo de modelo en el directorio del proyecto, como se muestra en la siguiente figura:

Inserte la descripción de la imagen aquí

2.4 Prueba de modelo

Después de completar la configuración del entorno y la implementación del modelo, ¡podemos probar!

(1) Primero pruebe las imágenes en el conjunto de datos TusSample

  • El primer paso es crear una carpeta Mytest en el archivo de datos en el directorio del proyecto original y luego seleccionar arbitrariamente una imagen en el conjunto de datos de TusSample, como 1.jpg, como se muestra en la siguiente figura:

Inserte la descripción de la imagen aquí

  • El segundo paso es utilizar PyCharm para abrir el proyecto descargado. Después de configurar el entorno, abra el terminal, como se muestra en la siguiente figura:

Inserte la descripción de la imagen aquí

  • El tercer paso es ingresar el siguiente comando en la terminal para ejecutar el programa:
python tools/test_lanenet.py --weights_path model/tusimple_lanenet/tusimple_lanenet.ckpt --image_path data/Mytest/1.jpg

El efecto de detección de línea de carril final es el siguiente:
Inserte la descripción de la imagen aquí

(2) Pruebe sus propias imágenes

  • El primer paso es seleccionar una imagen de línea de carril 2.jpg que tomó y colocarla en la carpeta Mytest recién creada, como se muestra en la siguiente figura:

Inserte la descripción de la imagen aquí
El segundo paso es abrir la terminal, ingresar el comando y ejecutar el programa:

python tools/test_lanenet.py --weights_path model/tusimple_lanenet/tusimple_lanenet.ckpt --image_path data/Mytest/2.jpg

Los resultados de detección de fotografías tomadas por usted mismo son los siguientes:

Inserte la descripción de la imagen aquí
análisis de prueba:

Se puede ver en la figura que al detectar la propia imagen, aunque el resultado final de la detección puede coincidir perfectamente con la línea del carril real, se extiende al aire.

La razón principal de esta situación es que no crearon sus propios conjuntos de datos para la capacitación, a fin de obtener modelos más específicos. Dado que el modelo de prueba que utilicé aquí fue entrenado con el conjunto de datos de TuSimple, probaremos muy bien las imágenes en TuSimple, como el 1.jpg anterior.

Si queremos probar nuestras propias imágenes y obtener mejores resultados, entonces necesitamos nuestro propio conjunto de datos. La mejor forma es:

  • Primero, entrena bajo el conjunto de datos de TuSimple, y el modelo de entrenamiento obtenido se usa como modelo de preentrenamiento. Esta parte del trabajo ya está hecha. Puedes descargar el modelo de pre-entrenamiento directamente.
  • Luego, sobre la base del modelo previamente entrenado, cargue el conjunto de datos creado por usted mismo y luego entrene hasta lograr el efecto deseado.

¡El uso de este tipo de idea de aprendizaje por transferencia a menudo puede obtener el doble de resultado con la mitad de esfuerzo!

1024, ¡les deseo a todos unas felices fiestas! Dame un me gusta si te gusta, ¡tu apoyo es la mayor motivación para mi creación!

Supongo que te gusta

Origin blog.csdn.net/wjinjie/article/details/108575549
Recomendado
Clasificación