Raspberry Pi a récemment lancé plusieurs produits d’IA, dont le Raspberry Pi AI HAT+ pour le Pi 5 avec 13 TOPS ou 26 TOPS de performances et la caméra Raspberry Pi AI, moins puissante, adaptée à tous les Raspberry Pi SBC dotés d’un connecteur MIPI CSI. La société m’a envoyé des échantillons de l’AI HAT+ (26 TOPS) et de la caméra AI pour test, ainsi que d’autres accessoires tels que le Raspberry Pi Touch Display 2 et le Raspberry Pi Bumper, je vais donc rapporter mon expérience de démarrage principalement en suivant le documentation pour l’AI HAT+ et la caméra AI.

Matériel utilisé pour les tests
Dans ce tutoriel/test, j’utiliserai un Raspberry Pi 5 avec l’AI HAT+ et un Raspberry Pi Camera Module 3, tandis que je connecterai la caméra AI à un Raspberry Pi 4. Je prévois également d’utiliser l’une des cartes avec le nouvel écran tactile 2.

Passons en test un déballage rapide du nouveau matériel Pi AI en commençant par le 26 TOPS AI HAT+.

Le package comprend l’AI HAT+ lui-même avec un accélérateur AI Hailo-8 26 TOPS soudé sur la carte par opposition à un module M.2 comme dans le kit Raspberry Pi AI qui a été le premier matériel de ce type lancé par la société, ainsi qu’un Embase empilable à 40 broches et quelques entretoises et vis en plastique.

Un câble plat est également connecté au HAT+, et la face inférieure ne comporte aucun composant majeur, seulement quelques composants passifs, ainsi qu’un bon nombre de points de test.
Le package Raspberry Pi AI Camera comprend le module caméra avec un capteur de vision intelligent Sony IMX500, des câbles à 22 et 15 broches qui s’adaptent au connecteur MIPI CSI sur diverses cartes Raspberry Pi et un anneau blanc utilisé pour régler la mise au point manuellement.

Par exemple, le câble 22 broches conviendrait au Raspberry Pi 5 et le câble 15 broches au Raspberry Pi 4, nous utiliserons donc ce dernier dans cette test.
Voici un gros plan du module Raspberry Pi AI Camera lui-même.

Installation du Raspberry Pi AI HAT+ sur le Raspberry Pi 5
J’utiliserais généralement mon Raspberry Pi 5 avec un SSD NVMe, mais ce n’est pas possible avec l’AI HAT+ lorsque j’utilise les accessoires standard fournis par Raspberry Pi. J’ai donc retiré le SSD et le HAT, et je vais plutôt démarrer le système d’exploitation Raspberry Pi à partir d’une carte microSD Raspberry Pi officielle.
Je pourrais toujours garder la glacière active. La première partie de l’installation consiste à insérer l’en-tête d’empilage GPIO sur l’en-tête GPIO à 40 broches du Pi 5, à installer des entretoises et à connecter le câble plat PCIe comme indiqué sur la photo ci-dessous.

Une fois cela fait, nous pouvons insérer le HAT+ dans le connecteur mâle et le fixer avec quatre vis.

J’ai également connecté le Raspberry Pi Camera Module 3 au Pi 5, mais j’ai dû renoncer à installer le SBC sur le Touch Display 2 car il ne peut pas être monté quand il y a HAT et je n’aurais pas pu brancher le câble d’alimentation avec l’en-tête d’empilement GPIO utilisé ici.

Je termine donc la construction en retirant les quatre vis qui maintiennent les entretoises, en plaçant le pare-chocs sur le côté inférieur et en le fixant en resserrant les vis en place.

Installation de la caméra Raspberry Pi AI et de l’écran tactile 2 avec Raspberry Pi 4
Installons maintenant la caméra AI sur notre Raspberry Pi 4 en connectant d’abord le câble à 15 broches comme indiqué ci-dessous avec les contacts dorés tournés vers les connecteurs micro HDMI.

C’est tout ce qu’il y a à faire si vous comptez utiliser le matériel avec un moniteur HDMI. Mais nous souhaitons utiliser le Raspberry Pi Touch Display 2, nous devrons donc connecter le câble plat MIPI DSI et le câble d’alimentation comme indiqué ci-dessous.

Le câble d’alimentation peut être inséré dans les deux sens et la première fois je me suis trompé avec le fil rouge à gauche, donc ça n’a pas fonctionné… Il faut le brancher avec le câble noir à gauche comme indiqué sur la photo ci-dessus.
Après cela, nous pouvons insérer le câble MIPI DSI dans le Raspberry Pi 4 en faisant face à la partie bleue du câble la partie noire du connecteur, avant de fixer le SBC avec quatre vis. J’attache la caméra AI à l’arrière de l’écran avec du ruban adhésif. J’aurais aimé que Raspberry Pi ait pensé à un mécanisme de montage pour leurs caméras…

Mais il fait l’affaire avec l’écran posé sur un support pour smartphone.

Premiers pas avec la caméra Raspberry Pi AI avec les applications RPICam et les démos Libcamera2
La première étape consistait à configurer l’affichage en mode paysage car Raspberry Pi OS démarrera en mode portrait par défaut. Tout ce que j’avais à faire était d’aller dans l’éditeur de disposition d’écran et de sélectionner Mise en page-> Écrans-> XWAYLAND0-> Orientation-> Droite.

