Lesere som deg er med på å støtte MUO. Når du foretar et kjøp ved å bruke lenker på nettstedet vårt, kan vi tjene en tilknyttet provisjon. Les mer.

Du kan bruke mange prosjekter for å styrke ferdighetene dine innen datasyn og Python. Et av disse prosjektene er å lage en enkel push-up-teller ved hjelp av Python. Du kan skrive dette prosjektets program i en enkelt fil.

Programmet vil ta en videoinngang eller en sanntidsinngang fra et kamera, utføre menneskelig positur på inngangen, og telle antall push-ups personen gjør. For å utføre estimering av menneskelig positur, vil programmet bruke MediaPipe-modellen for estimering av menneskelig positur.

Det er en modell utviklet av Google som sporer trettitre landemerker på menneskekroppen. Den forutsier også en helkroppssegmentering som den representerer som en toklasses segmentering. Følgende bilde viser alle landemerkene som modellen er i stand til å identifisere. Nummererte punkter identifiserer hvert landemerke og kobles til hverandre med linjer.

Bildekreditt: MediaPipe/GitHub

Ditt push-up counter-program vil bruke posisjonene til skuldrene og albuene. På bildet ovenfor er skulder-landemerkene 11 og 12, mens albue-landemerkene er 13 og 14.

Sette opp miljøet ditt

Du bør allerede være kjent med det grunnleggende om Python. Åpne en Python IDE og lag en ny Python-fil. Kjør følgende kommando på terminalen for å installere de respektive pakkene på miljøet ditt:

pip installer OpenCV-Python

Du vil bruke OpenCV-Python for å ta videoinngangen i programmet og behandle den. Dette biblioteket gir programmet ditt datasynsmuligheter.

pip installer MediaPipe

Du vil bruke MediaPipe til å utføre estimering av menneskelig positur på inngangen.

pip install imutils

Du vil bruke imutils for å endre størrelsen på videoinngangen til ønsket bredde.

Importer de tre bibliotekene du tidligere installerte på miljøet ditt. Dette vil gjøre det mulig å bruke deres avhengigheter i prosjektet.

import cv2
import imutils
import mediapipe som smp

Lag deretter tre MediaPipe-objekter og initialiser dem ved hjelp av de respektive funksjonene. Du vil bruke mp.solutions.drawing_utilsfunction for å tegne de ulike landemerkene på inngangen. mp.solutions.drawing_styles for å endre stilene som tegningene av landemerkene vises i, og mp.solutions.pose som er modellen du vil bruke for å identifisere disse landemerkene.

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

Utføre menneskelig positur-estimering

Å oppdage posituren til et menneske er prosessen med å identifisere deres kroppsorientering ved å identifisere og klassifisere leddene deres.

Erklære dine variabler

Angi variablene du vil bruke til å lagre antall pushups, posisjonen til skuldre og albuer og videoinngangen.

telle = 0
posisjon = Ingen
cap = cv2.VideoCapture("v4.mp4")

Initialiser posisjonsvariabelen til Ingen. Programmet vil oppdatere det avhengig av plasseringen av albuene og skuldrene.

Ring MediaPipe positur-estimeringsmodellen som vil oppdage den menneskelige posituren i inngangen.

med mp_pose. Pose(
min_detection_confidence = 0.7,
min_tracking_confidence = 0.7) som positur:

Initialiseringene av deteksjonssikkerheten og sporingssikkerheten representerer nivået av nøyaktighet du trenger fra modellen. 0,7 tilsvarer 70 % nøyaktighet. Du kan endre det til ønsket nivå.

Ta og forhåndsbehandle inndataene

Ta innspillet som du senere vil overføre til positur-estimeringsmodellen. Endre størrelsen på bredden på videoinngangen ved å bruke imutils-biblioteket. Konverter inngangen fra BGR til RGB da MediaPipe kun fungerer med RGB-inngang. Send til slutt den konverterte inngangen til den menneskelige positur-estimeringsmodellen for å identifisere landemerkene.

samtidig som cap.isOpened():
suksess, image=cap.read()

hvisikke suksess:
skrive ut("tomt kamera")
gå i stykker

image = imutils.resize (bilde, bredde=500)
image = cv2.cvtColor (cv2.flip (bilde, 1), cv2.COLOR_BGR2RGB)
resultat = pose.process (bilde)

Etter å ha behandlet innspillet, har du identifisert landemerkene på innspillet.

Tegn de identifiserte landemerkene på inngangen

Lag en tom liste som vil lagre koordinatene til hvert landemerke. Bruk draw_landmarks-klassen til å tegne en prikk på hvert landemerke og forbindelsene mellom dem. Bruk en for-løkke, iterer over landemerkene og lagre ID og koordinater for hvert landemerke i listen du opprettet. Bruk klassen image.shape for å beregne bredden og høyden på videoinngangen.

lmList = []

hvis result.pose_landmarks:
# Tegner landemerkenes punkter og kobler dem sammen
mp_draw.draw_landmarks (image, result.pose_landmarks,
mp_pose. POSE_CONNECTIONS)

til id, im i enumerate (result.pose_landmarks.landmark):
# Finne lengden og bredden på videoinngangen
h, w, _ = bilde.form

# Finne de nøyaktige koordinatene til kroppspunktene
X, Y = int (im.x * w), int (im.y * h)
lmList.append([id, X, Y])

ID-en er nummeret som gis til et spesifikt landemerke av MediaPipe-posisjonsestimatmodellen. Etter å ha identifisert posituren til mennesket i inngangen, må du telle antall push-ups de gjør hvis noen.

Å telle antall push-ups

Lag en tilstand som kontrollerer posisjonen til skuldrene mot posisjonen til albuene. Når skuldrene til personen i inngangen er høyere enn albuene er personen oppe. Når skuldrene er lavere enn albuene, er personen nede. Du sjekker dette ved å sammenligne ID-ene til skuldrenes landemerker med de til albuenes landemerker.

# Sjekker om det er identifiserte landemerker
hvis len (lmList) != 0:
# Tilstand som identifiserer nedposisjonen
hvis (lmList[12][2] og lmList[11][2] >= lmList[14][2] og lmList[13][2]):
posisjon = "ned"

# Tilstand som identifiserer oppposisjonen
hvis (lmList[12][2] og lmList[11][2] <= lmList[14][2] og lmList[13][2])
og posisjon == "ned":
posisjon = "opp"
telle +=1

For at en person skal fullføre en hel push-up, må de innta en nedposisjon og deretter komme tilbake til oppposisjonen. Etter en fullstendig push-up kan programmet oppdatere tellingen med én.

Viser utdata

Du må vise antall push-ups programmet har talt. Skriv ut verdien av tellingen på terminalen, hver gang brukeren gjør en fullstendig push-up. Vis til slutt resultatet av personen som gjør push-ups med landemerkene tegnet på kroppen.

 skrive ut (telle)

cv2.imshow("Push-up teller", cv2.flip (bilde, 1))
nøkkel = cv2.waitKey(1)

# Programmet avsluttes når q trykkes
hvis nøkkel == ord('q'):
gå i stykker

cap.release()

Utgangen skal se omtrent slik ut:

Du bør observere en oppdatering på terminalen ettersom personen på utgangen gjør en fullstendig push-up.

Styrk datasynsferdighetene dine

Datasyn er bredt. En push-up-teller er et av de mange prosjektene du kan bruke for å sette dine datasynsferdigheter ut i livet. Den beste måten å styrke disse ferdighetene på er å bygge flere prosjekter som involverer datasyn.

Jo flere prosjekter du skal bygge, jo mer lærer du!