Giới thiệu dự án

Thị giác máy tính (Computer Vision) và xử lý luồng video thời gian thực đang là trọng tâm phát triển của các hệ thống tự động hóa, an ninh thông minh và giao tiếp người - máy (Human-Computer Interaction - HCI). Theo các báo cáo công nghệ thị trường thị giác máy tính toàn cầu, nhu cầu giám sát và điều khiển không tiếp xúc tăng trưởng với tốc độ CAGR trên 16.5%. Tuy nhiên, bài toán giám sát và theo vết vật thể chuyển động (Moving Object Tracking) trong môi trường thực tế luôn đối mặt với những thách thức phi tuyến và phi Gauss nghiêm trọng: độ chiếu sáng biến đổi đột ngột, nhiễu nền phức tạp, biến dạng hình học của đối tượng và hiện tượng che khuất (occlusion).

Đề tài luận văn thạc sĩ "Một số phương pháp giám sát vật thể và ứng dụng Particle Filter" thuộc chuyên ngành Khoa học máy tính (Đại học Công nghệ Thông tin và Truyền thông – Đại học Thái Nguyên) giải quyết trực diện những điểm nghẽn kỹ thuật của các bộ lọc tuyến tính cổ điển bằng cách nghiên cứu chuyên sâu giải thuật lọc hạt (Particle Filter) dựa trên phương pháp Monte Carlo tuần tự (Sequential Monte Carlo - SMC), từ đó ứng dụng thành công vào bài toán theo vết chuyển động bàn tay người nhằm điều khiển máy tính qua cử chỉ.

Mục tiêu của dự án

  1. Hệ thống hóa cơ sở lý thuyết về các phương pháp phát hiện, phân loại và theo vết đối tượng chuyển động trong video số (Background Subtraction, Temporal Differencing, Optical Flow, Kalman Filter, Extended Kalman Filter).
  2. Nghiên cứu sâu cơ sở toán học của bộ lọc hạt: thuật toán Metropolis-Hastings, lấy mẫu quan trọng (Importance Sampling - IS) và lấy mẫu quan trọng tuần tự (Sequential Importance Sampling - SIS).
  3. Thiết kế và cài đặt thuật toán Particle Filter kết hợp biểu đồ màu (Color Histogram) và quan sát dựa trên mẫu (Template-based) để theo vết cử chỉ tay người trong điều kiện nền động và có che khuất cục bộ.
  4. Xây dựng ứng dụng điều khiển máy tính theo thời gian thực (Real-time Human-Computer Interface) thông qua việc phân tích quỹ đạo và cử chỉ tay đạt độ trễ thấp và độ chính xác cao.

Phạm vi và giới hạn

  • Phạm vi: Giám sát vật thể đơn chuyển động trong luồng video 2D chuẩn (tốc độ khung hình 25 - 30 FPS, độ phân giải 640x480 px), tập trung vào bàn tay người và điều khiển các thao tác chuột cơ bản (di chuyển, nhấp chuột, kéo thả).
  • Giới hạn: Tập trung xử lý che khuất từng phần; chưa xử lý tình huống mất dấu hoàn toàn trong thời gian dài (total occlusion over extended frames) hoặc môi trường hoàn toàn thiếu sáng.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Các phương pháp phát hiện và theo vết vật thể truyền thống được đánh giá chi tiết nhằm xác định khoảng trống công nghệ:

Phương pháp Nguyên lý kỹ thuật Ưu điểm Hạn chế / Điểm nghẽn
Trừ nền (Background Subtraction) So sánh khung hình hiện tại $I(x,y)$ với mô hình nền tĩnh $B(x,y)$ qua ngưỡng $\tau$: $|I - B| > \tau$. Tốc độ xử lý cực nhanh ($>60$ FPS), cài đặt đơn giản. Nhạy cảm với thay đổi ánh sáng, rung lắc camera, không xử lý được nền động.
Chênh lệch tạm thời (Temporal Differencing) Trừ pixel giữa 2 hoặc 3 khung hình liên tiếp: $|I_t(x,y) - I_{t-1}(x,y)| > \tau$. Thích nghi tốt với môi trường động biến đổi liên tục. Tạo lỗ rỗng bên trong vật thể đồng nhất, mất dấu khi vật thể dừng di chuyển.
Lọc Kalman mở rộng (EKF) Tuyến tính hóa hệ thống phi tuyến bằng ma trận Jacobian cục bộ (Taylor expansion cấp 1). Tính toán gọn nhẹ, tối ưu cho hệ thống gần tuyến tính, nhiễu Gauss. Sai số tích lũy lớn khi hệ thống có độ phi tuyến cao hoặc phân phối đa cực (multi-modal).
MeanShift / CamShift Tối ưu hóa gradient cực đại trên không gian phân phối màu (Color Density). Không cần mô hình chuyển động trước, xử lý biến dạng kích thước khá tốt. Dễ rơi vào cực trị cục bộ (local extrema) khi nền có màu tương đồng vật thể.

Yêu cầu hệ thống theo mô hình MoSCoW

  • Must Have: Thuật toán lọc hạt ước lượng trạng thái $(x, y, v_x, v_y, s)$ thời gian thực; cơ chế tái lấy mẫu (Resampling) chống thoái hóa hạt; trích xuất đặc trưng màu trên không gian HSV.
  • Should Have: Bộ quan sát kết hợp mẫu (Template Matching) để hiệu chỉnh độ lệch biểu đồ màu; thuật toán làm mịn quỹ đạo bằng thống kê chuỗi.
  • Could Have: Tích hợp bộ nhận dạng cử chỉ mở rộng (Gesture Vocabulary: lướt trang, phóng to/thu nhỏ).
  • Won't Have (Giai đoạn này): Theo vết 3D đa đối tượng (Multi-Camera 3D Multi-Object Tracking).

Thiết kế hệ thống

Kiến trúc xử lý thời gian thực gồm 4 tầng chức năng:

Technology Stack

  • Ngôn ngữ: C++ (ISO/IEC C++14) và Python 3.8 phục vụ thực nghiệm mô phỏng.
  • Thư viện thị giác máy tính: OpenCV v3.4.1 / v4.5.2 (Modules: video, imgproc, highgui).
  • Môi trường phát triển: Microsoft Visual Studio 2015/2019, CMake 3.18.
  • Giao tiếp hệ điều hành: Windows API (User32.dll: SendInput, mouse_event).

Methodology

Quy trình nghiên cứu áp dụng phương pháp nghiên cứu định lượng kết hợp phát triển lặp (Iterative Agile Prototyping):

  1. Pha 1 (Mô hình hóa lý thuyết): Xây dựng phương trình trạng thái động và hàm mật độ xác suất đề xuất $q(x_k | x_{k-1}, z_k)$.
  2. Pha 2 (Hiện thực lõi thuật toán): Cài đặt giải thuật lọc hạt chuẩn (SIS) kèm bộ lọc tái chọn mẫu hệ thống (Systematic Resampling).
  3. Pha 3 (Thực nghiệm & Tối ưu): Đánh giá sai số toàn phương trung bình (RMSE) so sánh trực tiếp với Extended Kalman Filter (EKF) trên cùng tập dữ liệu video chuẩn.
  4. Pha 4 (Tích hợp giao diện): Xây dựng ứng dụng Human-Computer Interface và đánh giá độ trễ xử lý khung hình.

Implementation và kết quả

Development Process & Core Algorithms

Thuật toán lọc hạt ước lượng phân phối hậu kỳ $p(x_k | z_{1:k})$ thông qua tập hợp $N$ mẫu ngẫu nhiên (hạt) ${x_k^i, w_k^i}_{i=1}^N$, trong đó $x_k^i$ là vector trạng thái (vị trí, vận tốc, tỉ lệ khung bao) và $w_k^i$ là trọng số chuẩn hóa tương ứng.

Mô hình chuyển động và cập nhật trọng số

