Bối cảnh và vấn đề nghiên cứu

Tai nạn giao thông do tài xế ngủ gật hoặc mất tập trung khi điều khiển phương tiện là một trong những nguyên nhân phổ biến dẫn đến các vụ va chạm nghiêm trọng. Nhằm góp phần nâng cao an toàn giao thông và giảm thiểu tai nạn, đề tài "Nhận dạng trạng thái buồn ngủ khi lái xe sử dụng thuật toán Facial Landmark trên thiết bị nhúng Raspberry" được tác giả Hà Xuân Thân (lớp ĐTTT02 - K57, Viện Điện tử Viễn thông – Trường Đại học Bách Khoa Hà Nội) thực hiện dưới sự hướng dẫn của GS.TS Nguyễn Đức Thuận vào tháng 1/2019.

Nhiệm vụ và mục tiêu chính của đồ án gồm:

  1. Nghiên cứu kỹ thuật phát hiện khuôn mặt người dựa trên đặc trưng HOG (Histogram of Oriented Gradients).
  2. Nghiên cứu kỹ thuật tiền xử lý ảnh nhằm chuẩn hóa ánh sáng bằng bộ lọc Retinal filter.
  3. Nghiên cứu và áp dụng phương pháp điểm mốc khuôn mặt (Facial Landmark) vào bài toán xác định vùng mắt và nhận dạng trạng thái nháy mắt, buồn ngủ.
  4. Tìm hiểu và khai thác các thư viện thị giác máy tính mã nguồn mở OpenCV và dlib trên ngôn ngữ C++.
  5. Thiết kế, tích hợp và triển khai toàn bộ thuật toán lên hệ thống phần cứng nhúng bao gồm bo mạch Raspberry Pi và module camera để xử lý, đưa ra cảnh báo tự động trong thời gian thực.

Đối tượng nghiên cứu của đề tài là hình ảnh khuôn mặt người lái xe thu nhận trực tiếp từ camera, tập trung phân tích tọa độ các điểm mốc vùng mắt để ước tính độ mở của mắt qua thời gian. Phạm vi nghiên cứu được triển khai thực nghiệm trên hệ điều hành Raspbian chạy trên bo mạch nhúng Raspberry Pi kết hợp module camera độ phân giải 1 Megapixel.

So với các công nghệ nhận dạng sinh trắc học khác (như giọng nói dễ bị nhiễu âm thanh, chữ ký khó đồng nhất, vân tay đòi hỏi tiếp xúc vật lý và dễ bị giả mạo, hay mống mắt yêu cầu thiết bị quang học phức tạp), công nghệ nhận dạng mặt người có ưu điểm nổi bật là hoạt động không tiếp xúc, giám sát liên tục từ xa và phù hợp để lắp đặt trên phương tiện giao thông.


Cơ sở lý thuyết và phương pháp

Đồ án xây dựng quy trình nhận dạng trạng thái buồn ngủ thông qua chuỗi xử lý thị giác máy tính kết hợp học máy:

Thành phần xử lý Thuật toán / Mô hình sử dụng Mục đích và vai trò
Phát hiện khuôn mặt Đặc trưng HOG kết hợp bộ phân loại Linear SVM Xác định và khoanh vùng khuôn mặt người từ khung hình camera
Tiền xử lý ánh sáng Bộ lọc Retinal filter (Naka-Rushton, bộ lọc Gaussian, DoG) Khử ảnh hưởng của độ sáng không đồng đều, tăng cường biên nét
Trích xuất điểm mốc Mô hình 68 Facial Landmarks (Kazemi & Sullivan, 2014) Định vị chính xác tọa độ các bộ phận: hàm, lông mày, mũi, mắt, miệng
Xác định trạng thái mắt Tỷ lệ khung hình mắt EAR (Eye Aspect Ratio) Tính toán độ co/mở của mắt qua chuỗi khung hình liên tiếp

1. Phương pháp phát hiện mặt người bằng HOG và Linear SVM

Thuật toán HOG mô tả cấu trúc hình học và hình dáng cục bộ của đối tượng bằng cách đếm tần suất xuất hiện của các hướng đạo hàm biên (gradient orientation). Quá trình trích xuất HOG gồm:

  • Tính gradient: Sử dụng toán tử đạo hàm theo hai hướng với nhân chập $D_x = [-1, 0, 1]$ và $D_y = [1, 0, -1]^T$. Độ lớn và hướng của gradient tại mỗi điểm ảnh $(x, y)$ được tính bởi: $$|G| = \sqrt{I_x^2 + I_y^2}$$ $$\theta = \arctan\left(\frac{I_y}{I_x}\right)$$
  • Gán hướng gradient vào cell: Chia ảnh thành các ô nhỏ (cells), hướng gradient được chia thành 9 khoảng giá trị (từ $0^\circ$ đến $360^\circ$, mỗi khoảng $40^\circ$).
  • Chuẩn hóa khối (blocks): Gom các cell thành khối lớn hơn và thực hiện chuẩn hóa vector theo chuẩn $L_1$ hoặc $L_2$ nhằm chống lại sự thay đổi về độ tương phản và ánh sáng.
  • Học phân loại: Sử dụng bộ phân loại SVM tuyến tính (Linear Support Vector Machine) được huấn luyện trên tập mẫu mặt người (mẫu dương) và mẫu nền (mẫu âm), áp dụng kỹ thuật cửa sổ trượt (sliding window) và huấn luyện lặp với các mẫu nhận dạng sai (hard negative mining). Mô hình phân loại được tích hợp sẵn từ thư viện dlib.

2. Chuẩn hóa ánh sáng với bộ lọc Retinal filter

Mô phỏng cơ chế thị giác sinh học của con người (lớp Photoreceptor và Outer Plexiform), bộ lọc áp dụng phương trình phi tuyến Naka-Rushton để cân bằng độ tương phản: $$Y = \frac{X}{X + X_0}$$ Trong đó $X$ là ảnh đầu vào và $X_0$ là tác nhân điều chỉnh biến thiên theo từng điểm ảnh. Hệ thống áp dụng liên tiếp hai bộ lọc thông thấp với nhân Gaussian ($G_1$ có $\sigma_1 = 1$, $G_2$ có $\sigma_2 = 3$), kết hợp với phép lọc sai phân Gauss (Difference of Gaussians - DoG, $\sigma_{Ph} = 0.5$) và hàm cắt ngưỡng để đưa các ảnh ở điều kiện sáng khác nhau về cùng dải phân bố tương đồng, đồng thời làm sắc nét mắt, lông mày và miệng.

3. Trích xuất điểm mốc khuôn mặt (Facial Landmark)

Đồ án sử dụng mô hình dự đoán hình dạng khuôn mặt 68 điểm (shape_predictor_68_face_landmarks) của dlib, được huấn luyện trên tập dữ liệu chuẩn iBUG 300-W theo thuật toán hồi quy cây của Vahid Kazemi và Josephine Sullivan (2014). Tọa độ 68 điểm mốc được phân bổ chi tiết:

  • Đường viền quai hàm: Điểm 1 đến điểm 17 (17 điểm).
  • Lông mày phải: Điểm 18 đến điểm 22 (5 điểm).
  • Lông mày trái: Điểm 23 đến điểm 27 (5 điểm).
  • Sống mũi và cánh mũi: Điểm 28 đến điểm 36 (9 điểm).
  • Mắt phải: Điểm 37 đến điểm 42 (6 điểm).
  • Mắt trái: Điểm 43 đến điểm 48 (6 điểm).
  • Vùng miệng và môi: Điểm 49 đến điểm 68 (20 điểm).

4. Thuật toán phát hiện trạng thái buồn ngủ qua chỉ số EAR

Từ 6 tọa độ điểm mốc của mỗi bên mắt ($p_1, p_2, p_3, p_4, p_5, p_6$), tỷ lệ khung hình mắt EAR (Eye Aspect Ratio) được tính theo công thức: $$EAR = \frac{||p_2 - p_6|| + ||p_3 - p_5||}{2 ||p_1 - p_4||}$$

Ở trạng thái mở mắt bình thường, giá trị EAR duy trì ổn định quanh một ngưỡng không đổi. Khi nhắm mắt hoặc chớp mắt, khoảng cách $||p_2 - p_6||$ và $||p_3 - p_5||$ giảm mạnh khiến EAR tiến dần về 0. Một chu kỳ nháy mắt thông thường kéo dài từ 100 ms đến 400 ms. Nếu giá trị EAR giảm sâu dưới ngưỡng quy định và kéo dài liên tục qua nhiều khung hình vượt quá ngưỡng thời gian chớp mắt thông thường, hệ thống xác định người lái đang nhắm mắt buồn ngủ và kích hoạt cảnh báo.


Thiết kế và triển khai hệ thống

Hệ thống được xây dựng dưới dạng một thiết bị nhúng khép kín, hoạt động độc lập với các thành phần phần cứng và phần mềm như sau:

Thành phần Đặc tả kỹ thuật / Cấu hình Vai trò trong hệ thống
Bộ xử lý nhúng Bo mạch Raspberry Pi Nền tảng tính toán, xử lý thuật toán và điều khiển luồng
Cảm biến hình ảnh Module Raspberry Camera (1 Megapixel) Thu nhận luồng video liên tục khuôn mặt tài xế
Hệ điều hành Raspbian Linux Môi trường điều hành trên phần cứng nhúng ARM
Ngôn ngữ lập trình C++ Đảm bảo tốc độ thực thi và tối ưu hóa tài nguyên phần cứng
Thư viện thị giác máy OpenCV (phiên bản 3.1) Thu nhận luồng ảnh, xử lý ma trận Mat, giao diện highgui
Thư viện học máy dlib Định vị khuôn mặt HOG và trích xuất 68 điểm Facial Landmark

Cấu trúc phần mềm ứng dụng C++ khai thác trực tiếp các module cốt lõi của OpenCV gồm: core (cấu trúc dữ liệu mảng ma trận điểm ảnh), imgproc (các phép biến đổi không gian và bộ lọc ảnh), highgui (giao diện hiển thị và nhận diện video), objdetect và ml (các thuật toán phân loại đối tượng). Phần tính toán mô hình hình dạng khuôn mặt được dlib xử lý trực tiếp trên các khung hình trích xuất từ camera.


Nội dung chính theo từng chương

Chương 1: Tổng quan về xử lý ảnh

Chương 1 trình bày hệ thống lý thuyết nền tảng về thị giác máy tính và các giai đoạn cốt lõi của xử lý ảnh:

  • Các bước cơ bản: Thu nhận ảnh $\rightarrow$ Tiền xử lý (khử nhiễu, nâng cao độ tương phản) $\rightarrow$ Phân đoạn ảnh (tách vùng theo màu sắc, mức xám) $\rightarrow$ Tách đặc tính (biểu diễn dạng biên hoặc dạng vùng) $\rightarrow$ Nhận dạng và giải thích đối tượng.
  • Biểu diễn ảnh số: Mô hình vector và mô hình raster (ma trận điểm ảnh với lân cận 4 điểm hoặc 8 điểm liền kề); phân tích ảnh xám 8-bit (256 mức xám) và ảnh màu RGB 24-bit ($2^{24} \approx 16{,}7$ triệu màu); phân tích lược đồ mức xám Histogram.
  • Cấu trúc tệp ảnh: Phân tích cấu trúc header 16 bytes và 4 kiểu gói nén của định dạng file IMG; cấu trúc header 128 bytes cùng cơ chế nén độ dài loạt RLE của định dạng file PCX.
  • Thách thức trong bài toán nhận diện mặt người: Phân tích các yếu tố gây sai lệch như góc chụp/tư thế xoay đầu, sự che khuất (kính mắt, khẩu trang, râu), biểu cảm khuôn mặt, điều kiện chiếu sáng biến đổi, nền ảnh phức tạp và sắc tố da.

Chương 2: Xây dựng hệ thống nhận dạng trạng thái buồn ngủ

Chương 2 mô tả chi tiết cơ chế toán học và thuật toán của các module thành phần trong hệ thống:

  • Trình bày toán tử tính vector đặc trưng HOG, quy tắc chia 9 bin hướng từ $0^\circ$ đến $360^\circ$, quy trình chuẩn hóa khối và thuật toán Linear SVM để phát hiện vùng mặt.
  • Thiết lập phương trình Naka-Rushton, hai bộ lọc thông thấp Gauss kết hợp bộ lọc sai phân Gauss (DoG) trong cấu trúc bộ lọc Retinal filter nhằm ổn định độ sáng ảnh đầu vào.
  • Trình bày mô hình 68 Facial Landmarks của Kazemi và Sullivan, xác định chính xác danh sách chỉ số điểm mốc cho 7 phân vùng trên khuôn mặt.
  • Xây dựng mô hình toán học tính tỷ lệ khung hình mắt EAR từ 6 điểm mốc vùng mắt, thiết lập cơ chế phân biệt giữa nháy mắt sinh lý thông thường ($100 - 400\text{ ms}$) và trạng thái nhắm mắt do ngủ gật.

Chương 3: Xây dựng hệ thống

