MediaPipe: دليل شامل للرؤية الحاسوبية
اكتشف كيفية استخدام MediaPipe لاكتشاف الوضعية والوجه واليدين وغير ذلك.
I
InSkillCoach
· دقيقة
MediaPipe: دليل شامل للرؤية الحاسوبية
MediaPipe مكتبة مفتوحة المصدر طورتها Google، وهي تسهّل إنشاء تطبيقات الرؤية الحاسوبية ومعالجة الوسائط المتعددة.
1. التثبيت والإعداد
# تثبيت الاعتماديات
pip install mediapipe opencv-python numpy
# استيراد المكتبات اللازمة
import mediapipe as mp
import cv2
import numpy as np
2. اكتشاف الوضعية (Pose)
2.1 الإعداد الأساسي
# تهيئة MediaPipe Pose
mp_pose = mp.solutions.pose
pose = mp_pose.Pose(
min_detection_confidence=0.5,
min_tracking_confidence=0.5
)
mp_draw = mp.solutions.drawing_utils
def detect_pose(image):
# التحويل إلى RGB
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# اكتشاف الوضعية
results = pose.process(image_rgb)
# رسم نقاط المرجع
if results.pose_landmarks:
mp_draw.draw_landmarks(
image,
results.pose_landmarks,
mp_pose.POSE_CONNECTIONS
)
return image
2.2 تحليل الحركات
def analyze_movement(landmarks):
# استخراج النقاط الرئيسية
left_shoulder = np.array([
landmarks.landmark[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x,
landmarks.landmark[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y
])
right_shoulder = np.array([
landmarks.landmark[mp_pose.PoseLandmark.RIGHT_SHOULDER.value].x,
landmarks.landmark[mp_pose.PoseLandmark.RIGHT_SHOULDER.value].y
])
# حساب زاوية الكتفين
shoulder_angle = np.arctan2(
right_shoulder[1] - left_shoulder[1],
right_shoulder[0] - left_shoulder[0]
)
return shoulder_angle
3. اكتشاف الوجه
3.1 الإعداد
# تهيئة MediaPipe Face Detection
mp_face_detection = mp.solutions.face_detection
face_detection = mp_face_detection.FaceDetection(
min_detection_confidence=0.5
)
def detect_faces(image):
# التحويل إلى RGB
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# اكتشاف الوجوه
results = face_detection.process(image_rgb)
# رسم مربعات الاكتشاف
if results.detections:
for detection in results.detections:
bbox = detection.location_data.relative_bounding_box
h, w, _ = image.shape
x = int(bbox.xmin * w)
y = int(bbox.ymin * h)
width = int(bbox.width * w)
height = int(bbox.height * h)
cv2.rectangle(image, (x, y), (x + width, y + height), (0, 255, 0), 2)
return image
3.2 تحليل التعابير
def analyze_expression(landmarks):
# استخراج نقاط الوجه
left_eye = np.array([
landmarks.landmark[mp_face_detection.FaceLandmark.LEFT_EYE.value].x,
landmarks.landmark[mp_face_detection.FaceLandmark.LEFT_EYE.value].y
])
right_eye = np.array([
landmarks.landmark[mp_face_detection.FaceLandmark.RIGHT_EYE.value].x,
landmarks.landmark[mp_face_detection.FaceLandmark.RIGHT_EYE.value].y
])
# حساب المسافة بين العينين
eye_distance = np.linalg.norm(right_eye - left_eye)
return eye_distance
4. اكتشاف اليدين
4.1 الإعداد
# تهيئة MediaPipe Hands
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(
min_detection_confidence=0.7,
min_tracking_confidence=0.5
)
def detect_hands(image):
# التحويل إلى RGB
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# اكتشاف اليدين
results = hands.process(image_rgb)
# رسم نقاط المرجع
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
mp_draw.draw_landmarks(
image,
hand_landmarks,
mp_hands.HAND_CONNECTIONS
)
return image
4.2 التعرف على الإيماءات
def recognize_gesture(hand_landmarks):
# استخراج نقاط الأصابع
thumb_tip = np.array([
hand_landmarks.landmark[mp_hands.HandLandmark.THUMB_TIP.value].x,
hand_landmarks.landmark[mp_hands.HandLandmark.THUMB_TIP.value].y
])
index_tip = np.array([
hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP.value].x,
hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP.value].y
])
# حساب المسافة بين الإبهام والسبابة
pinch_distance = np.linalg.norm(thumb_tip - index_tip)
return pinch_distance
5. تطبيق متكامل
def main():
# تهيئة الكاميرا
cap = cv2.VideoCapture(0)
while cap.isOpened():
success, image = cap.read()
if not success:
continue
# اكتشاف الوضعية
image = detect_pose(image)
# اكتشاف الوجه
image = detect_faces(image)
# اكتشاف اليدين
image = detect_hands(image)
# العرض
cv2.imshow('MediaPipe Demo', image)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
main()
6. تحسين الأداء
6.1 تقليل زمن الاستجابة
def optimize_performance():
# إعداد للحصول على أداء أفضل
pose = mp_pose.Pose(
min_detection_confidence=0.5,
min_tracking_confidence=0.5,
model_complexity=1, # 0=Lite, 1=Full, 2=Heavy
smooth_landmarks=True,
enable_segmentation=False
)
6.2 إدارة الذاكرة
def manage_memory():
# تنظيف الموارد
pose.close()
face_detection.close()
hands.close()
7. أفضل الممارسات
-
المعالجة المسبقة للصور
- تغيير حجم الصور للحصول على أداء أفضل
- تطبيع قيم البكسلات
- التعامل مع صيغ الصور المختلفة
-
معالجة الأخطاء
- التحقق من توفر الكاميرا
- التعامل مع الحالات التي يتعذر فيها الاكتشاف
- تطبيق مهلات زمنية (timeouts) مناسبة
-
التحسين
- استخدام الوضع الخفيف (lite) للأجهزة المحمولة
- تقليل وتيرة الاكتشاف عند الحاجة
- تطبيق نظام ذاكرة تخزين مؤقت (cache) للنتائج
الخلاصة
النقاط الرئيسية:
- اكتشاف دقيق للوضعية والوجه واليدين
- واجهة برمجية (API) بسيطة وسهلة الاستخدام
- أداء ممتاز
- دعم متعدد المنصات
التوصيات:
- ملاءمة تعقيد النموذج حسب الاحتياجات
- تحسين الأداء للأجهزة المحمولة
- تطبيق إدارة قوية للأخطاء
- استخدام الوضع الخفيف (lite) للتطبيقات الفورية
نبذة عن InSkillCoach
خبير في التدريب والتقنيات
مدرّب متخصص في التقنيات المتقدمة والذكاء الاصطناعي، تدعمه شركة GNeurone Inc.
الشهادات:
- AWS Certified Solutions Architect – Professional
- شهادات Google Cloud
- Microsoft Certified: DevOps Engineer Expert
- Certified Kubernetes Administrator (CKA)
- CompTIA Security+
1.4k
210
التعليقات
التعليقات مدعومة عبر GitHub Discussions
سجّل الدخول باستخدام GitHub للمشاركة في النقاش