🛠 Boîte de vision RTSP : caméra MIPI, accélération NPU RKNN et VPU
Objectifs
Construire une boîte de vision sur le NPU 1 TOPS INT8 du RK3568 (framework RKNN, support TensorFlow/TF-Lite/PyTorch/Caffe/ONNX) et le VPU (décodage 4Kp60 H.265/H.264/VP9, encodage 1080p60) : caméra sur le connecteur MIPI CSI 2 lanes, inférence sur trame, diffusion RTSP. Radxa documente chaque brique : sections officielles RTSP, OpenCV et AI/RKNN dans docs.radxa.com (app-development).
Matériel
- Radxa ROCK 3B sous Radxa OS
- Caméra MIPI CSI 2 lanes compatible (nappe vers le connecteur CSI de la carte)
- Refroidissement conseillé (charge VPU+NPU soutenue), SSD/eMMC pour les vidéos
Code complet
# 1. Activer la caméra (Radxa OS) : rsetup -> Camera overlay, reboot, puis :
ls /dev/video* ; v4l2-ctl --list-devices # chercher la pipeline mipi-csi
# 2. Chaîne d'acquisition (gstreamer, décodage/encodage matériel) :
sudo apt install gstreamer1.0-tools gstreamer1.0-plugins-good
gst-launch-1.0 v4l2src device=/dev/video11 ! video/x-raw,width=1280,height=720 ! \
videoconvert ! autovideosink # aperçu live depuis la CSI
# 3. Inférence RKNN : installer la toolchain rknn-toolkit2 (hôte x86) pour
# convertir le modèle ONNX -> .rknn, puis runtime rknnlite sur la carte :
sudo pip3 install rknn-toolkit-lite2 # wheel selon la doc AI Radxa
python3 detect.py --model model.rknn --cam 0 # script du tuto AI officiel
# 4. Diffusion RTSP (encodage 1080p60 matériel) :
sudo apt install v4l2loopback-dkms
# gst-launch-1.0 ... ! mpph264enc ! rtspclientsink location=rtsp://... (voir tuto RTSP)
Vérification attendue
v4l2-ctl --list-devices liste la pipeline CSI ; gst-launch affiche le flux caméra ; le script RKNN affiche boîtes/labels et latence par trame (le NPU 1 TOPS tient du temps réel en modèles légers type YOLO quantifiés INT8) ; un client VLC lit le flux RTSP. cat /sys/class/devfreq/*npu*/load (ou rknn top) montre le NPU actif.
Erreurs fréquentes
- Tester RKNN sous une image mainline/Armbian maison : le NPU dépend du noyau constructeur — les blobs libmali/RKNN et panfrost ne se mélangent pas (problème documenté sur les images auto-construites).
- Nappe CSI mal insérée ou face des contacts inversée : aucun /dev/video de pipeline.
- Confondre décodage et encodage : le VPU décode en 4Kp60 et encode en 1080p60 (la fiche marketing radxa.com qui inverse les deux est une coquille).
- Conversion d'un modèle non supporté par RKNN : passer par le convertisseur ONNX et quantifier en INT8 sur PC x86, pas sur la carte.
- Surchauffe en charge VPU+NPU soutenue : ajouter dissipateur/ventilateur avant de conclure à un bridage logiciel.
Autres tutoriels pour cette carte
- Faire clignoter une LED via le GPIO avec libgpiod
- Lire un bouton poussoir en Python avec python3-libgpiod
- Premier réseau : Ethernet double gigabit, Wi-Fi optionnel et SSH
- Installer et booter le système sur un SSD NVMe (M.2 M-Key)
- Interroger un capteur I2C sur le connecteur 40 broches
- Surveiller température et fréquence CPU, piloter le ventilateur PWM
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash