Construye rápidamente un proyecto de detección de obstáculos en vehículo con reComputer-RK / Docker / RKNN / YOLO

Puedes consultar el código fuente de este proyecto en GitHub: https://github.com/doublelf/area-intrusion-alarm
Descripción del proyecto
Este proyecto parte de un sistema de detección de intrusión en zona basado en RK3576 / RKNN / YOLO / RGA, cuyo escenario original era disparar una alarma cuando objetivos del tipo "persona / vehículo" entraban en un polígono definido, a partir del flujo de una cámara fija. Toda la cadena de "dibujo de zona + máquina de estados + archivado de instantáneas" se puede migrar de forma natural al escenario vehicular: redefiniendo el polígono de "zona de acceso prohibido" a "zona de riesgo de colisión / ángulo muerto / paso de peatones", y extendiendo las clases de disparo de 2 a 8 clases relacionadas con vehículos y personas, se obtiene la capacidad de detección de obstáculos en vehículo que muestra este proyecto.
Nota sobre el material de demostración: en la raíz de este repositorio,
video/1-1.mp4es un vídeo de un escenario de conducción; durante la ejecución se reemplaza la vista previa GIF superior por una vista previa MJPEG.
Inicio rápido
1. Clonar el proyecto
git clone https://github.com/doublelf/area-intrusion-alarm
cd area-intrusion-alarm2. Preparar el archivo de clases class_config.txt
En la raíz del repositorio ya está reservado el nombre class_config.txt, pero actualmente es un marcador de posición de directorio vacío (algunos puntos de montaje lo crearon erróneamente como directorio durante la sincronización). Sustitúyelo por un archivo con el mismo nombre y el siguiente contenido (subconjunto de vehículos / personas de COCO, 8 clases):
"person", "bicycle", "car", "motorbike", "bus", "truck", "traffic light", "stop sign"3. Construir la imagen
sudo docker build -t area-intrusion:local .4. Iniciar el contenedor y ejecutar la inferencia
sudo docker run --rm --privileged --net=host \
-e PYTHONUNBUFFERED=1 \
-e RKNN_LOG_LEVEL=0 \
-v $(pwd)/class_config.txt:/app/class_config.txt \
-v $(pwd)/video:/app/video:ro \
--device /dev/video0:/dev/video0 \
--device /dev/dri/renderD128:/dev/dri/renderD128 \
-v /proc/device-tree/compatible:/proc/device-tree/compatible \
area-intrusion:local \
python3 web_detection.py --model_path model/yolov8n.rknn --video video/1-1.mp4 --class_path class_config.txtDonde:
-v $(pwd)/class_config.txt:/app/class_config.txtmonta el archivo de clases en el contenedor y, junto con--class_path class_config.txt, habilita el subconjunto de 8 clases de vehículos / personas;-v $(pwd)/video:/app/video:romapea el directorio localvideo/como solo lectura al/app/videode la imagen;--device /dev/video0:/dev/video0y--device /dev/dri/renderD128:/dev/dri/renderD128se usan, respectivamente, para la cámara V4L2 y la aceleración por hardware RGA;- el comando final
python3 web_detection.py --model_path ... --video video/1-1.mp4 --class_path ...inicia la inferencia.
Nota de compatibilidad de CLI: el nombre actual del argumento en
web_detection.pyde este repositorio es--video_path(verweb_detection.py:1206). Si al ejecutar apareceunknown arg: --video, reescribe--video video/1-1.mp4como--video_path video/1-1.mp4; el resto de parámetros no cambia.
5. Acceder a la plataforma web
Cuando el proyecto esté en marcha, abre en el navegador http://<board_ip>:8000/ y cambia en la pestaña superior a Zona de obstáculos (Intrusion Zones):
- Selecciona el modo Draw, haz clic en al menos 3 puntos del vídeo en orden, doble clic o haz clic otra vez sobre el punto inicial para cerrar el polígono, introduce un nombre de zona (por ejemplo,
Ángulo muerto frontal,Ángulo muerto del retrovisor derecho,Paso de peatones) y confirma; - Marca en la casilla Target las clases que quieras incluir en la alerta (por defecto, person / car están marcadas; puedes añadir truck / bus / bicycle / motorbike / traffic light / stop sign según necesites);
- Cuando el centro de masa de cualquier objetivo entre en una zona activa, se añadirá una nueva fila en la lista Recent Warnings con la hora del disparo, la clase del objetivo, el nombre de la zona y una miniatura JPEG anotada (haz clic para descargar la imagen original).

Desarrollo secundario basado en el proyecto
Saca el código fuente completo de la imagen a local:
sudo docker cp area-intrusion:local:/app/web_detection.py ./
sudo docker cp area-intrusion:local:/app/py_utils ./Después de modificar, vuelve a construir la imagen:
sudo docker build -t area-intrusion:local .A continuación, vuelve a iniciar con el comando docker run indicado arriba.
Puntos de partida habituales para el desarrollo secundario:
- Sustituir las clases de detección: edita
class_config.txtpara añadir o quitar clases; surte efecto sin tocar código; - Ajustar la sensibilidad de disparo: en la pestaña web Real-time Detection, mueve los deslizadores Confidence Threshold e IOU Threshold;
- Integrar zonas personalizadas: llama a
POST /api/regionspara escribir directamente los vértices del polígono (coordenadas en el sistema de coordenadas de la imagen de origen), adecuado para integrarse con un sistema HMI del coche.
Llamar a la cámara para inferencia en tiempo real
Sustituye --video por --camera_id para usar una cámara USB / CSI. El argumento de línea de comandos se corresponde uno a uno con el dispositivo de cámara mapeado con --device:
sudo docker run --rm --privileged --net=host \
-e PYTHONUNBUFFERED=1 \
-e RKNN_LOG_LEVEL=0 \
-v $(pwd)/class_config.txt:/app/class_config.txt \
--device /dev/video0:/dev/video0 \
--device /dev/dri/renderD128:/dev/dri/renderD128 \
-v /proc/device-tree/compatible:/proc/device-tree/compatible \
area-intrusion:local \
python3 web_detection.py --model_path model/yolov8n.rknn --camera_id 0 --class_path class_config.txt