راهنمای تشخیص نقطه عطف برای وب، راهنمای تشخیص نقطه عطف برای وب

وظیفه‌ی MediaPipe Pose Landmarker به شما امکان می‌دهد نشانه‌های بدن انسان را در یک تصویر یا ویدیو تشخیص دهید. می‌توانید از این وظیفه برای شناسایی مکان‌های کلیدی بدن، تجزیه و تحلیل وضعیت بدن و دسته‌بندی حرکات استفاده کنید. این وظیفه از مدل‌های یادگیری ماشین (ML) استفاده می‌کند که با تصاویر یا ویدیوهای تکی کار می‌کنند. این وظیفه، نشانه‌های وضعیت بدن را در مختصات تصویر و در مختصات دنیای سه‌بعدی خروجی می‌دهد.

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

مثال کد

کد نمونه برای Pose Landmarker، پیاده‌سازی کاملی از این وظیفه را در جاوا اسکریپت برای مرجع شما ارائه می‌دهد. این کد به شما کمک می‌کند تا این وظیفه را آزمایش کنید و ساخت برنامه Pose Landmarker خود را شروع کنید. می‌توانید مثال Pose Landmarker را فقط با استفاده از مرورگر وب خود مشاهده، اجرا و ویرایش کنید.

راه‌اندازی

این بخش مراحل کلیدی برای راه‌اندازی محیط توسعه شما به طور خاص برای استفاده از Pose Landmarker را شرح می‌دهد. برای اطلاعات کلی در مورد راه‌اندازی محیط توسعه وب و جاوا اسکریپت، از جمله الزامات نسخه پلتفرم، به راهنمای راه‌اندازی برای وب مراجعه کنید.

بسته‌های جاوا اسکریپت

کد Pose Landmarker از طریق بسته NPM مدیاپایپ @mediapipe/tasks-vision در دسترس است. می‌توانید با دنبال کردن دستورالعمل‌های موجود در راهنمای راه‌اندازی پلتفرم، این کتابخانه‌ها را پیدا و دانلود کنید.

شما می‌توانید بسته‌های مورد نیاز را از طریق NPM با استفاده از دستور زیر نصب کنید:

npm install @mediapipe/tasks-vision

اگر می‌خواهید کد وظیفه را از طریق سرویس شبکه تحویل محتوا (CDN) وارد کنید، کد زیر را در تگ <head> در فایل HTML خود اضافه کنید:

<!-- You can replace JSDeliver with another CDN if you prefer -->
<head>
  <script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision/vision_bundle.mjs"
    crossorigin="anonymous"></script>
</head>

مدل

وظیفه‌ی MediaPipe Pose Landmarker به یک مدل آموزش‌دیده نیاز دارد که با این وظیفه سازگار باشد. برای اطلاعات بیشتر در مورد مدل‌های آموزش‌دیده‌ی موجود برای Pose Landmarker، به بخش مدل‌های نمای کلی وظیفه مراجعه کنید.

یک مدل را انتخاب و دانلود کنید و سپس آن را در دایرکتوری پروژه خود ذخیره کنید:

<dev-project-root>/app/shared/models/

وظیفه را ایجاد کنید

از یکی از توابع createFrom...() در Pose Landmarker برای آماده‌سازی وظیفه جهت اجرای استنتاج‌ها استفاده کنید. از تابع createFromModelPath() به همراه یک مسیر نسبی یا مطلق به فایل مدل آموزش‌دیده استفاده کنید. اگر مدل شما از قبل در حافظه بارگذاری شده است، می‌توانید از متد createFromModelBuffer() استفاده کنید.

مثال کد زیر استفاده از تابع createFromOptions() را برای تنظیم وظیفه نشان می‌دهد. تابع createFromOptions() به شما امکان می‌دهد Pose Landmarker را با گزینه‌های پیکربندی سفارشی کنید. برای اطلاعات بیشتر در مورد گزینه‌های پیکربندی، به گزینه‌های پیکربندی مراجعه کنید.

کد زیر نحوه ساخت و پیکربندی وظیفه با گزینه‌های سفارشی را نشان می‌دهد:

const vision = await FilesetResolver.forVisionTasks(
  // path/to/wasm/root
  "https://cdn.jsdelivr.net/npm/@mediapipe/tasks-vision@latest/wasm"
);
const poseLandmarker = await poseLandmarker.createFromOptions(
    vision,
    {
      baseOptions: {
        modelAssetPath: "path/to/model"
      },
      runningMode: runningMode
    });

گزینه‌های پیکربندی

این وظیفه گزینه‌های پیکربندی زیر را برای برنامه‌های وب و جاوا اسکریپت دارد:

نام گزینه توضیحات محدوده ارزش مقدار پیش‌فرض
runningMode حالت اجرا را برای وظیفه تنظیم می‌کند. دو حالت وجود دارد:

تصویر: حالت ورودی‌های تک تصویر.

ویدئو: حالتی برای فریم‌های رمزگشایی‌شده‌ی یک ویدئو یا روی پخش زنده‌ی داده‌های ورودی، مثلاً از یک دوربین.
{ IMAGE, VIDEO } IMAGE
numPoses حداکثر تعداد حالت‌هایی که توسط Pose Landmarker قابل تشخیص است. Integer > 0 1
minPoseDetectionConfidence حداقل امتیاز اطمینان برای تشخیص ژست که موفقیت‌آمیز تلقی شود. Float [0.0,1.0] 0.5
minPosePresenceConfidence حداقل امتیاز اطمینان امتیاز حضور ژست در تشخیص نشانه‌های ژست. Float [0.0,1.0] 0.5
minTrackingConfidence حداقل امتیاز اطمینان برای اینکه ردیابی ژست موفق تلقی شود. Float [0.0,1.0] 0.5
outputSegmentationMasks آیا Pose Landmarker یک ماسک تقسیم‌بندی برای حالت شناسایی‌شده خروجی می‌دهد یا خیر. Boolean False

