Parker Hu2026-07-22

Proyecto CPP de inferencia en tiempo real YOLOv8 con reComputer RK3576

Un proyecto de inferencia en tiempo real YOLOv8 con entrada multi-fuente y salida multi-flujo, basado en RK3576, RKNN, MPP, RGA y ZLMediaKit.

reComputer-RKrk3576yoloCPPGithub

Un proyecto de inferencia en tiempo real YOLOv8 con entrada de múltiples fuentes y salida de múltiples flujos, basado en RK3576 / RKNN / MPP / RGA / ZLMediaKit.

El proyecto actual soporta:

  • Entrada de cámara V4L2
  • Entrada de video de red RTSP
  • Entrada en bucle de archivo de video local localvideo
  • Tres flujos de salida RTSP: flujo principal / subflujo / flujo de depuración AI
  • Inferencia YOLOv8 RKNN, superposición de cuadros delimitadores, etiquetas de clase, tiempo y OSD de FPS
  • libavformat priorizado para entrada de flujo RTSP/comprimido local, con ffmpeg pipe como alternativa

Descripción de características

  • Fuentes de entrada

  • v4l2: Adecuado para cámaras USB, captura local

  • rtsp: Adecuado para flujos de video IPC/NVR/red

  • localvideo: Adecuado para reproducción de video local, validación sin conexión, inferencia en bucle

  • Flujos de salida

  • Flujo principal: rtsp://<board-ip>:8554/live/camera

  • Subflujo: rtsp://<board-ip>:8554/live/camera_sub

  • Flujo de depuración AI: rtsp://<board-ip>:8554/live/camera_ai

  • Use --streams main,sub,ai para emitir cualquier flujo simple, dual o los tres simultáneamente

  • Estrategias de resolución

  • Flujo principal camera: Escalado proporcional + relleno (sin estiramiento)

  • Subflujo camera_sub: Escalado proporcional + recorte central (sin estiramiento)

  • Flujo de depuración AI camera_ai: Escalado proporcional + relleno (sin estiramiento)

  • Inferencia AI

  • Entrada fija de 640x640

  • Prioriza RGA letterbox para el preprocesamiento

  • Soporta caché de detección, coincidencia PTS, superposición AI

Guía de despliegue

Dependencias

  • Entorno de ejecución de la placa RK3576
  • RKNN Runtime
  • Rockchip MPP
  • RGA / librga
  • Biblioteca de ejecución ZLMediaKit
  • Biblioteca de ejecución FFmpeg o herramientas de línea de comandos

Pasos de compilación

bash
cd /home/parker/Projects/rk3576_yolov8tortsp_demo
chmod +x scripts/build-linux.sh
./scripts/build-linux.sh

Salidas de compilación:

  • Ejecutable: install/bin/rk3576_yolov8tortsp_demo
  • Bibliotecas de ejecución: install/lib
  • Documentación: install/docs
  • Directorio de modelos: install/model

Configuración previa a la ejecución

bash
cd install
export LD_LIBRARY_PATH="$(pwd)/lib:${LD_LIBRARY_PATH}"

Ubicación de modelos

Coloque los modelos RKNN en:

text
model/
  yolov8n_rk3576.rknn
  yolov8s_rk3576.rknn
  yolov8m_rk3576.rknn

Si no se proporciona explícitamente --model, el programa seleccionará automáticamente los modelos existentes en el siguiente orden:

  1. model/yolov8n_rk3576.rknn
  2. model/yolov8s_rk3576.rknn
  3. model/yolov8m_rk3576.rknn

Uso

Entrada de cámara V4L2

bash
sudo ./bin/rk3576_yolov8tortsp_demo \
  --source v4l2 \
  --device /dev/video0 \
  --model model/yolov8n_rk3576.rknn \
  --camera-width 1920 \
  --camera-height 1080 \
  --output-width 1280 \
  --output-height 720 \
  --fps 30 \
  --bitrate 4000000 \
  --perf-interval-ms 1000 \
  --rtsp-port 8554 \
  --rtsp-app live \
  --rtsp-stream camera