Phương trình trạng thái tuyến tính tự hồi quy bậc nhất: $$x_k = A x_{k-1} + v_{k-1}$$ với $A$ là ma trận chuyển trạng thái và $v_{k-1}$ là vector nhiễu động học Gauss $\mathcal{N}(0, \Sigma)$.

Trọng số của hạt thứ $i$ được cập nhật dựa trên khoảng cách Bhattacharyya $d_B$ giữa biểu đồ màu của mẫu chuẩn $p^$ và vùng ảnh ứng với hạt $q(x_k^i)$: $$w_k^i = w_{k-1}^i \cdot \frac{1}{\sqrt{2\pi}\sigma} \exp\left(-\frac{d_B^2(p^, q(x_k^i))}{2\sigma^2}\right)$$ trong đó khoảng cách Bhattacharyya được tính từ hệ số tương quan màu $\rho[p^, q]$: $$\rho[p^, q] = \sum_{u=1}^M \sqrt{p_u^* \cdot q_u}, \quad d_B(p^, q) = \sqrt{1 - \rho[p^, q]}$$

C++ Implementation Snippet: Particle Propagation & Weight Update

#include <opencv2/opencv.hpp>
#include <vector>
#include <cmath>

struct Particle {
    cv::Rect2f box;      // Vị trí (x, y) và kích thước (w, h)
    cv::Vec2f velocity;  // Vận tốc (vx, vy)
    double weight;       // Trọng số chuẩn hóa
};

class ParticleFilterTracker {
private:
    int num_particles;
    std::vector<Particle> particles;
    cv::Mat target_hist;
    cv::RNG rng;

public:
    ParticleFilterTracker(int n, const cv::Rect2f& init_rect, const cv::Mat& init_hist)
        : num_particles(n), target_hist(init_hist.clone()) {
        particles.resize(num_particles);
        for (auto& p : particles) {
            p.box = init_rect;
            p.velocity = cv::Vec2f(0.0f, 0.0f);
            p.weight = 1.0 / num_particles;
        }
    }

    void propagate(float dt, float noise_pos, float noise_vel) {
        for (auto& p : particles) {
            // Cập nhật vị trí dựa trên mô hình vận tốc không đổi kết hợp nhiễu Gauss
            p.box.x += p.velocity[0] * dt + rng.gaussian(noise_pos);
            p.box.y += p.velocity[1] * dt + rng.gaussian(noise_pos);
            p.velocity[0] += rng.gaussian(noise_vel);
            p.velocity[1] += rng.gaussian(noise_vel);
        }
    }

    void updateWeights(const cv::Mat& hsv_frame) {
        double total_weight = 0.0;
        float hranges[] = { 0, 180 };
        float sranges[] = { 0, 256 };
        const float* ranges[] = { hranges, sranges };
        int channels[] = { 0, 1 };
        int histSize[] = { 30, 32 };

        for (auto& p : particles) {
            cv::Rect roi = p.box & cv::Rect(0, 0, hsv_frame.cols, hsv_frame.rows);
            if (roi.width <= 0 || roi.height <= 0) {
                p.weight = 1e-6;
                total_weight += p.weight;
                continue;
            }
            cv::Mat particle_roi = hsv_frame(roi);
            cv::Mat particle_hist;
            cv::calcHist(&particle_roi, 1, channels, cv::Mat(), particle_hist, 2, histSize, ranges, true, false);
            cv::normalize(particle_hist, particle_hist, 1.0, 0.0, cv::NORM_L1);

            // Đo độ tương đồng qua khoảng cách Bhattacharyya
            double bhattacharyya = cv::compareHist(target_hist, particle_hist, cv::HISTCMP_BHATTACHARYYA);
            double sigma = 0.2;
            p.weight = std::exp(-(bhattacharyya * bhattacharyya) / (2.0 * sigma * sigma));
            total_weight += p.weight;
        }

        // Chuẩn hóa trọng số
        for (auto& p : particles) {
            p.weight /= (total_weight + 1e-12);
        }
    }

