Construisez rapidement un projet de détection d'obstacles embarqué avec reComputer-RK / Docker / RKNN / YOLO

Vous pouvez consulter le code source de ce projet sur GitHub : https://github.com/doublelf/area-intrusion-alarm
Présentation du projet
Ce projet est issu d'un système de détection d'intrusion dans une zone basé sur RK3576 / RKNN / YOLO / RGA, dont le scénario d'origine était de déclencher une alerte lorsque des cibles « personne / véhicule » pénètrent dans un polygone défini, à partir du flux d'une caméra fixe. L'ensemble de la chaîne « dessin de zone + machine à états + archivage d'instantanés » se transpose naturellement au scénario embarqué : en redéfinissant le polygone de « zone d'accès interdit » à « zone de risque de collision / angle mort / passage piéton », et en étendant les classes de déclenchement de 2 à 8 classes liées aux véhicules et aux personnes, on obtient la capacité de détection d'obstacles embarquée illustrée par ce projet.
Note sur le matériel de démonstration : à la racine de ce dépôt,
video/1-1.mp4est une vidéo de scénario de conduite ; pendant l'exécution, l'aperçu remplace le GIF ci-dessus par un aperçu MJPEG.
Démarrage rapide
1. Cloner le projet
git clone https://github.com/doublelf/area-intrusion-alarm
cd area-intrusion-alarm2. Préparer le fichier de classes class_config.txt
Le nom class_config.txt est déjà réservé à la racine du dépôt, mais il s'agit actuellement d'un répertoire vide servant d'espace réservé (certains points de montage l'ont créé par erreur comme répertoire durant la synchronisation). Remplacez-le par un fichier du même nom dont le contenu est le suivant (sous-ensemble véhicules / personnes de COCO, 8 classes) :
"person", "bicycle", "car", "motorbike", "bus", "truck", "traffic light", "stop sign"3. Construire l'image
sudo docker build -t area-intrusion:local .4. Lancer le conteneur et exécuter l'inférence
sudo docker run --rm --privileged --net=host \
-e PYTHONUNBUFFERED=1 \
-e RKNN_LOG_LEVEL=0 \
-v $(pwd)/class_config.txt:/app/class_config.txt \
-v $(pwd)/video:/app/video:ro \
--device /dev/video0:/dev/video0 \
--device /dev/dri/renderD128:/dev/dri/renderD128 \
-v /proc/device-tree/compatible:/proc/device-tree/compatible \
area-intrusion:local \
python3 web_detection.py --model_path model/yolov8n.rknn --video video/1-1.mp4 --class_path class_config.txtOù :
-v $(pwd)/class_config.txt:/app/class_config.txtmonte le fichier de classes dans le conteneur et active, en combinaison avec--class_path class_config.txt, le sous-ensemble de 8 classes véhicules / personnes ;-v $(pwd)/video:/app/video:romappe le répertoire localvideo/en lecture seule sur le/app/videode l'image ;--device /dev/video0:/dev/video0et--device /dev/dri/renderD128:/dev/dri/renderD128sont utilisés respectivement pour la caméra V4L2 et l'accélération matérielle RGA ;- la commande finale
python3 web_detection.py --model_path ... --video video/1-1.mp4 --class_path ...démarre l'inférence.
Note de compatibilité CLI : le nom d'argument actuel dans
web_detection.pyde ce dépôt est--video_path(voirweb_detection.py:1206). Si l'exécution renvoieunknown arg: --video, réécrivez--video video/1-1.mp4en--video_path video/1-1.mp4; les autres paramètres restent inchangés.
5. Accéder à la plateforme Web
Une fois le projet en marche, ouvrez dans le navigateur http://<board_ip>:8000/ et passez en haut sur l'onglet Zone d'obstacles (Intrusion Zones) :
- Sélectionnez le mode Draw, cliquez successivement sur au moins 3 points de l'image, double-cliquez ou recliquez sur le point de départ pour fermer le polygone, saisissez un nom de zone (par exemple
Angle mort frontal,Angle mort rétroviseur droit,Passage piéton) puis validez ; - Cochez dans la case Target les classes cibles à inclure dans l'alerte (par défaut person / car sont cochées ; ajoutez selon vos besoins truck / bus / bicycle / motorbike / traffic light / stop sign) ;
- Dès que le centroïde d'une cible entre dans une zone activée, une nouvelle ligne apparaît dans la liste Recent Warnings à droite, avec l'heure du déclenchement, la classe de la cible, le nom de la zone et une vignette JPEG annotée (cliquez pour télécharger l'image originale).

Développement secondaire basé sur le projet
Récupérez le code source complet de l'image en local :
sudo docker cp area-intrusion:local:/app/web_detection.py ./
sudo docker cp area-intrusion:local:/app/py_utils ./Après modifications, reconstruisez l'image :
sudo docker build -t area-intrusion:local .Puis relancez avec la commande docker run ci-dessus.
Points d'entrée courants pour le développement secondaire :
- Remplacer les classes de détection : éditez
class_config.txtpour ajouter ou retirer des classes ; effectif sans modifier le code ; - Ajuster la sensibilité de déclenchement : dans l'onglet Web Real-time Detection, déplacez les curseurs Confidence Threshold et IOU Threshold ;
- Intégrer des zones personnalisées : appelez
POST /api/regionspour écrire directement les sommets du polygone (coordonnées dans le système de coordonnées de l'image source), adapté à l'intégration avec un système HMI embarqué.
Appeler la caméra pour l'inférence en temps réel
Remplacez --video par --camera_id pour appeler une caméra USB / CSI. L'argument en ligne de commande correspond un à un au périphérique caméra mappé via --device :
sudo docker run --rm --privileged --net=host \
-e PYTHONUNBUFFERED=1 \
-e RKNN_LOG_LEVEL=0 \
-v $(pwd)/class_config.txt:/app/class_config.txt \
--device /dev/video0:/dev/video0 \
--device /dev/dri/renderD128:/dev/dri/renderD128 \
-v /proc/device-tree/compatible:/proc/device-tree/compatible \
area-intrusion:local \
python3 web_detection.py --model_path model/yolov8n.rknn --camera_id 0 --class_path class_config.txt