Giới thiệu dự án

Trong kỷ nguyên thị giác máy tính và trí tuệ nhân tạo biên (Edge AI), bài toán phát hiện khuôn mặt đóng vai trò nền tảng trong các hệ thống giám sát an ninh, nhận diện danh tính, theo dõi tài xế chống ngủ gật và giao tiếp người - máy. Theo các thống kê công nghiệp, việc triển khai các mô hình thị giác máy tính trên vi xử lý truyền thống (CPU) hoặc vi xử lý đồ họa (GPU) tiêu tốn công suất lớn (thường từ 15W đến hơn 100W), đồng thời gặp phải nút thắt cổ chai băng thông bộ nhớ ngoài (Off-chip DDR Memory Bottleneck), gây độ trễ khung hình cao và không phù hợp với các thiết bị nhúng thời gian thực.

Khóa luận tốt nghiệp tập trung giải quyết bài toán: Hiện thực hóa và tối ưu giải thuật phát hiện khuôn mặt Viola-Jones trên nền tảng phần cứng tái cấu trúc FPGA (Field Programmable Gate Array) nhằm tối đa hóa thông lượng tính toán, triệt tiêu độ trễ truy xuất bộ nhớ và tối ưu hóa năng lượng tiêu thụ.

+-------------------------------------------------------------------------+
|                              ZYNQ-7000 SoC                              |
|  +--------------------------------+  +-------------------------------+  |
|  |     Processing System (PS)     |  |   Programmable Logic (PL)     |  |
|  |  [Dual ARM Cortex-A9 @667MHz]  |  |  [Custom Face Detection IP]   |  |
|  |                |               |  |               ^               |  |
|  |                v               |  |               |               |  |
|  |     [C Application Driver]     |  |       [Window & II Buffers]   |  |
|  +----------------|---------------+  +---------------|---------------+  |
|                   |   AXI4-Lite / Stream Bus         |                  |
|                   +----------------------------------+                  |
|                                     |                                   |
|                                     v                                   |
|                            [VGA Display Output]                         |
+-------------------------------------------------------------------------+

Mục tiêu của đồ án

  1. Nghiên cứu và đánh giá thực nghiệm các phương pháp phát hiện khuôn mặt: so sánh giải thuật dựa trên không gian màu da $YCbCr$ với giải thuật Viola-Jones dựa trên đặc trưng Haar-like và cấu trúc phân lớp tầng (Cascade Classifier).
  2. Thiết kế kiến trúc phần cứng chuyên dụng (IP Core): Hiện thực toàn bộ luồng xử lý của thuật toán Viola-Jones bằng ngôn ngữ mô tả phần cứng SystemVerilog/Verilog.
  3. Tối ưu hóa kiến trúc bộ nhớ đệm (Line Buffering): Cải tiến khối tạo cửa sổ tích phân (Integral Window Buffer) và bộ đệm dòng (Row Buffers), giảm thời gian trễ khởi tạo từ 76.800 chu kỳ xuống còn 8.000 chu kỳ xung nhịp (clock cycles).
  4. Tích hợp hệ thống SoC hoàn chỉnh: Triển khai IP Core lên dòng chip Xilinx Zynq-7000 SoC, kết nối với bộ xử lý ARM (Processing System - PS) qua bus AXI và xuất trực tiếp kết quả bounding box lên màn hình thông qua chuẩn giao tiếp VGA.

Phạm vi và giới hạn kỹ thuật

  • Độ phân giải xử lý: Cố định $320 \times 240$ pixel, ảnh mức xám (Grayscale 8-bit depth).
  • Mô hình phân loại: Bộ Haar Cascade huấn luyện sẵn trích xuất từ OpenCV gồm 25 tầng phân loại (stages) với tổng cộng 2.913 đặc trưng Haar-like (weak classifiers).
  • Đối tượng nhận diện: Khuôn mặt người ở tư thế trực diện (frontal face), góc nghiêng trong khoảng $\pm 15^\circ$.

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

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

Quá trình khảo sát đánh giá hai hướng tiếp cận chính trong bài toán phát hiện khuôn mặt nhúng:

Tiêu chí Tiếp cận dựa trên màu da ($YCbCr$) Mô hình Deep Learning (CNN/Tiny-YOLO) Giải thuật Viola-Jones trên FPGA
Độ chính xác thực nghiệm Thấp ($52,0%$) Rất cao ($95,0% - 98,5%$) Tốt ($82,0%$)
Độ phức tạp phần cứng Rất thấp (Toán tử ngưỡng + Morphological) Cực cao (Yêu cầu NPU/ hàng triệu trọng số) Trung bình (Tối ưu cho Logic & BRAM)
Độ nhạy sáng Rất nhạy cảm với ánh sáng nền Tự thích ứng tốt Thích ứng nhờ chuẩn hóa độ lệch chuẩn ($\sigma$)
Băng thông bộ nhớ Nhỏ Cực lớn (DDR3/DDR4 liên tục) Khép kín trên On-Chip BRAM
Độ trễ xử lý $< 5\text{ ms}$ $30\text{ ms} - 100\text{ ms}$ trên Edge CPU $< 10\text{ ms}$ (Real-time $60+\text{ FPS}$)

Thực nghiệm trên 241 ảnh thử nghiệm cho thấy phương pháp màu da bị nhận diện nhầm nghiêm trọng vào các vùng tay, chân và hậu cảnh phức tạp. Do đó, thuật toán Viola-Jones là lựa chọn tối ưu về mặt cân bằng giữa độ chính xác và tính khả thi trên tài nguyên phần cứng FPGA tầm trung.

                MoSCoW Requirements Breakdown
+-------------------------------------------------------------+
| MUST HAVE                                                   |
| - Pipeline tính toán Integral Image (II) & Square II (SII). |
| - Module Cascade Classifier 25 stages với 2913 weak nodes.  |
| - Giao tiếp AXI / ngắt IRQ và xuất tọa độ X-Y.              |
+-------------------------------------------------------------+
| SHOULD HAVE                                                 |
| - Bộ tính Standard Deviation (Stddev) khử nhiễu ánh sáng.   |
| - Line buffer 25 dòng giảm latency xử lý khung hình.        |
+-------------------------------------------------------------+
| COULD HAVE                                                  |
| - Khối Scale Pyramid đa tỉ lệ bằng Nearest-Neighbor.        |
| - Non-Maximum Suppression (NMS) lọc bounding box trùng.     |
+-------------------------------------------------------------+
| WON'T HAVE (This Phase)                                     |
| - Nhận diện khuôn mặt nghiêng góc lớn (>45 độ).             |
| - Xử lý trực tiếp luồng video màu Full HD 1080p.            |
+-------------------------------------------------------------+

Thiết kế hệ thống

Kiến trúc hệ thống được chia thành hai phần chính trên nền tảng Zynq-7000 SoC:

Nền tảng công nghệ và thông số kỹ thuật

  • Nền tảng phần cứng: Bo mạch Xilinx Zynq-7000 (XC7Z020-CLG484 hoặc Zybo/ZedBoard).
  • Môi trường phát triển: Xilinx Vivado Design Suite 2020.2, Xilinx Vitis / SDK.
  • Ngôn ngữ thiết kế: SystemVerilog, Verilog-2001, C/C++ (Bare-metal driver trên ARM Cortex-A9).
  • Đặc tả tập dữ liệu & Model: Bộ trọng số Haar Cascade XML chuẩn OpenCV (haarcascade_frontalface_default.xml).

Cơ sở toán học cho việc hiện thực hóa phần cứng

  1. Ảnh tích phân (Integral Image - II) và Ảnh tích phân bình phương (Square Integral Image - SII): $$II(x,y) = \sum_{x' \le x, y' \le y} I(x', y'), \quad SII(x,y) = \sum_{x' \le x, y' \le y} I^2(x', y')$$
  2. Tính tổng vùng chữ nhật bất kỳ trong cửa sổ trượt (Rectangle Sum): Với 4 đỉnh của hình chữ nhật $D = [A, B, C, D]$: $$\text{RecSum}(D) = II(D) + II(A) - II(B) - II(C)$$ Độ phức tạp tính toán giảm từ $\mathcal{O}(W \times H)$ về $\mathcal{O}(1)$ với chỉ 3 phép tính số học (2 cộng, 1 trừ).
  3. Bù trừ ánh sáng cục bộ (Lighting Normalization): $$\sigma = \sqrt{\frac{SII(W)}{N} - \left(\frac{II(W)}{N}\right)^2} = \sqrt{\frac{N \cdot \text{Ssii} - (\text{Sii})^2}{N^2}}$$ Trong đó $N = 24 \times 24 = 576$, $\text{Sii}$ và $\text{Ssii}$ là tổng giá trị pixel và tổng bình phương pixel trên cửa sổ dò tìm $24 \times 24$.

Implementation và kết quả

Quá trình phát triển phần cứng (Development Process)

Hệ thống được module hóa thành các khối phần cứng chuyên trách độc lập:

  1. Khối IMG Buffer & Address Generator: Bộ nhớ RAM 2 cổng (Dual-port RAM) lưu trữ ảnh xám $320 \times 240$ ($76.800 \text{ bytes} \approx 600\text{ Kibit}$). Điểm đột phá nằm ở cơ chế kích hoạt sớm: thay vì chờ nhận đủ toàn bộ khung hình (76.800 chu kỳ), hệ thống bắt đầu quét ngay khi bộ đệm dòng nhận đủ 25 dòng quét đầu tiên ($320 \times 25 = 8.000\text{ chu kỳ}$).
  2. Khối Integral WindowBuffer & Square Integral WindowBuffer: Quản lý ma trận con $25 \times 25$ điểm II/SII. Thiết kế cho phép truy xuất đồng thời 4 tọa độ góc của tối đa 3 hình chữ nhật con trong cùng 1 chu kỳ xung nhịp nhờ phân chia ngân hàng bộ nhớ (Multi-bank distributed registers).
  3. Khối Stddev Unit: Pipeline hóa phép tính bình phương, nhân cố định và xấp xỉ căn bậc hai (Fixed-point square root) với độ trễ 4 chu kỳ clock, cho ra hệ số chuẩn hóa phương sai.
  4. Khối Classifier Core: Tích hợp các khối ROM chứa tham số từ file XML (tọa độ hình chữ nhật, trọng số $W_1, W_2, W_3$, ngưỡng node WeakThr, LeftVal, RightVal, và ngưỡng tầng StageThreshold).
// Trích đoạn Verilog HDL tính toán Rectangle Sum O(1) từ ma trận Integral Window
module rect_sum_calc (
    input  wire signed [19:0] ii_a,
    input  wire signed [19:0] ii_b,
    input  wire signed [19:0] ii_c,
    input  wire signed [19:0] ii_d,
    input  wire signed [7:0]  weight,
    output wire signed [27:0] weighted_sum
);
    wire signed [20:0] raw_sum;
    
    // RecSum = II(D) + II(A) - II(B) - II(C)
    assign raw_sum = ($signed(ii_d) + $signed(ii_a)) - ($signed(ii_b) + $signed(ii_c));
    assign weighted_sum = raw_sum * $signed(weight);
endmodule
// Mã điều khiển tích hợp trên ARM Cortex-A9 (Processing System)
#include "xparameters.h"
#include "xil_io.h"

#define FACE_IP_BASE_ADDR   XPAR_FACE_DETECTOR_IP_0_BASEADDR
#define REG_CONTROL_OFFSET  0x00
#define REG_STATUS_OFFSET   0x04
#define REG_COORD_X_OFFSET  0x08
#define REG_COORD_Y_OFFSET  0x0C

void send_frame_to_fpga(uint8_t *frame_buffer, int width, int height) {
    // Kích hoạt reset và start IP core
    Xil_Out32(FACE_IP_BASE_ADDR + REG_CONTROL_OFFSET, 0x01);
    
    for (int i = 0; i < width * height; i++) {
        // Ghi pixel qua bus AXI-Stream / FIFO
        Xil_Out8(FACE_IP_BASE_ADDR + 0x10, frame_buffer[i]);
    }
    
    // Đợi tín hiệu ngắt hoàn tất (IRQ status)
    while ((Xil_In32(FACE_IP_BASE_ADDR + REG_STATUS_OFFSET) & 0x01) == 0);
    
    uint32_t face_x = Xil_In32(FACE_IP_BASE_ADDR + REG_COORD_X_OFFSET);
    uint32_t face_y = Xil_In32(FACE_IP_BASE_ADDR + REG_COORD_Y_OFFSET);
}

Kiểm thử và đánh giá hiệu năng (Testing & Validation)

Hệ thống được mô phỏng kiểm tra chức năng (Functional Simulation) bằng Vivado Simulator và đánh giá thực tế trên 241 mẫu ảnh test chuẩn.

                    Độ chính xác nhận diện (%)
  100 +-------------------------------------------------------+
   80 |                                    82.0%     82.0%    |
   60 |                        52.0%       +----+    +----+   |
   40 |                        +----+      |    |    |    |   |
   20 |                        |    |      |    |    |    |   |
    0 +------------------------+----+------+----+----+----+---+
                               YCbCr       C-SW      FPGA-HW

Kết quả sử dụng tài nguyên phần cứng (Xilinx Zynq XC7Z020)

Tài nguyên Thiết kế gốc (Tham chiếu [15]) Thiết kế đề xuất (Đã cải tiến) Khả dụng trên Chip Tỉ lệ sử dụng (%)
LUT (Lookup Tables) 18.420 14.850 53.200 $27,9%$
FF (Flip-Flops) 14.210 11.640 106.400 $10,9%$
BRAM 36Kb 32,5 Block 21,5 Block 140 Block $15,3%$
DSP48 Slices 44 28 220 $12,7%$
Tần số hoạt động ($F_{\max}$) 85 MHz 125 MHz - -

Tối ưu hóa thời gian xử lý và độ trễ

- Thiết kế chưa tối ưu : [========== Lưu toàn khung hình: 76.800 cycles ==========][ Xử lý Classify... ]
- Thiết kế sau cải tiến: [ Lưu 25 dòng: 8.000 cycles ][====== Xử lý Classify song song liên tục ======]
                         <-- Giảm 89.6% độ trễ chờ -->
  • Số chu kỳ khởi động chờ: Giảm từ $76.800\text{ cycles}$ xuống $8.000\text{ cycles}$ (tiết kiệm $89,6%$ thời gian chết).
  • Cơ chế Cascade Early Rejection: Hơn $70%$ số cửa sổ background bị loại bỏ ngay tại Stage 1 (9 features) và Stage 2 (16 features), giúp giảm thiểu số phép tính trên toàn khung hình từ hàng triệu phép tính xuống trung bình chưa đầy 12 chu kỳ cho mỗi cửa sổ trượt không chứa khuôn mặt.

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

  1. Cơ chế tạo cửa sổ tích phân cuốn chiếu (Pipelined Circular Line Buffering): Không cần lưu toàn bộ ma trận tích phân kích thước lớn lên bộ nhớ ngoài, thiết kế chỉ duy trì 25 dòng quét trên BRAM nội chuỗi, triệt tiêu hoàn toàn nghẽn cổ chai truy xuất DDR RAM.
  2. Khối chuẩn hóa phương sai ($\sigma$) phần cứng không dùng phép chia dấu phẩy động: Triển khai bộ tính độ lệch chuẩn bằng phép dịch bit và bảng tra số học dấu số nguyên cố định (Fixed-point Look-up Table), cho phép tính $\sigma$ chỉ trong 4 chu kỳ xung nhịp.
  3. Tiết kiệm $33,8%$ Block RAM và $36,3%$ khối DSP: Tối ưu hóa cấu trúc lưu trữ trọng số Haar Cascade trong ROM phân tán, tái sử dụng các bộ nhân số học cho nhiều hình chữ nhật con trong cùng một đặc trưng.
  4. Kiến trúc đồng thiết kế Phần cứng - Phần mềm (HW/SW Co-design): Tạo ra một IP Core tương thích chuẩn AXI4, dễ dàng cắm và chạy (Plug-and-Play) vào bất kỳ kiến trúc vi xử lý nhúng nào (ARM Cortex-A, RISC-V, MicroBlaze).

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

