fbpixel
Étiquettes : , , ,

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)

raspberry-pi-imager-raspbian-os-64-bits Détection d'objet avec Yolo sur Raspberry Pi

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)

raspberry-pi-yolo-detection-boats Détection d'objet avec Yolo sur Raspberry Pi

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

Sources