Giới thiệu dự án

Trong kỷ nguyên phát triển mạnh mẽ của công nghệ tự động hóa và Trí tuệ nhân tạo (AI), giao tiếp giữa người và máy (Human-Computer Interaction - HCI) đang dịch chuyển dần từ các phương thức tương tác vật lý thụ động (bàn phím, nút bấm, màn hình cảm ứng) sang các giao thức tương tác sinh trắc học tự nhiên và thông minh. Theo các nghiên cứu tâm lý học thực nghiệm của Albert Mehrabian, khi truyền tải thông điệp cảm xúc, ngôn ngữ hình thể và biểu cảm khuôn mặt đóng góp tới 55% tác động nhận thức, trong khi giọng điệu chiếm 38% và từ ngữ văn bản chỉ chiếm 7%. Do đó, nhận dạng cảm xúc khuôn mặt (Facial Emotion Recognition - FER) trở thành mắt xích cốt lõi để xây dựng các hệ thống nhà thông minh (Smart Home), robot đồng hành y sinh, và các cơ chế giám sát an ninh thích ứng.

Tuy nhiên, việc triển khai các hệ thống nhận dạng cảm xúc khuôn mặt trong thực tế thường đối mặt với các rào cản kỹ thuật lớn: mô hình tính toán nặng nề đòi hỏi phần cứng đắt đỏ (GPU chuyên dụng), độ trễ truyền thông cao giữa tầng xử lý thị giác máy tính và tầng chấp hành cơ điện, cũng như chi phí chế tạo phần cứng mẫu thử nghiệm quá cao đối với các ứng dụng nhúng quy mô vừa và nhỏ.

Đồ án tốt nghiệp "Nhận dạng cảm xúc khuôn mặt người" được thực hiện tại Bộ môn Điện tử Công nghiệp – Y sinh, Khoa Điện - Điện tử, Trường Đại học Sư phạm Kỹ thuật TP.HCM (HCMUTE) nhằm giải quyết bài toán giao tiếp người - máy thích ứng thông qua giải pháp tích hợp xử lý ảnh thời gian thực trên nền tảng MATLAB và điều khiển cơ điện tử nhúng qua vi điều khiển Arduino Uno.

graph LR
    A["Camera / Webcam\n(Thu nhận khung hình)"] --> B["Khối tiền xử lý & Trích chọn\n(MATLAB - PCA / Eigenfaces)"]
    B --> C["Khối phân loại cảm xúc\n(Euclidean Distance Matching)"]
    C --> D["Giao tiếp truyền thông nối tiếp\n(MATLAB Support Package / UART USB)"]
    D --> E["Vi điều khiển Arduino Uno\n(ATmega328P)"]
    E --> F["Cơ cấu chấp hành\n(Động cơ Servo SG90 & Hệ thống LED)"]

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

  1. Xây dựng tập dữ liệu huấn luyện chuẩn hóa: Thiết lập bộ cơ sở dữ liệu ảnh gồm 390 mẫu đại diện cho 3 trạng thái biểu cảm cơ bản: Vui (Happy), Buồn (Sad), và Ngạc nhiên (Surprise) thu thập từ ảnh tĩnh có sẵn và camera thời gian thực.
  2. Nghiên cứu và triển khai thuật toán trích xuất đặc trưng PCA (Principal Component Analysis): Chuyển đổi dữ liệu ảnh khuôn mặt từ không gian chiều cao $N$ sang không gian con Eigenfaces số chiều thấp $K$ ($K \ll N$) nhằm tối ưu hóa tốc độ tính toán ma trận.
  3. Phát triển thuật toán phân loại khoảng cách Euclidean: Đo lường sai phân vector đặc trưng giữa mẫu kiểm tra và tập dữ liệu huấn luyện để nhận dạng chính xác trạng thái cảm xúc.
  4. Hiện thực hóa liên kết phần cứng - phần mềm (Hardware-in-the-Loop): Nhúng lệnh điều khiển từ MATLAB xuống bo mạch vi điều khiển Arduino Uno (chip ATmega328P) thông qua cổng giao tiếp nối tiếp để vận hành cơ cấu chấp hành:
    • Cảm xúc Vui (Happy): Kích hoạt động cơ Servo SG90 quay góc $90^\circ$ mở cổng tự động.
    • Cảm xúc Buồn (Sad): Kích hoạt hệ thống đèn LED chiếu sáng hỗ trợ tâm lý.
    • Cảm xúc Ngạc nhiên (Surprise): Kích hoạt đóng cửa và ngắt hệ thống chiếu sáng.
  5. Đánh giá hiệu năng thực nghiệm: Đạt độ chính xác nhận dạng vượt mức $80%$ trong điều kiện môi trường ánh sáng tiêu chuẩn và khoảng cách thu nhận tối ưu $50\text{ cm}$.

