Een 3D-houdingsschattingssysteem gebaseerd op RK3576 / RKNN / YOLO / Pose Estimation
U kunt het project bekijken op GitHub: https://github.com/doublelf/3D-Human-Pose-Estimation/tree/main
Een YOLOv8 objectdetectie- + pose-estimation-pipeline, geoptimaliseerd voor de reComputer RK3576. Dit project is ontwikkeld op basis van de basisalgoritmen van het reComputer AI Lab-platform, waarbij de oorspronkelijke inference-backend en scheduling-logica zijn vervangen om rekentaken te verdelen over de heterogene rekeneenheden van de RK3576:
| Rekeneenheid | Taak |
|---|---|
| NPU 0+1 | YOLOv8n objectdetectie met 80 klassen (modelbestand yolov8n.rknn) |
| NPU 2 | YOLOv8n-pose pose-estimation met 17 keypoints (modelbestand yolov8n_pose.rknn) |
| VPU | H.264 hardwarecodec via ffmpeg h264_rkmpp |
| CPU | Letterbox-voorbewerking, DFL/NMS-nabewerking en frame-rendering |
Repository-indeling
ceshi_rk3576/
├── README.md
├── pyproject.toml
├── requirements.txt
├── Dockerfile
├── configs/
│ └── default.yaml
├── data/
│ ├── inputs/ # Invoervideobronnen
│ ├── outputs/ # Uitvoermap voor resultaten
│ └── weights/ # Modelgewichten: yolov8n.rknn, yolov8n_pose.rknn
├── src/poseball/
│ ├── __init__.py
│ ├── __main__.py
│ ├── cli.py # Opdrachtregel-ingangspunt
│ ├── config.py # YAML-gebaseerd configuratiebeheer
│ ├── rknn_engine.py # NPU-inference-wrapper
│ ├── vpu_codec.py # VPU-codec via ffmpeg-subproces
│ ├── models.py # Handige modellader
│ ├── preprocess.py # Letterbox-verwerking + BGR-naar-RGB-conversie
│ ├── postprocess.py # DFL/NMS + herstel van Letterbox-coördinaten
│ ├── video.py # VPU / cv2 video lees-/schrijfmodule
│ ├── hw_scheduler.py # Multi-threaded pipelineplanner (CPU/NPU/VPU)
│ ├── pipeline.py # High-level bedrijfsorkestratie
│ ├── geometry.py # Point / Rect / Detection gegevensklassen
│ ├── io_utils.py # JSON- en bestandsysteem-hulpprogramma's
│ └── _compat.py # NumPy-compatibiliteitsadapter
├── src/py_utils/
│ ├── __init__.py
│ ├── yolov8_utils.py # Objectdetectie-nabewerking (afkomstig van ballo-project)
│ └── pose_utils.py # Pose-estimation-nabewerking (afkomstig van ball-project)
└── tests/
├── test_rknn_engine.py
├── test_vpu_codec.py
├── test_postprocess.py
└── test_hw_scheduler.pyInstallatie op de reComputer RK3576
Optie 1: Installeren vanaf GitHub
Project ophalen
git clone https://github.com/doublelf/3D-Human-Pose-Estimation.git && cd 3D-Human-Pose-EstimationOmgeving instellen
# 1. Maak een virtuele omgeving aan
python3 -m venv venv
source venv/bin/activate
# 2. Installeer dit pakket en de vereiste afhankelijkheden
pip install -e .
pip install -r requirements.txt
# 3. Installeer rknn-toolkit-lite2 voor de bijbehorende Python-versie (alleen aarch64)
cd RKNN-Toolkit/
pip3 install rknn_toolkit_lite2-2.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whlGebruik
# Voer een volledige hardware-diagnose uit (aanbevolen bij eerste gebruik van een nieuw apparaat)
ceshi_rk3576 doctor
# Geef gedetecteerde hardware-mogelijkheden weer
ceshi_rk3576 info
# Smoke-test met één frame
ceshi_rk3576 smoke --input data/inputs/sample.mp4
# End-to-end-pipeline met één camera (objectdetectie + pose-estimation + baldetectie)
ceshi_rk3576 infer \
--config configs/default.yaml \
--input data/inputs/sample.mp4 \
--output data/outputs/annotated.mp4 \
--json data/outputs/detections.json
# Dual-camera pipeline (hoofdtestopdracht)
ceshi_rk3576 dual-infer \
--input-a data/inputs/sample-a.mp4 \
--input-b data/inputs/sample-b.mp4 \
--output-a data/outputs/annotated-a.mp4 \
--output-b data/outputs/annotated-b.mp4 \
--json-a data/outputs/detections-a.json \
--json-b data/outputs/detections-b.json
# Genereer een pseudo-3D-animatie-MP4 met matplotlib op basis van JSON-resultaten
ceshi_rk3576 render \
--json-a data/outputs/detections-a.json \
--output data/outputs/3d.mp4 \
--depth-mode lrOptie 2: Installeren met Docker
Project ophalen + in één stap uitvoeren
Image ophalen
sudo docker pull ghcr.io/doublelf/3d_human_pose_estimation:v1.0Dual-camera pipeline uitvoeren
sudo docker run --rm --privileged --net=host -e PYTHONUNBUFFERED=1 \
--device /dev/video1:/dev/video1 \
--device /dev/dri/renderD129:/dev/dri/renderD129 \
-v /proc/device-tree/compatible:/proc/device-tree/compatible \
-v $(pwd)/data/inputs:/app/data/inputs \
-v $(pwd)/data/weights:/app/data/weights \
-v $(pwd)/data/outputs:/app/data/outputs \
-v $(pwd)/configs:/app/configs \
ghcr.io/doublelf/3d_human_pose_estimation:v1.0 \
ceshi_rk3576 dual-infer --input-a data/inputs/sample-a.mp4 --input-b data/inputs/sample-b.mp4 --output-a data/outputs/annotated-a.mp4 --output-b data/outputs/annotated-b.mp4 --json-a data/outputs/detections-a.json --json-b data/outputs/detections-b.jsonPseudo-3D-animatie-MP4 met matplotlib genereren op basis van JSON-resultaten
sudo docker run --rm --privileged --net=host -e PYTHONUNBUFFERED=1 \
--device /dev/video1:/dev/video1 \
--device /dev/dri/renderD129:/dev/dri/renderD129 \
-v /proc/device-tree/compatible:/proc/device-tree/compatible \
-v $(pwd)/data/inputs:/app/data/inputs \
-v $(pwd)/data/weights:/app/data/weights \
-v $(pwd)/data/outputs:/app/data/outputs \
-v $(pwd)/configs:/app/configs \
ghcr.io/doublelf/3d_human_pose_estimation:v1.0 \
ceshi_rk3576 render --json-a data/outputs/detections-a.json --output data/outputs/3d.mp4 --depth-mode lrBeschrijving van uitvoerbestanden
| Bestand | Inhoud |
|---|---|
annotated*.mp4 | Origineel frame + bounding boxes + skelet met 17 keypoints + rode cirkel voor de sportbal (COCO-klasse 32) |
detections*.json | Per-frame gegevens: detections (alle 80 COCO-klassen), poses (bbox + 17 keypoints met betrouwbaarheid), ball_xy (centrum van de beste bal-bbox) |
3d.mp4 | Met matplotlib gerenderd pseudo-3D-skelet + balbaan + trajecten van linker- en rechterenkel, per frame roterend (depth_mode=lr); rendert uitsluitend gegevens van camera A |
Het render-commando leest de JSON-bestanden die door infer of dual-infer zijn gegenereerd — de twee fasen zijn onafhankelijk. U kunt render eenvoudig opnieuw uitvoeren om de uitvoergrootte, framesnelheid of depth-modus aan te passen, zonder de video opnieuw op de NPU te verwerken.
Hardware-taakverdeling
RK3576 NPU-topologie
De RK3576 SoC beschikt over slechts twee NPU-cores (core 0 en core 1). We koppelen elk model aan een andere core, zodat ze parallel kunnen draaien zonder om dezelfde hardware te concurreren:
| Model | Standaard core_mask-configuratie | Fysieke core |
|---|---|---|
| YOLOv8n-detector | NPU_CORE_0 (0x01) | Core 0 |
| YOLOv8n-pose-model | NPU_CORE_1 (0x02) | Core 1 |
De vorige standaardconfiguratie (detector met NPU_CORE_0_1 en pose-model met NPU_CORE_2) was onjuist: het RKNN-stuurprogramma wijst NPU_CORE_2 stilzwijgend opnieuw toe aan NPU_CORE_0 en geeft een waarschuwing bij het laden. Met die configuratie zouden beide modellen om de cores 0+1 strijden.