Detección de línea de carril ligero

1. Conocimientos previos

En primer lugar, debe saber que hay dos formas principales de implementar la tarea de segmentación de instancias:

inserte la descripción de la imagen aquí

1. De arriba hacia abajo: primero detecte el marco y luego clasifique los píxeles de los objetos en el marco.La desventaja es que el marco de detección de algunos objetivos está incompleto, lo que afectará la precisión;

2. De abajo hacia arriba, primero clasifique los píxeles de destino y luego clasifique los píxeles de cada objetivo por agrupamiento;

Resumen: para la escena de la línea del carril, se utilizan más métodos de abajo hacia arriba, porque la escena de la línea del carril es compleja, lo que no conduce a la detección;

2. Algoritmo de agrupamiento

Después de clasificar los puntos de forma ascendente, se requiere agrupamiento para asignar cada píxel a un objetivo diferente;

aprendizaje métricoaprendizaje métrico a distanciaaprendizaje de similitud;

Nota: Este concepto está involucrado en tareas de segmentación, detección de puntos clave y reconocimiento facial;

En la tarea de línea de carril, se adopta el método de agrupación de abajo hacia arriba en lugar del método de aprendizaje métrico;

Se utiliza una función de pérdida, papel: https://arxiv.org/pdf/1708.02551.pdf

inserte la descripción de la imagen aquí

La figura de arriba muestra el efecto de agrupamiento de los pétalos por este método de agrupamiento;

A continuación se muestran varios métodos de agrupación:

inserte la descripción de la imagen aquí

K-medias

Pasos de implementación:

inserte la descripción de la imagen aquí

La siguiente figura muestra los cambios en Kmean durante el proceso de agrupamiento:

inserte la descripción de la imagen aquí

ventaja:

El principio es simple, fácil de implementar y el efecto de agrupación es bueno, lo cual es adecuado para conjuntos de datos convencionales;

defecto:

La selección del valor K y el valor inicial es difícil de determinar, y el centro del grupo inicial es sensible;

El resultado obtenido es solo un óptimo local;

Es bueno para distinguir conjuntos de datos de conglomerados, pero no es efectivo para conjuntos de datos de franjas;

Mejora de K-means++

Para la estrategia de optimización para inicializar el centroide:

inserte la descripción de la imagen aquí

DBSCAN

Descripción: un algoritmo de agrupamiento;

inserte la descripción de la imagen aquí

A: objeto central;

B, C: punto de la línea límite;

N: punto atípico;

Proceso: tome A como el punto central, continúe dibujando círculos y extendiéndose hacia afuera, y busque constantemente puntos de la misma categoría que el objeto central;

Ventaja:

1. No es necesario especificar el número de grupos;

2. Se pueden encontrar grupos de cualquier forma;

3. Bueno para encontrar valores atípicos;

4. No hay sesgo en los resultados del agrupamiento Relativamente, el valor inicial del algoritmo de agrupamiento como K-Means tiene una gran influencia en los resultados del agrupamiento;

Desventajas:

1. Los datos de alta dimensión son algo difíciles (se pueden usar para la reducción de la dimensionalidad)

2. Cuando la densidad es desigual y la distancia de agrupamiento es muy diferente, el efecto de agrupamiento es pobre;

3. Es difícil elegir parámetros (diferentes parámetros tienen una gran influencia en los resultados)

4. La eficiencia es muy lenta;

Desplazamiento medio

inserte la descripción de la imagen aquí

Explicación: como se puede ver en la figura, a través del punto centroide inicial, calcule un vector medio de todos los puntos en el área seleccionada, itere para encontrar el siguiente punto centroide e itere este proceso hasta encontrar el centroide final;

Nota: También se utilizan algunos conceptos de funciones del núcleo, lo que requiere una cierta comprensión de este conocimiento;

3. Introducción a la estructura del modelo LaneNet

En comparación con FCN para la detección de líneas de carril, LaneNet

Primero observe un diagrama de implementación general:

inserte la descripción de la imagen aquí

proceso:

Primero aprenda las características compartidas a través del codificador (codificación) y luego a través de dos ramas;

La rama anterior es la rama de incrustación, que realiza operaciones de agrupamiento;

La siguiente rama es la rama Segmentación, que realiza un muestreo superior para realizar la segmentación de la línea de carril;

Finalmente, las dos ramas se fusionan para obtener el efecto de segmentación de instancia de línea de carril;

aprendizaje multitarea

Por supuesto, usar diferentes ramas y tener diferentes funciones de pérdida para la retropropagación implica una estrategia de aprendizaje multitarea;

Aquí hay un ejemplo común de aprendizaje multitarea:

inserte la descripción de la imagen aquí

Explicación: la figura anterior es un aprendizaje multitarea de atributos faciales, en el que los pesos de los mapas de características superficiales se comparten en realidad, y los valores de pérdida devueltos para diferentes tareas deben devolverse de manera ponderada y luego retropropagación se realiza para actualizar los parámetros;

Si has estado en contacto con Faster RCNN, también debes saber que al final, también utiliza dos ramas para la detección y clasificación;

De hecho, el aprendizaje multitarea también puede hacer algunas variantes de red, es decir, cambiar la forma de convolución compartida:

inserte la descripción de la imagen aquí

Por supuesto, la convolución de las dos ramas también se puede compartir de forma cruzada:

inserte la descripción de la imagen aquí

Aquí tenemos que pensar en una pregunta, ¿cómo establecer el peso de la función de pérdida de diferentes ramas?

Proporcione una idea: genere los valores de pérdida en diferentes ramas por separado y realice el balance de pérdida a través del peso (es decir, la operación de normalización).Por ejemplo: el valor de pérdida de una rama es 100 y la otra rama es 1, luego se requiere la relación de peso El balance es 1:100, luego de acuerdo con la importancia de la tarea, la alineación se ajusta en cierta proporción;

Mejoras en el modelo

Para lograr un extremo a otro, se agregará una capa de líneas de carril de regresión H-Net;

inserte la descripción de la imagen aquí

Es decir, la matriz H puede entenderse como una matriz de transformación, de hecho, el efecto no es necesariamente mejor luego de agregar la matriz H;

4. Implementación de código de agrupación

1. Implementación de código del algoritmo Kmean

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# 创建样本点
coordinate, type_index = make_blobs(
    # 1000个样本
    n_samples=1000,
    # 每个样本2个特征,代表x和y
    n_features=2,
    # 4个中心(聚类的类别)
    centers=4,
    # 随机数种子
    random_state=2
)

fig0, axi0 = plt.subplots(1)
# 传入x、y坐标,macker='o'代表打印一个圈,s=8代表尺寸
axi0.scatter(coordinate[:, 0], coordinate[:, 1], marker='o', s=8)
# 打印所有的点
plt.show()

inserte la descripción de la imagen aquí

color = np.array(['red', 'yellow','blue','black'])
fig1, axi1=plt.subplots(1)
# 下面显示每个点真实的类别
for i in range(4):
    axi1.scatter(
        coordinate[type_index == i, 0],
        coordinate[type_index == i, 1],
        marker='o',
        s=8,
        c=color[i]
    )
plt.show()

inserte la descripción de la imagen aquí

# 下面用kmeans去聚类得到的结果
y_pred = KMeans(n_clusters=4, random_state=9).fit_predict(coordinate)
plt.scatter(coordinate[:, 0], coordinate[:, 1], c=color[y_pred], s=8)
plt.show()

inserte la descripción de la imagen aquí

Conclusión: se puede ver que el efecto de agrupamiento de Kmean sigue siendo bueno, excepto que el efecto de algunos puntos de interferencia no es bueno, puede ser porque los datos son demasiado simples y pueden lograr buenos resultados;

2, Kmedia++

Para mejorar el algoritmo Kmean, solo necesita agregar un parámetro más al llamar a la función;

# 下面用kmeans++去聚类得到的结果
y_pred = KMeans(n_clusters=4, random_state=9, init='k-means++').fit_predict(coordinate)
plt.scatter(coordinate[:, 0], coordinate[:, 1], c=color[y_pred], s=8)
plt.show()

Conclusión: No hay gran diferencia con Kmean en términos de resultados;

3. Algoritmo DBSCAN

# eps:半径,min_samples:使用附近的多少个样本来构建中心点
y_pred = DBSCAN(eps=1.8, min_samples=3).fit_predict(coordinate)
plt.scatter(coordinate[:, 0], coordinate[:, 1], c=y_pred, s=8)
plt.show()

En este algoritmo, usamos otra distribución para construir puntos de muestra.La siguiente figura muestra los puntos de muestra originales:

inserte la descripción de la imagen aquí

El resultado después de pasar DBSCAN:

inserte la descripción de la imagen aquí

Conclusión: el principio del algoritmo de DBSCAN es juzgar la categoría según la cantidad de puntos circundantes, por lo que los grupos que no están muy separados se considerarán como una categoría, que se puede resolver ajustando los parámetros;

4. Algoritmo de desplazamiento medio

# 估算半径
bandwidth = estimate_bandwidth(coordinate, quantile=0.2, n_samples=500)
# bin_seeding: 随便找一些点的中心来作为初始位置
meanShift = MeanShift(bandwidth=bandwidth, bin_seeding=True)
meanShift.fit(coordinate)
labels = meanShift.labels_
plt.scatter(coordinate[:, 0], coordinate[:, 1], c=labels, s=8)
plt.show()

