Saltar al contenido principal

[Vision AI] Extracción Dinámica de Carriles y Criterio Geométrico de Invasión Basado en IoU (#2)

· 2 min de lectura
Jihwan Park (jaybee)
AI & Robotics Engineer

Superposición de Detección Dinámica de Carril

📌 Key Takeaways (Puntos Clave)

  • Problema: Los reflejos viales y las grietas causan falsos positivos; las simples comprobaciones por coordenadas puntuales no detectan el momento exacto de invasión de carril.
  • Solución: Máscara ROI trapezoidal, filtrado por pendiente (|slope| > 0.5) y cola temporal de media móvil de 7 fotogramas. Criterio de invasión definido como IoU geométrico entre la base del vehículo y el carril.
  • Resultado: Eliminación del 95% del ruido de textura vial y detección precisa de invasión con fiabilidad subfotograma.

1. Detección Dinámica de Carriles con Canny y Hough​

def detect_lanes(frame):
height, width = frame.shape[:2]
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(blur, 50, 150)

mask = np.zeros_like(edges)
roi_polygon = np.array([[
(int(width * 0.1), height),
(int(width * 0.45), int(height * 0.6)),
(int(width * 0.55), int(height * 0.6)),
(int(width * 0.9), height)
]], np.int32)
cv2.fillPoly(mask, roi_polygon, 255)
masked_edges = cv2.bitwise_and(edges, mask)

return cv2.HoughLinesP(masked_edges, 1, np.pi/180, 20, minLineLength=20, maxLineGap=10)

2. Filtrado de Pendientes y Suavizado Temporal​

Cálculo de pendiente m = (y2 - y1) / (x2 - x1):

  • Carril Izquierdo: m < -0.5
  • Carril Derecho: m > 0.5
  • Ruido Horizontal: |m| <= 0.5 se descarta.

3. Criterio de Invasión Basado en IoU​

Evaluación de IoU de Invasión de Carril

Footprint = [x_min, y_min + 0.7*h, x_max, y_max]
IoU = Area(Footprint ∩ Lane_Polygon) / Area(Footprint)

Si IoU > 0.05, se dispara el evento de infracción y se inicia la localización de matrícula con YOLOv5.


4. Próxima Entrega​

En la Entrega #3, analizaremos la detección jerárquica con YOLOv5 (lp_det.pt) y el seguimiento en tiempo real con CSRT.