fbpixel
Etiquetas: , , ,
0
(0)

É possível incorporar modelos de reconhecimento de objectos como o Yolo num Raspberry Pi. Naturalmente, devido ao seu baixo desempenho em comparação com os computadores, o desempenho é inferior em termos de reconhecimento em tempo real. No entanto, é perfeitamente possível desenvolver algoritmos que utilizem o reconhecimento de objectos para aplicações que não necessitem de reconhecimento em tempo real.

Hardware

  • Raspberry Pi 4
  • Ecrã+rato+teclado
  • Cartão SD com o sistema operativo Raspbian 64bits

Configuração

Para utilizar o Yolo, é necessário instalar a versão de 64 bits do Raspberry Pi OS. Esta versão está disponível no software Raspberry Pi Imager, no menu Raspberry Pi OS (outros).

As versões compatíveis do Python são >=3.9

As bibliotecas a serem instaladas são

pip install numpy imutils opencv-python
pip install ultralytics

Código de deteção de objectos

O código para a deteção de objectos com o Yolo é o mesmo que num computador

O modelo Yolo é inicializado (o ficheiro .pt é descarregado no início do programa).

model = YOLO("yolov5nu.pt")

Em seguida, abra um fluxo de vídeo (ou um ficheiro de vídeo ou imagem)

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

O modelo é então executado em cada imagem

detections = model(frame)[0]

Por fim, traçamos os resultados da deteção na imagem e apresentamo-los.

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

Os resultados deste código mostram a deteção de objectos a uma velocidade de cerca de um fotograma por segundo (1 FPS, em comparação com 10FPS para um computador).

Velocidade melhorada

Executar um modelo de reconhecimento de objectos num Raspberry Pi é um verdadeiro desafio. Mas há formas de melhorar os resultados.

O nosso resultado básico é obtido utilizando o modelo yolov5nu com deteção a 1 fotograma por segundo (1 FPS).

Mudança de cartões

Para obter resultados de alto desempenho, é preferível recorrer a microcomputadores concebidos para trabalhar com inteligência artificial. Entre outras coisas, estas placas têm microprocessadores adaptados a estes volumes de cálculos (por exemplo, Nvidia Jetson).

Alterar a língua

O código aqui proposto é escrito em Python, mas existem versões lite escritas em C++ que aumentam consideravelmente a velocidade de execução.

Reduzir o número de imagens processadas

É possível reduzir a carga de processamento saltando imagens.

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

Fontes

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?