Entrada RTSP

bash
sudo ./bin/rk3576_yolov8tortsp_demo \
  --source rtsp \
  --rtsp-input-url "rtsp://192.168.100.101:554/live" \
  --rtsp-username "admin" \
  --rtsp-password "c32bdc3e" \
  --model model/yolov8n_rk3576.rknn \
  --camera-width 1920 \
  --camera-height 1080 \
  --output-width 1280 \
  --output-height 720 \
  --fps 30 \
  --bitrate 4000000 \
  --perf-interval-ms 1000 \
  --rtsp-timeout-ms 5000 \
  --rtsp-reconnect-ms 1000 \
  --rtsp-port 8554 \
  --rtsp-app live \
  --rtsp-stream camera

Entrada en bucle de video local

bash
sudo ./bin/rk3576_yolov8tortsp_demo \
  --source localvideo \
  --localvideo ./videos/demo.mp4 \
  --model model/yolov8n_rk3576.rknn \
  --camera-width 1920 \
  --camera-height 1080 \
  --output-width 1280 \
  --output-height 720 \
  --fps 30 \
  --bitrate 4000000 \
  --perf-interval-ms 1000 \
  --rtsp-port 8554 \
  --rtsp-app live \
  --rtsp-stream camera

Registros detallados

Solo se imprime un resumen de inicio de forma predeterminada; para imprimir registros detallados de ejecución, agregue:

bash
--detail-info

Exportar fotogramas de entrada NPU

bash
sudo ./bin/rk3576_yolov8tortsp_demo \
  --source localvideo \
  --localvideo ./videos/demo.mp4 \
  --model model/yolov8n_rk3576.rknn \
  --streams ai \
  --dump-ai-input-dir ./debug_ai_input \
  --dump-ai-input-every 30 \
  --detail-info

Habilitar flujos de salida específicos

bash
--streams ai
--streams main,ai
--streams main,sub
--streams main,sub,ai

Explicación:

  • --streams ai: Realiza solo inferencia AI y emite camera_ai
  • --streams main,ai: Emite el flujo principal y el flujo de depuración AI
  • --streams main,sub: Solo flujo dual estándar, no carga el modelo RKNN
  • Si se omite, por defecto es --streams main,sub,ai

Ver ayuda

bash
./bin/rk3576_yolov8tortsp_demo --help

Referencia de API

Argumentos principales de línea de comandos

  • --source <v4l2|rtsp|localvideo>: Tipo de fuente de entrada
  • --device <ruta>: Nodo de dispositivo V4L2
  • --rtsp-input-url <url>: Dirección RTSP
  • --rtsp-username <valor>: Nombre de usuario RTSP
  • --rtsp-password <valor>: Contraseña RTSP
  • --localvideo <ruta>: Ruta del archivo de video local
  • --model <ruta>: Ruta del modelo RKNN
  • --camera-width <valor> / --camera-height <valor>: Resolución de entrada
  • --output-width <valor> / --output-height <valor>: Resolución de salida del flujo principal
  • --sub-width <valor> / --sub-height <valor>: Resolución de salida del subflujo
  • --fps <valor>: Velocidad de fotogramas de codificación objetivo
  • --bitrate <valor>: Bitrate objetivo del flujo principal
  • --rtsp-port <valor>: Puerto del servidor RTSP local
  • --rtsp-app <valor>: Nombre de la aplicación RTSP
  • --rtsp-stream <valor>: Nombre del flujo principal
  • --sub-stream <valor>: Nombre del subflujo
  • --ai-stream <valor>: Nombre del flujo de depuración AI
  • --streams <elementos>: Habilita qué flujos de salida, admite combinaciones separadas por comas de main, sub, ai
  • --rtsp-timeout-ms <valor>: Tiempo de espera de lectura RTSP
  • --rtsp-reconnect-ms <valor>: Intervalo de reconexión RTSP
  • --perf-interval-ms <valor>: Ciclo de salida PERF
  • --detail-info: Habilita registros detallados
  • --help: Imprime ayuda

