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
- Raspberry Pi 4
- Pantalla+ratón+teclado
- Tarjeta SD con OS Raspbian 64bits
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