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.
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 libavformatpriorizado para entrada de flujo RTSP/comprimido local, conffmpeg pipecomo 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,aipara 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 letterboxpara 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
cd /home/parker/Projects/rk3576_yolov8tortsp_demo
chmod +x scripts/build-linux.sh
./scripts/build-linux.shSalidas 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
cd install
export LD_LIBRARY_PATH="$(pwd)/lib:${LD_LIBRARY_PATH}"Ubicación de modelos
Coloque los modelos RKNN en:
model/
yolov8n_rk3576.rknn
yolov8s_rk3576.rknn
yolov8m_rk3576.rknnSi no se proporciona explícitamente --model, el programa seleccionará automáticamente los modelos existentes en el siguiente orden:
model/yolov8n_rk3576.rknnmodel/yolov8s_rk3576.rknnmodel/yolov8m_rk3576.rknn
Uso
Entrada de cámara V4L2
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 cameraEntrada RTSP
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 cameraEntrada en bucle de video local
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 cameraRegistros detallados
Solo se imprime un resumen de inicio de forma predeterminada; para imprimir registros detallados de ejecución, agregue:
--detail-infoExportar fotogramas de entrada NPU
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-infoHabilitar flujos de salida específicos
--streams ai
--streams main,ai
--streams main,sub
--streams main,sub,aiExplicación:
--streams ai: Realiza solo inferencia AI y emitecamera_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
./bin/rk3576_yolov8tortsp_demo --helpReferencia 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 demain,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 ramaencode: Tiempo de codificación MPPpush: Tiempo de envío RTSPe2e: Tiempo total desde el inicio del procesamiento hasta la finalización del envío dentro de la ramafps: Rendimiento real de la rama calculado por ventana estadística de tiempo real
Descripción general de la estructura del proyecto
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_partyGuí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:
stretchletterboxcenter_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 coincidenciaPTS
4. 日志与调试
- 默认仅打印启动摘要
- 通过
--detail-info启用详细运行时日志 - 日志记录器位于
include/rk3576_yolo_demo/common/logger.hpp
部署建议
- 生产部署时,请确保为
/dev/rga、视频设备及相关运行时库设置正确的权限 - 建议将模型、运行时库和配置文件与
install/一起打包 - RTSP 输入优先使用
libavformat,在旧环境中自动回退至ffmpeg pipe - 若需长期稳定运行,建议使用 systemd 或 supervisor 进行守护与重启管理
已知限制
camera_ai的框绘制与水印叠加仍会消耗一定 CPU 开销e2e并非完整的全链路延迟;它仅表示分支内所花费的时间localvideo目前基于压缩流读取链路,主要用于离线验证与循环推理
未来开发建议
- 继续降低
camera_ai的 OSD CPU 开销,可考虑引入瓦片缓存或更高效的混合路径 - 新增真正的全链路
pipeline_e2e指标,与当前的分支e2e区分开 - 改进
localvideo场景下的播放节奏控制,使其更接近实时源 - 为主/子码流添加更多独立的编码参数配置能力
- 若需要更复杂的输入类型,可继续扩展
source抽象层