Icono del sitio AranaCorp

Detección de objetos con Yolo en Raspberry Pi

Es posible integrar modelos de reconocimiento de objetos como Yolo en una Raspberry Pi. Por supuesto, debido a su bajo rendimiento en comparación con los ordenadores, el rendimiento es menor en términos de reconocimiento en tiempo real. Sin embargo, es totalmente posible desarrollar algoritmos que utilicen el reconocimiento de objetos para aplicaciones que no requieran reconocimiento en tiempo real.

Hardware

Configuración

Para utilizar el Yolo, tendrá que instalar la versión de 64 bits de Raspberry Pi OS. Esta versión está disponible en el software Raspberry Pi Imager en el menú Raspberry Pi OS (otros).

Las versiones de Python compatibles son >=3.9

Las bibliotecas que deben instalarse son

pip install numpy imutils opencv-python
pip install ultralytics

Código de detección de objetos

El código para la detección de objetos con Yolo es el mismo que en un ordenador

Se inicializa el modelo Yolo (el archivo .pt se descarga al inicio del programa).

model = YOLO("yolov5nu.pt")

A continuación, abra un flujo de vídeo (o un archivo de vídeo o imagen)

vs = VideoStream(src=0, resolution=(640, 640)).start()
#video_cap = cv2.VideoCapture(0)

A continuación, el modelo se ejecuta en cada imagen

detections = model(frame)[0]

Por último, trazamos los resultados de la detección en la imagen y los mostramos.

#!/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()

Los resultados de este código muestran la detección de objetos a una velocidad aproximada de un fotograma por segundo (1 FPS, frente a los 10FPS de un ordenador).

Velocidad mejorada

Ejecutar un modelo de reconocimiento de objetos en una Raspberry Pi es todo un reto. Pero hay formas de mejorar los resultados.

Nuestro resultado básico se obtiene utilizando el modelo yolov5nu con detección a 1 fotograma por segundo (1 FPS).

Cambio de tarjetas

Si quieres resultados de alto rendimiento, lo mejor es recurrir a microordenadores diseñados para trabajar con inteligencia artificial. Entre otras cosas, estas tarjetas cuentan con microprocesadores adaptados a estos volúmenes de cálculos (por ejemplo, Nvidia Jetson).

Cambiar de idioma

El código aquí propuesto está escrito en Python, pero existen versiones lite escritas en C++ que aumentan considerablemente la velocidad de ejecución.

Reducir el número de imágenes procesadas

Es posible reducir la carga de procesamiento omitiendo imágenes.

if img_counter % 5 == 0 :
    detections = model(frame)[0]
img_counter+=1

Fuentes

Salir de la versión móvil