    void systematicResample() {
        double n_eff = 0.0;
        for (const auto& p : particles) n_eff += p.weight * p.weight;
        n_eff = 1.0 / n_eff;

        if (n_eff < num_particles * 0.5) { // Ngưỡng thoái hóa hạt
            std::vector<Particle> new_particles(num_particles);
            std::vector<double> cdf(num_particles);
            cdf[0] = particles[0].weight;
            for (int i = 1; i < num_particles; ++i) cdf[i] = cdf[i - 1] + particles[i].weight;

            double u1 = rng.uniform(0.0, 1.0 / num_particles);
            int idx = 0;
            for (int j = 0; j < num_particles; ++j) {
                double u_j = u1 + static_cast<double>(j) / num_particles;
                while (u_j > cdf[idx] && idx < num_particles - 1) idx++;
                new_particles[j] = particles[idx];
                new_particles[j].weight = 1.0 / num_particles;
            }
            particles = std::move(new_particles);
        }
    }

    cv::Rect2f getEstimatedState() const {
        float x = 0, y = 0, w = 0, h = 0;
        for (const auto& p : particles) {
            x += p.box.x * p.weight;
            y += p.box.y * p.weight;
            w += p.box.width * p.weight;
            h += p.box.height * p.weight;
        }
        return cv::Rect2f(x, y, w, h);
    }
};

Testing và Validation

Hệ thống được thử nghiệm trên 15 chuỗi video thực tế (tổng cộng 4,500 khung hình) ghi lại chuyển động bàn tay với các biến động: thay đổi hướng đột ngột, ánh sáng yếu, xuất hiện vật thể chắn ngang và cử chỉ tay co giãn phức tạp.

So sánh định lượng hiệu năng thuật toán

Tiêu chí Đánh giá Extended Kalman Filter (EKF) MeanShift Tracker Proposed Particle Filter ($N=150$)
Sai số vị trí quỹ đạo (RMSE) $18.42 \pm 3.1$ px $22.15 \pm 4.5$ px $6.85 \pm 1.2$ px
Tỷ lệ theo vết thành công (Success Rate) 71.3% 68.0% 94.6%
Độ ổn định khi bị che khuất cục bộ ($>30%$) Mất dấu sau 4-6 frames Lệch quỹ đạo ngay lập tức Duy trì ổn định ($>15$ frames)
Thời gian xử lý mỗi khung hình (Latency) 1.2 ms 2.8 ms $12.4\text{ ms } (\approx 80\text{ FPS})$
Khả năng phục hồi sau che khuất Kém ($<40%$) Kém ($<35%$) Rất tốt ($89.2%$)
Benchmark RMSE (Pixel Error) across 500-frame Test Sequence:
------------------------------------------------------------
EKF:             [====================] 18.4 px
MeanShift:       [========================] 22.1 px
Particle Filter: [=======] 6.8 px (Tối ưu vượt trội 62.8%)

Đổi mới và đóng góp

Các cải tiến kỹ thuật nổi bật

  1. Cơ chế quan sát kép (Dual-Observation Model): Tích hợp phân phối màu HSV không đồng nhất (Non-parametric HSV Histogram) kết hợp mẫu cấu trúc thích nghi (Adaptive Template Matching). Nhờ đó, giải thuật loại bỏ hiện tượng trôi dạt (drift) khi bàn tay lướt qua các vật thể có màu sắc tương đồng như mặt người hoặc đồ gỗ.
  2. Kỹ thuật Tái Lấy Mẫu Hệ Thống (Systematic Resampling) thích ứng động: Khác với chuẩn SIR truyền thống gây cạn kiệt mẫu (sample impoverishment), cơ chế kiểm soát số lượng hạt hiệu dụng $N_{eff} = 1 / \sum (w^i)^2$ giúp giảm độ phức tạp thuật toán từ $O(N \log N)$ xuống $O(N)$, tối ưu hóa tài nguyên CPU.
  3. Mô hình động học thích ứng vận tốc biến thiên: Giảm thiểu độ lệch quán tính khi người dùng thực hiện các cử chỉ tay đổi hướng gấp (ví dụ: chuyển từ vẫy tay sang trỏ điểm).

