شما می توانید از پروژه های زیادی برای تقویت مهارت های خود در بینایی کامپیوتر و پایتون استفاده کنید. یکی از این پروژه ها ایجاد یک فشار شمار ساده با استفاده از پایتون است. شما می توانید برنامه این پروژه را در یک فایل بنویسید.
شما می توانید از پروژه های زیادی برای تقویت مهارت های خود در بینایی کامپیوتر و پایتون استفاده کنید. یکی از این پروژه ها ایجاد یک فشار شمار ساده با استفاده از پایتون است. شما می توانید برنامه این پروژه را در یک فایل بنویسید.
این برنامه یک ورودی ویدیو یا ورودی بلادرنگ از یک دوربین می گیرد، تخمین ژست انسان را روی ورودی انجام می دهد و تعداد فشارهایی را که فرد انجام می دهد می شمارد. برای انجام تخمین ژست انسانی، برنامه از مدل تخمین ژست انسانی MediaPipe استفاده می کند.
مدل تخمین موقعیت انسانی MediaPipe چیست؟
این مدلی است که توسط گوگل ساخته شده است که سی و سه نقطه عطف در بدن انسان را ردیابی می کند. همچنین یک تقسیم بندی تمام بدن را پیش بینی می کند که به عنوان یک تقسیم بندی دو کلاسه نشان می دهد. تصویر زیر تمام نشانه هایی را که مدل قادر به شناسایی آنها است نشان می دهد. نقاط شماره گذاری شده هر نقطه عطف را مشخص می کنند و با خطوط به یکدیگر متصل می شوند.
برنامه شمارنده فشار به بالا از موقعیت شانه ها و آرنج ها استفاده می کند. در تصویر بالا، نشانه های شانه 11 و 12 و نشانه های آرنج 13 و 14 هستند.
تنظیم محیط
از قبل باید با اصول پایتون آشنا باشید. یک IDE پایتون باز کنید و یک فایل پایتون جدید بسازید. دستور زیر را در ترمینال اجرا کنید تا بسته های مربوطه را روی محیط خود نصب کنید:
pip install OpenCV-Python
شما از OpenCV-Python برای گرفتن ورودی ویدیو در برنامه خود و پردازش آن استفاده خواهید کرد. این کتابخانه به برنامه شما قابلیت های بینایی کامپیوتری را می دهد.
pip install MediaPipe
شما از MediaPipe برای انجام تخمین ژست انسانی در ورودی استفاده خواهید کرد.
pip install imutils
برای تغییر اندازه ورودی ویدیو به عرض دلخواه خود از imutils استفاده خواهید کرد.
واردات و مقداردهی اولیه MediaPipe
سه کتابخانه ای را که قبلاً روی محیط خود نصب کرده اید وارد کنید. این امکان استفاده از وابستگی های آنها را در پروژه فراهم می کند.
import cv2
import imutils
import mediapipe as mp
سپس سه شی MediaPipe ایجاد کنید و با استفاده از توابع مربوطه آنها را مقداردهی اولیه کنید. شما از تابع mp.solutions.drawing_utils برای ترسیم نشانه های مختلف روی ورودی استفاده خواهید کرد. mp.solutions.drawing_styles برای تغییر سبک هایی که در آن نقاشی های نشانه ها ظاهر می شوند، و mp.solutions.pose که مدلی است که برای شناسایی این نشانه ها استفاده خواهید کرد.
mp_draw = mp.solutions.drawing_utils
mp_draw_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose
انجام تخمین وضعیت انسان
تشخیص ژست یک انسان فرآیند شناسایی جهت گیری بدن آنها از طریق شناسایی و طبقه بندی مفاصل است.
اعلان متغیرهای شما
متغیرهایی را که برای ذخیره کردن تعداد فشارها، موقعیت شانهها و آرنجها و ورودی ویدیو استفاده میکنید، اعلام کنید.
count = 0
position = None
cap = cv2.VideoCapture("v4.mp4")
متغیر موقعیت را به None راه اندازی کنید. این برنامه بسته به موقعیت آرنج و شانه ها آن را به روز می کند.
فراخوانی مدل تخمین موقعیت MediaPipe
مدل تخمین ژست MediaPipe را فراخوانی کنید تا ژست انسان را در ورودی تشخیص دهد.
with mp_pose.Pose(
min_detection_confidence = 0.7,
min_tracking_confidence = 0.7) as pose:
مقداردهی اولیه اطمینان تشخیص و اطمینان ردیابی نشان دهنده سطح دقتی است که شما از مدل نیاز دارید. 0.7 مشابه دقت 70 درصد است. می توانید آن را به سطح دلخواه خود تغییر دهید.
گرفتن و پیش پردازش ورودی
ورودی را که بعداً به مدل تخمین پوز ارسال می کنید، بگیرید. اندازه عرض ورودی ویدیو را با استفاده از کتابخانه imutils تغییر دهید. ورودی را از BGR به RGB تبدیل کنید زیرا MediaPipe فقط با ورودی RGB کار می کند. در نهایت، ورودی تبدیل شده را به مدل تخمین وضعیت انسانی برای شناسایی نشانهها ارسال کنید.
while cap.isOpened():
success, image=cap.read()
if not success:
print("empty camera")
break
image = imutils.resize(image, width=500)
image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
result = pose.process(image)
پس از پردازش ورودی، نشانه های روی ورودی را شناسایی کرده اید.
ترسیم نشانه های شناسایی شده روی ورودی
یک لیست خالی ایجاد کنید که مختصات هر نشانه را ذخیره کند. از کلاس draw_landmarks برای ترسیم یک نقطه روی هر نشانه و ارتباط بین آنها استفاده کنید. با استفاده از یک حلقه for، روی نشانه ها تکرار کنید و شناسه و مختصات هر نشانه را در لیستی که ایجاد کرده اید ذخیره کنید. از کلاس image.shape برای محاسبه عرض و ارتفاع ورودی ویدیو استفاده کنید.
lmList = []
if result.pose_landmarks:
# Draws the landmarks' points and connects them
mp_draw.draw_landmarks(image, result.pose_landmarks,
mp_pose.POSE_CONNECTIONS)
for id, im in enumerate(result.pose_landmarks.landmark):
# Finding the length and width of the video input
h, w, _ = image.shape
# Finding the exact coordinates of the body points
X, Y = int(im.x * w), int(im.y * h)
lmList.append([id, X, Y])
ID عددی است که توسط مدل تخمین پوز MediaPipe به یک نقطه عطف خاص داده می شود. پس از شناسایی ژست انسان در ورودی، باید تعداد فشارهایی را که در صورت وجود انجام می دهند، بشمارید.
شمارش تعداد پوش آپ ها
شرایطی ایجاد کنید که موقعیت شانه ها را در مقابل موقعیت آرنج ها بررسی کند. زمانی که شانه های فرد در ورودی بالاتر از آرنج باشد، فرد به سمت بالا قرار می گیرد. زمانی که شانه ها پایین تر از آرنج باشد، فرد به سمت پایین است. این را با مقایسه شناسه نشانه های شانه ها با نشانه های آرنج بررسی می کنید.
# Checking whether there are any identified landmarks
if len(lmList) != 0:
# Condition that identifies the down position
if (lmList[12][2] and lmList[11][2] >= lmList[14][2] and lmList[13][2]):
position = "down"
# Condition that identifies the up position
if (lmList[12][2] and lmList[11][2] <= lmList[14][2] and lmList[13][2])
and position == "down":
position = "up"
count +=1
برای اینکه یک فرد بتواند یک فشار کامل را انجام دهد، باید حالت پایین را به خود بگیرد و سپس به حالت بالا بازگردد. پس از یک فشار کامل، برنامه می تواند تعداد را یک بار به روز کند.
نمایش خروجی
باید تعداد فشارهایی را که برنامه شمارش کرده است نمایش دهید. هر بار که کاربر یک فشار کامل انجام می دهد، مقدار شمارش را روی ترمینال چاپ کنید. در نهایت، خروجی فردی را که در حال انجام تمرینات فشاری است، با نشانه های ترسیم شده روی بدنش نمایش دهید.
print(count)
cv2.imshow("Push-up counter", cv2.flip(image, 1))
key = cv2.waitKey(1)
# Program terminates when q is pressed
if key == ord('q'):
break
cap.release()
خروجی باید چیزی شبیه به این باشد:
شما باید یک به روز رسانی را در ترمینال مشاهده کنید زیرا شخصی که در خروجی قرار دارد یک فشار کامل انجام می دهد.
مهارت های بینایی کامپیوتر خود را تقویت کنید
دید کامپیوتری گسترده است. شمارنده فشاری یکی از پروژههایی است که میتوانید از آن برای عملی کردن مهارتهای بینایی رایانهتان استفاده کنید. بهترین راه برای تقویت این مهارت ها، ساختن پروژه های بیشتر است که شامل بینایی کامپیوتری می شود.
هرچه پروژه های بیشتری بسازید، بیشتر یاد خواهید گرفت!