I lettori come te aiutano a sostenere MUO. Quando effettui un acquisto utilizzando i link sul nostro sito, potremmo guadagnare una commissione di affiliazione. Per saperne di più.

Puoi utilizzare molti progetti per rafforzare le tue abilità in visione artificiale e Python. Uno di questi progetti sta creando un semplice contatore push-up usando Python. Puoi scrivere il programma di questo progetto in un singolo file.

Il programma prenderà un input video o un input in tempo reale da una telecamera, eseguirà la stima della posa umana sull'input e conterà il numero di flessioni che la persona sta facendo. Per eseguire la stima della posa umana, il programma utilizzerà il modello di stima della posa umana MediaPipe.

È un modello sviluppato da Google che traccia trentatré punti di riferimento sul corpo umano. Predice anche una segmentazione di tutto il corpo che rappresenta come una segmentazione a due classi. L'immagine seguente mostra tutti i punti di riferimento che il modello è in grado di identificare. I punti numerati identificano ogni punto di riferimento e si collegano tra loro con linee.

instagram viewer

Immagine di credito: MediaPipe/Git Hub

Il tuo programma di conteggio delle flessioni utilizzerà le posizioni delle spalle e dei gomiti. Nell'immagine sopra, i punti di riferimento della spalla sono 11 e 12 mentre i punti di riferimento del gomito sono 13 e 14.

Configurazione dell'ambiente

Dovresti già avere familiarità con le basi di Python. Apri un IDE Python e crea un nuovo file Python. Esegui il seguente comando sul terminale per installare i rispettivi pacchetti nel tuo ambiente:

pip installa OpenCV-Python

Utilizzerai OpenCV-Python per prendere l'input video nel tuo programma ed elaborarlo. Questa libreria fornisce il tuo programma capacità di visione artificiale.

pip installa MediaPipe

Utilizzerai MediaPipe per eseguire la stima della posa umana sull'input.

pip installa imutils

Utilizzerai imutils per ridimensionare l'input video alla larghezza desiderata.

Importa le tre librerie che hai precedentemente installato nel tuo ambiente. Ciò consentirà di utilizzare le loro dipendenze nel progetto.

importare cv2
importare imutils
importare mediapipe COME mp

Quindi creare tre oggetti MediaPipe e inizializzarli utilizzando le rispettive funzioni. Utilizzerai mp.solutions.drawing_utilsfunction per disegnare i vari punti di riferimento sull'input. mp.solutions.drawing_styles per modificare gli stili in cui vengono visualizzati i disegni dei punti di riferimento e mp.solutions.pose che è il modello che utilizzerai per identificare questi punti di riferimento.

mp_draw = mp.solutions.drawing_utils
mp_draw_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose

Esecuzione della stima della posa umana

Rilevare la posa di un essere umano è il processo di identificazione del loro orientamento corporeo identificando e classificando le loro articolazioni.

Dichiarare le tue variabili

Dichiara le variabili che utilizzerai per memorizzare il numero di flessioni, la posizione delle spalle e dei gomiti e l'input video.

contare = 0
posizione = Nessuno
cap = cv2.VideoCapture("v4.mp4")

Inizializza la variabile di posizione su None. Il programma lo aggiornerà in base alla posizione dei gomiti e delle spalle.

Chiama il modello di stima della posa di MediaPipe che rileverà la posa umana nell'input.

con mp_pose. Posa(
min_detection_confidence = 0.7,
min_tracking_confidence = 0.7) COME posa:

Le inizializzazioni dell'attendibilità del rilevamento e dell'attendibilità del tracciamento rappresentano il livello di accuratezza necessario dal modello. 0,7 è simile al 70% di precisione. Puoi cambiarlo al livello desiderato.

Prendere e preelaborare l'input

Prendi l'input che in seguito passerai al modello di stima della posa. Ridimensiona la larghezza dell'input video utilizzando la libreria imutils. Converti l'input da BGR a RGB poiché MediaPipe funziona solo con l'input RGB. Infine, passa l'input convertito al modello di stima della posa umana per identificare i punti di riferimento.

Mentre cap.isOpened():
successo, image=cap.read()

Senon successo:
stampa("fotocamera vuota")
rottura

immagine = imutils.resize (immagine, larghezza=500)
immagine = cv2.cvtColor (cv2.flip (immagine, 1), cv2.COLOR_BGR2RGB)
risultato = pose.process (immagine)

Dopo aver elaborato l'input, hai identificato i punti di riferimento sull'input.

Disegnare i punti di riferimento identificati sull'input

Crea un elenco vuoto che memorizzerà le coordinate di ciascun punto di riferimento. Usa la classe draw_landmarks per disegnare un punto su ogni punto di riferimento e le connessioni tra di loro. Usando un ciclo for, itera sui punti di riferimento e memorizza l'ID e le coordinate di ogni punto di riferimento nell'elenco che hai creato. Usa la classe image.shape per calcolare la larghezza e l'altezza dell'input video.

lmLista = []

Se risultato.pose_landmarks:
# Disegna i punti di riferimento e li collega
mp_draw.draw_landmarks (immagine, risultato.pose_landmarks,
mp_pose. POSE_CONNESSIONI)

per id, im In enumerare (result.pose_landmarks.landmark):
# Trovare la lunghezza e la larghezza dell'ingresso video
h, w, _ = immagine.forma

# Trovare le coordinate esatte dei punti del corpo
X, Y = int (im.x * w), int (im.y * h)
lmList.append([id, X, Y])

L'ID è il numero assegnato a un punto di riferimento specifico dal modello di stima della posa di MediaPipe. Dopo aver identificato la posa dell'essere umano nell'input, è necessario contare il numero di flessioni che stanno facendo, se ce ne sono.

Contare il numero di flessioni

Crea una condizione che controlli la posizione delle spalle contro la posizione dei gomiti. Quando le spalle della persona nell'input sono più alte dei gomiti, la persona è in alto. Quando le spalle sono più basse dei gomiti, la persona è a terra. Puoi verificarlo confrontando gli ID dei punti di riferimento delle spalle con quelli dei punti di riferimento dei gomiti.

# Verifica della presenza di punti di riferimento identificati
Se len (lmLista) != 0:
# Condizione che identifica la posizione in basso
Se (elencolm[12][2] E lmList[11][2] >= lmList[14][2] E lmList[13][2]):
posizione = "giù"

# Condizione che identifica la posizione in alto
Se (elencolm[12][2] E lmList[11][2] <= lmList[14][2] E lmList[13][2])
E posizione == "giù":
posizione = "su"
contare +=1

Affinché una persona possa completare un push-up completo, deve assumere una posizione abbassata e poi tornare alla posizione sollevata. Dopo un completo push-up, il programma può aggiornare il conteggio di uno.

Visualizzazione dell'output

È necessario visualizzare il numero di flessioni che il programma ha contato. Stampa il valore del conteggio sul terminale, ogni volta che l'utente esegue un push-up completo. Infine, mostra l'output della persona che fa le flessioni con i punti di riferimento disegnati sul proprio corpo.

 stampare (contare)

cv2.imshow("Contatore push-up", cv2.flip (immagine, 1))
chiave = cv2.waitKey(1)

# Il programma termina quando si preme q
Se chiave == ord('Q'):
rottura

cap.rilascio()

L'output dovrebbe essere simile a questo:

Dovresti osservare un aggiornamento sul terminale mentre la persona in uscita esegue un completo push-up.

Rafforza le tue capacità di visione artificiale

La visione artificiale è ampia. Un contatore push-up è uno dei tanti progetti che puoi utilizzare per mettere in pratica le tue capacità di visione artificiale. Il modo migliore per rafforzare queste abilità è costruire più progetti che coinvolgono la visione artificiale.

Più progetti costruirai, più imparerai!