Il est possible d’embarquer des modèles de reconnaissance d’objets, comme Yolo, sur un Raspberry Pi. Bien sûr de par ses faibles performances comparer à des ordinateurs, les performances sont moindre en terme de reconnaissance en temps réel. Il est par contre tout à fait possible de de développer des algorithmes utilisant la reconnaissance d’objet pour des applications ne nécessitant pas de temps réel.
Matériel
- Raspberry Pi 4
- Écran+souris+clavier
- Carte SD avec OS Raspbian 64bits
Configuration
Pour utiliser la Yolo, il vous faudra installer la version 64bits de Raspberry Pi OS. Cette version est disponible dans le logiciel Raspberry Pi Imager dans le menu Raspberry Pi OS (others)
Les versions de Python compatibles sont les versions >=3.9
Les librairies à installer sont les suivantes
pip install numpy imutils opencv-python
pip install ultralytics
Code pour la détection d’objet
Le code pour la détection d’objet avec Yolo est le même que sur un ordinateur
On initialise le modèle Yolo (le fichier de poids .pt est télécharger au début de programme)
model = YOLO("yolov5nu.pt")
Puis on ouvre un flux vidéo (où un fichier vidéo ou une image)
vs = VideoStream(src=0, resolution=(640, 640)).start()
#video_cap = cv2.VideoCapture(0)
On exécute ensuite le modèle sur chaque image
detections = model(frame)[0]
Enfin nous traçons les résultats de la détections sur l’image et l’affichons
#!/usr/bin/env python # -*- coding: utf-8 -*- # import datetime from ultralytics import YOLO import cv2 from imutils.video import VideoStream import screeninfo # define some constants CONFIDENCE_THRESHOLD = 0.7 GREEN = (0, 255, 0) model = YOLO("yolov5nu.pt") #model = YOLO("./runs/detect/yolov8n_v8_50e2/weights/best.pt") # test trained model print(model.names) # initialize the video capture object vs = VideoStream(src=0, resolution=(640, 640)).start() #video_cap = cv2.VideoCapture(0) #video_cap = cv2.VideoCapture("datasets\\Splash - 23011.mp4") while True: # start time to compute the fps start = datetime.datetime.now() frame = vs.read(); ret=True #ret, frame = video_cap.read() # if there are no more frames to process, break out of the loop if not ret: break # run the YOLO model on the frame detections = model(frame)[0] # loop over the detections #for data in detections.boxes.data.tolist(): for box in detections.boxes: #extract the label name label=model.names.get(box.cls.item()) # extract the confidence associated with the detection data=box.data.tolist()[0] confidence = data[4] # filter out weak detections if float(confidence) < CONFIDENCE_THRESHOLD: continue # draw the bounding box on the frame xmin, ymin, xmax, ymax = int(data[0]), int(data[1]), int(data[2]), int(data[3]) cv2.rectangle(frame, (xmin, ymin) , (xmax, ymax), GREEN, 2) #draw confidence and label y = ymin - 15 if ymin - 15 > 15 else ymin + 15 cv2.putText(frame, "{} {:.1f}%".format(label,float(confidence*100)), (xmin, y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, GREEN, 2) # end time to compute the fps end = datetime.datetime.now() # show the time it took to process 1 frame total = (end - start).total_seconds() print(f"Time to process 1 frame: {total * 1000:.0f} milliseconds") # calculate the frame per second and draw it on the frame fps = f"FPS: {1 / total:.2f}" cv2.putText(frame, fps, (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 0, 255), 2) # show the frame to our screen cv2.imshow("Frame", frame) #press key Q to exit if cv2.waitKey(1) == ord("q"): break #video_cap.release() vs.stop() cv2.destroyAllWindows()
Les résultats de ce code montre une détection d’objet à une vitesse avoisinant une image par seconde environ (1 FPS, comparé à 10FPS pour un ordinateur)
Amélioration de la rapidité
Faire tourner un modèle de reconnaissance d’objet sur un Raspberry Pi est un véritable défi. Il existe des solutions pour améliorer ces résultats.
Notre résultat de base est obtenu avec le modèle yolov5nu avec une détection à 1 image par seconde (1 FPS)
Changer de carte
Si vous souhaitez des résultat performant mieux vaut vous tourner vers des microordinateurs prévus pour travailler avec l’intelligence artificielle. C’est cartes possèdent entre autre des microprocesseurs adaptés à ces volumes de calculs (ex; Nvidia Jetson)
Changer de langage
Le code proposé ici est écrit en Python, il existe des versions lite écrite en C++ qui permette d’augmenter considérablement la vitesse d’exécution.
Réduire le nombre d’image traité
Il est possible de réduire la charge de calcul en sautant des images.
if img_counter % 5 == 0 : detections = model(frame)[0] img_counter+=1