Significados de PERF

  • process: Tiempo de procesamiento de imagen dentro de la rama
  • encode: Tiempo de codificación MPP
  • push: Tiempo de envío RTSP
  • e2e: Tiempo total desde el inicio del procesamiento hasta la finalización del envío dentro de la rama
  • fps: Rendimiento real de la rama calculado por ventana estadística de tiempo real

Descripción general de la estructura del proyecto

text
rk3576_yolov8tortsp_demo
├── CMakeLists.txt
├── README.md
├── docs
├── include
│   ├── rk3576_demo
│   └── rk3576_yolo_demo
├── model
├── scripts
├── src
│   ├── ai          # RKNN inference and pre/post-processing
│   ├── app         # Application entry and orchestration
│   ├── branch      # 3-branch output, OSD, PERF
│   ├── camera      # V4L2 capture
│   ├── codec       # MPP encode/decode
│   ├── common      # Common types, logger, thread queues
│   ├── pipeline    # V2 distribution and processing pipeline
│   ├── rga         # Image scaling and conversion
│   ├── rtsp        # Local RTSP publishing
│   ├── source      # Input source abstraction and implementation
│   ├── utils
│   └── watermark   # Time/FPS/Label rendering
└── third_party

Guía de desarrollo

1. Ampliación de fuentes de entrada

  • Interfaz unificada en include/rk3576_yolo_demo/source/i_source.hpp
  • Punto de entrada de la fábrica en src/source/source_factory.cpp
  • Las nuevas fuentes de entrada deben implementar:
    • Open()
    • Close()
    • ReadPacket()
    • Describe()

2. Ampliación de salidas de rama

  • Implementación de rama ubicada en src/branch/branch_output.cpp
  • Actualmente soporta tres estrategias de geometría:
    • stretch
    • letterbox
    • center_crop
  • Las relaciones geométricas se calculan uniformemente en ComputeFrameTransform(), facilitando la reutilización para el escalado de salida y el mapeo de cajas AI

3. Ampliación de la inferencia AI

  • Entrada RKNN en src/ai/yolov8_engine.cpp
  • El preprocesamiento prioriza RGA
  • Los resultados de detección entran en la caché DetectionFrame, luego son superpuestos por la rama AI basándose en la coincidencia PTS

4. 日志与调试

  • 默认仅打印启动摘要
  • 通过 --detail-info 启用详细运行时日志
  • 日志记录器位于 include/rk3576_yolo_demo/common/logger.hpp

部署建议

  • 生产部署时,请确保为 /dev/rga、视频设备及相关运行时库设置正确的权限
  • 建议将模型、运行时库和配置文件与 install/ 一起打包
  • RTSP 输入优先使用 libavformat,在旧环境中自动回退至 ffmpeg pipe
  • 若需长期稳定运行,建议使用 systemd 或 supervisor 进行守护与重启管理

已知限制

  • camera_ai 的框绘制与水印叠加仍会消耗一定 CPU 开销
  • e2e 并非完整的全链路延迟;它仅表示分支内所花费的时间
  • localvideo 目前基于压缩流读取链路,主要用于离线验证与循环推理

未来开发建议

  1. 继续降低 camera_ai 的 OSD CPU 开销,可考虑引入瓦片缓存或更高效的混合路径
  2. 新增真正的全链路 pipeline_e2e 指标,与当前的分支 e2e 区分开
  3. 改进 localvideo 场景下的播放节奏控制,使其更接近实时源
  4. 为主/子码流添加更多独立的编码参数配置能力
  5. 若需要更复杂的输入类型,可继续扩展 source 抽象层