Chương 3 tập trung vào khâu hiện thực hóa hệ thống trên phần cứng và phần mềm:

  • Thư viện OpenCV: Phân tích kiến trúc đa nền tảng, cơ chế tối ưu đa nhân, tập lệnh SSE/AVX và vai trò của các thư viện con (core, imgproc, highgui, video, objdetect, ml, gpu, ocl, nonfree, contrib).
  • Thư viện dlib: Phân tích các phân hệ học máy gồm phân lớp (kNN, SVM), biến đổi dữ liệu, phân cụm, hồi quy, dự đoán có cấu trúc và trường ngẫu nhiên Markov (MRF).
  • Phần cứng thực nghiệm: Tích hợp bo mạch máy tính nhúng Raspberry Pi với module Raspberry Camera (1MP) kết nối qua giao tiếp chuyên dụng, cài đặt môi trường Raspbian và biên dịch mã nguồn C++.

Chương 4: Kết quả

Chương 4 công bố kết quả thử nghiệm trực tiếp của hệ thống trong việc nhận dạng khuôn mặt, định vị vùng mắt và phát hiện trạng thái ngủ gật theo thời gian thực:

  • Mô hình trích xuất thành công khung đa giác bao quanh hai mắt từ các điểm landmark (hiển thị trực quan bằng các đường nối màu xanh lá cây trên khung hình).
  • Đánh giá khả năng phân loại trạng thái mắt dựa trên ngưỡng mặc định $EAR = 0{,}25$:
    • Khi mắt mở bình thường: Chỉ số tính toán đạt $EAR = 0{,}30$ ($> 0{,}25$), hệ thống xác định trạng thái tỉnh táo, không xuất hiện cảnh báo.
    • Khi mắt nhắm do buồn ngủ: Chỉ số tính toán giảm xuống $EAR = 0{,}15$ ($< 0{,}25$), hệ thống kích hoạt và hiển thị dòng chữ cảnh báo "DROWSINESS" trên màn hình điều khiển.

Kết quả và đóng góp

Nội dung Kết quả thực nghiệm đạt được
Khả năng trích xuất điểm mốc Định vị chính xác 68 điểm mốc khuôn mặt, phân lập độc lập vùng mắt trái (điểm 43–48) và mắt phải (điểm 37–42).
Thiết lập ngưỡng cảnh báo EAR Xác lập ngưỡng phân loại $EAR = 0{,}25$; hệ thống giữ trạng thái bình thường khi $EAR = 0{,}30$ và kích hoạt nhãn DROWSINESS khi $EAR = 0{,}15$.
Triển khai hệ thống nhúng Đóng gói thành công toàn bộ chuỗi thuật toán xử lý ảnh C++, OpenCV và dlib chạy trực tiếp trên Raspberry Pi kết hợp camera 1MP.

Đóng góp chính của đồ án là chứng minh tính khả thi của việc kết hợp thuật toán Facial Landmark hiện đại với chỉ số hình học EAR để giải quyết bài toán an toàn giao thông trên một nền tảng phần cứng nhúng giá thành thấp, kích thước nhỏ gọn và không yêu cầu phần cứng máy tính cồng kềnh.


Hạn chế và hướng nghiên cứu tiếp

Dựa trên các kết quả và đánh giá được tác giả nêu trong đồ án, hệ thống còn một số điểm cần tiếp tục hoàn thiện:

  • Chất lượng cảm biến đầu vào: Module camera thực nghiệm có độ phân giải $1\text{ MP}$ nên chất lượng hình ảnh thu nhận còn hạn chế, dễ bị ảnh hưởng khi môi trường rung lắc hoặc thiếu sáng.
  • Phương thức cảnh báo: Hệ thống mới chỉ hiển thị thông báo văn bản DROWSINESS trên màn hình hiển thị, chưa tích hợp còi hú hoặc loa phát âm thanh cảnh báo trực tiếp để đánh thức tài xế tức thì.
  • Tốc độ và hiệu năng xử lý: Cần tối ưu hóa thuật toán hơn nữa để tăng tốc độ khung hình xử lý trên giây (FPS) trên phần cứng hạn chế của Raspberry Pi.

Hướng nghiên cứu mở rộng được đề xuất:

  1. Nâng cấp module camera có độ phân giải cao hơn và hỗ trợ hồng ngoại để hoạt động tốt vào ban đêm.
  2. Tận dụng các chân GPIO mở rộng của Raspberry Pi để kết nối module loa/còi cảnh báo âm thanh và đèn LED báo động.
  3. Cải tiến giải thuật để nâng cao độ chính xác nhận dạng khi người lái quay đầu hoặc thay đổi tư thế lái xe.

Giá trị tham khảo

Đồ án là tài liệu tham khảo thiết thực cho sinh viên các ngành Kỹ thuật Điện tử - Viễn thông, Công nghệ Thông tin, Kỹ thuật Máy tính và Cơ điện tử:

  • Tài liệu học tập thị giác máy tính: Cung cấp cơ sở toán học chi tiết về thuật toán trích xuất đặc trưng HOG, cấu trúc bộ lọc Retinal filter và công thức tính tỉ lệ hình học mắt EAR.
  • Kinh nghiệm lập trình nhúng: Hướng dẫn cấu hình, tích hợp và biên dịch thư viện C++, OpenCV 3.1 và dlib trên hệ điều hành Raspbian của Raspberry Pi.
  • Triển khai ứng dụng giám sát: Cung cấp mô hình tham chiếu hoàn chỉnh cho các dự án nghiên cứu về hỗ trợ lái xe an toàn (ADAS), phát hiện mất tập trung và các hệ thống giám sát sinh trắc học không tiếp xúc.

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

1. Đồ án sử dụng mô hình Facial Landmark bao nhiêu điểm và tập dữ liệu huấn luyện nào?

Đồ án sử dụng mô hình shape_predictor_68_face_landmarks của thư viện dlib để xác định 68 điểm mốc trên khuôn mặt. Mô hình này được huấn luyện trên bộ dữ liệu chuẩn iBUG 300-W theo phương pháp của Vahid Kazemi và Josephine Sullivan (2014).

2. Chỉ số EAR được tính như thế nào và ngưỡng phát hiện buồn ngủ trong đồ án là bao nhiêu?

Chỉ số EAR (Eye Aspect Ratio) được tính dựa trên tỷ lệ giữa chiều cao và chiều rộng của mắt: $$EAR = \frac{||p_2 - p_6|| + ||p_3 - p_5||}{2 ||p_1 - p_4||}$$ Trong đồ án, ngưỡng EAR mặc định được thiết lập là $0{,}25$. Khi mắt mở bình thường, chỉ số đo được là $EAR = 0{,}30$; khi mắt nhắm buồn ngủ, chỉ số giảm xuống $EAR = 0{,}15$ và hệ thống kích hoạt cảnh báo.

3. Phân bố các điểm mốc vùng mắt trên mô hình 68 điểm được quy định ra sao?

Vùng mắt phải được định vị bởi 6 điểm mốc từ điểm 37 đến điểm 42. Vùng mắt trái được định vị bởi 6 điểm mốc từ điểm 43 đến điểm 48.

4. Hệ thống thực nghiệm sử dụng nền tảng phần cứng và ngôn ngữ lập trình nào?

Hệ thống được xây dựng trên bo mạch máy tính nhúng Raspberry Pi kết hợp với module Raspberry Camera độ phân giải 1 Megapixel, chạy hệ điều hành Raspbian và lập trình bằng ngôn ngữ C++ cùng hai thư viện OpenCV và dlib.

5. Bộ lọc Retinal filter có vai trò gì trong hệ thống?

Bộ lọc Retinal filter mô phỏng cơ chế thị giác sinh học (lớp Photoreceptor và Outer Plexiform) bằng cách áp dụng phương trình Naka-Rushton, hai bộ lọc Gaussian ($\sigma_1=1, \sigma_2=3$) và bộ lọc sai phân Gauss DoG ($\sigma_{Ph}=0{,}5$). Bộ lọc giúp chuẩn hóa ảnh từ các điều kiện chiếu sáng khác nhau về cùng dải giá trị tương đồng và làm sắc nét các đường viền quan trọng (mắt, lông mày, miệng).


Kết luận

Đồ án tốt nghiệp của tác giả Hà Xuân Thân đã nghiên cứu và triển khai thành công hệ thống tự động nhận dạng trạng thái buồn ngủ của người lái xe bằng thuật toán Facial Landmark trên máy tính nhúng Raspberry Pi. Bằng việc kết hợp đặc trưng HOG, bộ lọc Retinal filter và tỷ lệ hình học mắt EAR, hệ thống đã phát hiện chính xác trạng thái nhắm mắt và đưa ra cảnh báo kịp thời. Đây là công trình thực nghiệm hoàn chỉnh, kết hợp chặt chẽ giữa cơ sở lý thuyết thị giác máy tính và ứng dụng kỹ thuật nhúng phục vụ an toàn giao thông.