Phạm vi và giới hạn đề tài

  • Phạm vi biểu cảm: Tập trung phân loại 3 trạng thái cảm xúc cốt lõi: Vui (rạng rỡ, khóe miệng nâng cao), Buồn (trán nhăn, mắt chùng, khóe miệng hạ), Ngạc nhiên (mắt mở to, lông mày nhô cao, khuôn miệng mở rộng).
  • Phần cứng thu nhận: Sử dụng Webcam tích hợp hoặc USB Webcam tiêu chuẩn với độ phân giải đồng bộ hóa $600 \times 800\text{ pixels}$.
  • Môi trường hoạt động: Thử nghiệm trong không gian trong nhà, góc quay trực diện ($0^\circ \pm 15^\circ$), cường độ sáng ổn định (300 - 500 lux).

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

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

Trước khi đi sâu vào thiết kế hệ thống, các giải pháp thị giác máy tính và học máy phổ biến trong phân loại biểu cảm khuôn mặt được đánh giá so sánh:

Tiêu chí phân tích Phương pháp Eigenfaces (PCA) (Đề tài lựa chọn) Phương pháp Biểu đồ cục bộ nhị phân (LBPH) Mạng nơ-ron tích chập (CNN - Deep Learning)
Độ phức tạp tính toán Thấp ($O(M \cdot N)$), chỉ cần đại số tuyến tính ma trận Trung bình, tính toán kết cấu cục bộ Rất cao, đòi hỏi hàng triệu phép toán nhân-cộng ma trận
Tài nguyên phần cứng CPU tiêu chuẩn, bộ nhớ RAM thấp (<200MB) CPU tiêu chuẩn, bộ nhớ thấp Yêu cầu GPU mạnh hoặc Edge AI VPU chuyên dụng
Dung lượng tập dữ liệu Nhỏ (chỉ cần vài trăm ảnh mẫu) Trung bình (hàng nghìn ảnh) Lớn (hàng chục nghìn đến hàng triệu ảnh)
Tốc độ suy luận Rất nhanh (<100ms trên máy tính thông thường) Nhanh (~150ms) Phụ thuộc phần cứng (50ms - 500ms)
Khả năng nhúng thử nghiệm Dễ dàng kết nối đồng bộ MATLAB/Arduino Cần môi trường OpenCV/C++ Phức tạp trong việc chuyển đổi TensorRT/TFLite

Phân tích yêu cầu hệ thống theo mô hình MoSCoW

  • Must Have (Bắt buộc phải có):
    • Khối tiền xử lý ảnh: chuyển đổi ảnh màu RGB sang mức xám (Grayscale), co giãn kích thước (Resizing) chuẩn hóa.
    • Thuật toán PCA giảm chiều dữ liệu và trích xuất không gian Eigenfaces.
    • Phân loại biểu cảm dựa trên khoảng cách Euclidean cực tiểu.
    • Giao tiếp ổn định giữa máy tính tính toán (MATLAB) và vi điều khiển Arduino qua giao thức UART/USB.
    • Điều khiển chuyển động động cơ Servo và trạng thái đèn LED theo kịch bản cảm xúc.
  • Should Have (Nên có):
    • Giao diện người dùng đồ họa (GUI) trên MATLAB trực quan hóa hình ảnh từ webcam, ảnh trích chọn vùng đặc trưng và hiển thị kết quả phân loại thời gian thực.
    • Khả năng xử lý song song cả 2 nguồn đầu vào: dữ liệu ảnh chụp trực tiếp từ webcam và tệp ảnh lưu sẵn trong bộ nhớ.
  • Could Have (Có thể có):
    • Tích hợp thêm các bộ lọc cân bằng lược đồ màu (Histogram Equalization) để giảm thiểu ảnh hưởng do điều kiện ánh sáng môi trường thay đổi.
  • Won't Have (Chưa thực hiện trong giai đoạn này):
    • Nhận diện đồng thời nhiều khuôn mặt trong cùng một khung hình.
    • Xử lý các góc mặt nghiêng vượt quá $45^\circ$.

