name: snakeview-pose-pipeline
description: "Pose-Detection-Pipeline auf snakeview — playbooks/pose.yml + files/pose_export.py, Gotchas"
metadata:
node_type: memory
type: project
originSessionId: 4ce7fd9b-8ce6-4952-a2eb-b3157d1cc404


Video → Bewegungsdaten auf snakeview (Hailo-8, yolov8m_pose):
ansible-playbook playbooks/pose.yml [-e video_src=/pfad/clip.mp4]

Fluss: lokales Video → snakeview:/home/sysop/pose/import/ → Hailo → export/
(annotiertes _pose.mkv + .json mit 17 COCO-Keypoints pro Person pro Frame,
normalisiert x/y 0–1 + Pixel px/py + track_id/confidence/bbox). JSON wird nach
tmp/snakeview/export/ zurĂŒckgeholt.

Das Herz ist playbooks/files/pose_export.py — eine headless Variante der
hailo-rpi5-examples Pose-App. Vier Gotchas, die es zum Laufen brauchte:

  1. Datei-Loop: Basis-App spult Dateiquellen bei EOS zurĂŒck (Endlos-Demo).
    on_eos() ĂŒberschreiben → shutdown() = Single-Pass. Sonst nie EOS, kein JSON,
    und DMA-Warning-Flut (siehe [[snakeview-hailo-dkms-kernel]]).
  2. run() ruft sys.exit(0) im Erfolgsfall → Code NACH app.run() lĂ€uft nie.
    JSON darum in on_eos() schreiben (dump_json), nicht nach run().
  3. Headless-Output: statt DISPLAY_PIPELINE (autovideosink) →
    OVERLAY_PIPELINE + FILE_SINK_PIPELINE (x264enc/matroskamux/filesink).
  4. x264enc fehlt: gstreamer1.0-plugins-ugly nötig (Pi 5 hat KEINEN
    HW-H264-Encoder → Software-x264, CPU-Last ~5). Playbook installiert es.
    MKV-Header danach mit ffmpeg remuxen (-c copy).

AusfĂŒhrung im venv nach source setup_env.sh (bash, nicht dash → shell-Task
mit executable:/bin/bash). HEF explizit per --hef-path pinnen (current_path der
App zeigt in site-packages, nicht auf hailo-rpi5-examples/resources).
Verifiziert 2026-07-14: 1400 Frames / 910 Detektionen, 0 neue dmesg-Warnings.

Viewer: playbooks/files/pose_viewer.html — JSON-getrieben (zeichnet das
Skelett selbst aus den Keypoints, nicht das gebackene Overlay). Playbook legt
ihn + pose-data.js neben das Video. Daten als window.POSE einbetten, weil
fetch() unter file:// an CORS scheitert. Videoname wird aus POSE.source
abgeleitet, fps aus frame_count/video.duration → fĂŒr jeden Clip nutzbar.

Datenschutz siehe [[crumbforest-passkante-bewegungsdaten]] — nur das Werkzeug
wandert ins git, Video und Pose-Daten bleiben lokal unter tmp/ (gitignored).