Giới thiệu dự án
Nghiên cứu thị giác máy tính (Computer Vision) trong bài toán phân tích hành vi và trạng thái con người đang trở thành trọng tâm của cuộc Cách mạng Công nghiệp 4.0. Trong đó, bài toán nhận diện cảm xúc khuôn mặt (Facial Emotion Recognition - FER) đóng vai trò then chốt trong việc xây dựng các hệ thống tương tác người - máy (Human-Computer Interaction - HCI) thông minh. Theo báo cáo nghiên cứu thị trường từ Mordor Intelligence, quy mô thị trường nhận diện cảm xúc toàn cầu đạt 19,87 tỷ USD vào năm 2020 và dự báo đạt mức tăng trưởng kép hàng năm (CAGR) 18,5% trong giai đoạn 2021–2026. Nhu cầu ứng dụng công nghệ này đang bùng nổ mạnh mẽ trong các lĩnh vực: giám sát an toàn giao thông (phát hiện tài xế mệt mỏi, mất tập trung), bán lẻ thông minh (đo lường mức độ hài lòng của khách hàng tại điểm bán) và giáo dục trực tuyến (đánh giá mức độ tiếp thu của học viên).
Tuy nhiên, bài toán nhận diện cảm xúc khuôn mặt trong điều kiện thực tế (unconstrained environment) đối mặt với thách thức kỹ thuật lớn: sự cân bằng giữa độ chính xác phân loại (Classification Accuracy) và độ trễ tính toán thời gian thực (Real-time Latency). Các mô hình học sâu hiện đại (Deep Learning) đạt độ chính xác cao trên các tập dữ liệu chuẩn thường sở hữu kiến trúc mạng nơ-ron tích chập (Convolutional Neural Networks - CNN) cồng kềnh với hàng chục triệu tham số (ví dụ: VGG16, ResNet50 hay mô hình kết hợp Ensemble). Điều này đòi hỏi năng lực tính toán phần cứng đắt đỏ (GPU chuyên dụng) và gây nghẽn hiệu năng nghiêm trọng khi triển khai trên các thiết bị biên (Edge Devices), hệ thống nhúng hoặc môi trường camera giám sát luồng video thời gian thực.
Dự án "Phương pháp cho bài toán nhận diện cảm xúc trong thời gian thực" (Facial Emotion Recognition With Real-time Processing) được thực hiện nhằm giải quyết trực tiếp rào cản này bằng cách phát triển một quy trình khép kín (End-to-End Pipeline) tối ưu hóa toàn diện từ khâu phát hiện khuôn mặt đến phân loại cảm xúc.
[Camera Stream / Input Frame]
[Gán nhãn Bounding Box + Tỷ lệ cảm xúc hiển thị Real-time]
Mục tiêu cụ thể của dự án
- Khảo sát và đánh giá toàn diện: Phân tích thực nghiệm các kỹ thuật phát hiện khuôn mặt (Viola-Jones Haar Cascade, Single Shot MultiBox Detector - Face-SSD, BlazeFace) và các kiến trúc phân loại cảm xúc học sâu (VGG16, ResNet34, ResNet50, MobileNetV1, Xception).
- Đề xuất kiến trúc CNN thu gọn: Thiết kế và huấn luyện mô hình mạng nơ-ron tích chập rút gọn (
CNN_minimum) kết hợp kỹ thuật chắt lọc tri thức (Knowledge Distillation) và bộ tối ưu hóa thích nghi AdaBelief.
- Tối ưu hóa hiệu năng thời gian thực: Đạt tốc độ xử lý tối thiểu 30 Khung hình/giây (Frames Per Second - FPS) trên phần cứng CPU tiêu chuẩn mà không phụ thuộc vào GPU cao cấp.
- Duy trì độ chính xác cao: Đạt độ chính xác kiểm thử trên 70% trên tập dữ liệu không ràng buộc FER2013 với số lượng tham số mô hình giới hạn dưới 1,5 triệu tham số.
- Xây dựng ứng dụng minh họa hoàn chỉnh: Phát triển hệ thống Web Application tích hợp camera trực tiếp cho phép tùy biến linh hoạt các module trích xuất và phân loại.
Phạm vi và giới hạn đề tài
- Phạm vi dữ liệu: Huấn luyện và đánh giá trên bộ dữ liệu khuôn mặt không ràng buộc FER2013 (Facial Expression Recognition 2013 Challenge) gồm 35.887 ảnh thang độ xám kích thước $48 \times 48$ pixel.
- Phân loại cảm xúc: Tiếp cận hệ thống phân loại 7 cảm xúc cơ bản của Paul Ekman dựa trên Hệ thống mã hóa hành động khuôn mặt (Facial Action Coding System - FACS) bao gồm: Tức giận (Angry), Ghê tởm (Disgust), Sợ hãi (Fear), Hạnh phúc (Happy), Buồn bã (Sad), Bất ngờ (Surprise) và Trung tính (Neutral).
- Giới hạn kỹ thuật: Xử lý dữ liệu ảnh 2D tĩnh trích xuất từ khung hình camera, không bao gồm phân tích chuyển động chuỗi 3D hay tín hiệu âm thanh đa phương thức.
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
Trong lịch sử nghiên cứu thị giác máy tính, bài toán nhận diện cảm xúc khuôn mặt trải qua hai giai đoạn tiếp cận chính:
TIẾP CẬN BÀI TOÁN FER
| Tiêu chí |
Phương pháp truyền thống (HOG + SVM / Radon + HMM) |
Phương pháp học sâu phức hợp (Ensemble SOTA / Residual Masking) |
Phương pháp đề xuất (BlazeFace + Compact CNN) |
| Kỹ thuật trích xuất |
Thủ công (Hand-crafted Features: HOG, LBP, Gabor Filters, Radon Transform) |
Tự động hóa qua các lớp tích chập đa tầng kết hợp Masking/Attention |
Tích chập sâu phân tách (Depthwise Separable Conv) + Knowledge Distillation |
| Độ chính xác (FER2013) |
$55.0% - 62.5%$ (Kém trên dữ liệu unconstrained) |
$74.1% - 76.8%$ (Rất cao nhờ kết hợp đa mô hình) |
$70.14% - 72.40%$ (Đạt chuẩn ứng dụng thực tế) |
| Số lượng tham số |
Không đáng kể ($< 0.1\text{M}$) |
$25\text{M} - 130\text{M}+$ tham số |
$1.3\text{M}$ tham số |
| Độ trễ xử lý (CPU) |
Rất nhanh ($> 60\text{ FPS}$) |
Rất chậm ($3 - 8\text{ FPS}$, nghẽn I/O) |
Thời gian thực ($35 - 45\text{ FPS}$) |
| Khả năng tổng quát hóa |
Nhạy cảm với ánh sáng, góc xoay khuôn mặt |
Rất tốt nhưng đòi hỏi tài nguyên tính toán lớn |
Cân bằng tối ưu giữa độ chính xác và tài nguyên |
Ma trận yêu cầu hệ thống (MoSCoW Prioritization)
- Must Have (Bắt buộc có):
- Module phát hiện khuôn mặt tự động từ luồng video với IoU $\ge 0.5$.
- Phân loại chính xác 7 nhãn cảm xúc theo chuẩn FACS.
- Tốc độ xử lý luồng khung hình đạt tối thiểu $30\text{ FPS}$ trên CPU Intel Core i5.
- Tiền xử lý chuẩn hóa ảnh khuôn mặt về không gian kích thước đồng nhất ($96 \times 96$).
- Should Have (Nên có):
- Áp dụng kỹ thuật Chắt lọc tri thức (Knowledge Distillation) để chuyển giao trọng số từ Teacher Model (ResNet/VGG) sang Student Model.
- Giao diện trực quan hiển thị bounding box, nhãn cảm xúc và phân phối xác suất dự đoán (Confidence Score).
- Could Have (Có thể có):
- Cơ chế Ensemble mềm (Soft Voting) giữa các mô hình nhỏ để nâng cao độ chính xác khi chạy trên GPU.
- Chức năng lưu log phân tích biểu cảm theo thời gian thực phục vụ báo cáo thống kê.
- Won't Have (Chưa thực hiện):
- Nhận diện cảm xúc dựa trên đặc trưng cử chỉ cơ thể hoặc phân tích giọng nói đi kèm.
Thiết kế hệ thống
Kiến trúc tổng thể của giải pháp là một pipeline đa tầng dạng modularized, tách biệt độc lập giữa khâu tiền xử lý thị giác và khâu suy luận nơ-ron:
Chi tiết Tech Stack và Phiên bản công nghệ
- Ngôn ngữ lập trình: Python
3.8.10
- Deep Learning Framework: PyTorch
1.9.0+cu111, Torchvision 0.10.0
- Thị giác máy tính & Xử lý ảnh: OpenCV
4.5.3.56, MediaPipe 0.8.6
- Bộ tối ưu hóa & Tiện ích tính toán: AdaBelief Optimizer, NumPy
1.21.0, SciPy 1.7.0
- Web Application Backend & UI: Flask
2.0.1, Jinja2 3.0.1, HTML5/Canvas
Thiết kế Module phát hiện khuôn mặt (Face Detection Module)
Hệ thống tích hợp kiến trúc BlazeFace - mô hình mạng tích chập tối ưu hóa cho thiết bị di động của Google. BlazeFace giải quyết bài toán bằng hai cải tiến kỹ thuật cốt lõi:
- Khối BlazeBlock: Sử dụng tích chập sâu phân tách (Depthwise Separable Convolution) với kernel $5 \times 5$ kết hợp Pointwise Convolution $1 \times 1$. Thiết kế này mở rộng trường tiếp nhận (Receptive Field) trong khi giảm hơn $80%$ chi phí tính toán so với tích chập tiêu chuẩn $3 \times 3$.
- Cơ chế neo đa tỉ lệ thu gọn (Modified Anchor Scheme): Thay thế kiến trúc kim tự tháp đặc trưng 6 tầng của SSD truyền thống bằng 2 tầng bản đồ đặc trưng ($16 \times 16$ và $8 \times 8$), tăng số lượng hộp neo dự đoán lên 896 hộp, giúp nhận diện chính xác các khuôn mặt kích thước nhỏ và góc nghiêng lớn.
Thiết kế kiến trúc mạng phân loại cảm xúc (CNN_minimum)
Kiến trúc CNN_minimum được thiết kế theo cấu trúc khối lặp đối xứng (Modular Residual-like Blocks):
- Input Layer: Kích thước $1 \times 96 \times 96$ (Thang độ xám được chuẩn hóa).
- Conv Block 1: 2 lớp Conv2D ($32$ filters, kernel $3 \times 3$, padding='same') $\rightarrow$ Batch Normalization $\rightarrow$ LeakyReLU ($\alpha = 0.2$) $\rightarrow$ Max Pooling ($2 \times 2$) $\rightarrow$ Dropout ($0.25$).
- Conv Block 2: 2 lớp Conv2D ($64$ filters, kernel $3 \times 3$) $\rightarrow$ Batch Normalization $\rightarrow$ LeakyReLU $\rightarrow$ Max Pooling ($2 \times 2$) $\rightarrow$ Dropout ($0.25$).
- Conv Block 3: 2 lớp Conv2D ($128$ filters, kernel $3 \times 3$) $\rightarrow$ Batch Normalization $\rightarrow$ LeakyReLU $\rightarrow$ Max Pooling ($2 \times 2$) $\rightarrow$ Dropout ($0.3$).
- Dense Layers: Global Average Pooling 2D $\rightarrow$ Fully Connected ($256$ units) $\rightarrow$ Batch Normalization $\rightarrow$ Dropout ($0.5$) $\rightarrow$ Output Dense ($7$ units, Softmax Activation).
Input (1x96x96)
Implementation và kết quả
Quy trình phát triển và Thuật toán cốt lõi
Quy trình huấn luyện áp dụng kỹ thuật Chắt lọc tri thức (Knowledge Distillation). Mô hình Teacher mạnh (ResNet50 / VGG16) chuyển giao tri thức tiềm ẩn (Dark Knowledge) thông qua phân phối xác suất làm mịn (Soft Targets) cho mô hình Student (CNN_minimum):
$$\mathcal{L}{total} = (1 - \alpha) \mathcal{L}{CE}(y, \sigma(z_s)) + \alpha T^2 \mathcal{L}_{KL}\left(\sigma\left(\frac{z_s}{T}\right), \sigma\left(\frac{z_t}{T}\right)\right)$$
Trong đó:
- $z_s, z_t$ lần lượt là logits đầu ra của Student và Teacher model.
- $\sigma(\cdot)$ là hàm kích hoạt Softmax.
- $T$ là hệ số nhiệt độ (Temperature Scaling factor, chọn $T = 4.0$).
- $\alpha$ là trọng số cân bằng loss (chọn $\alpha = 0.7$).
- $\mathcal{L}{CE}$ là hàm mất mát Categorical Cross-Entropy, $\mathcal{L}{KL}$ là hàm khoảng cách Kullback-Leibler Divergence.
Bộ tối ưu hóa AdaBelief được sử dụng để duy trì tốc độ hội tụ nhanh của Adam nhưng đạt khả năng tổng quát hóa vượt trội như SGD with Momentum bằng cách điều chỉnh kích thước bước học theo "mức độ tin cậy" của gradient hiện tại:
$$\theta_{t} = \theta_{t-1} - \frac{\alpha}{\sqrt{s_t} + \epsilon} m_t, \quad \text{với } s_t = \beta_2 s_{t-1} + (1-\beta_2)(g_t - m_t)^2$$
import torch
import torch.nn as nn
import torch.nn.functional as F
class CompactEmotionCNN(nn.Module):
def __init__(self, num_classes=7):
super(CompactEmotionCNN, self).__init__()
def conv_block(in_channels, out_channels, dropout_rate):
return nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1, bias=False),
nn.BatchNorm2d(out_channels),
nn.LeakyReLU(negative_slope=0.2, inplace=True),
nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1, bias=False),
nn.BatchNorm2d(out_channels),
nn.LeakyReLU(negative_slope=0.2, inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
nn.Dropout2d(p=dropout_rate)
)
self.block1 = conv_block(1, 32, 0.25)
self.block2 = conv_block(32, 64, 0.25)
self.block3 = conv_block(64, 128, 0.30)
self.global_pool = nn.AdaptiveAvgPool2d((1, 1))
self.fc = nn.Sequential(
nn.Linear(128, 256, bias=False),
nn.BatchNorm1d(256),
nn.LeakyReLU(negative_slope=0.2, inplace=True),
nn.Dropout(p=0.5),
nn.Linear(256, num_classes)
)
def forward(self, x):
x = self.block1(x)
x = self.block2(x)
x = self.block3(x)
x = self.global_pool(x)
x = torch.flatten(x, 1)
logits = self.fc(x)
return logits
class KnowledgeDistillationLoss(nn.Module):
def __init__(self, alpha=0.7, temperature=4.0):
super(KnowledgeDistillationLoss, self).__init__()
self.alpha = alpha
self.temperature = temperature
self.ce_loss = nn.CrossEntropyLoss()
self.kl_div = nn.KLDivLoss(reduction='batchmean')
def forward(self, student_logits, teacher_logits, labels):
loss_ce = self.ce_loss(student_logits, labels)
soft_student = F.log_softmax(student_logits / self.temperature, dim=1)
soft_teacher = F.softmax(teacher_logits / self.temperature, dim=1)
loss_kd = self.kl_div(soft_student, soft_teacher) * (self.temperature ** 2)
return (1.0 - self.alpha) * loss_ce + self.alpha * loss_kd
Đánh giá thực nghiệm và Kết quả kiểm thử
Hệ thống được kiểm thử thực nghiệm trên tập dữ liệu FER2013 (gồm 28.709 ảnh huấn luyện, 3.589 ảnh kiểm định và 3.589 ảnh kiểm thử độc lập).
KẾT QUẢ THỰC NGHIỆM
Đánh giá Module phát hiện khuôn mặt
Thử nghiệm trên 500 khung hình video mẫu với các điều kiện môi trường phức tạp:
| Phương pháp |
AP@0.5 (%) |
Thời gian xử lý/Frame (ms) |
Hiệu năng trong môi trường thiếu sáng |
Khả năng phát hiện mặt nghiêng |
| Viola & Jones (Haar Cascade) |
$82.1%$ |
$18.2\text{ ms}$ |
Kém (Tỷ lệ False Negative cao) |
Rất kém ($< 45%$) |
| Face-SSD (ResNet-10 Backbone) |
$97.5%$ |
$14.5\text{ ms}$ |
Tốt |
Tốt ($> 85%$) |
| BlazeFace (Đề xuất sử dụng) |
$98.8%$ |
$3.2\text{ ms}$ |
Rất tốt |
Rất tốt ($> 92%$) |
Đánh giá Module phân loại cảm xúc trên FER2013
| Mô hình phân loại |
Số lượng tham số (Million) |
Kích thước File mô hình (MB) |
Độ chính xác (Accuracy %) |
Tốc độ suy luận CPU (FPS) |
| VGG16 (Fine-tuned) |
$138.35\text{M}$ |
$528.0\text{ MB}$ |
$68.50%$ |
$5.2\text{ FPS}$ |
| ResNet50 |
$25.60\text{M}$ |
$98.5\text{ MB}$ |
$71.20%$ |
$11.4\text{ FPS}$ |
| MobileNetV1 |
$3.20\text{M}$ |
$12.8\text{ MB}$ |
$69.30%$ |
$24.8\text{ FPS}$ |
| Proposed Full CNN |
$4.50\text{M}$ |
$17.2\text{ MB}$ |
$72.40%$ |
$28.5\text{ FPS}$ |
| Proposed Ensemble Model |
$12.80\text{M}$ |
$48.9\text{ MB}$ |
$73.85%$ |
$14.2\text{ FPS}$ |
Proposed CNN_minimum |
$1.30\text{M}$ |
$5.1\text{ MB}$ |
$70.14%$ |
$42.6\text{ FPS}$ |
Đánh giá phân phối phân loại trên Ma trận hỗn loạn (Confusion Matrix) của CNN_minimum
- Happy (Hạnh phúc): Đạt độ chính xác nhận diện cao nhất ($88.4%$) nhờ các đặc trưng Action Unit rõ nét (AU6 + AU12).
- Surprise (Bất ngờ): Đạt độ chính xác $81.2%$ (AU1 + AU2 + AU26).
- Neutral (Trung tính) và Sad (Buồn bã): Độ chính xác đạt $67.5%$ và $61.8%$, có hiện tượng nhầm lẫn lẫn nhau do biên độ chuyển động cơ mặt nhỏ.
- Disgust (Ghê tởm): Đạt $54.2%$ do số lượng mẫu trong tập FER2013 bị mất cân bằng nghiêm trọng (chỉ chiếm 436 mẫu trên tổng số 28.709 mẫu huấn luyện).
Đổi mới và đóng góp
- Kiến trúc mạng lai tối ưu hóa biên (Edge-tailored Hybrid Architecture): Kết hợp thành công giữa cơ chế trích xuất đặc trưng hình thái nhanh của BlazeFace và mạng nơ-ron tích chập thu gọn
CNN_minimum. Giải pháp này giảm $99.06%$ tham số so với kiến trúc VGG16 truyền thống và giảm $94.92%$ tham số so với ResNet50.
- Ứng dụng hiệu quả Knowledge Distillation trên dữ liệu cảm xúc: Chứng minh việc sử dụng hàm mất mát chắt lọc tri thức kết hợp thuật toán tối ưu AdaBelief giúp mô hình nhỏ $1.3\text{M}$ tham số cải thiện $+2.84%$ độ chính xác so với việc huấn luyện
CNN_minimum từ đầu (scratch training) mà không làm tăng bất kỳ chi phí tính toán nào trong quá trình suy luận (Inference Time).
- Giải quyết triệt để bài toán trễ thời gian thực: Đạt mốc hiệu năng $42.6\text{ FPS}$ trên CPU tiêu chuẩn (Intel Core i5 thế hệ 8, không sử dụng card đồ họa rời), vượt trội hoàn toàn so với các nghiên cứu SOTA của Christopher Pramerdorfer ($75.2%$ nhưng chạy 8 mô hình ensemble cồng kềnh) hay Residual Masking Network của Phạm Quí Luân ($74.14%$ với độ trễ lớn).
SO SÁNH ĐỘ PHỨC TẠP TÍNH TOÁN
VGG16 (Baseline) ████████████████████████████████████████ 138.3M params
ResNet50 ███████ 25.6M params
Ensemble SOTA ████ 12.8M params
Proposed Full CNN █ 4.5M params
Proposed CNN_minimum ▎ 1.3M params (Tối ưu 99% tham số)
Ứng dụng thực tế và triển khai
Kịch bản ứng dụng thực tế
- Hệ thống giám sát trạng thái tài xế (Driver Monitoring System - DMS): Tích hợp trực tiếp vào camera hành trình hoặc chip nhúng trên cabin xe để phân tích các biểu cảm mệt mỏi, tức giận (road rage) hoặc mất tập trung của lái xe, phát cảnh báo âm thanh tức thời khi chỉ số tiêu cực vượt ngưỡng $70%$ trong 3 giây liên tiếp.
- Phân tích hành vi khách hàng tại điểm bán (Smart Retail Analytics): Gắn camera tại quầy thanh toán hoặc khu vực trưng bày sản phẩm để đo lường mức độ hài lòng (tỷ lệ Happy/Surprise vs Neutral/Angry) theo thời gian thực mà không vi phạm quyền riêng tư (chỉ lưu vector nhãn cảm xúc, loại bỏ luồng hình ảnh gốc).
- Hỗ trợ tâm lý học và giáo dục trực tuyến: Đánh giá mức độ tập trung, hoang mang hoặc chán nản của học sinh trong các lớp học từ xa qua Zoom/Teams để giảng viên điều chỉnh phương pháp sư phạm.
QUY TRÌNH DEPLOY DOCKER CONTAINER
Hướng dẫn triển khai hệ thống (Deployment Instructions)
Hệ thống được đóng gói thông qua Docker và tối ưu hóa chuyển đổi mô hình sang định dạng ONNX (Open Neural Network Exchange):
# 1. Khởi tạo môi trường ảo và cài đặt dependencies
python3 -m venv venv && source venv/bin/activate
pip install torch==1.9.0 torchvision==0.10.0 opencv-python==4.5.3.56 flask==2.0.1 onnxruntime==1.8.1
# 2. Xuất mô hình PyTorch sang ONNX Runtime Engine
python export_onnx.py --model_path weights/cnn_minimum.pth --output weights/cnn_minimum.onnx
# 3. Khởi chạy Web Server phân tích luồng Video
python app.py --host 0.0.0.0 --port 5000 --detector blazeface --classifier cnn_minimum
Đặc tả API Endpoints
1. API Phân tích Frame tĩnh: POST /api/v1/detect-emotion
- Request Format:
multipart/form-data chứa file ảnh định dạng .jpg, .png
- Response Format:
JSON
{
"status": "success",
"processing_time_ms": 23.4,
"faces_detected": 1,
"results": [
{
"box": {"x": 142, "y": 85, "width": 120, "height": 120},
"dominant_emotion": "happy",
"confidence": 0.894,
"probabilities": {
"angry": 0.012,
"disgust": 0.001,
"fear": 0.005,
"happy": 0.894,
"sad": 0.018,
"surprise": 0.042,
"neutral": 0.028
}
}
]
}
Hạn chế và hướng phát triển
Hạn chế kỹ thuật hiện tại
- Mất cân bằng dữ liệu nghiêm trọng: Tập dữ liệu FER2013 có sự chênh lệch lớn giữa các lớp (Lớp Happy chiếm $25.1%$, trong khi lớp Disgust chỉ chiếm $1.5%$), dẫn đến độ nhạy (Recall) của mô hình đối với các cảm xúc hiếm chưa cao.
- Nhiễu do phụ kiện và che khuất: Độ chính xác suy giảm $15 - 20%$ khi khuôn mặt bị che khuất một phần bởi khẩu trang, kính râm hoặc trong môi trường ánh sáng thay đổi quá đột ngột.
- Phân tích 2D đơn khung hình: Chưa tận dụng được mối tương quan thời gian giữa các khung hình liên tiếp trong video để làm mượt dự đoán, đôi khi xảy ra hiện tượng nhấp nháy nhãn (Flickering effect).
Hướng phát triển tiếp theo
- Tích hợp mạng Temporal: Bổ sung khối Temporal Convolutional Network (TCN) hoặc mô hình Transformer siêu nhẹ (MobileViT) để phân tích chuỗi chuyển động cảm xúc dạng video.
- Data Augmentation nâng cao: Áp dụng Generative Adversarial Networks (GANs) để sinh thêm mẫu khuôn mặt cho các nhãn hiếm như Disgust và Fear nhằm cân bằng phân phối tập huấn luyện.
- Lượng tử hóa mô hình (Quantization INT8): Áp dụng kỹ thuật Post-Training Quantization và TensorRT để nén kích thước mô hình xuống dưới $2\text{ MB}$, sẵn sàng chạy trực tiếp trên vi điều khiển ESP32-CAM hoặc Raspberry Pi 4.
Đối tượng hưởng lợi
ĐỐI TƯỢNG HƯỞNG LỢI
- Sinh viên và Giảng viên chuyên ngành Khoa học Máy tính / Trí tuệ Nhân tạo: Tiếp cận mã nguồn mẫu chuẩn mực về việc xây dựng pipeline thị giác máy tính hai pha, tài liệu học tập thực tế về Knowledge Distillation và tối ưu hóa siêu tham số.
- Kỹ sư AI và Lập trình viên hệ thống nhúng (Embedded Engineers): Nhận được một kiến trúc mạng CNN đã được benchmark kỹ lưỡng, dễ dàng tích hợp trực tiếp vào các ứng dụng Edge AI mà không mất thời gian nghiên cứu cân chỉnh kiến trúc từ đầu.
- Doanh nghiệp bán lẻ và Đơn vị phát triển phần mềm: Sở hữu giải pháp phân tích phản hồi khách hàng chi phí thấp ($0\text{ USD}$ chi phí bản quyền GPU server, chạy trực tiếp trên hạ tầng camera giám sát hiện hữu).
- Nhà nghiên cứu học thuật: Cung cấp bộ số liệu đối sánh thực nghiệm chi tiết giữa 3 thuật toán phát hiện khuôn mặt và 6 mô hình phân loại trên cùng một hệ quy chiếu chuẩn.
Câu hỏi thường gặp
1. 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 cấu hình phần cứng tối thiểu: CPU lõi kép x86 hoặc ARMv8 (tương đương Raspberry Pi 4 Model B hoặc Intel Core i3 thế hệ 4 trở lên), RAM $2\text{ GB}$, không yêu cầu card đồ họa rời (GPU). Hệ thống hoạt động tốt trên hệ điều hành Linux (Ubuntu 18.04+), Windows 10/11 và macOS.
2. Làm thế nào để giải quyết vấn đề nhận diện sai khi người dùng đeo khẩu trang?
Khi khuôn mặt bị che khuất phần dưới (mũi và miệng), các Action Units quan trọng như AU12 (Lip Corner Raiser) bị mất. Giải pháp tối ưu là tái huấn luyện mô hình bằng cách bổ sung dữ liệu Augmented với kỹ thuật vẽ ngẫu nhiên khẩu trang (Mask Augmentation) và tăng cường trọng số trích xuất đặc trưng vùng mắt (AU1, AU2, AU4, AU6).
3. Tại sao chọn kích thước ảnh đầu vào phân loại là $96 \times 96$ thay vì $48 \times 48$ gốc của FER2013?
Ảnh gốc $48 \times 48$ khi qua các lớp Max Pooling ($2 \times 2$) sẽ giảm kích thước rất nhanh về $6 \times 6$, làm mất mát các chi tiết vi biểu cảm (Micro-expressions). Việc nội suy lên $96 \times 96$ bằng thuật toán Bicubic Interpolation cho phép mạng tích chập trích xuất được các đường nét cơ mặt mịn hơn ở các lớp sâu mà không làm tăng đáng kể khối lượng tính toán.
4. Chi phí vận hành giải pháp trên môi trường Cloud là bao nhiêu?
Nhờ kiến trúc siêu nhẹ ($1.3\text{M}$ tham số, tiêu thụ CPU $< 20%$), hệ thống có thể chạy ổn định trên một máy ảo Cloud cấp thấp nhất (ví dụ: AWS EC2 t3.small giá khoảng $15\text{ USD/tháng}$) để xử lý đồng thời $4 - 6$ luồng video camera, tiết kiệm hơn $90%$ chi phí so với việc thuê các instance có GPU (như g4dn.xlarge giá $\sim 380\text{ USD/tháng}$).
5. Hệ thống xử lý thế nào khi khung hình có nhiều khuôn mặt cùng lúc?
Module BlazeFace hỗ trợ phát hiện đồng thời đa khuôn mặt trong khung hình với độ trễ tăng tuyến tính không đáng kể. Sau khi phát hiện, hệ thống sẽ gom các vùng khuôn mặt thành một mini-batch đưa qua CNN_minimum để suy luận song song trong một forward pass duy nhất, đảm bảo tốc độ khung hình vẫn duy trì trên $30\text{ FPS}$ với tối đa 4 người trong một khung hình.
Kết luận
Dự án đã giải quyết thành công bài toán nhận diện cảm xúc khuôn mặt trong thời gian thực thông qua việc thiết kế tối ưu hệ thống hai module kết hợp: phát hiện khuôn mặt bằng BlazeFace và phân loại cảm xúc bằng CNN_minimum áp dụng kỹ thuật Knowledge Distillation. Kết quả nghiên cứu chứng minh tính khả thi vượt trội của việc triển khai các mô hình thị giác máy tính học sâu trên các thiết bị phần cứng giới hạn mà vẫn đảm bảo độ chính xác đạt chuẩn ứng dụng ($70.14%$ trên tập FER2013 và tốc độ $42.6\text{ FPS}$ trên CPU).
Công trình không chỉ đóng góp một giải pháp kỹ thuật hiệu quả cho cộng đồng nghiên cứu và phát triển phần mềm mà còn mở ra tiềm năng thương mại hóa rộng rãi trong các hệ thống giám sát an toàn giao thông, bán lẻ thông minh và giáo dục số. Toàn bộ mã nguồn, trọng số mô hình đã huấn luyện và tài liệu kỹ thuật chi tiết được đóng gói sẵn sàng phục vụ việc tích hợp và mở rộng trong tương lai.