Giới thiệu dự án

Thị giác máy tính (Computer Vision) và Điện toán tương tác cảm xúc (Affective Computing) đang định hình lại cách con người tương tác với các hệ thống phần mềm, đặc biệt trong các ngành công nghiệp giải trí kỹ thuật số, phát triển trò chơi điện tử (Game Development) và nghiên cứu trải nghiệm người dùng (UX/UI Research). Theo báo cáo thị trường toàn cầu, ngành công nghệ nhận diện cảm xúc khuôn mặt (Facial Expression Recognition - FER) được dự báo đạt tốc độ tăng trưởng kép (CAGR) trên 14.8% trong giai đoạn 2023–2030, chứng minh nhu cầu bức thiết của việc định lượng trạng thái tâm lý người dùng theo thời gian thực.

Vấn đề cốt lõi đặt ra trong quá trình đánh giá game hoặc video là phương pháp khảo sát truyền thống (surveys, questionnaires hoặc phỏng vấn trực tiếp) thường bị chi phối bởi định kiến chủ quan (subjective bias), gián đoạn trải nghiệm của người tham gia và không thể thu thập phản hồi tức thì tại từng phân cảnh cụ thể. Trong khi đó, các phương pháp đo đạc sinh trắc học xâm lấn như điện não đồ (EEG) hay cảm biến phản xạ da (GSR) tuy chính xác nhưng cồng kềnh, chi phí cao và gây khó chịu cho người thử nghiệm.

Đề tài "Ước lượng tâm trạng người xem video / chơi game trên máy tính bằng cách xử lý hình ảnh webcam" do sinh viên Nguyễn Quang Anh (Khoa Điện – Điện tử, Trường Đại học Bách Khoa – ĐHQG TP.HCM, dưới sự hướng dẫn của Th.s Phạm Quang Thái) thực hiện nhằm giải quyết trực tiếp bài toán này thông qua luồng video từ webcam thông thường với giải pháp phi xâm lấn (non-invasive).

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

  1. Xây dựng pipeline tự động phát hiện và trích xuất khuôn mặt từ luồng video webcam thời gian thực trên hệ điều hành Windows bằng kiến trúc mạng Multi-Task Cascaded Convolutional Networks (MTCNN).
  2. Tận dụng mô hình tiền huấn luyện FaceNet (pre-trained Inception-ResNet-v1) để ánh xạ hình ảnh khuôn mặt thành không gian vector đặc trưng thu gọn (128-dimensional embedding vector).
  3. Huấn luyện và tối ưu hóa các thuật toán Học máy (Machine Learning) trên tập vector đặc trưng để phân loại chính xác các trạng thái tâm trạng/cảm xúc chủ đạo (như Vui vẻ, Buồn bã, Tập trung/Trung tính, Ngạc nhiên, Căng thẳng/Bực bội).
  4. Đảm bảo hệ thống đạt độ trễ thấp (Inference Latency $\le 45\text{ms}$/frame, tương đương tốc độ $\ge 22\text{ FPS}$) với mức sử dụng tài nguyên phần cứng tối ưu trên máy tính cá nhân.

Phạm vi nghiên cứu tập trung vào môi trường tương tác một người dùng (single-user desktop setting), xử lý dữ liệu hình ảnh thu nhận từ webcam chuẩn 720p/1080p trong điều kiện ánh sáng văn phòng và phòng cá nhân.


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

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

Trước khi xây dựng hệ thống, việc đánh giá các công nghệ nhận diện khuôn mặt và cảm xúc hiện có giúp lựa chọn kiến trúc tối ưu nhất giữa độ chính xác và hiệu năng tính toán.

Phương pháp Ưu điểm Nhược điểm Chi phí tính toán Độ chính xác FER
Cảm biến sinh học (EEG/GSR) Độ chính xác tâm lý cao, phản ánh tín hiệu thần kinh trực tiếp Gây vướng víu, cản trở tự nhiên khi chơi game, chi phí thiết bị đắt Thấp (chỉ xử lý tín hiệu 1D) $88% - 94%$
Haar-Cascade + HOG + SVM Nhẹ, chạy tốt trên CPU yếu, tốc độ xử lý nhanh Rất nhạy cảm với góc quay đầu (pose) và thay đổi ánh sáng Rất thấp ($< 5\text{ms}$) $65% - 72%$
End-to-End Deep CNN (VGG16/ResNet50) Học đặc trưng sâu, độ chính xác nhận diện biểu cảm tốt Mô hình nặng ($> 100\text{MB}$), đòi hỏi GPU rời để chạy thời gian thực Cao ($> 60\text{ms}$ trên CPU) $82% - 87%$
Giải pháp đề xuất: MTCNN + FaceNet (128-D) + ML Classifier Phát hiện khuôn mặt chuẩn xác đa góc độ, trích xuất đặc trưng cô đọng, phân loại siêu nhanh Cần chuẩn hóa dữ liệu đầu vào cho mạng trích xuất Trung bình ($35 - 45\text{ms}$) $85% - 90%$

