ویژگی تصویر

کتابخانه mediapipe در پایتون

  /  پایتون   /  کتابخانه mediapipe در پایتون
بنر تبلیغاتی الف

کتابخانه MediaPipe یک فریم‌ورک متن‌باز از تیم Google است که مدل‌های آماده و بهینه‌شده برای پردازش ویدیو و بینایی کامپیوتر را فراهم می‌کند. در پایتون، MediaPipe به‌سادگی قابلیت‌هایی مانند تشخیص دست، ردیابی ژستِ بدن (pose), تشخیص چهره (face mesh)، و ترکیب چند کانال را بدون نیاز به آموزش مدل از صفر فراهم می‌کند. این موضوع برای توسعهٔ پروتوتایپ‌ها، پروژه‌های تحقیقاتی و اپلیکیشن‌های تعاملی بسیار مفید است.

ویژگی‌های کلیدی

  • پایگاه مدل‌های آماده و بهینه‌شده برای realtime.
  • API ساده و منطبق با OpenCV برای پردازش فریم‌ها.
  • امکان ترکیب چندین ماژول (مثلاً هم‌زمان FaceMesh و Pose).
  • پشتیبانی از موبایل و دسکتاپ (با راه‌اندازی‌های متفاوت برای GPU).

نصب و آماده‌سازی

pip install mediapipe opencv-python

این دستور مدیاپایپ و OpenCV را نصب می‌کند. در برخی سیستم‌ها (ویندوز/مک) اگر با خطا مواجه شدید، نسخهٔ پایتون یا wheels سازگار را بررسی کنید یا از virtualenv استفاده کنید.

مثال عملی: تشخیص دست با MediaPipe Hands

import cv2
import mediapipe as mp

mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils

cap = cv2.VideoCapture(0)
with mp_hands.Hands(
    static_image_mode=False,
    max_num_hands=2,
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5) as hands:
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        results = hands.process(frame_rgb)

        if results.multi_hand_landmarks:
            for hand_landmarks in results.multi_hand_landmarks:
                mp_drawing.draw_landmarks(
                    frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)
        cv2.imshow('MediaPipe Hands', frame)
        if cv2.waitKey(5) & 0xFF == 27:
            break

cap.release()
cv2.destroyAllWindows()

این کد از وب‌کم فریم می‌گیرد، فریم را به RGB تبدیل و به مدل Hands می‌فرستد. در صورت یافتن دست، نقاط (landmarks) و اتصالات بین آنها را روی فریم می‌کشد و نمایش می‌دهد. پارامترها مانند max_num_hands و min_detection_confidence برای کنترل سرعت و دقت استفاده می‌شوند.

مثال کاربردی: تشخیص ژست بدن (Pose)

import cv2
import mediapipe as mp

mp_pose = mp.solutions.pose
mp_drawing = mp.solutions.drawing_utils

cap = cv2.VideoCapture('video.mp4')
with mp_pose.Pose(model_complexity=1, min_detection_confidence=0.5) as pose:
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        res = pose.process(image_rgb)

        if res.pose_landmarks:
            mp_drawing.draw_landmarks(frame, res.pose_landmarks, mp_pose.POSE_CONNECTIONS)
        cv2.imshow('Pose', frame)
        if cv2.waitKey(1) & 0xFF == 27:
            break
cap.release()
cv2.destroyAllWindows()

در این مثال از مدل Pose استفاده شده و با model_complexity می‌توان بین سرعت و دقت تعادل برقرار کرد. مدل‌های با پیچیدگی بیشتر عموماً دقیق‌تر ولی کندتر هستند.