Tình huống ứng dụng thực tế

  • Hệ thống giám sát lái xe an toàn (DMS): Phát hiện vị trí khuôn mặt người lái trong thời gian thực dưới điều kiện ánh sáng cabin biến đổi liên tục, làm tiền đề nhận diện trạng thái mệt mỏi/ngủ gật.
  • Thiết bị điểm danh / Kiểm soát vào ra độc lập (Edge Access Control): Hoạt động không cần kết nối Internet, công suất thấp ($< 2,5\text{W}$ trên bo mạch Zynq), bảo mật tuyệt đối dữ liệu riêng tư tại biên.
                  Quy trình triển khai hệ thống
+-------------------------------------------------------------+
| BƯỚC 1: XUẤT BITSTREAM PHẦN CỨNG                            |
| Mở Vivado -> Chạy Synthesis, Implementation -> Tạo Bitstream |
+-------------------------------------------------------------+
                              |
                              v
+-------------------------------------------------------------+
| BƯỚC 2: XUẤT PHẦN CỨNG SANG VITIS / SDK                     |
| Export Hardware (.xsa) -> Tạo Platform Board Support (BSP)  |
+-------------------------------------------------------------+
                              |
                              v
+-------------------------------------------------------------+
| BƯỚC 3: NẠP CHƯƠNG TRÌNH VÀ VẬN HÀNH                        |
| Nạp Bitstream qua JTAG -> Chạy mã C trên ARM -> Xuất VGA    |
+-------------------------------------------------------------+

Phân tích hiệu quả kinh tế và mở rộng

  • Chi phí phần cứng: Sử dụng FPGA họ Spartan-7 hoặc Zynq-7010 giá thành thấp ($\approx $25 - $40$), rẻ hơn đáng kể so với việc trang bị GPU công nghiệp nhúng (như NVIDIA Jetson $\ge $200$).
  • Khả năng mở rộng: Thiết kế IP Core cho phép nâng cấp pipeline lên $640 \times 480$ bằng cách mở rộng chiều rộng của bộ đệm dòng (từ 320 lên 640 phần tử) mà không cần thay đổi cấu trúc bộ phân loại tầng.

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

Hạn chế kỹ thuật

  • Hệ thống cố định ở cửa sổ trượt cơ sở $24 \times 24$, việc scale ảnh qua thuật toán nội suy Nearest-Neighbor có thể làm suy giảm chi tiết ở các tỉ lệ thu nhỏ lớn.
  • Khả năng nhận diện bị giới hạn đối với khuôn mặt quay nghiêng góc lớn ($> \pm 30^\circ$) hoặc bị che khuất một phần (khẩu trang, kính râm).

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

  • Tích hợp giải thuật Non-Maximum Suppression (NMS) trực tiếp bằng phần cứng để loại bỏ triệt để các bounding box chồng lấn tại các tỉ lệ scale khác nhau.
  • Nghiên cứu mô hình nén mạng nơ-ron nhị phân (Binary Neural Network - BNN) hoặc mạng Tiny-YOLOv4 kết hợp bộ tăng tốc DPU (Deep Learning Processing Unit) trên FPGA để xử lý đa góc mặt và tăng độ chính xác lên $>95%$.

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

+-------------------------------------------------------------------------+
|                           ĐỐI TƯỢNG HƯỞNG LỢI                           |
|                                                                         |
|  [Sinh viên / Người học]      [Kỹ sư phần cứng FPGA]                    |
|  - Tài liệu mẫu về RTL design - Kiến trúc pipeline xử lý ảnh streaming  |
|  - Cấu trúc HW/SW SoC mẫu     - Thiết kế bộ nhớ đệm Line Buffer tối ưu |
|                                                                         |
|  [Doanh nghiệp IoT / Edge AI] [Nhà nghiên cứu học thuật]                |
|  - Giải pháp Edge AI chi phí  - Cơ sở đối chuẩn benchmark thuật toán    |
|    thấp, không phụ thuộc GPU    cổ điển vs CNN trên kiến trúc nhúng     |
+-------------------------------------------------------------------------+

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

1. Yêu cầu phần cứng tối thiểu để triển khai IP Core này là gì?

Hệ thống yêu cầu dòng FPGA hỗ trợ tối thiểu 15.000 LUTs, 22 Block RAM 36Kb, 28 DSP Slices (tương đương chip Xilinx Artix-7 XC7A35T hoặc Zynq-7010 trở lên) và cổng xuất hình ảnh (VGA hoặc HDMI).

2. Giới hạn tỉ lệ khung hình (FPS) tối đa của hệ thống là bao nhiêu?

Với xung nhịp $125\text{ MHz}$, IP Core có khả năng xử lý luồng ảnh $320 \times 240$ với thông lượng đạt từ $65\text{ FPS}$ đến $110\text{ FPS}$ (tùy thuộc vào mật độ khuôn mặt trong khung hình nhờ cơ chế Cascade Rejection).

3. Làm thế nào để tích hợp IP này với các vi xử lý khác ngoài ARM Zynq?

IP Core sử dụng giao diện bus chuẩn công nghiệp AXI4-Lite (cho cấu hình thanh ghi) và AXI4-Stream (cho dữ liệu pixel). Bạn hoàn toàn có thể kết nối IP với lõi RISC-V, vi xử lý mềm Xilinx MicroBlaze hoặc bộ điều khiển DMA tiêu chuẩn.

4. Có thể thay đổi bộ trọng số nhận diện đối tượng khác (biển số xe, người đi bộ) không?

Có. Cấu trúc phần cứng được thiết kế tổng quát hóa cho giải thuật Haar Cascade. Người dùng chỉ cần trích xuất file XML của đối tượng tương ứng từ OpenCV, chạy script chuyển đổi sang định dạng bộ nhớ ROM Verilog và nạp lại vào module Classifier.

5. Chi phí ước tính và thời gian thu hồi vốn (ROI) khi thương mại hóa?

Với chi phí sản xuất phần cứng dạng mạch tích hợp chuyên dụng (ASIC/FPGA module) dưới $$50/\text{thiết bị}$ và điện năng tiêu thụ chỉ $\sim 2\text{W}$, giải pháp giúp doanh nghiệp tiết kiệm $70%$ chi phí phần cứng và $90%$ tiền điện so với giải pháp sử dụng máy tính biên chạy GPU, đạt điểm hòa vốn ROI trong vòng 6 - 9 tháng triển khai thực tế.


Kết luận

Khóa luận tốt nghiệp đã nghiên cứu và hiện thực hóa thành công Hệ thống phát hiện khuôn mặt thời gian thực trên FPGA Zynq-7000 SoC dựa trên giải thuật Viola-Jones. Bằng việc đề xuất kiến trúc xử lý dạng dòng (streaming) kết hợp bộ đệm dòng 25 hàng quét và tính toán ma trận tích phân trực tiếp trên BRAM, thiết kế đã khắc phục hoàn toàn hiện tượng nghẽn cổ chai bộ nhớ ngoài, giảm thời gian trễ khởi tạo tới $89,6%$, đạt độ chính xác $82,0%$ tương đương phần mềm nhưng mang lại thông lượng xử lý vượt trội ở mức tiêu thụ năng lượng tối thiểu.

Đây là tài liệu tham khảo kỹ thuật giá trị cho các kỹ sư và nhà nghiên cứu trong lĩnh vực vi mạch, hệ thống nhúng và xử lý ảnh biên.