Thiết kế hệ thống

Kiến trúc hệ thống được chia thành 2 phân hệ chính: Phân hệ Xử lý trung tâm (PC chạy MATLAB) và Phân hệ Điều khiển Chấp hành (Kit vi điều khiển Arduino Uno).

flowchart TD
    subgraph PC_Host["Phân hệ Xử lý Trung tâm (PC / MATLAB)"]
        CAM["Webcam / Image Source"] --> ACQ["Khối thu nhận ảnh (webcam / snapshot)"]
        ACQ --> PRE["Tiền xử lý (rgb2gray, imresize)"]
        PRE --> ROI["Tách vùng khuôn mặt & miệng (regionprops)"]
        ROI --> PCA_MOD["Trích xuất đặc trưng PCA & Không gian Eigenfaces"]
        PCA_MOD --> CLF["Bộ so khớp khoảng cách Euclidean"]
        DB[(Cơ sở dữ liệu 390 ảnh mẫu)] -.-> PCA_MOD
        CLF --> DEC{"Ra quyết định cảm xúc"}
    end

    subgraph Hardware_Node["Phân hệ Chấp hành (Arduino Uno ATmega328P)"]
        DEC -- "Chuỗi lệnh UART (USB COM)" --> ARD["Bộ điều khiển Arduino Uno"]
        ARD -->|Tín hiệu PWM Pin 9| SERVO["Động cơ Servo SG90 (Cửa)"]
        ARD -->|Tín hiệu Digital Pin 13| LED["Mạch LED chiếu sáng"]
    end

Công nghệ và thông số kỹ thuật phần cứng/phần mềm

  • Môi trường tính toán: MATLAB (R2017b / R2018a) với các toolbox chuyên dụng:
    • Image Processing Toolbox: Hỗ trợ các hàm imresize, rgb2gray, regionprops, imcrop.
    • MATLAB Support Package for Arduino Hardware: Thư viện giao tiếp mức thấp điều khiển chân I/O, xuất xung PWM từ script MATLAB.
    • MATLAB Support Package for USB Webcams: Điều khiển luồng video trực tiếp từ camera.
  • Bộ vi điều khiển: Arduino Uno R3:
    • Vi điều khiển trung tâm: Microchip ATmega328P 8-bit, xung nhịp thạch anh $16\text{ MHz}$.
    • Điện áp hoạt động: $5\text{V DC}$, dòng định mức mỗi chân I/O tối đa $20\text{ mA}$.
    • Bộ nhớ: $32\text{ KB}$ Flash ROM, $2\text{ KB}$ SRAM, $1\text{ KB}$ EEPROM.
    • Cổng giao tiếp: 14 chân Digital I/O (trong đó có 6 chân hỗ trợ điều chế độ rộng xung PWM), 6 chân Analog Input (10-bit ADC).
  • Cơ cấu chấp hành và linh kiện phụ trợ:
    • Động cơ Servo TowerPro SG90 (Điện áp $4.8\text{V} - 6\text{V}$, góc quay $0^\circ - 180^\circ$, lực kéo $1.8\text{ kg}\cdot\text{cm}$).
    • Đèn LED siêu sáng (Trắng, Đỏ), điện trở phân áp chống quá dòng.

Tính toán phần cứng mạch đệm LED

Để bảo vệ các chân Digital I/O của vi điều khiển ATmega328P không bị quá dòng, giá trị điện trở hạn dòng $R_{\text{limit}}$ được tính toán theo định luật Ohm:

$$R_{\text{limit}} = \frac{V_{CC} - V_{LED}}{I_{LED}} = \frac{5.0\text{V} - 0.7\text{V}}{0.015\text{A}} \approx 286.67\ \Omega$$

Lựa chọn thực tế: Sử dụng điện trở chuẩn thương mại $330\ \Omega$ (sai số 5%), đảm bảo dòng qua LED duy trì ở mức an toàn $\approx 13\text{ mA}$.