نکات بهینه‌سازی و بهترین شیوه‌ها

  • برای ویدیوهای realtime، static_image_mode=False را نگه دارید تا ردیابی سریع‌تر انجام شود.
  • مقدار min_detection_confidence را بسته به نیاز افزایش یا کاهش دهید؛ کاهش باعث سرعت بیشتر و افزایش خطا می‌شود.
  • در صورت کار با چند ماژول (مثلاً FaceMesh + Pose)، تا حد امکان فریم‌ها را shared پردازش کنید و از رزولوشن پایین‌تر برای افزایش سرعت استفاده کنید.
  • برای پردازش ویدیو در پس‌زمینه از threading یا queue استفاده کنید تا فریم‌ریت UI حفظ شود.
  • بر روی دسکتاپ، نسخه‌های pip عموماً CPU-based هستند؛ برای تسریع GPU باید MediaPipe را از سورس کامپایل یا از راه‌حل‌های پلتفرم موبایل استفاده کنید.

نمونهٔ ترکیبی: Holistic (چهره، دست، ژست)

import cv2
import mediapipe as mp

mp_holistic = mp.solutions.holistic
mp_drawing = mp.solutions.drawing_utils

cap = cv2.VideoCapture(0)
with mp_holistic.Holistic(min_detection_confidence=0.5, min_tracking_confidence=0.5) as holistic:
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        res = holistic.process(image_rgb)

        if res.face_landmarks:
            mp_drawing.draw_landmarks(frame, res.face_landmarks, mp_holistic.FACEMESH_TESSELATION)
        if res.left_hand_landmarks:
            mp_drawing.draw_landmarks(frame, res.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS)
        if res.pose_landmarks:
            mp_drawing.draw_landmarks(frame, res.pose_landmarks, mp_holistic.POSE_CONNECTIONS)

        cv2.imshow('Holistic', frame)
        if cv2.waitKey(5) & 0xFF == 27:
            break
cap.release()
cv2.destroyAllWindows()

ماژول Holistic ترکیبی از چند حل (solutions) است و برای اپلیکیشن‌هایی که نیاز به هم‌زمانی اطلاعات چهره، دست و ژست دارند مناسب است. دقت و مصرف منابع در این حالت بالاتر است.

جدول مقایسهٔ سریع ماژول‌های اصلی

ماژولکاربردبار محاسباتی
Handsردیابی و تشخیص نقاط دستپایین تا متوسط
Poseردیابی ژست و استخوان‌بندی بدنمتوسط
FaceMeshنقاط دقیق چهره و ساخت شبکهٔ چهرهمتوسط تا بالا
Holisticترکیب چهره، دست و ژستبالا

موارد استفاده واقعی (Use Cases)

  • اپلیکیشن‌های واقعیت افزوده (AR) و افکت‌های چهره.
  • سیستم‌های کنترل با ژست دست برای دستگاه‌های بدون تاچ.
  • آنالیز ورزشی و اصلاح فرم تمرینات با استفاده از Pose.
  • جمع‌آوری داده‌های آنوتیشن سریع برای مدل‌های سفارشی.

نکات امنیتی و حریم خصوصی

هنگام استفاده از دوربین و ارسال ویدیو به سرورهای خارجی، الزامات حریم خصوصی را رعایت کنید. MediaPipe مدل‌ها را محلی اجرا می‌کند، پس اگر داده‌ها روی دستگاه بمانند، خطر افشای کم‌تری وجود دارد. اما در صورت ارسال به سرور، حتماً رمزنگاری و توافق‌نامه‌های لازم را مد نظر قرار دهید.

جمع‌بندی و راه‌های پیشرفته

MediaPipe در پایتون یک ابزار قدرتمند برای پیاده‌سازی سریع قابلیت‌های بینایی کامپیوتر است. با تنظیم پارامترها، انتخاب ماژول مناسب و بهینه‌سازی‌های ساده می‌توان به عملکرد realtime دست یافت. برای کاربردهای پیشرفته‌تر می‌توانید مدل‌ها را با شبکه‌های عصبی سفارشی ترکیب کرده یا MediaPipe را از سورس کامپایل کنید تا از شتاب‌دهنده‌های سخت‌افزاری بهره ببرید.

در صورت نیاز می‌توانم مثال‌های بیشتری (مثل استخراج زوایا از landmarks، ذخیرهٔ داده‌ها برای آنالیز آفلاین، یا راهنمایی برای ساخت GUI) آماده کنم.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: