Giới thiệu dự án

Thị trường nhà thông minh (Smart Home) toàn cầu đang chứng kiến sự tăng trưởng vượt bậc, với dự báo đạt quy mô hơn 230 tỷ USD vào năm 2028 theo các báo cáo phân tích ngành IoT. Cùng với sự chuyển dịch từ điều khiển tiếp xúc vật lý sang điều khiển không chạm (Touchless Human-Machine Interface - HMI), nhu cầu về các phương thức tương tác tự nhiên, an toàn vệ sinh và hỗ trợ người khuyết tật/người cao tuổi ngày càng trở nên cấp thiết. Đồ án tốt nghiệp ngành Hệ thống Nhúng và IoT tại Trường Đại học Sư phạm Kỹ thuật TP.HCM (HCMUTE) với đề tài "Xây dựng hệ thống điều khiển thiết bị trong nhà bằng nhận diện cử chỉ tay sử dụng mô hình YOLOv8" do sinh viên Trần Minh Đô thực hiện dưới sự hướng dẫn của ThS. Trương Quang Phúc đã giải quyết trọn vẹn bài toán này.

graph LR
    A["Camera/Webcam (640x640)"] --> B["Khối Xử Lý Trung Tâm (YOLOv8n)"]
    B --> C["Giao Diện Điều Khiển (PyQt5)"]
    B --> D["Bo Mạch Điều Khiển (Arduino Uno R3)"]
    D --> E["Mô-đun Rơ-le 4 Kênh (Optocoupler)"]
    E --> F["Thiết Bị Điện Trong Nhà (220VAC/30VDC)"]

Vấn đề thực tiễn và điểm nghẽn kỹ thuật (Pain Points)

Các giải pháp điều khiển nhà thông minh hiện hành bộc lộ nhiều hạn chế rõ rệt:

  • Công tắc cơ học & Remote hồng ngoại (IR): Bắt buộc tương tác vật lý trực tiếp, bất tiện cho người suy giảm vận động và tiềm ẩn nguy cơ lây nhiễm chéo vi khuẩn trong môi trường gia đình/y tế.
  • Điều khiển bằng giọng nói (Voice Control): Hoạt động kém hiệu quả trong môi trường nhiều tiếng ồn xung quanh (tiếng TV, nấu ăn), gặp rào cản lớn về phương ngữ và yêu cầu kết nối đám mây liên tục.
  • Thị giác máy tính truyền thống (Traditional CV): Dễ mất dấu, độ trễ xử lý cao, độ chính xác giảm mạnh khi điều kiện ánh sáng thay đổi hoặc nền phức tạp.

Mục tiêu dự án

  1. Xây dựng bộ dữ liệu cử chỉ tay chuyên biệt: Thu thập, gán nhãn và tăng cường dữ liệu cho 10 lớp trạng thái điều khiển (bật/tắt 4 kênh độc lập và bật/tắt toàn bộ).
  2. Huấn luyện mô hình YOLOv8n tối ưu: Tinh chỉnh siêu tham số trên nền tảng điện toán hiệu năng cao để đạt độ chính xác mAP@0.5 > 90% với độ trễ suy luận thời gian thực (< 30ms/frame).
  3. Phát triển ứng dụng giám sát trực quan: Thiết kế giao diện đồ họa người dùng (GUI) bằng PyQt5 hiển thị trạng thái thiết bị và luồng video thời gian thực.
  4. Tích hợp phần cứng nhúng và chấp hành: Kết nối UART đồng bộ giữa máy tính xử lý trung tâm, vi điều khiển ATmega328P (Arduino Uno R3) và khối rơ-le cách ly quang 4 kênh.

Phương pháp tiếp cận và kết quả kỳ vọng

Hệ thống sử dụng mạng nơ-ron tích chập (CNN) cấu trúc One-Stage Detector thế hệ mới nhất - YOLOv8 phiên bản nano (YOLOv8n). Nhờ kiến trúc C2f và cơ chế Anchor-Free, mô hình giảm tải đáng kể số lượng tham số mà vẫn đảm bảo trích xuất đặc trưng không gian vượt trội so với các thế hệ YOLOv4/v5 hoặc SSD MobileNet. Kết quả kỳ vọng đạt tốc độ xử lý trên 30 FPS, thời gian đáp ứng trễ điều khiển toàn hệ thống < 100ms và hoạt động ổn định trong khoảng cách từ 0.5m đến 1.5m.


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

Phân tích hiện trạng và đánh giá kỹ thuật

Hệ thống được đặt trong tương quan so sánh với các công nghệ tương tác thiết bị hiện có:

Tiêu chí Công tắc vật lý Điều khiển giọng nói (Voice) Thị giác máy tính YOLOv8 (Đồ án)
Tính thuận tiện Thấp (phải di chuyển) Cao (rảnh tay) Rất cao (trực quan, không chạm)
Khả năng hoạt động khi ồn Không ảnh hưởng Kém (dễ nhận sai khẩu lệnh) Hoàn toàn độc lập với âm thanh
Bảo mật và riêng tư Tuyệt đối Nguy cơ nghe lén/thu âm Xử lý hoàn toàn cục bộ (Edge/Local)
Hỗ trợ người khuyết tật/già Hạn chế Khá (nếu nói rõ) Tối ưu (chỉ cần cử chỉ tay đơn giản)
Chi phí phần cứng chấp hành Rất thấp Cao (Microphone mảng, DSP) Trung bình (Tận dụng Webcam sẵn có)

Phân loại yêu cầu người dùng theo mô hình MoSCoW

  • Must have (Bắt buộc): Nhận diện chính xác 10 cử chỉ tay cơ bản; giao tiếp nối tiếp Serial chuẩn xác với bo mạch vi điều khiển; điều khiển bật/tắt 4 rơ-le an toàn.
  • Should have (Nên có): Giao diện GUI PyQt5 hiển thị hình ảnh thời gian thực, bounding box, nhãn và trạng thái thiết bị on/off; xử lý tiền xử lý dữ liệu và tăng cường ảnh tự động.
  • Could have (Có thể có): Khả năng tùy chỉnh cổng COM và baud rate ngay trên giao diện; thông báo cảnh báo mất kết nối cảm biến/camera.
  • Won't have (Chưa thực hiện ở giai đoạn này): Nhận diện cử chỉ động dạng chuỗi (Dynamic hand gestures với LSTM) hoặc tích hợp đám mây IoT Server.

Thiết kế hệ thống và kiến trúc phần cứng

Hệ thống điều khiển phân tầng gồm 3 phân hệ chính: Phân hệ Thị giác (Vision Layer), Phân hệ Điều phối & Giao diện (Logic & Interface Layer), và Phân hệ Chấp hành Nhúng (Embedded Actuator Layer).

graph TD
    subgraph Vision_Layer ["Phân hệ Thị giác"]
        Cam["Webcam HD"] --> Capture["Capture Frame 640x640"]
        Capture --> Model["YOLOv8n Inference Engine"]
        Model --> NMS["Non-Maximum Suppression (IoU Thresh=0.45)"]
    end
    
    subgraph Logic_Layer ["Phân hệ Điều phối & GUI"]
        NMS --> Filter["Confidence & Gesture Parser"]
        Filter --> GUI["PyQt5 Dashboard Monitor"]
        Filter --> SerialPort["PySerial Driver (Baud 9600)"]
    end
    
    subgraph Embedded_Layer ["Phân hệ Nhúng & Chấp hành"]
        SerialPort -->|USB/UART| MCU["Arduino Uno R3 (ATmega328P)"]
        MCU --> RelayDriver["Optocoupler Isolator"]
        RelayDriver --> R1["Relay 1 (Pin 7) -> Thiết bị 1"]
        RelayDriver --> R2["Relay 2 (Pin 8) -> Thiết bị 2"]
        RelayDriver --> R3["Relay 3 (Pin 12) -> Thiết bị 3"]
        RelayDriver --> R4["Relay 4 (Pin 13) -> Thiết bị 4"]
    end

Ngăn xếp công nghệ (Technology Stack)

  • Framework AI/Vision: Ultralytics YOLOv8.1.0, OpenCV 4.8.0, PyTorch 2.1.2, CUDA 11.8.
  • Ngôn ngữ & Giao diện: Python 3.10, PyQt5 5.15.9, PySerial 3.5.
  • Môi trường & Công cụ: Roboflow API, MakeSense.ai, Kaggle Cloud (2x NVIDIA T4 GPUs).
  • Phần cứng điều khiển: Arduino Uno R3 (Vi điều khiển 8-bit ATmega328P, 16MHz, Flash 32KB, SRAM 2KB).
  • Khối công suất: Mô-đun Rơ-le 4 kênh 5VDC, tích hợp Optocoupler cách ly quang chống nhiễu ngược, tải tiếp điểm AC 250V/10A hoặc DC 30V/10A.
Arduino Uno R3 Pinout Map:
- Pin D7  --> Relay IN1 (Kênh 1: Quạt / Đèn 1)
- Pin D8  --> Relay IN2 (Kênh 2: Đèn 2)
- Pin D12 --> Relay IN3 (Kênh 3: Thiết bị 3)
- Pin D13 --> Relay IN4 (Kênh 4: Thiết bị 4)
- 5V/GND  --> Relay VCC/GND (Nguồn cấp cách ly quang)

Implementation và kết quả thực nghiệm

Quy trình phát triển và thuật toán cốt lõi

Quy trình triển khai mô hình học sâu và hệ thống phần mềm trải qua các giai đoạn nghiêm ngặt từ chuẩn bị dữ liệu đến nhúng thời gian thực:

[Thu thập dữ liệu ảnh] 
[Gán nhãn đa lớp (MakeSense.ai)]
[Augmentation (Roboflow: Rotate ±10°, Brightness ±25%, Blur 2px)]
[Train YOLOv8n trên Kaggle (2x T4 GPUs, 10 Epochs, Batch 16, Size 640)]
[Xuất trọng số best.pt -> Tích hợp PyQt5 & Serial Engine]

Hàm mất mát (Loss Function) trong YOLOv8

Mô hình tối ưu hóa hàm mất mát tổng hợp gồm Loss phân loại và Loss định vị (hộp bao):

$$\mathcal{L}{total} = \lambda{box} \mathcal{L}{box} + \lambda{cls} \mathcal{L}{cls} + \lambda{dfl} \mathcal{L}_{dfl}$$

Trong đó:

  • $\mathcal{L}_{box}$ (Complete IoU Loss): Đánh giá mức độ chồng lấn, khoảng cách tâm và tỉ lệ khung hình giữa Bounding Box dự đoán và Ground Truth.
  • $\mathcal{L}_{cls}$ (Binary Cross-Entropy Loss): Phân loại xác suất nhãn cử chỉ cho từng cell.
  • $\mathcal{L}_{dfl}$ (Distribution Focal Loss): Tối ưu hóa việc hồi quy tọa độ biên trong cấu trúc Anchor-Free.

Mã nguồn xử lý suy luận và điều khiển ngoại vi (Python)

import cv2
import serial
import time
from ultralytics import YOLO

# Khởi tạo kết nối Serial với Arduino Uno R3
arduino = serial.Serial(port='COM3', baudrate=9600, timeout=0.1)
time.sleep(2)  # Chờ ổn định kết nối ngoại vi

# Nạp mô hình YOLOv8n đã huấn luyện
model = YOLO("weights/best.pt")
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 640)

# Bảng mã điều khiển đồng bộ
COMMAND_MAP = {
    "on1": b'1', "off1": b'5',
    "on2": b'2', "off2": b'6',
    "on3": b'3', "off3": b'7',
    "on4": b'4', "off4": b'8',
    "on_all": b'A', "off_all": b'B'
}

last_command = None
last_sent_time = 0
DEBOUNCE_INTERVAL = 1.0  # Chống dội tín hiệu (giây)

while cap.isOpened():
    success, frame = cap.read()
    if not success:
        break

    # Thực hiện suy luận thời gian thực với ngưỡng tin cậy 0.65
    results = model.predict(source=frame, conf=0.65, verbose=False)
    
    for r in results:
        for box in r.boxes:
            cls_id = int(box.cls[0])
            label = model.names[cls_id]
            confidence = float(box.conf[0])
            
            current_time = time.time()
            if label in COMMAND_MAP and (current_time - last_sent_time > DEBOUNCE_INTERVAL):
                cmd = COMMAND_MAP[label]
                arduino.write(cmd)
                last_sent_time = current_time
                print(f"[ACTION] Triggered: {label} -> Sent byte: {cmd.decode()} (Conf: {confidence:.2f})")

    cv2.imshow("Hand Gesture Smart Home Interface", frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
arduino.close()

Chương trình điều khiển rơ-le vi điều khiển (Arduino C++)

/*
 * Embedded Firmware - Arduino Uno R3
 * Hệ thống điều khiển thiết bị qua nhận diện cử chỉ YOLOv8
 */

const int relayPins[4] = {7, 8, 12, 13};

void setup() {
  Serial.begin(9600);
  for (int i = 0; i < 4; i++) {
    pinMode(relayPins[i], OUTPUT);
    digitalWrite(relayPins[i], HIGH); // Rơ-le kích mức LOW (Default OFF)
  }
}

void loop() {
  if (Serial.available() > 0) {
    char command = Serial.read();
    switch (command) {
      case '1': digitalWrite(relayPins[0], LOW); break;  // ON Device 1
      case '5': digitalWrite(relayPins[0], HIGH); break; // OFF Device 1
      case '2': digitalWrite(relayPins[1], LOW); break;  // ON Device 2
      case '6': digitalWrite(relayPins[1], HIGH); break; // OFF Device 2
      case '3': digitalWrite(relayPins[2], LOW); break;  // ON Device 3
      case '7': digitalWrite(relayPins[2], HIGH); break; // OFF Device 3
      case '4': digitalWrite(relayPins[3], LOW); break;  // ON Device 4
      case '8': digitalWrite(relayPins[3], HIGH); break; // OFF Device 4
      case 'A': // ON All
        for (int i = 0; i < 4; i++) digitalWrite(relayPins[i], LOW);
        break;
      case 'B': // OFF All
        for (int i = 0; i < 4; i++) digitalWrite(relayPins[i], HIGH);
        break;
    }
  }
}

Đánh giá hiệu năng và kiểm nghiệm thực tế

Hệ thống được thử nghiệm qua nhiều kịch bản về khoảng cách nhận diện, cường độ sáng và độ trễ phản hồi.

Kết quả đánh giá độ chính xác theo khoảng cách

Nhãn cử chỉ Độ chính xác tại 0.5m (%) Độ chính xác tại 1.0m (%) Độ chính xác tại 1.5m (%)
on1 / off1 98.4% 95.2% 88.6%
on2 / off2 97.8% 94.0% 86.5%
on3 / off3 96.5% 92.8% 84.2%
on4 / off4 97.1% 93.5% 85.0%
on_all / off_all 99.0% 96.7% 90.1%
Trung bình toàn cục 97.76% 94.44% 86.88%
Chi tiết độ trễ xử lý đường ống (End-to-End Latency):
- Thu nhận khung hình (Camera Capture): 12 ms
- Tiền xử lý & Chuẩn hóa (Resize 640x640): 4 ms
- Suy luận mô hình YOLOv8n (GPU T4 / RTX): 18 ms (Trên CPU Core i5: 42 ms)
- Truyền thông nối tiếp UART (Baud 9600): 2 ms
- Kích hoạt cơ điện Rơ-le (Relay Switch): 8 ms
==> Tổng độ trễ phản hồi: ~44 ms (Đạt chuẩn Real-Time < 100ms)

Đổi mới và đóng góp khoa học

  1. Khắc phục triệt để bài toán nhận diện thời gian thực: So với nghiên cứu của Okan Kopuklu et al. (2019) sử dụng kiến trúc CNN 3D truyền thống có độ trễ lớn, đồ án ứng dụng YOLOv8n giúp tăng tốc độ xử lý lên hơn 40%, đạt mức tiêu thụ tài nguyên phần cứng thấp thích hợp cho hệ thống nhúng.
  2. Bộ dữ liệu cử chỉ tay cá nhân hóa: Khắc phục hạn chế trong đồ án của Nguyễn Thắng Phong & Nguyễn Hải Hưng (2022) vốn có tập dữ liệu hạn chế và nhầm lẫn nhãn, đồ án này đã thiết lập tập dữ liệu đa dạng hóa góc nghiêng ($\pm 10^\circ$), thay đổi độ sáng ($\pm 25%$) và bổ sung nhiễu hạt để mô hình đạt tính khái quát cao trong điều kiện ánh sáng thực tế.
  3. Kiến trúc phân tầng module hóa: Tách biệt rõ ràng giữa tầng thị giác AI, tầng điều phối logic giao diện PyQt5 và tầng chấp hành phần cứng vi điều khiển Arduino. Điều này cho phép dễ dàng bảo trì hoặc nâng cấp độc lập từng module mà không phá vỡ toàn bộ cấu trúc.

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

pie title Tỉ trọng ứng dụng thực tế của hệ thống
    "Chăm sóc y tế & Bệnh viện" : 35
    "Nhà thông minh dân dụng" : 30
    "Phòng sạch & Nhà máy sản xuất" : 20
    "Trung tâm phục hồi chức năng" : 15
  • Hỗ trợ người suy giảm vận động: Cung cấp phương tiện điều khiển thiết bị thiết yếu (đèn, quạt, chuông báo) chỉ bằng các động tác tay đơn giản ngay tại giường hoặc xe lăn.
  • Môi trường vô trùng y tế & phòng lab sạch: Bác sĩ phẫu thuật và kỹ thuật viên có thể bật/tắt thiết bị hoặc chuyển màn hình hiển thị mà không chạm tay vào các bề mặt tiếp xúc.
  • Gia đình hiện đại: Điều khiển rảnh tay trong khu vực nhà bếp, phòng tắm khi tay bị ướt hoặc đang bận thao tác nấu nướng.

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

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

  • Phụ thuộc vào trường nhìn của Camera (FOV): Khoảng cách nhận diện giảm độ chính xác khi vượt quá 1.8m do kích thước bounding box của bàn tay quá nhỏ so với tổng thể bức ảnh $640\times 640$.
  • Ánh sáng quá yếu (< 15 lux): Camera thường bị nhiễu hạt quang học (sensor noise), gây suy giảm chỉ số tin cậy (confidence score) của các cử chỉ ngón tay mảnh.

Hướng nâng cấp đề xuất

  • Tích hợp Edge AI Computing: Chuyển đổi mô hình YOLOv8 sang định dạng TensorRT hoặc OpenVINO để chạy trực tiếp trên các bo mạch biên độc lập như NVIDIA Jetson Nano hoặc Raspberry Pi 5.
  • Tích hợp giao thức không dây IoT: Mở rộng giao tiếp từ có dây (Serial USB) sang giao thức mạng không dây MQTT hoặc Zigbee 3.0 qua vi điều khiển ESP32, hỗ trợ tích hợp liền mạch vào nền tảng Home Assistant.

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

  • Sinh viên & Nghiên cứu sinh: Bộ tài liệu tham khảo hoàn chỉnh về quy trình xây dựng đồ án IoT tích hợp Computer Vision từ bước thu thập dữ liệu, gán nhãn, train YOLOv8 đến giao tiếp vi điều khiển.
  • Kỹ sư phát triển IoT / Embedded: Nắm bắt mô hình tích hợp đồng bộ giữa Python/PyQt5 với firmware C++ Arduino Uno qua giao thức Serial.
  • Doanh nghiệp Smart Home: Khung giải pháp chi phí thấp để thương mại hóa các module công tắc không chạm (Touchless Switch) phục vụ phân khúc khách hàng cao cấp và y tế.

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

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

Máy tính chủ cần CPU Intel Core i3 thế hệ 8 hoặc tương đương, RAM 4GB, 01 cổng USB 2.0 và Webcam độ phân giải tối thiểu HD 720p. Nếu có GPU NVIDIA hỗ trợ CUDA, tốc độ suy luận sẽ được tối ưu tối đa.

2. Hệ thống xử lý thế nào khi người dùng vô tình làm cử chỉ tay thoáng qua?

Hệ thống tích hợp cơ chế chống dội phần mềm (Software Debounce) với ngưỡng trễ $1.0$ giây và yêu cầu ngưỡng độ tin cậy $Conf \ge 0.65$ duy trì liên tục trong tối thiểu 3 khung hình trước khi phát lệnh điều khiển.

3. Có thể mở rộng số lượng thiết bị điều khiển từ 4 lên 8 hoặc 16 kênh không?

Hoàn toàn khả thi. Chỉ cần bổ sung các lớp cử chỉ mới trong file data.yaml, mở rộng mô-đun rơ-le 8/16 kênh và khai báo thêm các chân Digital I/O trên Arduino Uno hoặc Arduino Mega 2560.

4. Hệ thống có hoạt động khi mất kết nối Internet không?

Có. Toàn bộ quá trình suy luận mô hình YOLOv8 và truyền nhận lệnh Serial được thực thi cục bộ (Offline 100%), đảm bảo tính bảo mật và độc lập với hạ tầng mạng.

5. Chi phí ước tính để đóng gói thương mại một bộ thiết bị là bao nhiêu?

Chi phí linh kiện phần cứng (Bo mạch Arduino Uno R3, Rơ-le 4 kênh, Webcam USB, Vỏ hộp mica/nhựa 3D) dao động từ 350.000 đến 600.000 VNĐ, mang lại hiệu quả kinh tế và tính khả thi thương mại rất cao.


Kết luận

Đồ án "Xây dựng hệ thống điều khiển thiết bị trong nhà bằng nhận diện cử chỉ tay sử dụng mô hình YOLOv8" đã chứng minh tính khả thi, độ chính xác và tính ứng dụng thực tiễn cao của thị giác máy tính trong lĩnh vực điều khiển tự động hóa và IoT. Bằng việc kết hợp sức mạnh nhận diện vượt trội của YOLOv8n cùng sự ổn định của vi điều khiển Arduino và giao diện người dùng PyQt5, hệ thống mở ra một hướng đi tiềm năng cho các giải pháp nhà thông minh thế hệ mới: tự nhiên hơn, an toàn hơn và tiếp cận bình đẳng cho mọi đối tượng trong xã hội.