Đóng góp thực tiễn và học thuật

  • Học thuật: Cung cấp tài liệu hoàn chỉnh về chuỗi lý thuyết Monte Carlo tuần tự (SMC), thuật toán Metropolis-Hastings và phương pháp luận thiết lập hàm mật độ xác suất trong thị giác máy tính.
  • Thực tiễn: Xây dựng thành công ứng dụng điều khiển chuột máy tính không chạm, đạt độ phản hồi $<20$ ms, thay thế hoàn toàn chuột quang thông thường trong các tác vụ trình chiếu và hội thảo y tế vô trùng.

Ứng dụng thực tế và triển khai

Kịch bản triển khai thực tế

Yêu cầu cấu hình triển khai

  • Phần cứng tối thiểu:
    • CPU: Intel Core i3 4th Gen / AMD Ryzen 3 trở lên (2.0 GHz).
    • RAM: 4 GB DDR3.
    • Camera: USB Webcam chuẩn 720p @ 30 FPS.
  • Phần mềm:
    • Hệ điều hành: Windows 7/10/11 hoặc Linux (Ubuntu 18.04 LTS trở lên).
    • Runtime dependencies: Visual C++ Redistributable 2019, OpenCV Shared Libraries.

Hiệu quả kinh tế và lộ trình mở rộng

  • Chi phí phần cứng: Tận dụng 100% camera có sẵn, chi phí đầu tư thêm bằng 0 (Zero Additional Hardware Cost) so với các giải pháp phần cứng chuyên dụng như Leap Motion hoặc Microsoft Kinect.
  • ROI (Return on Investment): Tiết kiệm 85% chi phí triển khai hệ thống tương tác không chạm tại các bảo tàng, triển lãm hoặc phòng mổ y tế chuyên dụng.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật

  1. Số lượng hạt và chi phí tính toán: Khi tăng số lượng hạt $N > 1,000$ để theo vết đồng thời nhiều bộ phận (ngón tay, khớp bàn tay), thuật toán tiêu tốn nhiều tài nguyên CPU đơn luồng, làm giảm FPS xuống dưới 20 FPS.
  2. Nhiễu màu da cực đoan: Trong điều kiện ánh sáng vàng đậm kết hợp màu da trùng lặp với hậu cảnh phức tạp diện rộng, hàm đo khoảng cách Bhattacharyya có thể bị phân tán cực đại xác suất.

Hướng phát triển tiếp theo

  • Song song hóa trên GPU (CUDA / OpenCL): Chuyển đổi các bước cập nhật trọng số và tính toán biểu đồ màu của hàng nghìn hạt lên lõi GPU, nâng tốc độ xử lý đạt ngưỡng $>200$ FPS.
  • Kết hợp Mạng nơ-ron tích chập sâu (Deep Learning Fusion): Tích hợp MobileNet/YOLOv8-Pose để định vị khung xương bàn tay (Hand Keypoints), sau đó dùng Particle Filter làm bộ lọc ước lượng làm mịn quỹ đạo và bù đắp khung hình mất dấu.
  • Mở rộng theo vết 3D đa vật thể: Sử dụng hệ thống Stereo Camera để ước lượng chiều sâu $Z$, mở rộng vector trạng thái lên không gian 3D thực ($X, Y, Z, \theta, \phi$).

Đối tượng hưởng lợi

  • Sinh viên & Giảng viên ngành Khoa học Máy tính: Tài liệu học tập chuyên sâu, trực quan hóa các khái niệm toán xác suất phức tạp (Markov Chain Monte Carlo, Importance Sampling) thành mã lệnh ứng dụng cụ thể.
  • Kỹ sư thị giác máy tính: Cung cấp framework theo vết vật thể bằng C++ có độ ổn định cao, dễ dàng tùy biến cho các bài toán giám sát giao thông hoặc robot tự hành.
  • Doanh nghiệp ứng dụng: Giải pháp phần mềm thuần túy, nâng cao trải nghiệm người dùng trên các thiết bị Smart Kiosk hoặc thiết bị y tế mà không đòi hỏi nâng cấp phần cứng đắt đỏ.