Diagrama de efecto de agrupamiento:

inserte la descripción de la imagen aquí

Conclusión: Se puede observar que al agruparse con base en el centro del círculo, los agrupamientos que estén demasiado cerca serán clasificados en la misma categoría;

5. Utilice la red de detección para identificar líneas de carril

Debido al uso de la red de segmentación semántica para la detección de líneas de carril, el rendimiento sigue siendo demasiado bajo. No se puede alcanzar el nivel de aplicación de aterrizaje;

Al convertir la tarea de segmentación semántica en una tarea de detección, se mejora el rendimiento del modelo y el efecto no es malo;

Dirección en papel : https://arxiv.org/pdf/2004.11757.pdf

La siguiente figura muestra el método específico de la tarea de detección:

inserte la descripción de la imagen aquí

Explicación: como se puede ver en la figura, la imagen de entrada se divide en una imagen de cuadrícula, y se juzga si hay una línea de carril para cada cuadrícula, y también se guarda la información de ubicación;

A continuación se presenta el truco de mejora de datos:

1. Recortar: dado que no hay una línea de carril en la parte superior de la escena de la línea de carril, de acuerdo con la información marcada en los datos, la imagen de la parte superior se puede cortar para reducir la cantidad de cálculo;

2. Rotación: mejora de datos;

3. Transformación vertical y longitudinal: enderezar la línea del carril y otras operaciones;

4. Extender la línea del carril;

inserte la descripción de la imagen aquí

Diagrama de estructura de red:

inserte la descripción de la imagen aquí

Nota: La rama anterior se usa principalmente en la fase de entrenamiento para distinguir las líneas de carril. Solo necesita ir a la rama inferior al inferir. Se puede ver que la estructura general de la red usa una red troncal ResNet y el acceso posterior a se realiza la conexión completa La transformación de la dimensión de la característica finalmente obtiene la posición de cuadrícula del punto donde se encuentra la línea del carril;

Función de pérdida:

L total = L cls + α L str + β L seg L_{\text {total}}=L_{cls}+\alpha L_{str}+\beta L_{seg}Ltotales =Lc l s+α Ls t r+βL _s e g

Descripción: pérdida de clasificación + pérdida de ubicación + pérdida de segmentación

Código de combate

Dirección de origen: https://github.com/cfzd/Ultra-Fast-Lane-Detection

El modelo pre-entrenado se puede descargar en la dirección del proyecto:

inserte la descripción de la imagen aquí

Según la conclusión oficial, el efecto de 306 fps se puede lograr con el conjunto de datos de Tusimple, pero la ejecución real con 1080Ti solo alcanza los 250 fps;

1. Procesamiento de datos

Función: De acuerdo con la regresión de línea de carril realizada por el área, el conjunto de datos de Tusimple se divide en cuatro áreas (porque hay hasta cuatro líneas de carril en el conjunto de datos), por lo que el conjunto de datos se etiqueta con líneas de carril por área;

python scripts/convert_tusimple.py --root $TUSIMPLEROOT

2. Modificar el archivo de configuración

Modifique data_root en config/tusimple.py a la ruta del conjunto de datos de tusimple;

3. Llevar a cabo la capacitación

python train.py configs/path_to_your_config

4. Realice pruebas visuales

python demo.py configs/tusimple.py --test_model 

Se generará un archivo test.avi, que mostrará todas las imágenes detectadas como un video;

5. Velocidad de inferencia del modelo de prueba

python speed.py

inserte la descripción de la imagen aquí

Coloque aleatoriamente una representación final:

inserte la descripción de la imagen aquí

6. Resumen

Esta vez sobre el proyecto de detección de línea de carril, aprendí muchos puntos de conocimiento:

  • La arquitectura básica y el diseño de la red de segmentación;

  • algoritmo de agrupamiento;

  • Cómo implementar el aprendizaje multitarea;

  • Utilice la detección en lugar de la segmentación para realizar la detección de líneas de carril y mejorar el rendimiento;

Los puntos de conocimiento anteriores se pueden entender mejor en otras direcciones:

  • Aplicación del algoritmo de agrupamiento en el aprendizaje de métricas (como hacer un proyecto de recuperación de imágenes)
  • El aprendizaje multitarea realiza una clasificación de atributos múltiples y controla la capa de red de distribución de peso (como hacer una clasificación múltiple de atributos faciales)

Supongo que te gusta

Origin blog.csdn.net/weixin_40620310/article/details/124249849
Recomendado
Clasificación