آماده‌سازی داده‌ها

Pose Landmarker می‌تواند حالت‌های تصاویر را در هر فرمتی که توسط مرورگر میزبان پشتیبانی می‌شود، تشخیص دهد. این وظیفه همچنین پیش‌پردازش داده‌های ورودی، از جمله تغییر اندازه، چرخش و نرمال‌سازی مقادیر را انجام می‌دهد. برای حالت‌های نشانه‌گذاری شده در ویدیوها، می‌توانید از API برای پردازش سریع یک فریم در هر زمان استفاده کنید و با استفاده از مهر زمانی فریم، زمان وقوع حالت‌ها در ویدیو را تعیین کنید.

اجرای وظیفه

Pose Landmarker از متدهای detect() (با حالت اجرایی IMAGE ) و detectForVideo() (با حالت اجرایی VIDEO ) برای ایجاد استنتاج استفاده می‌کند. این وظیفه داده‌ها را پردازش می‌کند، سعی در ایجاد حالت‌های شاخص می‌کند و سپس نتایج را گزارش می‌دهد.

فراخوانی متدهای Pose Landmarker detect() و detectForVideo() به صورت همزمان اجرا می‌شوند و نخ interpose کاربر را مسدود می‌کنند. اگر در فریم‌های ویدیویی از دوربین دستگاه، پوزهایی را تشخیص دهید، هر تشخیص، نخ اصلی را مسدود می‌کند. می‌توانید با پیاده‌سازی web workerها برای اجرای متدهای detect() و detectForVideo() در نخ دیگر، از این امر جلوگیری کنید.

کد زیر نحوه اجرای پردازش با مدل وظیفه را نشان می‌دهد:

تصویر

const image = document.getElementById("image") as HTMLImageElement;
const poseLandmarkerResult = poseLandmarker.detect(image);

ویدئو

await poseLandmarker.setOptions({ runningMode: "VIDEO" });

let lastVideoTime = -1;
function renderLoop(): void {
  const video = document.getElementById("video");

  if (video.currentTime !== lastVideoTime) {
    const poseLandmarkerResult = poseLandmarker.detectForVideo(video);
    processResults(detections);
    lastVideoTime = video.currentTime;
  }

  requestAnimationFrame(() => {
    renderLoop();
  });
}

برای پیاده‌سازی کامل‌تر اجرای یک وظیفه Pose Landmarker، به مثال مراجعه کنید.

مدیریت و نمایش نتایج

Pose Landmarker برای هر اجرای تشخیص، یک شیء poseLandmarkerResult برمی‌گرداند. شیء result شامل مختصات هر نقطه عطف ژست است.

در زیر نمونه‌ای از داده‌های خروجی این وظیفه نشان داده شده است:

PoseLandmarkerResult:
  Landmarks:
    Landmark #0:
      x            : 0.638852
      y            : 0.671197
      z            : 0.129959
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.634599
      y            : 0.536441
      z            : -0.06984
      visibility   : 0.999909
      presence     : 0.999958
    ... (33 landmarks per pose)
  WorldLandmarks:
    Landmark #0:
      x            : 0.067485
      y            : 0.031084
      z            : 0.055223
      visibility   : 0.9999997615814209
      presence     : 0.9999984502792358
    Landmark #1:
      x            : 0.063209
      y            : -0.00382
      z            : 0.020920
      visibility   : 0.999976
      presence     : 0.999998
    ... (33 world landmarks per pose)
  SegmentationMasks:
    ... (pictured below)

خروجی شامل مختصات نرمال‌شده ( Landmarks ) و مختصات جهانی ( WorldLandmarks ) برای هر نقطه عطف است.

خروجی شامل مختصات نرمال‌شده‌ی زیر ( Landmarks ) است:

  • x و y : مختصات نقاط دیدنی که توسط عرض تصویر ( x ) و ارتفاع ( y ) بین ۰.۰ و ۱.۰ نرمال شده‌اند.

  • z : عمق نقطه عطف، که عمق در نقطه میانی باسن به عنوان مبدا در نظر گرفته می‌شود. هرچه مقدار کوچکتر باشد، نقطه عطف به دوربین نزدیکتر است. بزرگی z تقریباً از همان مقیاس x استفاده می‌کند.

  • visibility : احتمال قابل مشاهده بودن نقطه عطف در تصویر.

خروجی شامل مختصات جهانی زیر ( WorldLandmarks ) است:

  • x ، y و z : مختصات سه‌بعدی دنیای واقعی بر حسب متر، با نقطه میانی مفصل ران به عنوان مبدا.

  • visibility : احتمال قابل مشاهده بودن نقطه عطف در تصویر.

تصویر زیر، خروجی این وظیفه را به صورت بصری نشان می‌دهد:

زنی در حالت مراقبه. حالت او با یک قاب سیمی که موقعیت اندام‌ها و تنه او را نشان می‌دهد، برجسته شده است.

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

ماسک تقسیم‌بندی تصویر قبلی که شکل زن را مشخص می‌کند

کد مثال Pose Landmarker نحوه نمایش نتایج برگردانده شده از وظیفه را نشان می‌دهد، به مثال مراجعه کنید.