Dựa trên phân tích yêu cầu theo mô hình MoSCoW:

  • Must have (Bắt buộc): Nhận diện khuôn mặt từ webcam Windows; trích xuất vector 128 chiều qua FaceNet; phân loại các nhóm cảm xúc cơ bản.
  • Should have (Nên có): Hiển thị nhãn cảm xúc trực tiếp trên màn hình video; ghi log dữ liệu cảm xúc theo mốc thời gian (timeline logging).
  • Could have (Có thể có): Biểu đồ thống kê biến thiên tâm trạng theo thời gian của phiên chơi game/xem video.
  • Won't have (Chưa hỗ trợ): Xử lý đồng thời nhiều người trong khung hình hoặc theo dõi cử động mắt chuyên sâu (Eye-tracking).

Thiết kế hệ thống

Kiến trúc hệ thống được xây dựng theo mô hình phân tầng module hóa (Modular Pipeline Architecture):

+------------------+     Raw Frames      +-----------------------------------------+
|  Webcam Input    | ------------------> | MTCNN Face Detection & Alignment        |
|  (RGB Video)     |                     | (P-Net -> R-Net -> O-Net + Landmarks)   |
+------------------+                     +-----------------------------------------+
                                                              |
                                                     Cropped & Scaled Face (160x160)
                                                              v
+------------------+     Prediction      +-----------------------------------------+
| Mood Dashboard & | <------------------ | Pre-trained FaceNet (Inception-ResNet)  |
| Event Logging    |                     | (Generates 128-D Embedding Vector)      |
+------------------+                     +-----------------------------------------+
                                                              |
                                                     128-D Feature Vector
                                                              v
                                         +-----------------------------------------+
                                         | Trained Machine Learning Classifier     |
                                         | (SVM / Random Forest / Softmax Layer)   |
                                         +-----------------------------------------+

Technology Stack chi tiết:

  • Ngôn ngữ lập trình: Python 3.8+
  • Thị giác máy tính: OpenCV 4.5.5 (Xử lý khung hình, hiển thị luồng GUI)
  • Mô hình học sâu (Deep Learning Frameworks): TensorFlow 2.8.0, Keras 2.8.0
  • Trích xuất khuôn mặt & Landmarks: MTCNN library (mtcnn 0.1.1)
  • Không gian biểu diễn đặc trưng: Pre-trained FaceNet weights (facenet_keras.h5 - Inception-ResNet-v1 trained on VGGFace2/CASIA-WebFace)
  • Học máy & Đánh giá mô hình: Scikit-Learn 1.0.2 (SVM, Random Forest, k-NN, Metrics evaluation)
  • Môi trường vận hành: Hệ điều hành Microsoft Windows 10/11 64-bit

Hệ thống xử lý hoàn toàn trên bộ nhớ đệm cục bộ (In-Memory Processing). Video stream không bị lưu trữ dưới dạng tệp video thô trên đĩa cứng nhằm tuân thủ tuyệt đối tính riêng tư của người dùng (Data Privacy & Compliance).

Methodology

Quy trình nghiên cứu áp dụng phương pháp lặp có kiểm soát (Iterative Engineering Methodology):

  1. Giai đoạn Thu thập & Tiền xử lý dữ liệu: Chuẩn bị tập dữ liệu ảnh khuôn mặt biểu cảm đa dạng, tiến hành chuẩn hóa kích thước về $160 \times 160 \times 3$ pixel, chuẩn hóa giá trị điểm ảnh theo phân phối chuẩn (Standard Normalization).
  2. Giai đoạn Trích xuất Vector Nhúng (Feature Embedding): Chạy toàn bộ tập dữ liệu qua mạng FaceNet để thu về ma trận vector đặc trưng kích thước $N \times 128$.
  3. Giai đoạn Huấn luyện & Lựa chọn Mô hình: Đánh giá chéo (K-Fold Cross Validation với $K=5$) giữa các thuật toán phân loại (Support Vector Machine với RBF kernel, Random Forest, k-Nearest Neighbors, Multi-Layer Perceptron) để chọn ra bộ tham số có chỉ số F1-Score cao nhất.
  4. Giai đoạn Tích hợp & Kiểm thử thực nghiệm: Kết nối pipeline với luồng Webcam thực tế trên hệ điều hành Windows, đánh giá tốc độ khung hình (FPS) và độ ổn định khi người dùng di chuyển đầu.

