9.3 Serie de paquetes tensorRT advanced (4): proyecto de caso de conducción autónoma conducción autónoma - detección de línea de carril

prefacio

Leí el curso de implementación de alto rendimiento de tensorRT desde cero lanzado por Teacher Du antes, pero no tomé notas y olvidé muchas cosas. Lo haré de nuevo esta vez y tomaré notas.

En este curso, aprenderá la detección de líneas de carril de conducción autónoma del proyecto de caso de conducción autónoma avanzada tensorRT

Consulte el mapa mental a continuación para conocer el programa del curso.

Insertar descripción de la imagen aquí

1. Detección de carril

En esta sección estudiamos el análisis del modelo de detección de líneas de carril. Nuestro propósito es encontrar onnx para la detección de líneas de carril, analizar la lógica de uso general de onnx y luego escribir la versión más concisa de predict.py, que puede ser aproximadamente dividido en los siguientes tres pasos:

1. Abra la ventana de detección de línea de carril y verifique su entrada y salida.

2. Ver el código, encontrar el preprocesamiento de onnx y analizar la lógica de preprocesamiento

3. Para la información obtenida, escriba predict.py e intente escribirlo.

Vale la pena señalar que en este caso, debido a que el posprocesamiento es demasiado complejo, se considera fusionarlo en onnx para que el modelo sea lo más simple posible.

Antes de comenzar, primero realicemos un análisis simple de la tarea de detección de líneas de carril.

Para tareas de regresión de cuadros convencionales, como encontrar la posición de la moneda en la imagen a continuación, cx, cy, w, h, generalmente genera directamente 4 valores escalares para la regresión.

Insertar descripción de la imagen aquí

Figura 1 Regresión de caja convencional

En la actualidad, los últimos se inclinan más a utilizar el punto de probabilidad de posición multiplicado por su posición como valor de salida, que pertenece a la suma ponderada, como se muestra en la siguiente figura.

Insertar descripción de la imagen aquí

Figura 2 Probabilidad de posición

Este método representa las coordenadas de regresión con n probabilidades de posición, por ejemplo, para la regresión de cx, se expresa como 5 probabilidades, se puede considerar que la imagen se divide en 5 bloques, entonces es más probable que cx caiga en cuál bloquear para expresar. Por ejemplo, cuando cae en el centro de la imagen, su probabilidad central es la más alta. Hay un sabor a atención. El posprocesamiento como NanoDet y Alphapose es similar a la probabilidad de posición

El diagrama de detección de línea de carril es el siguiente:

Insertar descripción de la imagen aquí

Para la tarea de detección de líneas de carril, tenemos algunos conocimientos previos: por ejemplo, las líneas de carril también están ubicadas en la mitad inferior de la imagen y la mitad superior de la imagen es el cielo, por lo que no es necesario considerarlo. Además, las líneas de carril detectadas suelen ser 2 líneas de carril en el área de conducción más un total de 4 líneas de carril en ambos lados; y se conoce el valor y de las coordenadas de los puntos de las líneas de carril, dividiremos la imagen en N cuadrículas por fila, cada El número de puntos generados por la línea del carril es N, por lo que conocemos la y de cada punto; la única incertidumbre es la coordenada x de cada punto, que el modelo debe aprender

Entonces, ¿cómo devuelve el modelo las coordenadas x de estos puntos? De hecho, se logra mediante probabilidad de posición. Dividimos la imagen en M cuadrículas por columnas. El número total de salidas que la red necesita generar es 4xNxM. Además, también necesitamos agregar una dimensión en la dirección de la columna para determinar si el punto existe, entonces La salida final de la red es 4xNx(M+1)

Observemos el modelo onnx de la línea del carril inferior, como se muestra en la siguiente figura:

Insertar descripción de la imagen aquí

Figura 3 modelo onnx

Puede ver que la entrada del modelo onnx es 1x3x288x800, donde la altura de la imagen de entrada es 288, el ancho es 800 y la salida es 1x201x18x4, donde 4 representa 4 líneas de carril y 18 representa dividir la mitad inferior de la imagen. en 18 líneas (es decir, N=18), 201 representa dividir la mitad inferior de la imagen en 201 columnas (es decir, M=200)

Nuestro análisis y resumen puede obtener la siguiente información:

1. La entrada es: 1x3x288x800

2. La salida es: 1x201x18x4

3. Existen algunas definiciones o antecedentes para la tarea de detección de líneas de carril.

  • Sólo es necesario identificar 4 líneas.
  • La línea del carril está básicamente en el suelo, por lo que la dirección y puede comenzar desde el centro de la imagen, es decir, las coordenadas iniciales del ancla son desde el centro de la imagen hasta la parte inferior de la imagen.
  • Para la detección de líneas de carril, debido a que la línea es continua, se puede convertir en detección de puntos discretos. Se puede diseñar una línea para que se describa mediante 18 puntos.
  • Por lo tanto, para devolver un punto, se conoce su coordenada y y es necesario devolver la coordenada x.
  • Para la regresión de x, se utiliza la probabilidad de posición para representarla y se divide en 200 cuadrículas para representar sus coordenadas.
  • Para la pregunta de si existe el punto de la línea del carril, se utiliza la probabilidad 201. Si este punto no existe, el valor de la posición del punto 201 es el mayor.

Analicemos el código image_processor/lane_engine.cpp en el proyecto para obtener el trabajo de preprocesamiento y posprocesamiento específico: (consulte el video para un análisis detallado)

Sección de preprocesamiento :

  • El preprocesamiento de la imagen es directamente image/255.0
  • La imagen debe convertirse de BGR a RGB.
  • La imagen cambia de tamaño directamente a 288x800.

Parte de posprocesamiento :

  • Softmax se realiza en la dimensión 0-200 y en este momento se obtiene la probabilidad de posición
  • Multiplique y agregue la probabilidad de posición y el punto de índice de posición para obtener la ubicación. En este momento, la ubicación es 18x4
  • Juzgue el valor máximo de la salida original para determinar si el punto existe
  • Finalmente, las coordenadas de las cuatro líneas se obtienen mediante filtrado.

Simplemente podemos escribir una demostración para verificar, el código es el siguiente:

import onnxruntime
import cv2
import numpy as np
import matplotlib.pyplot as plt
import scipy

session = onnxruntime.InferenceSession("workspace/ultra_fast_lane_detection_culane_288x800.onnx", provider_options=["CPUExecutionProvider"])

image = cv2.imread("workspace/imgs/dashcam_00.jpg")
show  = image.copy()
image = cv2.resize(image, (800, 288))
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image_tensor = (image / 255.0).astype(np.float32)
image_tensor = image_tensor.transpose(2, 0, 1)[None]

prob = session.run(["200"], {
    
    "input.1": image_tensor})[0][0]

print(prob.shape)

out_j = prob
prob = scipy.special.softmax(out_j[:-1, :, :], axis=0)
idx = np.arange(200) + 1
idx = idx.reshape(-1, 1, 1)
loc = np.sum(prob * idx, axis=0)

print(loc.shape)

# 201 x 18 x 4, 201 维度上找最大值
out_j = np.argmax(out_j, axis=0)
loc[out_j == 200] = 0

col_sample = np.linspace(0, 800 - 1, 200)
col_sample_w = col_sample[1] - col_sample[0]
ys = np.array([121, 131, 141, 150, 160, 170, 180, 189, 199, 209, 219, 228, 238, 248, 258, 267, 277, 287])

xs = loc * col_sample_w * show.shape[1] / 800
ys = ys * show.shape[0] / 288

colors = [(0, 255, 0), (255, 0, 0), (255, 0, 0), (0, 255, 0)]

for iline in range(4):
    for x, y in zip(xs[:, iline], ys):
        if x == 0:
            continue

        cv2.circle(show, (int(x), int(y)), 5, colors[iline], -1, 16)

cv2.imwrite("lane.jpg", show)

El resultado es el siguiente:

Insertar descripción de la imagen aquí

Figura 4 salida

Se puede ver que el resultado cumple con nuestras expectativas y el mapa de detección de líneas del carril de salida es el siguiente:

Insertar descripción de la imagen aquí

Figura 5 Diagrama del efecto de detección de línea de carril

Luego, si desea usar tensorRT para razonar, encontrará que el posprocesamiento es demasiado complicado. Debemos considerar colocar el posprocesamiento en onnx. Primero podemos exportar el modelo de posprocesamiento de onnx y luego agregarlo a nuestro onnx. modelo, como sigue Como se muestra en la figura:

Insertar descripción de la imagen aquí

Figura 6 Postprocesamiento complejo en nx

Resumir

Este curso ha aprendido el caso de la detección de líneas de carril en proyectos de código abierto, principalmente un análisis simple del onnx del modelo de detección de líneas de carril, y a través del análisis del código del proyecto para aclarar las partes de preprocesamiento y posprocesamiento, y luego, a través de onnxruntime, verificación simple y luego inserte la parte compleja de posprocesamiento en onnx para facilitar el razonamiento posterior en tensorRT.

Supongo que te gusta

Origin blog.csdn.net/qq_40672115/article/details/132655776
Recomendado
Clasificación