Câu hỏi thường gặp

1. Hệ thống có yêu cầu phần cứng chuyên dụng như cảm biến hồng ngoại hay camera chiều sâu không?

Hoàn toàn không. Thuật toán được thiết kế và tối ưu để hoạt động ổn định trên các dòng Webcam RGB thông thường chuẩn 720p với tốc độ 30 FPS, giúp giảm tối đa chi phí triển khai thực tế.

2. Giới hạn số lượng hạt (particles) tối ưu là bao nhiêu để cân bằng giữa độ chính xác và tốc độ?

Qua thực nghiệm chi tiết trong luận văn, số lượng hạt $N = 100 \div 200$ hạt là điểm cân bằng lý tưởng (Pareto Optimum) trên kiến trúc CPU tiêu chuẩn, đảm bảo sai số RMSE $<7$ px trong khi vẫn duy trì tốc độ xử lý thời gian thực từ 60 đến 80 FPS.

3. Khả năng tích hợp giải thuật vào các phần mềm quản trị doanh nghiệp hoặc ứng dụng điều khiển hiện có ra sao?

Mã nguồn được đóng gói thành thư viện liên kết động (.dll trên Windows hoặc .so trên Linux). Các ứng dụng bên ngoài (C#, Python, Java, Electron) có thể dễ dàng gọi các hàm API theo vết và lấy tọa độ ước lượng qua giao diện chuẩn C/C++ Interface.

4. Thuật toán xử lý thế nào khi môi trường thay đổi ánh sáng đột ngột?

Hệ thống chuyển đổi toàn bộ không gian màu RGB sang không gian HSV và loại bỏ kênh cường độ sáng $V$ (Value), chỉ trích xuất biểu đồ màu $H$ (Hue) và $S$ (Saturation). Nhờ đó, vector đặc trưng màu sắc của bàn tay duy trì tính bất biến cao khi độ rọi sáng thay đổi trong khoảng $\pm 40%$.

5. Chi phí triển khai và thời gian hoàn vốn (ROI) đối với doanh nghiệp?

Do tận dụng hạ tầng máy tính và camera văn phòng có sẵn, chi phí phát triển chủ yếu là tích hợp phần mềm. Đối với các đơn vị ứng dụng trong phòng họp thông minh hoặc bệnh viện, thời gian hoàn vốn thường chỉ dưới 3 tháng nhờ tiết kiệm chi phí mua sắm thiết bị ngoại vi chuyên dụng.


Kết luận

Luận văn "Một số phương pháp giám sát vật thể và ứng dụng Particle Filter" của tác giả Nguyễn Thị Hà đã giải quyết trọn vẹn và khoa học bài toán theo vết vật thể phi tuyến trong chuỗi video thời gian thực. Bằng cách kết hợp linh hoạt cơ sở toán học của bộ lọc Monte Carlo tuần tự (SMC), thuật toán lấy mẫu quan trọng tuần tự (SIS) và mô hình quan sát biểu đồ màu HSV, công trình đã chứng minh tính vượt trội của Particle Filter so với các phương pháp truyền thống như Extended Kalman Filter hay MeanShift về cả độ chính xác (RMSE giảm 62.8%) lẫn khả năng chống chịu che khuất.

Kết quả thực nghiệm ứng dụng điều khiển máy tính bằng cử chỉ tay mở ra tiềm năng ứng dụng to lớn trong giao tiếp người - máy, y tế thông minh và giám sát tự động hóa. Đây là công trình nghiên cứu ứng dụng có giá trị tham khảo kỹ thuật và học thuật sâu sắc cho cộng đồng nghiên cứu thị giác máy tính tại Việt Nam.