Implementation và kết quả

Development process

Quá trình phát triển tập trung vào việc ghép nối tối ưu giữa khâu dò tìm khuôn mặt thời gian thực và khâu phân loại đặc trưng. MTCNN hoạt động qua 3 giai đoạn tầng:

  • Proposal Network (P-Net): Mạng tích chập hoàn toàn (FCN) nhanh chóng đề xuất các vùng ứng viên chứa khuôn mặt (Bounding Box Candidates).
  • Refine Network (R-Net): Loại bỏ phần lớn các ứng viên sai thông qua cơ chế Non-Maximum Suppression (NMS).
  • Output Network (O-Net): Tinh chỉnh tọa độ hộp bao và xác định 5 điểm mốc đặc trưng (2 mắt, mũi, 2 khóe miệng) để căn chỉnh góc nghiêng của khuôn mặt (Face Alignment).

Sau khi khuôn mặt được căn chỉnh và cắt chuẩn kích thước $160 \times 160$, FaceNet sử dụng hàm mất mát Triplet Loss để đưa khoảng cách Euclid giữa các vector cùng cảm xúc lại gần nhau và đẩy xa khoảng cách giữa các cảm xúc khác biệt:

$$L = \max\left(|f(x_i^a) - f(x_i^p)|_2^2 - |f(x_i^a) - f(x_i^n)|_2^2 + \alpha, 0\right)$$

Đoạn mã mẫu thể hiện quy trình trích xuất embedding và dự đoán cảm xúc:

import cv2
import numpy as np
from mtcnn.mtcnn import MTCNN
from tensorflow.keras.models import load_model
import joblib

# 1. Khởi tạo detector MTCNN và load mô hình FaceNet đã pre-trained
detector = MTCNN()
facenet_model = load_model('facenet_keras.h5')
classifier_model = joblib.load('best_emotion_classifier.pkl')

EMOTION_LABELS = {0: 'Neutral', 1: 'Happy', 2: 'Sad', 3: 'Surprise', 4: 'Frustrated'}

def extract_face_embedding(frame, face_box):
    x, y, w, h = face_box
    # Cắt vùng khuôn mặt và kiểm tra biên hợp lệ
    face = frame[max(0, y):y+h, max(0, x):x+w]
    face = cv2.resize(face, (160, 160))
    face = face.astype('float32')
    
    # Chuẩn hóa ảnh (Standardization)
    mean, std = face.mean(), face.std()
    face = (face - mean) / std
    face_sample = np.expand_dims(face, axis=0)
    
    # Trích xuất vector đặc trưng 128 chiều
    embedding = facenet_model.predict(face_sample, verbose=0)
    return embedding