Nous pouvons désormais installer le micrologiciel, les logiciels et les actifs de la caméra Raspberry Pi AI avec une seule commande, plus un redémarrage.
Nous pouvons maintenant essayer quelques démos « rpicam-apps » commençant par la détection d’objets :
rpicam-hello -t 0s –post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json –viewfinder-width 1920 –viewfinder-height 1080 –framerate 30
|
rpicam-hello -t 0s –post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json –viewfinder-width 1920 –viewfinder-height 1080 –framerate 30 |
ou lancé depuis SSH (accès à distance) :
DISPLAY=:0 rpicam-hello -t 0s –post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json –viewfinder-width 1920 –viewfinder-height 1080 –framerate 30
|
DISPLAY=:0 rpicam-hello -t 0s –post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json –viewfinder-width 1920 –viewfinder-height 1080 –framerate 30 |
Voilà le résultat ou la commande :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[0:01:25.418428032] [2246] INFO Caméra camera_manager.cpp:325 libcamera v0.3.2+27-7330f29b [0:01:25.438252186] [2249] WARN CameraSensorProperties camera_sensor_properties.cpp:305 Aucune propriété statique disponible pour ‘imx500’ [0:01:25.438624029] [2249] WARN CameraSensorProperties camera_sensor_properties.cpp:307 Veuillez envisager de mettre à jour la base de données des propriétés du capteur de la caméra. [0:01:25.466632714] [2249] WARN RPiSdn sdn.cpp:40 Utilisation du réglage SDN existant – veuillez envisager de déplacer SDN dans rpi.denoise [0:01:25.469557259] [2249] INFO RPI vc4.cpp:447 Caméra enregistrée /base/soc/i2c0mux/i2c@1/imx500@1a sur le périphérique Unicam /dev/media4 et le périphérique FAI /dev/media0 [0:01:25.469652592] [2249] INFO RPI pipeline_base.cpp:1126 Utilisation du fichier de configuration ‘/usr/share/libcamera/pipeline/rpi/vc4/rpi_apps.yaml’ Fenêtre d’aperçu X/EGL créée IMX500 : impossible de définir le retour sur investissement absolu Lecture de l’étape de post-traitement « imx500_object_detection » ————————————————– ————————————————– ————— REMARQUE : Le chargement du micrologiciel réseau sur l’IMX500 peut prendre plusieurs minutes, veuillez ne pas fermer l’application. ————————————————– ————————————————– ————— Lecture de l’étape de post-traitement « object_detect_draw_cv » Sélection du mode pour 1920:1080:12:P(30) SRGGB10_CSI2P,2028×1520/30.0219 – Note : 2467,7 SRGGB10_CSI2P,4056×3040/9.9987 – Note : 43357.3 Configuration du flux ajustée [0:01:28.520565569] [2246] INFO Caméra camera.cpp:1197 configuration des flux : (0) 1920×1080-YUV420 (1) 2028×1520-SRGGB10_CSI2P [0:01:28.521339201] [2249] INFO RPI vc4.cpp:622 Capteur : /base/soc/i2c0mux/i2c@1/imx500@1a – Format de capteur sélectionné : 2028×1520-SRGGB10_1X10 – Format unicam sélectionné : 2028×1520-pRAA Téléchargement du micrologiciel réseau : 100 % (3 872/3 872 Ko) |
Le téléchargement du micrologiciel réseau a pris quelques secondes la première fois, mais il est ensuite rapide lors des tentatives suivantes. L’image n’étant pas nette, j’ai dû régler la mise au point manuellement avec la bague de mise au point blanche fournie avec l’appareil photo.

La démo pouvait facilement détecter une personne et un ours en peluche, mais pas la bouteille, quel que soit l’angle que j’ai essayé. La vidéo est assez fluide et l’inférence est rapide.

Tout va bien, sauf que la documentation et la commande à exécuter ne sont pas synchronisées pour le moment, mais comme indiqué ci-dessus, j’ai trouvé une solution dans les forums. J’ai également réalisé que Scrot ne pouvait pas faire de captures d’écran dans Wayland (les images résultantes sont noires), j’ai donc dû passer à l’utilitaire Grim à la place…
Essayons un autre exemple : estimation de pose.
rpicam-hello -t 0s –post-process-file /usr/share/rpi-camera-assets/imx500_posenet.json –viewfinder-width 1920 –viewfinder-height 1080 –framerate 30
|
rpicam-hello -t 0s –post-process-file /usr/share/rpi-camera-assets/imx500_posenet.json –viewfinder-width 1920 –viewfinder-height 1080 –framerate 30 |

La première fois que nous avons exécuté le modèle, il a fallu le transférer vers la caméra, ce qui a probablement pris environ 2 minutes, mais les exécutions suivantes sont rapides. Encore une fois, le suivi est en temps réel et je n’ai pu remarquer aucun décalage. Je montrerai une démonstration vidéo de la segmentation du corps comparant la caméra AI aux démos AI HAT+ plus tard dans cette test.
Vous trouverez d’autres modèles avec lesquels jouer dans le répertoire imx500-models.
pi@raspberrypi:~ $ ls -l /usr/share/imx500-models/ total 98700 -rw-r–r– 1 root root 2574800 28 septembre 20:37 imx500_network_deeplabv3plus.rpk -rw-r–r– 1 root root 3722528 28 septembre 20:37 imx500_network_efficientdet_lite0_pp.rpk -rw-r–r– 1 root root 6285760 28 septembre 20:37 imx500_network_efficientnet_bo.rpk -rw-r–r– 1 root root 5576144 28 septembre 20:37 imx500_network_efficientnet_lite0.rpk -rw-r–r– 1 root root 6838704 28 septembre 20:37 imx500_network_efficientnetv2_b0.rpk -rw-r–r– 1 root root 6681664 28 septembre 20:37 imx500_network_efficientnetv2_b1.rpk -rw-r–r– 1 root root 6826864 28 septembre 20:37 imx500_network_efficientnetv2_b2.rpk -rw-r–r– 1 root root 2104384 28 septembre 20:37 imx500_network_higherhrnet_coco.rpk -rw-r–r– 1 root root 67056 28 septembre 20:37 imx500_network_inputtensoronly.rpk -rw-r–r– 1 root root 5222544 28 septembre 20:37 imx500_network_levit_128s.rpk -rw-r–r– 1 root root 5072400 28 septembre 20:37 imx500_network_mnasnet1.0.rpk -rw-r–r– 1 root root 4079808 28 septembre 20:37 imx500_network_mobilenet_v2.rpk -rw-r–r– 1 root root 3612448 28 septembre 20:37 imx500_network_mobilevit_xs.rpk -rw-r–r– 1 root root 2335520 28 septembre 20:37 imx500_network_mobilevit_xxs.rpk -rw-r–r– 1 root root 3281696 28 septembre 20:37 imx500_network_nanodet_plus_416x416_pp.rpk -rw-r–r– 1 root root 3118976 28 septembre 20:37 imx500_network_nanodet_plus_416x416.rpk -rw-r–r– 1 root root 1663152 28 septembre 20:37 imx500_network_posenet.rpk -rw-r–r– 1 root root 3440912 28 septembre 20:37 imx500_network_regnetx_002.rpk -rw-r–r- – 1 root de root 4054464 28 septembre 20:37 imx500_network_regnety_002.rpk -rw-r–r– 1 root root 5464912 28 septembre 20:37 imx500_network_regnety_004.rpk -rw-r–r– 1 root root 6211824 28 septembre 20:37 imx500_network_resnet18.rpk -rw-r–r– 1 root root 4081184 28 septembre 20:37 imx500_network_shufflenet_v2_x1_5.rpk -rw-r–r– 1 root root 1597680 28 septembre 20:37 imx500_network_squeezenet1.0.rpk -rw-r–r– 1 root root 3965824 28 septembre 20:37 imx500_network_ssd_mobilenetv2_fpnlite_320x320_pp.rpk -rw-r–r– 1 root root 3126656 28 septembre 20h37 imx500_network_yolov8n_pp.rpk
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
pi@raspberrypi :~ $ ls -l /usr/share/imx500-models/ total 98700 -rw-r–r– 1 root root 2574800 28 septembre 20:37 imx500_network_deeplabv3plus.rpk -rw-r–r– 1 root root 3722528 28 septembre 20:37 imx500_network_efficientdet_lite0_pp.rpk -rw-r–r– 1 root root 6285760 28 septembre 20:37 imx500_network_efficientnet_bo.rpk -rw-r–r– 1 root root 5576144 28 septembre 20:37 imx500_network_efficientnet_lite0.rpk -rw-r–r– 1 root root 6838704 28 septembre 20:37 imx500_network_efficientnetv2_b0.rpk -rw-r–r– 1 root root 6681664 28 septembre 20:37 imx500_network_efficientnetv2_b1.rpk -rw-r–r– 1 root root 6826864 28 septembre 20:37 imx500_network_efficientnetv2_b2.rpk -rw-r–r– 1 root root 2104384 28 septembre 20:37 imx500_network_higherhrnet_coco.rpk -rw-r–r– 1 root root 67056 28 septembre 20:37 imx500_network_inputtensoronly.rpk -rw-r–r– 1 root root 5222544 28 septembre 20:37 imx500_network_levit_128s.rpk -rw-r–r– 1 root root 5072400 28 septembre 20:37 imx500_network_mnasnet1.0.rpk -rw-r–r– 1 root root 4079808 28 septembre 20:37 imx500_network_mobilenet_v2.rpk -rw-r–r– 1 root root 3612448 28 septembre 20:37 imx500_network_mobilevit_xs.rpk -rw-r–r– 1 root root 2335520 28 septembre 20:37 imx500_network_mobilevit_xxs.rpk -rw-r–r– 1 root root 3281696 28 septembre 20:37 imx500_network_nanodet_plus_416x416_pp.rpk -rw-r–r– 1 root root 3118976 28 septembre 20:37 imx500_network_nanodet_plus_416x416.rpk -rw-r–r– 1 root root 1663152 28 septembre 20:37 imx500_network_posenet.rpk -rw-r–r– 1 root root 3440912 28 septembre 20:37 imx500_network_regnetx_002.rpk -rw-r–r– 1 root root 4054464 28 septembre 20:37 imx500_network_regnety_002.rpk -rw-r–r– 1 root root 5464912 28 septembre 20:37 imx500_network_regnety_004.rpk -rw-r–r– 1 root root 6211824 28 septembre 20:37 imx500_network_resnet18.rpk -rw-r–r– 1 root root 4081184 28 septembre 20:37 imx500_network_shufflenet_v2_x1_5.rpk -rw-r–r– 1 root root 1597680 28 septembre 20:37 imx500_network_squeezenet1.0.rpk -rw-r–r– 1 root root 3965824 28 septembre 20:37 imx500_network_ssd_mobilenetv2_fpnlite_320x320_pp.rpk -rw-r–r– 1 root root 3126656 28 septembre 20:37 imx500_network_yolov8n_pp.rpk |
La caméra Raspberry Pi AI prend également en charge le framework Picamera2. Nous pouvons installer les dépendances et les programmes de démonstration comme suit :
sudo apt install python3-opencv python3-munkres git clone https://github.com/raspberrypi/picamera2
|
sudo apt install python3-opencv python3-munkres clone git https://github.com/raspberrypi/picamera2 |
Essayons maintenant d’exécuter Yolov8 :
cd picamera2/examples/imx500/ DISPLAY=:0 python imx500_object_detection_demo.py –model /usr/share/imx500-models/imx500_network_ssd_mobilenetv2_fpnlite_320x320_pp.rpk
|
cd picamera2/exemples/imx500/ DISPLAY=:0 python imx500_object_detection_demo.py –model /usr/share/imx500-models/imx500_network_ssd_mobilenetv2_fpnlite_320x320_pp.rpk |
Mais cela n’a pas fonctionné comme prévu :
pi@raspberrypi:~/picamera2/examples/imx500 $ DISPLAY=:0 python imx500_object_detection_demo.py –model /usr/share/imx500-models/imx500_network_ssd_mobilenetv2_fpnlite_320x320_pp.rpk
[0:17:09.224913642] [40685] INFO Caméra camera_manager.cpp:325 libcamera v0.3.2+27-7330f29b
[0:17:09.251033940] [40690] WARN CameraSensorProperties camera_sensor_properties.cpp:305 Aucune propriété statique disponible pour ‘imx500’
[0:17:09.251093511] [40690] WARN CameraSensorProperties camera_sensor_properties.cpp:307 Veuillez envisager de mettre à jour la base de données des propriétés du capteur de la caméra.
[0:17:09.272530936] [40690] WARN RPiSdn sdn.cpp:40 Utilisation du réglage SDN existant – veuillez envisager de déplacer SDN dans rpi.denoise
[0:17:09.274669644] [40690] INFO RPI vc4.cpp:447 Caméra enregistrée /base/soc/i2c0mux/i2c@1/imx500@1a sur le périphérique Unicam /dev/media4 et le périphérique FAI /dev/media0
[0:17:09.274828357] [40690] INFO RPI pipeline_base.cpp:1126 Utilisation du fichier de configuration ‘/usr/share/libcamera/pipeline/rpi/vc4/rpi_apps.yaml’ ———————- ————————————————– —————————————— REMARQUE : Chargement du micrologiciel réseau sur l’IMX500 peut prendre plusieurs minutes, veuillez ne pas fermer l’application. ————————————————– ————————————————– —————
[0:17:09.456145829] [40685] INFO Caméra camera.cpp:1197 configuration des flux : (0) 640×480-XBGR8888 (1) 2028×1520-SRGGB10_CSI2P
[0:17:09.456830363] [40690] INFO RPI vc4.cpp:622 Capteur : /base/soc/i2c0mux/i2c@1/imx500@1a – Format de capteur sélectionné : 2028×1520-SRGGB10_1X10 – Format unicam sélectionné : 2028×1520-pRAA Téléchargement du micrologiciel réseau : 100%|████████████████████████████████ █████████████████████████████████████| 3,78 M/3,78 M [00:11<00:00, 360kbytes/s]
Traceback (dernier appel le plus récent) : Fichier « /home/pi/picamera2/examples/imx500/imx500_object_detection_demo.py », ligne 179, dans last_results = parse_detections(picam2.capture_metadata()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^Fichier « /home/pi/ picamera2/examples/imx500/imx500_object_detection_demo.py », ligne 28, dans parse_detections bbox_order = intrinsics.bbox_order ^^^^^^^^^^^^^^^^^^^^ AttributeError : l’objet ‘NetworkIntrinsics’ n’a pas d’attribut ‘bbox_order’
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
pi@raspberrypi:~/picamera2/examples/imx500 $ DISPLAY=:0 python imx500_object_detection_demo.py –model /usr/share/imx500-models/imx500_network_ssd_mobilenetv2_fpnlite_320x320_pp.rpk [0:17:09.224913642] [40685] INFO Caméra camera_manager.cpp:325 libcamera v0.3.2+27-7330f29b [0:17:09.251033940] [40690] WARN CameraSensorProperties camera_sensor_properties.cpp:305 Aucune propriété statique disponible pour ‘imx500’ [0:17:09.251093511] [40690] WARN CameraSensorProperties camera_sensor_properties.cpp:307 Veuillez envisager de mettre à jour la base de données des propriétés du capteur de la caméra. [0:17:09.272530936] [40690] WARN RPiSdn sdn.cpp:40 Utilisation du réglage SDN existant – veuillez envisager de déplacer SDN dans rpi.denoise [0:17:09.274669644] [40690] INFO RPI vc4.cpp:447 Caméra enregistrée /base/soc/i2c0mux/i2c@1/imx500@1a sur le périphérique Unicam /dev/media4 et le périphérique FAI /dev/media0 [0:17:09.274828357] [40690] INFO RPI pipeline_base.cpp:1126 Utilisation du fichier de configuration ‘/usr/share/libcamera/pipeline/rpi/vc4/rpi_apps.yaml’ ————————————————– ————————————————– ————— REMARQUE : Le chargement du micrologiciel réseau sur l’IMX500 peut prendre plusieurs minutes, veuillez ne pas fermer l’application. ————————————————– ————————————————– ————— [0:17:09.456145829] [40685] INFO Caméra camera.cpp:1197 configuration des flux : (0) 640×480-XBGR8888 (1) 2028×1520-SRGGB10_CSI2P [0:17:09.456830363] [40690] INFO RPI vc4.cpp:622 Capteur : /base/soc/i2c0mux/i2c@1/imx500@1a – Format de capteur sélectionné : 2028×1520-SRGGB10_1X10 – Format unicam sélectionné : 2028×1520-pRAA Téléchargement du micrologiciel réseau : 100%|████████████████████████████████ █████████████████████████████████████| 3,78 M/3,78 M [00:11<00:00, 360kbytes/s] Traceback (dernier appel le plus récent) : Fichier « /home/pi/picamera2/examples/imx500/imx500_object_detection_demo.py », ligne 179, dans last_results = parse_detections(picam2.capture_metadata()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier « /home/pi/picamera2/examples/imx500/imx500_object_detection_demo.py », ligne 28, dans parse_detections bbox_order = intrinsèques.bbox_order ^^^^^^^^^^^^^^^^^^^^^ AttributeError : l’objet ‘NetworkIntrinsics’ n’a pas d’attribut ‘bbox_order’ |
Je ne suis pas le seul à avoir ce problème, et en exécutant la commande suivante auparavant :
exporter PYTHONPATH=/home/pi/picamera2/
|
exporter PYTHONPATH=/home/pi/picamera2/ |
On peut aller plus loin, mais cela ne fonctionne toujours pas avec une autre erreur :
Fichier « /home/pi/picamera2/picamera2/devices/imx500/imx500.py », ligne 548, dans __get_output_tensor_info raise ValueError(f’tensor info length {len(tensor_info)} ne correspond pas à la taille attendue {size}’) ValueError : info tenseur la longueur 260 ne correspond pas à la taille attendue 708
|
Fichier « /home/pi/picamera2/picamera2/devices/imx500/imx500.py », ligne 548, dans __get_output_tensor_info raise ValueError (la longueur des informations f’tensor {len (tensor_info)} ne correspond pas à la taille attendue {size}’) ValueError : la longueur des informations sur le tenseur 260 ne correspond pas à la taille attendue 708 |
Encore une fois, une autre personne a eu un problème de non-concordance de taille, mais cette fois-ci, il ne semble pas y avoir de solution évidente. Ainsi, depuis le 24 novembre 2024, le framework Picamera2 n’est pas compatible avec la caméra AI Raspberry Pi AI. Espérons que cela sera corrigé dans les prochaines semaines. La documentation contient plus de détails sur l’architecture et des instructions montrent comment déployer vos propres modèles TensorFlow ou Pytorch, mais cela sort du cadre de ce guide de démarrage.
Premiers pas avec Raspberry Pi AI HAT+
Raspberry Pi recommande d’activer PCIe Gen3 pour des performances optimales, mais je n’ai pas eu besoin de le faire, car j’ai déjà activé PCIe Gen3 lorsque j’ai testé le SSD officiel Raspberry Pi. Alors installons les ressources Hailo et redémarrons la machine.
sudo apt installer hailo-all sudo redémarrer
|
sudo apt installer hailo-all redémarrage sudo |
Notez qu’une installation de près de 900 Mo pour le pilote et le micrologiciel du périphérique du noyau Hailo, le logiciel middleware HailoRT, les bibliothèques de post-traitement principales de Hailo Tappas et les étapes de démonstration du logiciel de post-traitement Hailo rpicam-apps.
Nous pouvons vérifier si l’accélérateur Hailo-8 AI est détecté avec la commande suivante :
hailortcli fw-control identifier
|
hailortcli fw-control identifier |
sortir:
Exécution sur l’appareil : 0000:01:00.0 Version du protocole de contrôle de la carte d’identification : 2 Version du micrologiciel : 4.18.0 (version, application, tampon de changement de contexte étendu) Version de l’enregistreur : 0 Nom de la carte : Hailo-8 Architecture de l’appareil : HAILO8 Numéro de série : pièce Numéro : Nom du produit :
|
Exécution sur l’appareil : 0000:01:00.0 Tableau d’identification Version du protocole de contrôle : 2 Version du micrologiciel : 4.18.0 (version, application, tampon de changement de contexte étendu) Version de l’enregistreur : 0 Nom du tableau : Hailo-8 Architecture de l’appareil : HAILO8 Numéro de série : Numéro de pièce : Nom du produit : |
Il n’y a pas de numéros de série, de pièces ou de nom de produit, donc peut-être que ceux-ci ne seront signalés que lors de l’utilisation d’un module M.2 ou mPCIe Hailo.
Nous pouvons également voir des informations liées à Hailo dans le journal du noyau :
pi@raspberrypi : ~ $ dmesg | grep -je hailo
[ 3.671365] hailo : module d’initialisation. version du pilote 4.18.0
[ 3.671510] hailo 0000:01:00.0 : Sonde sur : 1e60:2864…
[ 3.671517] hailo 0000:01:00.0 : Sondage : allouer de la mémoire pour l’extension de périphérique, 11632
[ 3.671539] hailo 0000:01:00.0 : dispositif d’activation (0000 -> 0002)
[ 3.671546] hailo 0000:01:00.0 : Sondage : appareil activé
[ 3.671566] hailo 0000:01:00.0 : Sondage : barre mappée 0 – 00000000a06c39ed 16384
[ 3.671572] hailo 0000:01:00.0 : Sondage : barre mappée 2 – 00000000a39a70f5 4096
[ 3.671577] hailo 0000:01:00.0 : Sondage : barre mappée 4 – 00000000800179f8 16384
[ 3.671581] hailo 0000:01:00.0 : Sondage : Forcer le réglage de max_desc_page_size à 4096 (la valeur recommandée est 16384)
[ 3.671589] hailo 0000:01:00.0 : Sondage : Activé DMA 64 bits
[ 3.671592] hailo 0000:01:00.0 : Sondage : Utilisation des tampons vdma alloués à l’espace utilisateur
[ 3.671595] hailo 0000:01:00.0 : Désactivation des ASPM L0
[ 3.671599] hailo 0000:01:00.0 : ASPM L0 désactivé avec succès
[ 3.898016] hailo 0000:01:00.0 : Le micrologiciel a été chargé avec succès
[ 3.913417] hailo 0000:01:00.0 : Sondage : carte ajoutée 1e60-2864, /dev/hailo0
|
pi@raspberrypi : ~ $ dmesg | grep -je hailo [ 3.671365] hailo : module d’initialisation. version du pilote 4.18.0 [ 3.671510] hailo 0000:01:00.0 : Sonde sur : 1e60:2864… [ 3.671517] hailo 0000:01:00.0 : Sondage : allouer de la mémoire pour l’extension de périphérique, 11632 [ 3.671539] hailo 0000:01:00.0 : dispositif d’activation (0000 -> 0002) [ 3.671546] hailo 0000:01:00.0 : Sondage : appareil activé [ 3.671566] hailo 0000:01:00.0 : Sondage : barre mappée 0 – 00000000a06c39ed 16384 [ 3.671572] hailo 0000:01:00.0 : Sondage : barre mappée 2 – 00000000a39a70f5 4096 [ 3.671577] hailo 0000:01:00.0 : Sondage : barre mappée 4 – 00000000800179f8 16384 [ 3.671581] hailo 0000:01:00.0 : Sondage : Forcer le réglage de max_desc_page_size à 4096 (la valeur recommandée est 16384) [ 3.671589] hailo 0000:01:00.0 : Sondage : Activé DMA 64 bits [ 3.671592] hailo 0000:01:00.0 : Sondage : Utilisation des tampons vdma alloués à l’espace utilisateur [ 3.671595] hailo 0000:01:00.0 : Désactivation des ASPM L0 [ 3.671599] hailo 0000:01:00.0 : ASPM L0 désactivé avec succès [ 3.898016] hailo 0000:01:00.0 : Le micrologiciel a été chargé avec succès [ 3.913417] hailo 0000:01:00.0 : Sondage : carte ajoutée 1e60-2864, /dev/hailo0 |
Nous pouvons maintenant consulter la démo rpicam-apps de GitHub :
git clone –profondeur 1 https://github.com/raspberrypi/rpicam-apps.git ~/rpicam-apps
|
git clone –profondeur 1 https://github.com/raspberrypi/rpicam-apps.git ~/rpicam-apps |
Et testez l’un des échantillons comme indiqué dans la documentation :
pi@raspberrypi:~ $ DISPLAY=:0 rpicam-hello -t 0 –post-process-file ~/rpicam-apps/assets/hailo_yolov8_inference.json –lores-width 640 –lores-height 640
[0:39:01.996590396] [17167] INFO Caméra camera_manager.cpp:325 libcamera v0.3.2+27-7330f29b
[0:39:02.004488912] [17170] INFO RPI pisp.cpp:695 libpisp version v1.0.7 28196ed6edcf 29-08-2024 (16:33:32)
[0:39:02.022338997] [17170] INFO RPI pisp.cpp:1154 Caméra enregistrée /base/axi/pcie@120000/rp1/i2c@80000/imx708@1a sur le périphérique CFE /dev/media2 et le périphérique FAI /dev/media0 utilisant la variante PiSP BCM2712_C0 Aperçu X/EGL réalisé fenêtre Post-traitement des lores demandés : 640×640 BGR888 Lecture étape de post-traitement « hailo_yolo_inference » ERREUR : *** Aucun nœud de ce type (hef_file) ***
|
pi@raspberrypi:~ $ DISPLAY=:0 rpicam-hello -t 0 –post-process-file ~/rpicam-apps/assets/hailo_yolov8_inference.json –lores-width 640 –lores-height 640 [0:39:01.996590396] [17167] INFO Caméra camera_manager.cpp:325 libcamera v0.3.2+27-7330f29b [0:39:02.004488912] [17170] INFO RPI pisp.cpp:695 libpisp version v1.0.7 28196ed6edcf 29-08-2024 (16:33:32) [0:39:02.022338997] [17170] INFO RPI pisp.cpp:1154 Caméra enregistrée /base/axi/pcie@120000/rp1/i2c@80000/imx708@1a sur le périphérique CFE /dev/media2 et le périphérique FAI /dev/media0 utilisant la variante PiSP BCM2712_C0 Fenêtre d’aperçu X/EGL créée Post-traitement des lores demandés : 640×640 BGR888 Lecture de l’étape de post-traitement « hailo_yolo_inference » ERREUR : *** Aucun nœud de ce type (hef_file) *** |
Oups… ça ne marche pas. Quelqu’un sur les forums Raspberry Pi recommande d’utiliser plutôt les modèles dans /usr/share/rpi-camera-assets/ :
pi@raspberrypi:~ $ DISPLAY=:0 rpicam-hello -t 0 –post-process-file /usr/share/rpi-camera-assets/hailo_yolov8_inference.json –lores-width 640 –lores-height 640 – -rotation 180
[0:42:20.662134072] [17198] INFO Caméra camera_manager.cpp:325 libcamera v0.3.2+27-7330f29b
[0:42:20.673362106] [17201] INFO RPI pisp.cpp:695 libpisp version v1.0.7 28196ed6edcf 29-08-2024 (16:33:32)
[0:42:20.695581852] [17201] INFO RPI pisp.cpp:1154 Caméra enregistrée /base/axi/pcie@120000/rp1/i2c@80000/imx708@1a sur le périphérique CFE /dev/media2 et le périphérique FAI /dev/media0 utilisant la variante PiSP BCM2712_C0 Aperçu X/EGL réalisé fenêtre Post-traitement des lores demandés : 640×640 BGR888 Lecture étape de post-traitement « hailo_yolo_inference » Étape de post-traitement de lecture « object_detect_draw_cv » Sélection du mode pour 2304:1296:12:P SRGGB10_CSI2P,1536×864/0 – Score : 3400 SRGGB10_CSI2P,2304×1296/0 – Score : 1000 SRGGB10_CSI2P,4608×2592/0 – Score : 1900 Configuration du flux ajustée
[0:42:21.844252109] [17198] INFO Caméra camera.cpp:1197 configuration des flux : (0) 2304×1296-YUV420 (1) 640×640-BGR888 (2) 2304×1296-BGGR_PISP_COMP1
[0:42:21.844388530] [17201] INFO RPI pisp.cpp:1450 Capteur : /base/axi/pcie@120000/rp1/i2c@80000/imx708@1a – Format de capteur sélectionné : 2304×1296-SBGGR10_1X10 – Format CFE sélectionné : 2304×1296-PC1B
[HailoRT] [warning] HEF a été compilé pour le périphérique Hailo8L, alors que le périphérique lui-même est Hailo8. Cela entraînera une baisse des performances.
[HailoRT] [warning] HEF a été compilé pour le périphérique Hailo8L, alors que le périphérique lui-même est Hailo8. Cela entraînera une baisse des performances.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
pi@raspberrypi:~ $ DISPLAY=:0 rpicam-hello -t 0 –post-process-file /usr/share/rpi-camera-assets/hailo_yolov8_inference.json –lores-width 640 –lores-height 640 – -rotation 180 [0:42:20.662134072] [17198] INFO Caméra camera_manager.cpp:325 libcamera v0.3.2+27-7330f29b [0:42:20.673362106] [17201] INFO RPI pisp.cpp:695 libpisp version v1.0.7 28196ed6edcf 29-08-2024 (16:33:32) [0:42:20.695581852] [17201] INFO RPI pisp.cpp:1154 Caméra enregistrée /base/axi/pcie@120000/rp1/i2c@80000/imx708@1a sur le périphérique CFE /dev/media2 et le périphérique FAI /dev/media0 utilisant la variante PiSP BCM2712_C0 Fenêtre d’aperçu X/EGL créée Post-traitement des lores demandés : 640×640 BGR888 Lecture de l’étape de post-traitement « hailo_yolo_inference » Lecture de l’étape de post-traitement « object_detect_draw_cv » Sélection du mode pour 2304:1296:12:P SRGGB10_CSI2P,1536×864/0 – Note : 3400 SRGGB10_CSI2P,2304×1296/0 – Note : 1000 SRGGB10_CSI2P,4608×2592/0 – Note : 1900 Configuration du flux ajustée [0:42:21.844252109] [17198] INFO Caméra camera.cpp:1197 configuration des flux : (0) 2304×1296-YUV420 (1) 640×640-BGR888 (2) 2304×1296-BGGR_PISP_COMP1 [0:42:21.844388530] [17201] INFO RPI pisp.cpp:1450 Capteur : /base/axi/pcie@120000/rp1/i2c@80000/imx708@1a – Format de capteur sélectionné : 2304×1296-SBGGR10_1X10 – Format CFE sélectionné : 2304×1296-PC1B [HailoRT] [warning] HEF a été compilé pour le périphérique Hailo8L, alors que le périphérique lui-même est Hailo8. Cela entraînera une baisse des performances. [HailoRT] [warning] HEF a été compilé pour le périphérique Hailo8L, alors que le périphérique lui-même est Hailo8. Cela entraînera une baisse des performances. |
Cela fonctionne enfin et le résultat est assez similaire à la démo MobileNet de la caméra Raspberry Pi AI, mais YOLOv8 sur l’AI HAT+ récupère également ma bouteille… Vous remarquerez également que j’ai ajouté un paramètre d’orientation car le support/boîtier de ma caméra nécessite que le logiciel faites pivoter l’image de 180 degrés.

Il existe également un exemple d’estimation de pose :
pi@raspberrypi:~ $ DISPLAY=:0 rpicam-hello -t 0 –post-process-file /usr/share/rpi-camera-assets/hailo_yolov8_pose.json –lores-width 640 –lores-height 640 – -rotation 180
[3:39:11.229348188] [334368] INFO Caméra camera_manager.cpp:325 libcamera v0.3.2+27-7330f29b
[3:39:11.237309251] [334371] INFO RPI pisp.cpp:695 libpisp version v1.0.7 28196ed6edcf 29-08-2024 (16:33:32)
[3:39:11.255766175] [334371] INFO RPI pisp.cpp:1154 Caméra enregistrée /base/axi/pcie@120000/rp1/i2c@80000/imx708@1a sur le périphérique CFE /dev/media2 et le périphérique FAI /dev/media0 utilisant la variante PiSP BCM2712_C0 Aperçu X/EGL réalisé fenêtre Post-traitement des lores demandés : 640×640 BGR888 Lecture étape de post-traitement « hailo_yolo_pose » Sélection du mode pour 2304:1296:12:P SRGGB10_CSI2P,1536×864/0 – Score : 3400 SRGGB10_CSI2P,2304×1296/0 – Score : 1000 SRGGB10_CSI2P,4608×2592/0 – Score : 1900 Configuration du flux ajusté
[3:39:12.423058392] [334368] INFO Caméra camera.cpp:1197 configuration des flux : (0) 2304×1296-YUV420 (1) 640×640-BGR888 (2) 2304×1296-RGGB_PISP_COMP1
[3:39:12.423195170] [334371] INFO RPI pisp.cpp:1450 Capteur : /base/axi/pcie@120000/rp1/i2c@80000/imx708@1a – Format de capteur sélectionné : 2304×1296-SRGGB10_1X10 – Format CFE sélectionné : 2304×1296-PC1R
[HailoRT] [warning] HEF a été compilé pour le périphérique Hailo8L, alors que le périphérique lui-même est Hailo8. Cela entraînera une baisse des performances.
[HailoRT] [warning] HEF a été compilé pour le périphérique Hailo8L, alors que le périphérique lui-même est Hailo8. Cela entraînera une baisse des performances.
|
pi@raspberrypi:~ $ DISPLAY=:0 rpicam-hello -t 0 –post-process-file /usr/share/rpi-camera-assets/hailo_yolov8_pose.json –lores-width 640 –lores-height 640 – -rotation 180 [3:39:11.229348188] [334368] INFO Caméra camera_manager.cpp:325 libcamera v0.3.2+27-7330f29b [3:39:11.237309251] [334371] INFO RPI pisp.cpp:695 libpisp version v1.0.7 28196ed6edcf 29-08-2024 (16:33:32) [3:39:11.255766175] [334371] INFO RPI pisp.cpp:1154 Caméra enregistrée /base/axi/pcie@120000/rp1/i2c@80000/imx708@1a sur le périphérique CFE /dev/media2 et le périphérique FAI /dev/media0 utilisant la variante PiSP BCM2712_C0 Fenêtre d’aperçu X/EGL créée Post-traitement des lores demandés : 640×640 BGR888 Lecture de l’étape de post-traitement « hailo_yolo_pose » Sélection du mode pour 2304:1296:12:P SRGGB10_CSI2P,1536×864/0 – Note : 3400 SRGGB10_CSI2P,2304×1296/0 – Note : 1000 SRGGB10_CSI2P,4608×2592/0 – Note : 1900 Configuration du flux ajustée [3:39:12.423058392] [334368] INFO Caméra camera.cpp:1197 configuration des flux : (0) 2304×1296-YUV420 (1) 640×640-BGR888 (2) 2304×1296-RGGB_PISP_COMP1 [3:39:12.423195170] [334371] INFO RPI pisp.cpp:1450 Capteur : /base/axi/pcie@120000/rp1/i2c@80000/imx708@1a – Format de capteur sélectionné : 2304×1296-SRGGB10_1X10 – Format CFE sélectionné : 2304×1296-PC1R [HailoRT] [warning] HEF a été compilé pour le périphérique Hailo8L, alors que le périphérique lui-même est Hailo8. Cela entraînera une baisse des performances. [HailoRT] [warning] HEF a été compilé pour le périphérique Hailo8L, alors que le périphérique lui-même est Hailo8. Cela entraînera une baisse des performances. |
C’est très similaire à la démo de la caméra AI, mais ajoute un suivi du nez et des yeux, et pratiquement aucun délai, il démarre immédiatement même la première fois.

Notez que tous les échantillons sont compilés pour l’accélérateur 13 TOPS Hailo-8L au lieu de la puce 26 TOPS Hailo-8, mais cela ne semble pas avoir d’impact sur les performances du point de vue de l’utilisateur. J’ai demandé à Raspberry Pi s’ils avaient une démo spécifique au 26 TOPS Hailo-8, et j’ai mis à jour cet article après l’avoir essayé.
La documentation Raspberry Pi AI HAT+ n’est pas aussi détaillée que celle de la caméra Raspberry Pi AI, et nous sommes redirigés vers le dépôt GitHub hailo-rpi5-examples pour plus de détails et vers la communauté Hailo pour obtenir de l’aide.
Démo d’estimation de pose de la caméra Raspberry Pi AI vs AI HAT +
Ma première impression est que la détection d’objets et l’estimation de pose fonctionnent de la même manière sur la caméra Raspberry Pi AI et sur l’AI HAT+ lorsqu’ils sont opérationnels.

La principale différence pour l’estimation de la pose est que la toute première exécution est lente à démarrer sur la caméra AI car le transfert du modèle prend du temps (près de deux minutes). Les exécutions suivantes sont rapides une fois que le modèle est dans le stockage de la caméra. Comme nous l’avons vu, l’estimation de pose Yolov8 exécutée sur AI HAT+ ajoute également le suivi des yeux et du nez, mais cela est probablement simplement dû au modèle différent utilisé au lieu d’une limitation du matériel.

Bien que la carte d’extension soit plus puissante sur le papier, la caméra Raspberry Pi AI et AI HAT+ peuvent exécuter des démos similaires. L’AI HAT+ s’appuie sur PCIe et ne fonctionnera qu’avec le Raspberry Pi 5 et le prochain module CM5, tandis que la caméra AI fonctionnera avec n’importe quel Raspberry Pi doté d’un connecteur MIPI CSI. Les démos se chargent plus lentement la première fois sur la caméra AI, mais à part cela, il n’y a pas beaucoup de différences. La documentation n’est pas toujours synchronisée avec les commandes réelles et j’ai dû parcourir les forums pour exécuter avec succès les démos. Les deux se vendent au même prix (70 $), mais notez que la plupart des applications nécessiteront un module de caméra Raspberry Pi avec AI HAT+.
Retrouvez l’histoire de Raspberry Pi dans cette vidéo :

-
Raspberry Pi® AI Hat+ (26 Tops) Platine d'extension
-
Raspberry Pi 5 AI HAT+ 13 TOPS