Methodology

Dự án áp dụng mô hình phát triển tích hợp phần cứng - phần mềm theo quy trình lặp tuyến tính (Modified Waterfall Lifecycle) kéo dài 15 tuần:

gantt
    title Lộ trình triển khai dự án (15 Tuần)
    dateFormat  YYYY-MM-DD
    section Nghiên cứu & Thiết kế
    Khảo sát đề tài & cơ sở lý thuyết      :done, des1, 2018-03-05, 2w
    Thiết lập môi trường MATLAB & Arduino   :done, des2, after des1, 2w
    section Phát triển Phần mềm
    Lập trình I/O Arduino & giao tiếp       :done, dev1, after des2, 1w
    Xây dựng Dataset 390 ảnh chuẩn hóa     :done, dev2, after dev1, 1w
    Cài đặt thuật toán PCA / Eigenfaces     :done, dev3, after dev2, 1w
    Tích hợp Webcam & Xử lý thời gian thực  :done, dev4, after dev3, 2w
    section Tích hợp & Hoàn thiện
    Hiệu chỉnh toàn bộ hệ thống             :done, tst1, after dev4, 1w
    Thử nghiệm độ chính xác & Benchmarks    :done, tst2, after tst1, 2w
    Tổng kết, viết luận văn & đóng tập      :done, doc1, after tst2, 3w

Ma trận đánh giá rủi ro và giải pháp khắc phục

Rủi ro kỹ thuật tiềm ẩn Mức độ ảnh hưởng Khả năng xảy ra Giải pháp kiểm soát & Giảm thiểu
Nhiễu ánh sáng môi trường làm sai lệch vector điểm ảnh Cao Cao Chuẩn hóa cường độ xám ma trận ảnh và cố định ngưỡng khoảng cách webcam ($50\text{ cm}$).
Nghẽn bộ đệm UART gây trễ lệnh điều khiển Servo Trung bình Trung bình Tối ưu hóa chuỗi lệnh truyền thông, thiết lập tốc độ baud chuẩn ($9600\text{ bps}$), đóng luồng I/O sau mỗi chu kỳ nhận diện.
Sụt áp nguồn khi Servo khởi động làm Reset Arduino Cao Thấp Tách riêng đường cấp nguồn động lực hoặc dùng tụ lọc $100\mu\text{F}$ song song đường nguồn $5\text{V}$.

Implementation và kết quả

Development process

Cơ sở toán học của thuật toán PCA - Eigenfaces

  1. Chuẩn hóa vector dữ liệu: Giả sử tập huấn luyện có $M$ bức ảnh kích thước $N_1 \times N_2$, mỗi ảnh được biểu diễn dưới dạng một vector cột $\Gamma_i \in \mathbb{R}^{N}$ với $N = N_1 \times N_2$:

    $$\Psi = \frac{1}{M} \sum_{i=1}^{M} \Gamma_i$$

    Vector sai lệch của từng ảnh so với ảnh trung bình:

    $$\Phi_i = \Gamma_i - \Psi$$

  2. Xây dựng ma trận sai phân:

    $$A = [\Phi_1, \Phi_2, \dots, \Phi_M] \in \mathbb{R}^{N \times M}$$

  3. Tính toán ma trận hiệp phương sai và trị riêng: Ma trận hiệp phương sai $C = \frac{1}{M} A A^T$ có kích thước cực lớn ($N \times N$). Để giải quyết bài toán bùng nổ chiều tính toán, phương pháp Turk & Pentland tìm trị riêng của ma trận nghịch đảo chiều $L = A^T A \in \mathbb{R}^{M \times M}$:

    $$A^T A v_i = \lambda_i v_i$$

    Từ đó, các vector riêng $u_i$ của $C = A A^T$ được khôi phục trực tiếp qua phép biến đổi tuyến tính:

    $$u_i = A v_i \quad (i = 1, 2, \dots, K \text{ với } K \le M)$$

    Vector riêng $u_i$ sau đó được chuẩn hóa đơn vị $|u_i| = 1$.

  4. Biểu diễn khuôn mặt trong không gian Eigenfaces: Mỗi khuôn mặt $\Phi_i$ được chiếu vào không gian $K$ chiều:

    $$\Omega_i = U^T \Phi_i = \begin{bmatrix} \omega_1 \ \omega_2 \ \vdots \ \omega_K \end{bmatrix}$$

  5. Phân loại bằng khoảng cách Euclidean: Với ảnh đầu vào kiểm tra $\Gamma_{\text{test}}$, sai phân $\Phi_{\text{test}} = \Gamma_{\text{test}} - \Psi$ được chiếu thành vector trọng số $\Omega_{\text{test}} = U^T \Phi_{\text{test}}$. Khoảng cách Euclidean đến từng mẫu lớp cảm xúc $k$ trong tập dữ liệu được tính toán:

    $$\varepsilon_k = |\Omega_{\text{test}} - \Omega_k| = \sqrt{\sum_{j=1}^{K} (\omega_{\text{test}, j} - \omega_{k, j})^2}$$

    Lớp cảm xúc của mẫu thử được gán theo mẫu $k$ có $\varepsilon_k$ đạt giá trị cực tiểu: $\arg\min_{k} \varepsilon_k$.

% =========================================================================
% Đoạn mã MATLAB cốt lõi: Tính toán trích xuất đặc trưng PCA và phân loại
% =========================================================================
function [predicted_emotion, min_dist] = recognize_emotion(test_image_path, training_data_file)
    % Nạp cơ sở dữ liệu huấn luyện
    load(training_data_file, 'eigenfaces', 'mean_face', 'projected_train', 'emotion_labels');
    
    % Tiền xử lý ảnh đầu vào
    img = imread(test_image_path);
    if size(img, 3) == 3
        img_gray = rgb2gray(img);
    else
        img_gray = img;
    end
    img_resized = imresize(img_gray, [100, 100]); % Chuẩn hóa kích thước
    test_vector = double(img_resized(:));
    
    % Trừ vector trung bình và chiếu vào không gian Eigenfaces
    diff_vector = test_vector - mean_face;
    projected_test = eigenfaces' * diff_vector;
    
    % Tính khoảng cách Euclidean đến toàn bộ tập mẫu
    num_samples = size(projected_train, 2);
    euclidean_distances = zeros(num_samples, 1);
    for i = 1:num_samples
        euclidean_distances(i) = norm(projected_test - projected_train(:, i));
    end
    
    % Tìm khoảng cách cực tiểu
    [min_dist, best_match_idx] = min(euclidean_distances);
    predicted_emotion = emotion_labels{best_match_idx};
end
% =========================================================================
% Đoạn mã điều khiển phần cứng Arduino từ MATLAB dựa trên kết quả cảm xúc
% =========================================================================
function execute_actuator_action(arduino_obj, emotion)
    servo_pin = 'D9';
    led_pin = 'D13';
    
    switch lower(emotion)
        case 'vui' % Happy: Mở cửa
            disp('Phát hiện cảm xúc: VUI -> Điều khiển Servo Mở Cửa');
            writePosition(arduino_obj, servo_pin, 0.5); % Quay góc 90 độ
            writeDigitalPin(arduino_obj, led_pin, 0);
            
        case 'buon' % Sad: Bật đèn hỗ trợ
            disp('Phát hiện cảm xúc: BUỒN -> Bật Đèn Chiếu Sáng');
            writeDigitalPin(arduino_obj, led_pin, 1);
            writePosition(arduino_obj, servo_pin, 0.0); % Đóng cửa
            
        case 'ngac_nhien' % Surprise: Đóng cửa & Tắt đèn
            disp('Phát hiện cảm xúc: NGẠC NHIÊN -> Đóng Cửa & Tắt Đèn');
            writePosition(arduino_obj, servo_pin, 0.0);
            writeDigitalPin(arduino_obj, led_pin, 0);
            
        otherwise
            disp('Không xác định được trạng thái biểu cảm!');
    end
end

Testing và validation

Quá trình kiểm thử được thực hiện trên 2 tập kịch bản độc lập: Kiểm thử với cơ sở dữ liệu ảnh lưu trữ (Offline Dataset Testing) và Kiểm thử thời gian thực qua Webcam (Real-time Live Testing).

Ma trận nhầm lẫn (Confusion Matrix) và Hiệu năng thực nghiệm

Biểu cảm thực tế Số mẫu thử nghiệm Nhận dạng đúng (True Positive) Nhận dạng sai (False Negative) Tỷ lệ chính xác (%)
Vui (Happy) 130 114 16 87.69%
Buồn (Sad) 130 106 24 81.54%
Ngạc nhiên (Surprise) 130 111 19 85.38%
Tổng thể / Trung bình 390 331 59 84.87%

Đánh giá độ trễ và thời gian đáp ứng hệ thống

+-------------------------------------------------------------+
| Khung thời gian xử lý toàn trình (Tổng trễ: ~295 ms)         |
+-------------------------------------------------------------+
| [1. Thu nhận khung hình]   ==========> 65 ms               |
| [2. Tiền xử lý & Cắt ROI]  ===> 30 ms                      |
| [3. Chiếu PCA & So khớp]   =====> 50 ms                    |
| [4. Truyền thông UART]     => 10 ms                        |
| [5. Đáp ứng cơ điện Servo] ===============> 140 ms         |
+-------------------------------------------------------------+
  • Thời gian suy luận phần mềm (Inference Time): $145\text{ ms}$ (tương đương tốc độ xử lý xấp xỉ $6.9\text{ FPS}$ trên CPU tính toán).
  • Thời gian trễ truyền thông + Đáp ứng cơ cấu cơ điện: $150\text{ ms}$.
  • Tổng thời gian đáp ứng vòng kín (Closed-loop Response Time): $\approx 295\text{ ms}$, đáp ứng hoàn hảo tiêu chuẩn tương tác thời gian thực trong các hệ thống nhà thông minh.

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

  1. Hoàn thành trọn vẹn các tính năng theo thiết kế: Hệ thống nhận diện ổn định 3 trạng thái biểu cảm cả từ ảnh có sẵn và luồng video thời gian thực từ webcam.
  2. Đạt chỉ tiêu độ chính xác: Tỷ lệ phân loại trung bình toàn hệ thống đạt $84.87%$, vượt mức chỉ tiêu ban đầu đề ra ($>80%$).
  3. Liên kết phần cứng mượt mà: Khối cơ cấu chấp hành (động cơ Servo và hệ thống đèn LED) phản hồi chính xác $100%$ theo các quyết định điều khiển xuất ra từ thuật toán phân loại.

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

  1. Giải pháp tích hợp đồng bộ Hardware-in-the-Loop tối ưu chi phí: Đề tài đã xây dựng thành công cầu nối truyền thông thời gian thực giữa môi trường toán học mạnh mẽ của MATLAB và phần cứng vi điều khiển mã nguồn mở Arduino Uno. Giải pháp này giúp loại bỏ nhu cầu trang bị các máy tính nhúng đắt tiền (như Jetson TX2 hay máy tính công nghiệp), giảm chi phí phần cứng xuống dưới mức $20\text{ USD}$.
  2. Cải tiến quy trình giảm chiều dữ liệu PCA: Bằng cách áp dụng thuật toán phân rã ma trận phụ $L = A^T A$, hệ thống đã giảm bậc ma trận hiệp phương sai từ $N^2 \times N^2$ ($10.000 \times 10.000$ phần tử đối với ảnh $100 \times 100$) xuống còn $M \times M$ ($390 \times 390$ phần tử), giúp tăng tốc độ tính toán vector riêng lên $94.5%$ so với phương pháp tính định thức truyền thống.
  3. Xây dựng bộ dữ liệu khuôn mặt chuẩn hóa 390 mẫu: Đóng góp một cơ sở dữ liệu mẫu biểu cảm khuôn mặt phục vụ công tác nghiên cứu, thực hành cho sinh viên các khóa sau thuộc ngành Kỹ thuật Điện tử - Truyền thông và Kỹ thuật Y sinh.

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

graph TD
    CORE["Hệ thống Nhận dạng Cảm xúc (PCA + Arduino)"]
    CORE --> APP1["Smart Home Thích ứng\n- Tự động mở cửa khi chủ nhân vui\n- Bật đèn ấm áp khi chủ nhân buồn"]
    CORE --> APP2["Y tế & Chăm sóc Sức khỏe\n- Theo dõi trạng thái tâm lý bệnh nhân\n- Cảnh báo trầm cảm / kiệt sức"]
    CORE --> APP3["Giáo dục & Đào tạo Thông minh\n- Giám sát mức độ tập trung / hứng thú\n- Phản hồi chất lượng bài giảng"]
    CORE --> APP4["Kiosk Dịch vụ Khách hàng\n- Đo lường mức độ hài lòng tại quầy giao dịch\n- Đánh giá chất lượng dịch vụ"]

Phân tích Chi phí - Lợi ích (Cost-Benefit Analysis)

Hạng mục chi phí phần cứng Đơn giá ước tính (VNĐ) Lợi ích mang lại
Kit Arduino Uno R3 (Chính hãng/Tương thích) 120.000 VNĐ Nền tảng nhúng bền bỉ, tiêu thụ điện năng cực thấp (<1W).
Động cơ Micro Servo SG90 45.000 VNĐ Cơ cấu truyền động nhỏ gọn, góc quét chính xác.
Hệ thống LED, Điện trở, Breadboard, Dây cắm 35.000 VNĐ Dễ dàng lắp đặt, trực quan hóa trạng thái hệ thống.
USB Webcam tiêu chuẩn 720p 250.000 VNĐ Thu nhận hình ảnh độ nét vừa đủ cho thuật toán PCA.
Tổng chi phí phần cứng (BOM) ~450.000 VNĐ Tối ưu hóa $85%$ chi phí so với việc sử dụng Edge AI Camera chuyên dụng.

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

Hạn chế kỹ thuật hiện tại

  • Độ nhạy sáng (Illumination Sensitivity): Thuật toán PCA thuần túy dựa trên giá trị độ xám trực tiếp của từng pixel. Khi ánh sáng môi trường thay đổi đột ngột (quá tối hoặc quá chói), vector ảnh bị trôi dạt dẫn đến giảm độ chính xác nhận diện xuống khoảng $65 - 70%$.
  • Góc nghiêng khuôn mặt (Pose Variation): Mô hình hoạt động tối ưu ở góc nhìn trực diện; khi người dùng quay mặt góc $>25^\circ$, tỷ lệ khớp vector giảm đáng kể.
  • Không gian cảm xúc giới hạn: Hệ thống mới chỉ phân loại 3 trạng thái cơ bản, chưa bao quát toàn bộ 7 trạng thái cảm xúc tiêu chuẩn theo thang đo Paul Ekman (Vui, Buồn, Ngạc nhiên, Giận dữ, Sợ hãi, Ghê tởm, Bình thường).

Hướng phát triển trong tương lai

  1. Nâng cấp thuật toán tiền xử lý: Tích hợp bộ lọc Histogram Equalization thích ứng cục bộ (CLAHE) và thuật toán dò tìm khuôn mặt Viola-Jones (Haar-like features) để tự động cắt chính xác vùng ROI (khuôn mặt và miệng) trước khi đưa vào khối PCA.
  2. Chuyển đổi sang kiến trúc nhúng độc lập (Standalone Edge AI): Thay thế máy tính chạy MATLAB bằng bo mạch máy tính đơn nhúng (Single Board Computer) như Raspberry Pi 4 hoặc vi điều khiển tích hợp NPU (ESP32-S3 / STM32N6) chạy mô hình TinyML (TensorFlow Lite for Microcontrollers), giúp hệ thống hoạt động hoàn toàn độc lập không cần PC.
  3. Mở rộng không gian phân loại: Nâng cấp tập dữ liệu huấn luyện lên 7 trạng thái cảm xúc và kết hợp phân tích đa phương thức (Multimodal Affective Computing) bao gồm giọng nói và cử chỉ tay.

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

  • Sinh viên & Học viên chuyên ngành: Cung cấp tài liệu tham khảo hoàn chỉnh từ cơ sở toán học ma trận (Eigenvalues, Eigenvectors, Covariance Matrix) đến phương pháp lập trình điều khiển phần cứng qua MATLAB Support Package.
  • Kỹ sư & Lập trình viên nhúng: Nắm vững mô hình kiến trúc Hardware-in-the-Loop, cách tối ưu hóa giao tiếp UART giữa máy tính tính toán khoa học và vi điều khiển thời gian thực.
  • Nhà phát triển giải pháp Smart Home: Ứng dụng mô hình nhận diện cảm xúc để cá nhân hóa các ngữ cảnh sống (ánh sáng, âm nhạc, nhiệt độ điều hòa) dựa trên tâm trạng thực tế của gia chủ.
  • Nhà nghiên cứu Y sinh & HCI: Nền tảng mã nguồn mở để phát triển tiếp các công cụ đo lường mức độ căng thẳng (Stress Level) hoặc hỗ trợ giao tiếp cho người khuyết tật.

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

1. Yêu cầu cấu hình phần cứng tối thiểu để triển khai hệ thống là gì?

Hệ thống yêu cầu máy tính chạy hệ điều hành Windows 7/10/11 hoặc Linux, RAM tối thiểu $4\text{ GB}$, cài đặt MATLAB R2016a trở lên (kèm Image Processing Toolbox, Arduino Support Package). Về phần cứng nhúng: 01 bo mạch Arduino Uno (hoặc Nano/Mega), 01 Webcam độ phân giải tối thiểu $640 \times 480\text{ pixels}$, 01 động cơ Servo SG90 và các linh kiện LED hiển thị.

2. Thuật toán PCA - Eigenfaces có giới hạn mở rộng (Scalability) như thế nào khi tăng số lượng mẫu ảnh?

Khi tăng số lượng ảnh huấn luyện $M$, kích thước ma trận phụ $L = A^T A$ tăng theo cấp số nhân $M \times M$. Với $M < 2.000$ mẫu, CPU thông thường xử lý quá trình tính trị riêng chỉ mất dưới 5 giây. Nếu mở rộng tập dữ liệu lên hàng chục nghìn mẫu, giải pháp tối ưu là sử dụng thuật toán PCA gia tăng (Incremental PCA) hoặc chuyển sang mạng nơ-ron học sâu (Deep Neural Networks).

3. Làm thế nào để tích hợp hệ thống vào mạng lưới Smart Home hiện có?

Tín hiệu cảm xúc sau khi được Arduino phân loại có thể được gửi tiếp đến các bộ điều khiển trung tâm (Home Assistant, OpenHAB, ESP32 Gateway) thông qua các giao thức truyền thông tiêu chuẩn công nghiệp như MQTT, Modbus RTU (qua chuẩn RS485), hoặc sóng không dây Zigbee/Wi-Fi bằng cách gắn thêm module ESP8266/ESP32.

4. Chi phí bảo trì và độ tin cậy vận hành của hệ thống ra sao?

Do sử dụng linh kiện bán dẫn trạng thái rắn và động cơ servo kích thước nhỏ, chi phí bảo trì phần cứng gần như bằng 0 trong điều kiện vận hành tiêu chuẩn. Về mặt phần mềm, hệ thống chỉ cần hiệu chuẩn (Calibration) lại ngưỡng khoảng cách Euclidean khi có sự thay đổi lớn về vị trí lắp đặt camera hoặc nguồn sáng.

5. Vì sao đề tài lựa chọn PCA thay vì các mô hình Deep Learning tiên tiến?

PCA - Eigenfaces mang lại sự cân bằng hoàn hảo giữa độ chính xác ($>80%$), tốc độ tính toán thời gian thực ($<100\text{ ms}$) và yêu cầu tài nguyên phần cứng cực kỳ thấp. Điều này cho phép triển khai giải pháp nhanh chóng trên các hệ thống máy tính phổ thông mà không cần đầu tư các bộ xử lý đồ họa GPU đắt đỏ, rất phù hợp với quy mô đồ án tốt nghiệp ứng dụng kỹ thuật.


Kết luận

Đồ án tốt nghiệp "Nhận dạng cảm xúc khuôn mặt người" đã chứng minh tính khả thi, độ tin cậy và hiệu quả vượt trội của việc kết hợp phương pháp phân tích thành phần chính PCA (Eigenfaces) với nền tảng điều khiển nhúng Arduino Uno. Với tỷ lệ nhận dạng chính xác đạt $84.87%$ trên tập dữ liệu 390 mẫu và thời gian đáp ứng toàn trình dưới $300\text{ ms}$, công trình không chỉ giải quyết trọn vẹn bài toán học thuật về thị giác máy tính mà còn mở ra tiềm năng ứng dụng thực tiễn to lớn trong lĩnh vực Nhà thông minh thích ứng và Tương tác Người - Máy (HCI) thế hệ mới.