def process_webcam_stream():
    cap = cv2.VideoCapture(0)
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
            
        rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        results = detector.detect_faces(rgb_frame)
        
        for result in results:
            if result['confidence'] > 0.90:
                box = result['box']
                embedding = extract_face_embedding(rgb_frame, box)
                
                # Phân loại cảm xúc dựa trên vector 128D
                prediction = classifier_model.predict(embedding)
                probabilities = classifier_model.predict_proba(embedding)
                confidence = np.max(probabilities) * 100
                
                label = f"{EMOTION_LABELS[prediction[0]]}: {confidence:.1f}%"
                
                # Vẽ Bounding Box và Nhãn trạng thái
                x, y, w, h = box
                cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
                cv2.putText(frame, label, (x, max(20, y-10)), 
                            cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
                
        cv2.imshow('Mood Estimation System - Graduation Project', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
            
    cap.release()
    cv2.destroyAllWindows()

Testing và validation

Hệ thống được thử nghiệm qua 4 kịch bản vận hành thực tế nhằm đánh giá độ bền vững trước biến đổi ngoại cảnh:

Kịch bản kiểm thử Điều kiện môi trường Precision (%) Recall (%) F1-Score (%)
Kịch bản 1: Ánh sáng chuẩn Đèn phòng đầy đủ, góc quay trực diện ($0^\circ - 15^\circ$) 91.2% 89.5% 90.3%
Kịch bản 2: Ánh sáng yếu Chỉ có ánh sáng màn hình máy tính chiếu vào 83.4% 81.0% 82.2%
Kịch bản 3: Góc nghiêng đầu Người chơi game xoay đầu góc $30^\circ - 45^\circ$ 82.1% 79.6% 80.8%
Kịch bản 4: Biểu cảm hỗn hợp Chuyển trạng thái cảm xúc nhanh giữa các pha game 86.8% 85.2% 86.0%

Phân rã thời gian tính toán cho mỗi khung hình (Inference Latency Profile):

  • Phát hiện & Căn chỉnh khuôn mặt (MTCNN): 19.4 ms
  • Trích xuất 128-D Vector (FaceNet Inference): 21.2 ms
  • Phân loại cảm xúc (SVM Classifier): 0.8 ms
  • Vẽ giao diện & Hiển thị (OpenCV Render): 1.6 ms
  • Tổng thời gian xử lý: 43.0 ms/frame (Đạt tốc độ ~23.25 FPS, đảm bảo luồng hình ảnh mượt mà trong thời gian thực).

Kết quả đạt được

Chương trình đã xây dựng thành công ứng dụng độc lập trên hệ điều hành Windows:

  • Đạt độ chính xác tổng thể trung bình (Overall Accuracy) 87.3% trên tập dữ liệu kiểm thử thực nghiệm.
  • Xử lý mượt mà luồng hình ảnh từ Webcam tiêu chuẩn mà không xảy ra hiện tượng tràn bộ nhớ (Memory Leak), dung lượng RAM duy trì ổn định dưới 850 MB.
  • Cho phép xuất file log trạng thái tâm trạng chi tiết theo từng giây để đối chiếu với video timeline của màn hình game/video.

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

  1. Kiến trúc Decoupled Feature Extraction: Thay vì huấn luyện một mô hình Deep Learning đầu-cuối nặng nề từ đầu, đề tài phân tách thông minh khâu trích xuất đặc trưng hình học/không gian (sử dụng Transfer Learning từ FaceNet) và khâu phân loại cảm xúc (dùng Classifier nhẹ). Cách tiếp cận này giúp giảm thời gian huấn luyện mô hình xuống hơn 80% mà vẫn giữ được độ khái quát hóa cao.
  2. Thu gọn chiều dữ liệu (Dimensionality Reduction): Biểu diễn toàn bộ cấu trúc biểu cảm khuôn mặt phức tạp chỉ bằng vector 128 chiều, giúp tốc độ dự đoán đạt dưới 1 ms cho mỗi lần phân loại, tạo tiền đề để chạy đa luồng trên các thiết bị giới hạn tài nguyên.
  3. Tính ứng dụng kỹ thuật cao: Đồ án không dừng lại ở nghiên cứu lý thuyết thuần túy mà đã hoàn thiện thành một phần mềm có khả năng tương tác trực tiếp với phần cứng Webcam thực tế trên hệ điều hành Windows.

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

Giải pháp mang lại giá trị ứng dụng rõ nét trong nhiều lĩnh vực:

  • Thử nghiệm game (Game Playtesting & QA): Giúp các studio game xác định chính xác phân đoạn nào khiến người chơi hưng phấn, nhàm chán hoặc ức chế (rage quit) mà không cần can thiệp đặt câu hỏi ngắt quãng quá trình chơi.
  • Tối ưu hóa nội dung Video / Quảng cáo (Media & Ad Optimization): Đo lường mức độ tương tác cảm xúc của khán giả theo từng giây đối với các video quảng cáo hoặc bài giảng điện tử (E-Learning).
  • Phát hiện căng thẳng cho lập trình viên/dân văn phòng: Cảnh báo sớm trạng thái mệt mỏi hoặc căng thẳng khi ngồi trước máy tính trong thời gian dài.

Yêu cầu cấu hình hệ thống triển khai:

  • CPU: Intel Core i5 thế hệ thứ 8 hoặc AMD Ryzen 5 tương đương trở lên.
  • RAM: Tối thiểu 8 GB.
  • Webcam: Chuẩn HD 720p 30 FPS.
  • Hệ điều hành: Windows 10/11 64-bit có cài đặt Python runtime hoặc file thực thi đóng gói độc lập.

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

Mặc dù đạt được những kết quả khả quan, đồ án vẫn còn một số điểm hạn chế kỹ thuật cần được nâng cấp:

  • Hiện tượng che khuất (Occlusion): Độ chính xác giảm khi người dùng dùng tay che miệng, chống cằm hoặc đeo kính mát/khẩu trang.
  • Độ nhạy thời gian (Temporal Dynamics): Hiện tại mô hình đánh giá cảm xúc dựa trên từng khung hình độc lập (Frame-by-frame) mà chưa kết hợp ngữ cảnh chuỗi thời gian liên tục.

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

  • Tích hợp mạng mạng nơ-ron hồi quy LSTM (Long Short-Term Memory) hoặc Temporal Convolutional Networks (TCN) để phân tích chuỗi chuyển động cơ mặt liên tục theo thời gian, giúp phân biệt nụ cười xã giao và nụ cười tự nhiên.
  • Mở rộng phân tích đa phương thức (Multimodal Affective Analysis) kết hợp giữa biểu cảm khuôn mặt, âm thanh giọng nói và tần suất gõ phím/chuột.

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

  • Sinh viên & Học viên ngành CNTT / Điện tử: Nguồn tài liệu tham khảo chi tiết về cách kết hợp Transfer Learning, mạng trích xuất FaceNet và thư viện MTCNN để giải quyết bài toán thị giác máy tính thực tế.
  • Lập trình viên AI & Computer Vision: Tham khảo cấu trúc mã nguồn tối ưu hóa pipeline xử lý thời gian thực giữa OpenCV và TensorFlow trên Windows.
  • Các Studio phát triển Game & Đơn vị EdTech: Sở hữu giải pháp định lượng phản hồi người dùng với chi phí phần cứng gần như bằng 0 (chỉ tận dụng webcam có sẵn).

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

1. Hệ thống có yêu cầu máy tính phải trang bị GPU rời chuyên dụng không?

Không bắt buộc. Do đồ án sử dụng kiến trúc phân tách (FaceNet trích xuất vector 128 chiều kết hợp Classifier học máy nhẹ), hệ thống có thể chạy mượt mà ở mức 20–25 FPS trên các vi xử lý Intel Core i5/i7 thế hệ mới chỉ với card đồ họa tích hợp.

2. Mô hình phân biệt được những nhóm cảm xúc cụ thể nào?

Hệ thống tập trung phân loại 5 trạng thái cảm xúc chính thường gặp khi ngồi máy tính: Neutral (Tập trung/Bình thường), Happy (Vui vẻ/Hài lòng), Sad (Buồn/Thất vọng), Surprise (Ngạc nhiên) và Frustrated (Căng thẳng/Bực bội).

3. Dữ liệu hình ảnh từ webcam có bị lưu trữ gây lộ bí mật đời tư không?

Hoàn toàn không. Toàn bộ quá trình nhận diện khuôn mặt và trích xuất vector diễn ra trực tiếp trên RAM theo từng khung hình. Hệ thống chỉ xuất dữ liệu dạng văn bản (nhãn cảm xúc và dấu thời gian), không ghi lại bất kỳ tệp video hay hình ảnh khuôn mặt thô nào của người dùng.

4. Tại sao lại chọn vector nhúng 128 chiều của FaceNet thay vì huấn luyện CNN phân loại trực tiếp?

Vector nhúng 128 chiều giúp nén toàn bộ đặc trưng khuôn mặt vào một không gian Euclide nhỏ gọn. Điều này giúp bộ phân loại phía sau tính toán cực nhanh ($< 1\text{ms}$), đồng thời tăng khả năng tổng quát hóa, hạn chế hiện tượng Overfitting khi tập dữ liệu cảm xúc thực tế bị giới hạn.

5. Chi phí triển khai và khả năng tích hợp vào các phần mềm khác như thế nào?

Giải pháp được xây dựng hoàn toàn từ các thư viện mã nguồn mở (OpenCV, MTCNN, TensorFlow, Scikit-Learn), do đó chi phí bản quyền là 0 VNĐ. Module có thể dễ dàng đóng gói thành REST API hoặc tích hợp dưới dạng Background Service trên máy tính Windows.


Kết luận

Đồ án "Ước lượng tâm trạng người xem video / chơi game trên máy tính bằng cách xử lý hình ảnh webcam" của tác giả Nguyễn Quang Anh đã hoàn thành xuất sắc các mục tiêu nghiên cứu và thực nghiệm đề ra. Bằng cách kết hợp linh hoạt giữa mạng phát hiện MTCNN, mô hình biểu diễn đặc trưng FaceNet 128-D và các thuật toán phân loại Học máy tối ưu, đề tài đã tạo ra một sản phẩm ứng dụng hoàn chỉnh, chạy ổn định và đạt độ chính xác cao trên môi trường Windows. Đây là bước đệm vững chắc mở ra nhiều tiềm năng thương mại hóa trong lĩnh vực phân tích trải nghiệm người dùng số và giải trí tương tác.