Latest Post

Khái niệm Low Code và kiến thức cơ bản về Low Code Khái niệm Web Development và lý do chọn nghề Web Developer

Để sử dụng TensorFlow.js nhằm ước tính khoảng cách giữa hai điểm hoặc đo kích thước của vật thể trong ảnh/video, bạn có thể áp dụng các bước sau. TensorFlow.js cung cấp mô hình học sâu sẵn có, chẳng hạn như Object Detection (nhận diện vật thể) hoặc Pose Detection (nhận diện tư thế), để phân tích khung hình và trích xuất thông tin về tọa độ điểm.

Quy trình tổng quát

  1. Cài đặt TensorFlow.js:
    • Dùng CDN hoặc npm/yarn để tích hợp TensorFlow.js vào dự án của bạn.
  2. Chọn mô hình phù hợp:
    • Coco-SSD: Nhận diện các vật thể phổ biến và cung cấp vị trí bounding box (hộp bao quanh vật thể).
    • MoveNet (hoặc PoseNet): Phát hiện các điểm cơ thể (keypoints) để tính toán khoảng cách giữa chúng.
  3. Tích hợp TensorFlow.js:
    • Sử dụng camera để nhận video trực tiếp.
    • Áp dụng mô hình để phát hiện tọa độ các điểm/vật thể.
    • Tính khoảng cách giữa hai điểm dựa trên tọa độ trả về.

Ví dụ 1: Sử dụng Coco-SSD để đo khoảng cách giữa hai vật thể

Code:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>TensorFlow.js Object Detection</title>
  <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
  <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/coco-ssd"></script>
  <style>
    video, canvas { width: 100%; height: auto; }
    canvas { position: absolute; top: 0; left: 0; pointer-events: none; }
  </style>
</head>
<body>
  <video id="camera" autoplay></video>
  <canvas id="overlay"></canvas>

  <script>
    const video = document.getElementById('camera');
    const canvas = document.getElementById('overlay');
    const ctx = canvas.getContext('2d');

    async function setupCamera() {
      const stream = await navigator.mediaDevices.getUserMedia({ video: true });
      video.srcObject = stream;

      return new Promise((resolve) => {
        video.onloadedmetadata = () => resolve(video);
      });
    }

    async function runDetection() {
      const model = await cocoSsd.load(); // Load the Coco-SSD model
      console.log("Coco-SSD model loaded!");

      canvas.width = video.videoWidth;
      canvas.height = video.videoHeight;

      const detectObjects = async () => {
        const predictions = await model.detect(video);

        ctx.clearRect(0, 0, canvas.width, canvas.height);
        predictions.forEach((prediction) => {
          const [x, y, width, height] = prediction.bbox;
          const label = prediction.class;

          // Vẽ bounding box và tên vật thể
          ctx.strokeStyle = 'red';
          ctx.lineWidth = 2;
          ctx.strokeRect(x, y, width, height);
          ctx.fillStyle = 'red';
          ctx.font = '16px Arial';
          ctx.fillText(`${label}`, x, y - 10);
        });

        // (Tùy chọn) Tính khoảng cách giữa 2 vật thể dựa trên bbox
        if (predictions.length >= 2) {
          const point1 = { x: predictions[0].bbox[0], y: predictions[0].bbox[1] };
          const point2 = { x: predictions[1].bbox[0], y: predictions[1].bbox[1] };

          const distance = calculatePixelDistance(point1, point2);
          console.log(`Khoảng cách giữa hai vật thể: ${distance.toFixed(2)} pixels`);
        }

        requestAnimationFrame(detectObjects);
      };

      detectObjects();
    }

    function calculatePixelDistance(p1, p2) {
      const dx = p2.x - p1.x;
      const dy = p2.y - p1.y;
      return Math.sqrt(dx * dx + dy * dy);
    }

    setupCamera().then(runDetection);
  </script>
</body>
</html>

Ví dụ 2: Sử dụng MoveNet để đo khoảng cách giữa hai keypoints (điểm cơ thể)

MoveNet có thể phát hiện các điểm chính trên cơ thể người, như vai, đầu gối, bàn tay, v.v. Dựa trên tọa độ các điểm, bạn có thể tính khoảng cách giữa hai điểm bất kỳ.

Code:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>MoveNet Pose Detection</title>
  <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"></script>
  <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/pose-detection"></script>
  <style>
    video, canvas { width: 100%; height: auto; }
    canvas { position: absolute; top: 0; left: 0; pointer-events: none; }
  </style>
</head>
<body>
  <video id="camera" autoplay></video>
  <canvas id="overlay"></canvas>

  <script>
    const video = document.getElementById('camera');
    const canvas = document.getElementById('overlay');
    const ctx = canvas.getContext('2d');

    async function setupCamera() {
      const stream = await navigator.mediaDevices.getUserMedia({ video: true });
      video.srcObject = stream;

      return new Promise((resolve) => {
        video.onloadedmetadata = () => resolve(video);
      });
    }

    async function runPoseDetection() {
      const detector = await poseDetection.createDetector(poseDetection.SupportedModels.MoveNet);
      console.log("MoveNet model loaded!");

      canvas.width = video.videoWidth;
      canvas.height = video.videoHeight;

      const detectPoses = async () => {
        const poses = await detector.estimatePoses(video);

        ctx.clearRect(0, 0, canvas.width, canvas.height);
        poses.forEach((pose) => {
          pose.keypoints.forEach((keypoint) => {
            if (keypoint.score > 0.5) {
              const { x, y } = keypoint;
              ctx.fillStyle = 'blue';
              ctx.beginPath();
              ctx.arc(x, y, 5, 0, 2 * Math.PI);
              ctx.fill();
            }
          });

          // Tính khoảng cách giữa 2 điểm bất kỳ (ví dụ: vai trái và vai phải)
          const leftShoulder = pose.keypoints.find(k => k.name === 'left_shoulder');
          const rightShoulder = pose.keypoints.find(k => k.name === 'right_shoulder');
          if (leftShoulder && rightShoulder) {
            const distance = calculatePixelDistance(leftShoulder, rightShoulder);
            console.log(`Khoảng cách giữa hai vai: ${distance.toFixed(2)} pixels`);
          }
        });

        requestAnimationFrame(detectPoses);
      };

      detectPoses();
    }

    function calculatePixelDistance(p1, p2) {
      const dx = p2.x - p1.x;
      const dy = p2.y - p1.y;
      return Math.sqrt(dx * dx + dy * dy);
    }

    setupCamera().then(runPoseDetection);
  </script>
</body>
</html>

So sánh các phương pháp:

Phương phápĐộ chính xácPhạm vi ứng dụng
Coco-SSDTốt cho vật thể lớnPhát hiện vật thể thông dụng
MoveNet/PoseNetTốt cho cơ thể ngườiPhân tích chuyển động, thể thao

Bạn có thể chọn mô hình phù hợp tùy thuộc vào nhu cầu của ứng dụng. Nếu bạn cần hỗ trợ thêm, mình sẵn sàng giải thích chi tiết! 😊

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *