Anda dapat menggunakan banyak proyek untuk memperkuat keterampilan Anda dalam visi komputer dan Python. Salah satu proyek ini adalah membuat penghitung push-up sederhana menggunakan Python. Anda dapat menulis program proyek ini dalam satu file.
Program akan mengambil input video atau input real-time dari kamera, melakukan estimasi pose manusia pada input tersebut, dan menghitung jumlah push-up yang dilakukan orang tersebut. Untuk melakukan estimasi pose manusia, program akan menggunakan model estimasi pose manusia MediaPipe.
Ini adalah model yang dikembangkan oleh Google yang melacak tiga puluh tiga landmark di tubuh manusia. Itu juga memprediksi segmentasi seluruh tubuh yang diwakilinya sebagai segmentasi dua kelas. Gambar berikut menampilkan semua landmark yang dapat diidentifikasi oleh model. Poin bernomor mengidentifikasi setiap landmark dan terhubung satu sama lain dengan garis.
Program penghitung push-up Anda akan memanfaatkan posisi bahu dan siku. Pada gambar di atas, landmark bahu adalah 11 dan 12 sedangkan landmark siku adalah 13 dan 14.
Menyiapkan Lingkungan Anda
Anda seharusnya sudah terbiasa dengan dasar-dasar Python. Buka IDE Python dan buat file Python baru. Jalankan perintah berikut di terminal untuk menginstal paket terkait di lingkungan Anda:
pip instal OpenCV-Python
Anda akan menggunakan OpenCV-Pythonto untuk mengambil input video dalam program Anda dan memprosesnya. Perpustakaan ini memberikan program Anda kemampuan visi komputer.
pip instal MediaPipe
Anda akan menggunakan MediaPipe untuk melakukan estimasi pose manusia pada input.
pip install imutils
Anda akan menggunakan imutils untuk mengubah ukuran input video ke lebar yang Anda inginkan.
Impor ketiga pustaka yang sebelumnya Anda instal di lingkungan Anda. Ini akan memungkinkan untuk menggunakan ketergantungan mereka dalam proyek.
impor cv2
impor imutil
impor mediapipe sebagai mp
Kemudian buat tiga objek MediaPipe dan inisialisasi menggunakan fungsi masing-masing. Anda akan menggunakan fungsi mp.solutions.drawing_utils untuk menggambar berbagai landmark pada input. mp.solutions.drawing_styles untuk mengubah gaya tampilan gambar tengara, dan mp.solutions.pose yang merupakan model yang akan Anda gunakan untuk mengidentifikasi tengara ini.
mp_draw = mp.solutions.drawing_utils
mp_draw_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose
Melakukan Estimasi Pose Manusia
Mendeteksi pose manusia adalah proses mengidentifikasi orientasi tubuhnya dengan mengidentifikasi dan mengklasifikasikan persendiannya.
Mendeklarasikan Variabel Anda
Deklarasikan variabel yang akan Anda gunakan untuk menyimpan jumlah push up, posisi bahu dan siku, serta input video.
menghitung = 0
posisi = Tidak ada
tutup = cv2.VideoCapture("v4.mp4")
Inisialisasi variabel posisi ke Tidak ada. Program akan memperbaruinya tergantung pada posisi siku dan bahu.
Panggil model estimasi pose MediaPipe yang akan mendeteksi pose manusia di input.
dengan mp_pose. Pose(
min_deteksi_kepercayaan = 0.7,
min_pelacakan_kepercayaan = 0.7) sebagai pose:
Inisialisasi keyakinan deteksi dan keyakinan pelacakan mewakili tingkat akurasi yang Anda perlukan dari model. 0,7 mirip dengan akurasi 70%. Anda dapat mengubahnya ke tingkat yang Anda inginkan.
Mengambil dan Memproses Input
Ambil input yang nantinya akan Anda berikan ke model estimasi pose. Ubah ukuran lebar masukan video menggunakan pustaka imutils. Ubah input dari BGR ke RGB karena MediaPipe hanya bekerja dengan input RGB. Terakhir, teruskan input yang dikonversi ke model estimasi pose manusia untuk mengidentifikasi landmark.
ketika cap.isOpened():
sukses, image=cap.read()jikabukan kesuksesan:
mencetak("kamera kosong")
merusak
image = imutils.resize (gambar, lebar=500)
gambar = cv2.cvtColor (cv2.flip (gambar, 1), cv2.COLOR_BGR2RGB)
hasil = pose.proses (gambar)
Setelah memproses input, Anda telah mengidentifikasi landmark pada input.
Menggambar Tengara Teridentifikasi pada Input
Buat daftar kosong yang akan menyimpan koordinat setiap landmark. Gunakan kelas draw_landmarks untuk menggambar titik pada setiap tengara dan hubungan di antaranya. Dengan menggunakan loop for, ulangi tengara dan simpan ID dan koordinat setiap tengara dalam daftar yang Anda buat. Gunakan kelas image.shape untuk menghitung lebar dan tinggi masukan video.
lmList = []
jika result.pose_landmarks:
# Menggambar titik tengara dan menghubungkannya
mp_draw.draw_landmarks (gambar, hasil.pose_landmarks,
mp_pose. POSE_CONNECTIONS)untuk id, im di dalam menghitung (result.pose_landmarks.landmark):
# Menemukan panjang dan lebar input video
h, w, _ = gambar.bentuk
# Menemukan koordinat titik tubuh yang tepat
X, Y = int (im.x * w), int (im.y * h)
lmList.append([id, X, Y])
ID adalah nomor yang diberikan pada tengara tertentu oleh model estimasi pose MediaPipe. Setelah mengidentifikasi pose manusia di input, Anda perlu menghitung jumlah push-up yang mereka lakukan jika ada.
Menghitung Jumlah Push-Up
Ciptakan kondisi yang memeriksa posisi bahu terhadap posisi siku. Ketika bahu orang yang di input lebih tinggi dari siku orang tersebut naik. Ketika bahu lebih rendah dari siku, orang tersebut jatuh. Anda memeriksanya dengan membandingkan ID penanda bahu dengan penanda siku.
# Memeriksa apakah ada landmark yang teridentifikasi
jika len (lmList) != 0:
# Kondisi yang mengidentifikasi posisi turun
jika (lmList[12][2] Dan lmList[11][2] >= lmList[14][2] Dan lmList[13][2]):
posisi = "turun"
# Kondisi yang mengidentifikasi posisi atas
jika (lmList[12][2] Dan lmList[11][2] <= lmList[14][2] Dan lmList[13][2])
Dan posisi == "turun":
posisi = "ke atas"
hitung +=1
Agar seseorang dapat menyelesaikan satu push-up penuh, mereka harus mengambil posisi turun dan kemudian kembali ke posisi atas. Setelah push-up lengkap, program dapat memperbarui hitungan per satu.
Menampilkan Keluaran
Anda perlu menampilkan jumlah push-up yang telah dihitung oleh program. Cetak nilai hitungan di terminal, setiap kali pengguna melakukan push-up lengkap. Terakhir, tampilkan output dari orang yang melakukan push-up dengan penanda yang digambar di tubuhnya.
cetak (hitung)
cv2.imshow("Penghitung push-up", cv2.flip (gambar, 1))
kunci = cv2.waitKey(1)# Program berhenti ketika q ditekan
jika kunci == ord('Q'):
merusak
tutup.rilis()
Outputnya akan terlihat seperti ini:
Anda harus mengamati pembaruan di terminal saat orang di keluaran melakukan push-up lengkap.
Perkuat Keterampilan Visi Komputer Anda
Visi komputer itu luas. Penghitung push-up adalah salah satu dari banyak proyek yang dapat Anda gunakan untuk mempraktikkan keterampilan visi komputer Anda. Cara terbaik untuk memperkuat keterampilan ini adalah dengan membangun lebih banyak proyek yang melibatkan visi komputer.
Semakin banyak proyek yang akan Anda bangun, semakin banyak yang akan Anda pelajari!