You are on page 1of 47

BAN CƠ YẾU CHÍNH PHỦ

HỌC VIỆN KỸ THUẬT MẬT MÃ


KHOA CÔNG NGHỆ THÔNG TIN

----

THỰC TẬP CƠ SỞ CHUYÊN NGÀNH


NGHIÊN CỨU THƯ VIỆN OpenCV ỨNG DỤNG NHẬN DẠNG KHUÔN
MẶT NGƯỜI

Ngành: An toàn thông tin


Mã số:

Giảng viên hướng dẫn: Cao Thanh Vinh


Sinh viên thực hiện: Mã sinh viên
Phạm Duy Phúc AT140434
Đinh Quang Tuyển AT140252
Nguyễn Trọng Chung AT140405

Hà Nội, 2020

1
DANH MỤC HÌNH VẼ............................................ Error! Bookmark not defined.
DANH MỤC KÝ KIỆU VIẾT TẮT ........................ Error! Bookmark not defined.
LỜI NÓI ĐẦU .......................................................... Error! Bookmark not defined.
KẾT LUẬN VÀ ĐỊNH HƯỚNG PHÁT TRIỂN .... Error! Bookmark not defined.
TÀI LIỆU THAM KHẢO........................................ Error! Bookmark not defined.
LỜI NÓI ĐẦU ....................................................................................................... 3
DANH MỤC HÌNH VẼ......................................................................................... 5
DANH MỤC CHỮ VIẾT TẮT ............................................................................. 7
CHƯƠNG I: CƠ SỞ LÝ THUYẾT ...................................................................... 8
1.1. Giới thiệu về phần mềm mã nguồn mở .................................................... 8
1.1.1. Định nghĩa bài toán ....................................................................................... 8
1.1.2. Những yếu tố ảnh hưởng đến bài toán ........................................................... 8
1.1.3. Các phương pháp pháp dò tìm khuôn mặt ..................................................... 8
1.2. Giới thiệu đặc trưng Haar - Like ............................................................. 9
1.2.1. Đặc trưng Haar - Like ........................................................................ 11
1.2.2. Trích đặc trưng Haar - Like từ ảnh ..................................................... 12
1.2.3. Mô hình Cascades of Boosted Classifiers............................................ 15
1.2.4. Adaboost ............................................................................................. 17
1.3. Định vị đối tượng..................................................................................... 25
1.4. Tổng quan về thư viện OpenCV ............................................................. 26
1.4.1. Tổng quan ........................................................................................... 26
1.4.2. Cấu trúc và ứng dụng của OpenCV..................................................... 27
1.4.3. Những đặc trưng của OpenCV ............................................................ 29
CHƯƠNG II: TỔNG QUAN ĐỀ TÀI ................................................................ 31
2.1. Đặt vấn đề và phạm vi đề tài ........................................................................ 31
2.2. Phương pháp nghiên cứu ........................................................................ 31
2.3. Phương hướng giải quyết........................................................................ 32
2.3.1. Phát hiện và nhận dạng đối tượng với đặc trưng Haar - Like

2
2.3.2. Hệ thống nhận diện đối tượng với ngôn ngữ Python . Error! Bookmark
not defined.

LỜI NÓI ĐẦU


Cùng với sự bùng nổ thông tin, sự phát triển công nghệ cao, sự giao tiếp
giữa con người và máy tính đang thay đổi rất nhanh, giờ đây giao tiếp này
không còn đơn thuần dùng những thiết bị như chuột, bàn phím,… mà có thể
thông qua các biểu hiện của khuôn mặt. Các hệ thống giao tiếp người máy
đang được phát triển rất nhiều. Trong số đó, có thể nói đến hệ thống nhận dạng
mặt người bằng hình ảnh. Nhận dạng mặt người là xác định danh tính tự động
cho từng ảnh đối tượng người dựa vào nội dung của ảnh. Nhận dạng mặt người
được ứng dụng trong thực tế như xác minh tội phạm, camera chống trộm, hệ
thống chấm công, điểm danh học sinh trong các lớp ở các trường đại học,
lưu trữ thông tin khuôn mặt ở các máy ATM,… Phát hiện mặt người trong ảnh
là một phần quan trọng của hệ thống nhận dạng mặt người, giải quyết yếu tố
việc phát hiện mặt người sẽ giúp tiết kiệm thời gian và nâng cao độ chính xác
của việc nhận diện khuôn mặt.
Hệ thống nhận dạng mặt người bao gồm 2 bước: phát hiện khuôn mặt người
và định danh tự động đối tượng. Công việc chính dựa vào các kỹ thuật rút trích
đặc trưng từ ảnh đối tượng và thực hiện đối sánh để định danh tự động. Hiệu
quả của hệ thống nhận dạng phụ thuộc vào các phương pháp sử dụng.
Bài báo cáo này nghiên cứu về OpenCV – thư viện xử lý ảnh mã nguồn mở
và các giải thuật để nhận dạng, phát hiện đối tượng trên thời gian thực. Haar –
Like là giải thuật máy học được áp dụng trong đề tài để trích các đặc trưng của
đối tượng cần dò tìm, kết hợp với bộ phân tầng Cascade of Boosted Classifiers
nhằm nhận dạng, phát hiện đối tượng trên mặt phẳng ảnh thông qua giải thuật
Adaboost để phân lớp.

3
LỜI CẢM ƠN
Trước hết nhóm chúng em xin chân thành cảm ơn các thầy giáo, cô giáo
Khoa công nghệ thông tin trường Học viện kỹ thuật Mật Mã, những người đã
dạy dỗ, trang bị cho chúng em những kiến thức cơ bản, cần thiết trong những
năm học vừa qua để chúng em có đầy đủ kiến thức để hoàn thành bản báo cáo
của mình.
Đặc biệt chúng em xin bày tỏ lòng biết ơn sâu sắc nhất tới cô giáo Cao
Thanh Vinh, cô đã hướng dẫn, chỉ bảo tận tình trong suốt thời gian làm bài
báo cáo.
Mặc dù đã hết sức cố gắng để hoàn thiện bài báo cáo thực tập cơ sở song
do khả năng còn hạn chế nên bài báo cáo còn nhiều thiếu sót. Vì vậy chúng
em rất mong nhận được sự đóng góp chân tình của thầy cô.
Một lần nữa chúng em xin chân thành cảm ơn!

4
DANH MỤC HÌNH VẼ
Hình 1.1: Đặc trưng Haar – Like
Hình 1.2: Tính toán vùng S dựa trên các vùng trước đó
Hình 1.3: Các đặc trưng Haar - Like cơ bản
Hình 1.4: Các đặc trưng mở rộng từ đặc trưng Haar - Like
Hình 1.5: Các tính Integral Image của ảnh
Hình 1.6: Cách tính nhanh vùng D với các tổng các điểm ảnh trên ảnh
Hình 1.7: Các tính nhanh tổng điểm ảnh D trên ảnh với các đặc trưng xoay 450
Hình 1.8: Cách trích đặc trưng Haar - Like
Hình 1.9: Cấu trúc phân tầng với N giai đoạn
Hình 1.10: Kỹ thuật Boosting
Hình 1.11: Nguyên tắc Adaboost
Hình 1.12: Kỹ thuật Adaboost
Hình 1.13: Lược đồ huấn luyện nhận dạng đối tượng
Hình 1.14: Ưu tiên trọng số lớn đê phân hoạch
Hình 1.15: Adaboost va Cascade of Boosted Classifier
Hình 1.16: Dò tìm đối tượng với Haar - Like Features - Cascade of Boosted Classifier
Hình 1.17: Thư viện OpenCV
Hình 1.18: Lịch sử các phiên bản OpenCV
Hình 1.19: Cấu trúc cơ bản của OpenCV
Hình 1.20: Các khía cạnh và ứng dụng của OpenCV
Hình 2.1: Quy trình của hệ thống
Hình 2.2 Ảnh thu thập được qua camera
Hình 2.3: Thư mục chứa ảnh và các mục liên quan
Hình 2.4: Nhận dạng được đối tượng
Hình 2.5: Một số bộ phân loại trong OpenCV

5
Hình 3.1: Giao diện ứng dụng
Hình 3.2: Chức năng Add a User
Hình 3.3: Chức năng trong Add a User
Hình 3.4: Xác nhận thực hiện chức năng quét khuôn mặt
Hình 3.5: Quá trình quét khuôn mặt
Hình 3.6: Lưu trữ ảnh thành công
Hình 3.7: Quá trình huấn luyện thành công
Hình 3.8: Chức năng Check a User
Hình 3.9: Chi tiết chức năng Check a User
Hình 3.10: Quá trình điểm danh
Hình 3.11: Danh sách sau quá trình điểm danh

6
DANH MỤC CHỮ VIẾT TẮT

Ký hiệu và viết tắt Viết đầy đủ


Adaboost Adaptive Boost
Open Source Computer Vision
OpenCV
Communications
XML eXtensible Markup Language
-w Width of Image
-h Height of Image
-vec Vector

7
CHƯƠNG I: CƠ SỞ LÝ THUYẾT
1.1. Giới thiệu về phần mềm mã nguồn mở
1.1.1. Định nghĩa bài toán
Dò tìm, xác định mặt người là một kỹ thuật máy tính dung để xác định kích
thước và vị trí của các khuôn mặt trong ảnh, video hay từ camera. Kỹ thuật
này nhận biết các đặc trưng cảu khuôn mặt bỏ qua yếu tố ngoại cảnh khác như
cây cối, nhà cửa, …
1.1.2. Những yếu tố ảnh hưởng đến bài toán
Có nhiều yếu tố ảnh hưởng đến việc nhận dạng đối tượng:
- Tư thế, góc chụp: Hướng của khuôn mặt trong ảnh có thể thay đổi nhiều
do vị trí của máy ảnh, camera, webcam,... như nhìn thẳng, nhìn nghiêng, hay
nhìn từ trên xuống. Với tư thế khác nhau các thành phần trên khuôn mặt như
mắt mũi, miệng có thể bị khuất một phần hoặc thậm chí khuất hết.
- Sự xuất hiện hoặc thiếu một số thành phần: sự có mặt của các chi tiết
không phải là đặc trưng riêng của khuôn mặt người, như mắt kinh râm,
râu,…Vấn đề này càng làm bài toán trở nên khó hơn rất nhiều.
- Sự che khuất: mặt người có thể bị che khuất bởi các đối tượng khác.
- Sự biểu cảm của khuôn mặt: sự biểu cảm có thể làm thay đổi đang kể
các đặc trưng và thông số của khuôn mặt, ví dụ như khuôn mặt của một người
sẽ rất khác khi người đó cười, tức giận, sợ hãi, …
- Sự phức tạp của hình nền: hình nền phức tạp sẽ khiến xác định khuôn
mặt trở nên khó khăn.
- Điều kiện của ảnh: ảnh được chụp trong các điều kiện khác nhau về:
chiếu sáng về tính chất (máy ảnh kỹ thuật só, webcam, …) ảnh hưởng rất nhiều
đến chất lượng khuôn mặt.
1.1.3. Các phương pháp pháp dò tìm khuôn mặt
Có 4 phương pháp xác định khuôn mặt trên ảnh, tương ứng với 4 hướng
tiếp cận khác nhau.
- Hướng tiếp cận dưa trên tri thức: Dựa vào các thuật toán, mã hóa các
đặc trưng và quan hệ giữa các đặc trưng của khuôn mặt thành các luật. Những
luật này thường là các mối quan hệ giữa các thành phần trên khuôn mặt. Trong
hướng tiếp cận này, các luật sẽ phụ thuộc rất lớn vào tri thức của những tác
gia nghiên cứu, Một số vấn đề phức tạp khác khi dùng hướng tiếp cận này là
làm sao chuyển từ tri thức con người sang các luật một cách hiệu quả. Nếu các
luật quá chi tiết thì khi dò tìm khuôn mặt sẽ có thể sai sót các đối tượng, vì
8
những đối tượng này không thỏa tất cả các luật được đưa ra. Nhưng các luật
quá tổng quát thì có thể gây ra nhận dạng lầm một vùng nào đó không phải
khuôn mặt mà lại dò tìm là khuôn mặt.
- Hướng tiếp cận dựa trên đặc trưng bất biến: Xây dựng các thuật toán
để tìm đặc trưng của khuôn mặt mà các đặc trung này không phụ thuộc tư thế
khuôn mặt hay vị trí đặt máy ảnh, camera (webcam) thay đổi, điều kiện ánh
sáng, và các khó khăn khác. Vấn đề của các thuật toán theo hướng tiếp cận
này là cần phải điều chỉnh cho phù hợp điều kiện ánh sáng, nhiễu và bị che
khuất,… đôi khi bóng của đối tượng sẽ tạo thêm cạnh mới, mà cạnh mới này
lại rõ hơn cạnh thật sự của nó, vì thế nếu dùng cạnh để xác định đối tượng sẽ
gặp khó khăn.
- Hướng tiếp cận dựa trên so sánh khớp mẫu: Dùng mẫu chuẩn của khuôn
mặt (các mẫu này đã được chọn và lưu trữ) để mô tả các khuôn mặt hay các
đặc trưng của khuôn mặt (các mẫu này được chọn tách biệt theo tiêu chuẩn đã
được các tác giả đề ra để so sánh). Các mẫu này được dùng để phát hiện khuôn
mặt bằng cách quét nó qua ảnh và tính toán giá trị tương đồng cho mỗi vị trí.
Việc xuất hiện khuôn mặt tại vị t rí nào đó trong ảnh phụ thuộc vào giá trị
tương đồng của điểm đó so với mẫu chuẩn. Hướng tiếp cận này có thể là rất
dễ cài đặt, nhưng không đạt hiệu quả khi tỷ lệ, tư thế và hình dáng thay đổi.
- Hướng tiếp cận dựa trên diện mạo: Trái ngược với hướmg tiếp cận trên
so sánh khớp mẫu, các mô hình (hay mẫu) sẽ được học từ một tập ảnh huấn
luyện mà thể hiện tính chất tiêu biểu của sự xuất hiện của mặt người trong ảnh.
Nói cách khá, các thuật toán dùng các kỹ thuật phânt tích thống kê và máy học
để xấp xỉ một hàm phân lớp tuyến tính. Sau đó hệ thống (mô hình) sẽ xác định
mặt người. Phương pháp này còn được biết đến với tên gọi tiếp cận theo các
phương pháp học máy.
1.2. Giới thiệu đặc trưng Haar - Like
Đặc trưng Haar - Like của Viola và Jones là những đặc trưng ảnh số được
sử dụng trong nhận dạng đối tượng. Những đặc trưng cơ bản Haar - Like
thường dùng để dò tìm khuôn mặt, do đó Haar - Like là sự lựa chọn phù hợp
cho mục đích nhận dạng nhanh chóng và chính xác trong thời gian thực.
Trong lịch sử, hầu như các tương tác nhận dạng đều làm việc trên cường
độ sáng tối của ảnh, củ thể là làm việc trên từng điểm (Pixel) trong ảnh, đòi
hỏi người dùng phải làm việc trên mức độ tính toán lớn. Để giải quyết được
bài toán “tính toán lớn tren từng điểm ảnh”. Viola và Jones đã phát triển và
điều chỉnh ý tưởng sử dụng những đặc trưng cơ bản của Haar - Like với việc
dùng những hình chữ nhật lân cận tại một địa điểm cụ thể trong cửa sổ dò tìm
nhằm thực hiện việc phát triển đối tượng. Song đó, tính năng phổ biến của
9
Haar - Like đề dò tìm đối tượng là tập hợp của các hình chữ nhật liền kề và
định vị vị trí của các hình chữ nhật liên quan được xác định nhằm mục đích là
bao quanh đối tượng cần tìm trên cửa sổ phát hiện đối tượng.
Đặc trưng Haar - Like trích bằng cách: di chuyển cửa sổ kích thước trên
ảnh và được tính toán cụ thể trên từng vùng ảnh nhỏ, sau đó được so sánh với
một ngưỡng học được phân biệt là không phải đối tượng từ đối tượng trên ảnh.
Ưu điểm chính của việc trích đặc trưng Haar - Like so với hầu hết cách trích
đặc trưng khác là tốc độ tính toán. Do sử dụng cách tính tích phân ảnh (Integral
images) nên đặc trưng Haar - Like có thể trích bất kỳ kích thước nào trong thời
gian liên tục.
Đặc trưng Haar - Like sẽ phản ảnh sự tương phản giữa các mối liên hệ của
đối tượng mà Haar - Like trích đặc trưng. Những đối tượng cần dò và phát
hiện có thể được xác định bởi một bộ những đặc trưng này thông qua những
liên hệ không gian giữa chúng.

Hình 1.1: Đặc trưng Haar - Like


Để có thể huấn luyện bộ phân lớp (Classifier), Viola-Jones đã sử dụng việc
phân tầng với các bộ phân lớp được nâng cao dần, được huấn luyện với vài
tram các mẫu đối tượng cần dò và phát hiện. Chúng sử dụng những mẫu có
đối tượng trong ảnh (những mẫu này có thể co giãn với kích thước 20x20) –
được gọi là mẫu khẳng định (Possitive) và những mẫu không có đối tượng cần
phát hiện – gọi là mẫu phủ định (Negative). Song đó, bộ phân lớp sẽ làm nhiệm
vụ là xuất ra giá trị một nếu vùng đó giống như đối tượng mà chúng ta quan
tâm và ngược với đối tượng không phải đối tượng cần tìm thì bộ phận lớp sẽ
trả về giá trị không. Chúng ta sẽ di chuyển cửa sổ tìm kiếm dọc theo ảnh nhằm
mục đích và xác định trên từng vị trí bởi việc sử dụng bộ phân lớp để tìm kiếm
đối tượng trong toàn bộ bức ảnh thu được từ camera. Bên cạnh đó, đối với
trường hợp tìm kiếm những đối tượng chưa biết cụ thể kích thước, chúng ta
10
cần phải có một thuật toán quét qua ảnh trong nhiều lần với tỷ lệ co giãn khác
nhau để tìm được đối tượng mà chúng ta quan tâm.
- Ảnh phân tích (Integral image):
Để nâng cao khả năng rút trích đúng, chính xác và nhanh chóng những đặc
trưng Haar - Like, Viola và Jones đã sử dụng ảnh tích phân. Đây là ảnh đã
được xử lý trước nhằm tăng cường khả năng rút trích.
Tại mỗi điểm (i,j) trong ảnh gốc, chúng ta tính tổng giá trị tất cả những
điểm ảnh phía bên trái và ở trên so với điểm (i, j):

Hình 1.2: Tính toán vùng S dựa trên các vùng trước đó
1.2.1. Đặc trưng Haar - Like
Viola và Jones đã đề xuất 4 đặc trưng cơ bản để xác định đối tượng và trích
đặc trưng của chúng. Mỗi đặc trưng Haar - Like là sự kết hợp của hải hay ba
hình chữ nhật “Trắng” hay “Đen”.

Hình 1.3: Các đặc trưng Haar - Like cơ bản


Ngoài 4 đặc trưng cơ bản trên, để xác định các góc cạnh và cụ thể là các
đường cong thì rất khó xác định chính xác. Do đó, với bài toán khó như nhận
dạng mặt người thì Viola và Jones đã mở rộng ra 3 tập (Nhóm) đặc trưng sau:

11
1. Đặc trưng cạnh (edge features):

2. Đặc trưng đường (line features):

3. Đặc trưng xung quanh tâm (center- surround features):

Hình 1.4: Các đặc trưng mở rộng từ đặc trưng Haar - Like
1.2.2. Trích đặc trưng Haar - Like từ ảnh
Đặc trưng Haar - Like sẽ được diễn đạt được tri thức về các đối tượng trong
ảnh (bởi vì nó biểu diễn mối liên hệ giữa các bộ phận của đối tượng) , điều mà
bản thân từng điểm ảnh không thể diễn đạt được- dựa trên việc co dãn của
khung cửa sổ tìm kiếm. Để tính giá trị các đặc trưng Haar - Like, ta tính sự
chênh lệch giữa tổng các Pixel của các vùng đen và các vùng trắng như công
thức:
𝑓 (𝑥 ) = ∑𝑣ù𝑛𝑔 đ𝑒𝑛(𝑝𝑖𝑥𝑒𝑙) − ∑𝑣ù𝑛𝑔 𝑡𝑟ắ𝑛𝑔(𝑝𝑖𝑥𝑒𝑙)
Vì vậy chúng ta sẽ thấy rằng, với tổng các Pixel trên ảnh (Pixel vùng trắng
và Pixel vùng đen) sẽ cho ta các giá trị đặc trưng Haar - Like. Nhưng để tính
toán khá lớn, dẫn đến không thể đáp ứng được cho các vị trí trên ảnh đòi hỏi
chi phí tính thời gian thực (run-time) trực tiếp từ camera (hay webcam trên

12
laptop). Do đó Viola và Jones đề xuất một khái niệm gọi là “tích phân ảnh”
(Integral Image) để tính toán nhanh cho các đặc trưng cơ bản của Haar - Like.
Tuy rằng “tích phân ảnh” đã chinh phục nhiều nhà nghiên cứu trên cộng
đồng thị giác máy tính, nhưng để tính toán cho các đặc trưng có góc quay
450 thì việc tính toán từ các đặc trưng trên sẽ rất khó. Do vậy, Lienhart đã kế
thừa Viola-Jones trong khái niệm tích phân ảnh và phát triển nhằm đưa ra thêm
khái niệm RSAT- Rotated Summed Area Table. Tích phân ảnh được định
nghĩa bằng một mảng 2 chiều với kích thước ảnh cần tính.
Mỗi phần tử của mảng trong đạo hàm ảnh được tính bằng cách tính tổng
của điểm ảnh phía trên (dòng-1) và bên trái (cột-1) của nó. Bắt đầu từ vị trí
trên, bên trái đến vị trí dưới, bên phải của ảnh, để thực hiện tính toán nhanh
chóng – chúng đơn thuần chỉ dựa trên phép cộng số nguyên đơn giản.

Hình 1.5: Các tính Integral Image của ảnh


Sau khi đã tính được tích phân ảnh, việc tính tổng điểm ảnh của một vùng
bất kỳ nào đó trên ảnh thực hiện rất đơn giản theo cách sau:
 Tính toán với các đặc trưng căn bản:

Hình 1.6: Cách tính nhanh vùng D với các tổng các điểm ảnh trên ảnh
13
- Tính tổng D:
 Tổng = A + B + C + D
 D = Tổng – (A + B) – (A – C) +A
Với A + B + C + D chính là giá trị tại điểm P4 trên đạo hàm ảnh, tương tự
như vậy A + B là giá trị tại điểm P2, A + C là giá trị tại điểm P3, và A là giá
trị tại điểm P1.
Vậy ta có thể viết lại biểu thức tính D ở trên như sau:
D = P4 - P2 - P3 + P1
D = (𝑥4 , 𝑦4 ) – (𝑥2 , 𝑦2 ) – (𝑥3 , 𝑦3 ) + (𝑥1 , 𝑦1 )

 Sử dụng RSAT – tính toán đặc trưng xoay

Hình 1.7: Các tính nhanh tổng điểm ảnh D trên ảnh với các đặc trưng xoay 450
Với các đặc trưng Haar- Like xoay 450 của tích phân ảnh tại một điểm
(x, y) được tính theo công thức (Lienhart):

𝑃(𝑥, 𝑦) = ∑𝑥≤𝑥,𝑥≤𝑥− |𝑦−𝑦| 𝐼(𝑥 ′ , 𝑦 ′ )

Tổng Pixel của một vùng bất kỳ (cụ thể vùng D) trên ảnh vẫn được tính
theo cách sau:
D = A + B + C + D – (A + B) – (A + C) + A

Như vậy tổng các điểm ảnh trong một hình chữ nhật (kể cả trường hợp xoay
0
45 ) bất kì đều có thể thay đổi được tính nhanh dựa trên tích phân ảnh tại 4
đỉnh của nó:
SUM (D) = P4 – P2 – P3 + P1

Do cách tính là sự kết hợp giữa các phép toán cộng (+), trừ (-) nên độ phức
tạp cho mỗi phép toán là O(1)  Tốc độ tính toán với các điểm trên ảnh nhanh
hơn  Áp dụng tốt cho các bài toán tính theo thời gian thực.
14
Hình 1.8: Cách trích đặc trưng Haar - Like
1.2.3. Mô hình Cascades of Boosted Classifiers
Ta thấy trong quá trình huấn luyện, bộ phận loại phại duyệt qua tất cả các
đặc trưng của các mẫu trong tập huyện luyện dẫn đến tốn rất nhiều thời gian.
Tuy nhiên, trong các mẫu đưa vào, không phải mẫu nào cũng thuộc loại khó
nhận dạng, có những mẫu nên rất dễ nhận ra (ta gọi là những mẫu đơn giản).
Đối với những mẫu này, ta chỉ cần xét một hay vài đặc trưng đơn giản là có
thể nhận diện được chứ không cần xét tất cả các đặc trưng. Nhưng đối với các
bộ phân loại thông thường thì cho dù mẫu cần nhận dạng là dễ hay khó thì nó
vẫn xét tất cả các đặc trưng mà nó rút ra được trong quá trình học. Do đó,
chúng tốn thời gian xử lý một cách không cần thiết.
Cấu trúc phân tầng (Cascade of Classifiers) được xây dựng chính là nhằm
rút ngắn thời gian xử lý, giảm thiếu nhận dạng làm (false alarm) cho bộ phân
loại. Cascade tree gồm nhiều stage (hay còn gọi là Layer), mỗi stage của cây
sẽ là một stage classifier. Một mẫu để được phân loại là đối tượng thì nó cần
phải đi qua hết tất cả các stages của cây. Các stage classifiers ở stage sau được
huấn luyện bằng những mẫu không có đối tượng (negative) mà stage classifier
trước nó nhận dạng sau, tức là nó sẽ tập trung học từ các mẫu nền khó hơn, do
đó sự kết hợp các stage classifiers này lại sẽ giúp bộ phân loại các false alarm
thấp. Với cấu trúc này, những mẫu nền dễ nhận diện sẽ bị loại ngay từ những
stages đầu tiên, giúp đáp ứng tốt nhất đối với độ phức tạp gia tang của các mẫu
đưa vào, đồng thời giúp rút ngắn thời gian xử lý.

15
 Minh họa thuật toán Cascade training:

Hình 1.9: Cấu trúc phân tầng với N giai đoạn


Hình trên minh họa huấn luyện của một tầng (cascade) gồm N giai đoạn
(stage). Ở mỗi giai đoạn, bộ phân lớp yếu tương ứng sẽ được huấn luyện sao
cho độ chính xác của nó là h và false alarm bằng f (tỷ lệ nhận dạng lầm)
 Thuật toán Cascade training:
1. Gọi:
F là giá trị false alarm
d là độ chính xác của weak classifier ở mỗi stage
𝑭𝒕𝒂𝒓𝒈𝒆𝒕 Giá trị max false alarm
P, N là số lượng mẫu positive và negetive
𝑷𝒊 , 𝑵𝒊 là tập positive và negative cho bộ phân lớp ở tầng thứ i.
𝑭𝒊 , 𝑫𝒊 Giá trị false alarm và độ chính xác của cascade trước khi đến
tầng thứ i.
2. Khởi tạo i=0 ; 𝐹0 =1 ; 𝐷0 =1.0
3. Lặp: while 𝑭𝒊 > 𝑭𝒕𝒂𝒓𝒈𝒆𝒕
 i= i+1;
 Huấn luyện bộ phân loại 𝒉𝒊 từ tập 𝑷𝒊 và 𝑵𝒊 với detection rate d và max
false alarm f. Thêm 𝒉𝒊 vào cây phân lớp.
 Dùng cây phân lớp hiện có để tính 𝑭𝒊 . Duyệt qua N mẫu negative cho
đến khi nào tìm đủ n mẫu mà cây phân lớp hiện có phân loại sai.
𝒏
(𝑭𝒊 = )
𝑵
 N:= ∅
 Nếu 𝑭𝒊 > 𝑭𝒕𝒂𝒓𝒈𝒆𝒕
16
N = { số mẫu sai ở stage hiện tại phân loại sai }

1.2.4. Adaboost
1.2.4.1. Tổng quan về Adaboost
Với hướng tiếp cận dựa trên diện mạo chính là cách mà chúng ta cho dữ
liệu học theo Adaboost, Viola và Jones đã dùng Adaboost kết hợp với cascade
để xác định đối tượng, mà cụ thể là khuôn mặt người với việc sử dụng trích
các đặc trưng dạng Haar - Like. Có được tốc độ xử lý nhanh và tỷ lệ chính xác
hơn 80% trên ảnh xám.
Adaboost, thuật toán máy học được phát triển dựa trên nền tảng thuật toán
máy học Boosting.
1.2.4.2. Sơ lược Boosting
Kearns người đã khơi nguồn cho giải thuật Boosting với câu hỏi nổi tiếng:
“Liệu có thể tạo ra một bộ phân lớp mạnh hơn từ một tập các bộ phân lớp
yếu ’’. Năm 1990, Robert Schapire đưa ra thuật toán boosting đầu tiên. Sau đó
được phát triển, áp dụng, kiểm nghiệm vào những năm 1993 trong các chương
trình nhận dạng do Drucker, Schapire và Simard thực hiện.Yoav Freund đã
cùng Robert Schapire tiếp tục nghiên cứu và phát triển, và đến năm 1995 thì
ông cùng với Schapire phát triển boosting thành Adaboost.
Dựa vào câu nói của Kearns đã cho ta có thể biết được nguyên lý hoạt động
cơ bản của Boosting là sự kết hợp bộ phân lớp yếu (weak classifier) thành một
phân lớp mạnh hơn (strong classifier).Với những gì mà Freund và Schapire đã
phát triển thì bộ phân lớp yếu chỉ cần có độ chính xác trên 50% là có thể áp
dụng “boost’ được.
Để hiểu cách hoạt động của thuật toán Boosting, ta xét một bài toán phân
loại 2 lớp (mẫu cần nhận dạng chỉ thuộc một trong hai lớp) với D là tập huấn
luyện gồm có n mẫu.Trước tiên, chúng ta sẽ chọn ngẫu nhiên ra n1 mẫu từ tập
D (n1 < n) để tạo tập D1. Sau đó, chúng ta sẽ xây dựng weak classifier đầu
tiên C1 từ tập D1. Tiếp theo, chúng ta xây dựng tập D2 để huấn luyện bộ phân
loại C2. D2 sẽ được xây dựng sao cho một nửa số mẫu của nó được phân loại
đúng bởi C1 và nửa còn lại bị phân loại sai bởi C1. Bằng các này, D2 chứa
đựng những thông tin bổ sung cho C1. Bây giờ chúng ta sẽ xây huấn luyện C2
từ D2.
Tiếp theo, chúng ta sẽ xây dựng tập D3 từ những mẫu không được phân
loại tốt bởi sự kết hợp giữa C1 và C2: những mẫu còn lại trong D màC1 và C2

17
cho kết quả khác nhau. Như vậy, D3 sẽ gồm những mẫu mà C1 và C2 hoạt
động không hiệu quả. Sau cùng, chúng ta sẽ huấn luyện bộ phân loại C3 từ
D3.
Bây giờ chúng ta có một strong classifier: sự kết hợp C1, C2 và C3. Khi
tiến hành nhận dạng một mẫu X, kết quả sẽ được quyết định bởi sự thỏa thuận
của 3 bộ C1, C2 và C3: nếu cả C1 và C2 đều phân X vào cùng một lớp thì lớp
này chính là kết quả phân loại của X; ngược lại nếu C1 và C2 phân X vào 2
lớp khác nhau, C3 sẽ quyết định X thuộc về lớp nào.

Hình 1.10: Kỹ thuật Boosting


1.2.4.3. Kỹ thuật Adaboost – Nhận dạng đối tượng
Adaboost (Adaptive Boost) là một bộ phân loại mạnh phi tuyến phức dựa
trên hướng tiếp cận boosting được Freund và Schapire đưa ra vào năm 1995.
Adaboost hoạt động trên nguyên tắc kết hợp tuyến tính các phân lớp yếu (weak
classifier) dựa trên dữ liệu đầu vào là các đặc trưng Haar - Like đề hình thành
một phân lớp mạnh hơn (strong classifier).
Adaboost thực hiện sử dụng một trọng số (weight) để dánh dấu các mẫu
khó nhận dạng khi kết hợp các bộ phân lớp yếu.Trong quá trình huấn luyện,
18
cứ mỗi phân lớp yếu (weak classifier) được xây dựng thì thuật toán sẽ tiến
hành cập nhật lại trọng số để chuẩn bị cho việc xây dựng phân lớp yếu (weak
classifier) tiếp theo. Theo nguyên tắc “tăng trọng số của các mẫu bị nhận
dạng sai và giảm trọng số của các mẫu được nhận dạng đúng bởi phân
lớp yếu vừa xây dựng ”. Bằng cách này, phân lớp yếu sau có thể tập trung
vào các mẫu mà các phân lớp yếu trước đó chưa thực hiện tốt. Sau cùng, các
phân lớp yếu sẽ được kết hợp tùy theo mức độ “tốt” của chúng để tạo nên một
phân lớp mạnh hơn.

Hình 1.11: Nguyên tắc Adaboost


Ý tưởng chính của Boosting là thực hiện lặp lại nhiều lần quá trình học của
bộ phân lớp yếu nghĩa là tập trung học lại các phần tử bị phân lớp sai. Tại mỗi
giai đoạn (stages) của Cascade of Boosted Classifiers được huấn luyện là một
Adaboost

1 𝑛ế𝑢 𝑝𝑘 𝑓𝑘 (𝑥) < 𝑝𝑘 𝜃𝑘


Các weak classifiers ℎ𝑘 (x) ={
𝑜 𝑛ế𝑢 𝑛𝑔ượ𝑐 𝑙ạ𝑖
Trong đó:
X mẫu hay cửa sổ con cần xét (X= (𝑥1, 𝑥2 , … . , 𝑥𝑛) là vector đặc trưng của
mẫu).
𝜃𝑘 ngưỡng (𝜃 = teta);
𝑓𝑘 giá trị của đặc trưng Haar - Like
𝑝𝑘 hệ số quyết định chiều của bất phương trình (a parity indicating the
direction of the inequality sign).
Bộ phân lớp mạnh ℎ𝑚ạ𝑛ℎ (𝑥) được tạo ra bằng cách kết hợp tuyến tính N bộ
phân loại. Vấn đề cốt lõi là thực hiện chọn các trọng số ∝1 , … . , ∝𝑛 thích hợp.

19
𝑦ế𝑢
ℎ𝑚ạ𝑛ℎ (𝑥)= sign∑𝑁
𝑘=1 𝑎𝑘 . ℎ𝑘 (𝑥)

Công thức trên có thể diễn giải như sau: Nếu giá trị đặc trưng của mẫu cho
bởi hàm đánh giá của bộ phân loại vượt qua một ngưỡng 𝜽 cho trước thì mẫu
đấy là đối tượng (gọi là object: đối tượng cần nhận dạng), ngược lại thì mẫu là
background (không phải đối tượng).
Ví dụ sau 3 lần lặp

Hình 1.12: Kỹ thuật Adaboost


Thuật toán Adaboost
1. Cho một tập gầm n mẫu có đánh dấu (𝑥1 , 𝑦1 ), (𝑥2 , 𝑦2 ), … . , (𝑥𝑛 , 𝑦𝑛 ) với
𝑥𝑘 ∈ (𝑥𝑘1 , 𝑥𝑘2 , … , 𝑥𝑘𝑚 ) là vector đặc trưng và 𝑦𝑘 ∈ (−1,1) là nhẵn của mẫu
(1 ứng với Object, -1 ứng với background).
2. Khởi tạo trọng số ban đầu cho tất cả các mẫu: với m là mẫu số đúng
(ứng với object và y=1) và l là số mẫu sai (ứng với background và y= -1).
20
1 1
W1,k = ,
2m 2l
3. Xây dựng T weak classifiers.
Lặp t = 1,…,T
 Với mỗi đặc trưng trong vector đặc trưng, xây dựng một weak
classifier ℎ𝑗 với ngưỡng 𝜃𝑗 và lỗi 𝜀𝑗 .
𝑘

𝜀𝑗 = ∑ 𝑊𝑡,𝑘 |ℎ𝑗 (𝑥𝑘 ) − 𝑦𝑘 |


𝑛
 Chọn ra ℎ𝑗 với 𝜀𝑗 nhỏ nhất, ta được ℎ𝑡 :
ℎ𝑡 : 𝑋 → {1, −1}
 Cập nhật lại trọng số
𝑊𝑡 𝑒 −𝛼𝑡 , ℎ𝑡 (𝑥𝑘 ) = 𝑦𝑘
𝑊𝑡+1,𝑘 = 𝑋 { 𝛼𝑡
𝑍𝑡 𝑒 , ℎ𝑡 (𝑥𝑘 ) ≠ 𝑦𝑘
Trong đó:
1 1 − 𝜀𝑗
𝛼𝑡 = ln( )
2 𝜀𝑗
𝑍𝑡 : Hệ số dùng để đưa 𝑊𝑡+1về đoạn [0,1] (normalization facetor)
4. Strong classifier được xây dựng:
𝑇

H(x) = dấu (∑ 𝛼𝑡 ℎ𝑡 (𝑥 ))
𝑡=1

21
Hình 1.13: Sơ đồ khối huấn luyện nhận dạng đối tượng
Quá trình huấn luyện bộ phân loại được thực hiện bằng một vòng lặp mà ở
mỗi bước lặp, thuật toán sẽ chọn ra weak classifier ℎ𝑡 thực hiện việc phân loại
với lỗi 𝜀𝑡 nhỏ nhất (do đó sẽ là bộ phân loại tốt nhất) để bổ sung vào trong
Classifire. Mỗi khi chọn được một bộ phân loại ℎ𝑡 , Adaboost sẽ tính giá trị 𝛼𝑡
theo công thức , 𝛼𝑡 cũng được chọn trên nguyên tắc làm giảm thiểu giá trị lỗi
𝜀𝑡 .
Hệ số 𝛼𝑡 nói lên mức độ của bộ phân loại H(x):

H(x) = dấu( ∑𝑇𝑡=1 𝛼𝑡 ℎ𝑡 (𝑥))


Tất cả bộ phân loại ℎ𝑡 đều có đóng góp vào kết quả của bộ phân loại H(x),
và mức độ đóng góp của chúng phụ thuộc vào giá trị 𝛼𝑡 tương ứng: ℎ𝑡 với 𝛼𝑡
càng lớn thì nó càng có vai trò quan trọng trong H(x).
Trong công thức tính 𝛼𝑡
1 1− 𝜀𝑗
𝛼𝑡 = ln ( )
2 𝜀𝑗

Giá trị 𝛼𝑡 tỉ lệ nghịch với 𝜀𝑡 . Bởi vì ℎ𝑡 được chọn với tiêu chí đạt 𝜀𝑡 nhỏ nhất,
do đó nó sẽ đảm bảo giá trị 𝛼𝑡 là lớn nhất.

22
Sau khi tính được 𝛼𝑡 , Adaboost tiến hành cập nhật lại trọng số các mẫu:
tăng trọng số các mẫu mà ℎ𝑡 phân loại sai, giảm trọng số các mẫu mà ℎ𝑡 phân
loại đúng. Bằng cách này, tọng số của mẫu phản ánh được mức độ khó nhận
dạng của mẫu đó và ℎ𝑡+1 sẽ ưu tiên học cách phân loại những mẫu này.

Hình 1.14: Ưu tiên trọng số lớn đê phân hoạch


Vòng lặp xây dựng strong classifier sẽ dừng lại sau T lần lặp. Trong thực
tế cài đặt (thư viện OpenCV của Intel), người ta sử dụng giá trị T vì không có
công thức nào đảm bảo tính được giá trị T tối ưu cho quá trình huấn luyện.
Thay vào đó, người ta sử dụng giá trị max false positive hay max alarm (tỉ lệ
nhận dạng sai tối đa các mẫu background). Tỉ lệ này của bộ phân loại cần xây
dựng không được phép vượt quá giá trị này. Khi đó, qua các lần lặp, false
alarm của strong classifier 𝐻𝑡 (𝑥) xây dựng được (tại lần lặp thứ t) sẽ giảm
dần, và vòng lặp kết thúc khi tỉ lệ thuận thấp hơn max false alarm.

23
Phương pháp Adaboost (Adaptive boost): là một cải tiến của hướng tiếp
cận boosting, sử dụng khái niệm trọng số (weight) để đánh dấu các mẫu khó
nhận dạng trong quá trình huấn luyện, mẫu càng khó trọng số càng cao.
- Kết hợp huấn luyện Adaboost và Phân tầng Cascade of Boosted
Classifires với các đặc trưng được trích từ Haar - Like

Hình 1.15: Adaboost va Cascade of Boosted Classifier

24
1.3. Định vị đối tượng
Mô hình dò tìm đối tượng

Hình 1.16: Dò tìm đối tượng với Haar - Like Features- Cascade of Boosted
Classifier

Sơ đồ trên, từ ảnh gốc tính nhanh giá trị của đặc trưng Haar - Like nhờ vào
phân tích ảnh (Integral Image), kết quả tính được sẽ được đưa qua bộ điều
chỉnh Adaboost để loại bỏ bớt các đặc trưng không cần thiết nhằm làm giảm
số lượng các đặc trưng. Các đặc trưng còn lại (các đặc trưng được chọn) sẽ
được đưa qua bộ phân lớp để quyết định xem có phải mặt người hay không.
Cấu trúc Cascade đạt tốc độ nhận dạng nhanh chính là nhờ sớm loại bỏ
được các mẫu sai (Background) đơn giản (thường có số lượng lớn hơn nhiều
so với các mẫu đúng (object) – các mẫu chứa khuôn mặt cần tiến hành động
25
dạng). Bên cạnh đó, hệ thống của Viola và Jones cũng đạt được độ chính xác
khá cao nhờ vào thuật toán cascade training, các bộ nhận dạng được huấn
luyện bằng Adaboost với đặc trưng Haar - Like mô tả tốt thông tin đối tượng,
cùng với các tính tích phân ảnh (Integral Image) tính nhanh các đặc trưng,
không làm giảm tốc độ nhận dạng của hệ thống.
Như vậy, mô hình Haar - Like Features – Cascade of Boosted Classifires
thật sự là một cách tiếp cận tốt cả về tốc độ lẫn khả năng nhận dạng, phù hợp
với bài toán định vị mặt người.
1.4. Tổng quan về thư viện OpenCV
1.4.1. Tổng quan
OpenCV (Open Soure Computer Vision Library) là thư viện mã nguồn mở
về thị giác máy tính và ngôn ngữ máy học của Intel. Được giới thiệu tháng 01
năm 1999 và đến năm 2006 phiên bản 1.0 được ra đời.

Hình 1.17: Thư viện OpenCV


Gói thư viện gồm hơn 500 hàm và trên 2500 thuật toán tối ưu được viết bằng
ngôn ngữ C/C++, python tương thích với các hệ điều hành Windows, Linux,
Android,… Các thuật toán này có thể được sử dụng và phát hiện, nhận dạng khuôn
mặt, theo dõi chuyển động con người tiếp cận xây dựng ứng dụng một cách nhanh
chóng và nâng cao hiệu quả tính toán. Từ lúc ra đời đến nay OpenCV đã thu hút
rất nhiều nhà nghiên cứu phát triển, trong đó có các công ty lớn như: Google,
Yahoo, Microsoft, IBM, Sony,… và nhiều cộng đồng mạng được thành lập cho
việc tham khảo và tra cứu.
Rất nhiều phiên bản ra đời góp phần to lớn vào công cuộc phát triển của cộng
đồng thị giác máy tính. Những phiên bản sai này được bổ sung nhiều hơn các giải
26
thuật đáp ứng như cầu thực tại, phiên bản 3.0 RC1 được phát hành 24-4-2005 là
phiên bản mới nhất, hỗ trợ trên Windows, Linux/ Mac và iOS.

Hình 1.18: Lịch sử các phiên bản OpenCV


1.4.2. Cấu trúc và ứng dụng của OpenCV
Cấu trúc của OpenCV gồm có 5 phần chính:

Hình 1.19: Cấu trúc cơ bản của OpenCV


Trong đó:
- Phần CV & CVAUX bao gồm các thư viện cơ bản về xử lý hình ảnh
và các giải thuật máy tính. Phần này sẽ thực hiện hỗ trợ các chức năng cấp cao
(nhận dạng đối tượng, hiệu chỉnh Camera/ Webcam), xử lý, phân tích các
chuyển động. Trong đó thì nội dụng CV sẽ là các phương thức, hàm xử đã ổn
định, còn CVAUX sẽ gồm các chức năng thử nghiệm để đưa vào phiên bản kế
tiếp. Phần CVAUX này bao gồm các thư viện cho việc phát hiện, theo dõi và
nhận dạng đối tượng (khuôn mặt, mắt, …)

27
- Phần MLL là bộ thư viện về các thuật toán học máy, bao gồm nhiều bộ
phân cụm và phân loại thống kê.
- Phần HighGUI chứa đựng những thủ tục vào ra, các chức năng về lưu
trữ cũng như đọc các file ảnh và video.
- Phần CxCore dùng để tổ chức dữ liệu cơ sở, thực hiện các thuật toán
(các phép tính – các phép tính ma trận , hỗ trợ tài liệu XML, các thao tác cơ
bản, vẽ, chú thích.
- Phần cuối cùng IPP là module thương mại cung cấp các đoạn mã mở
rộng đã được tối ưu hóa cho các phần cứng của Intels giúp tăng tốc trong xử
lý các ứng dụng lớn.
Đi kèm gói thư viện là tài liệu hướng dẫn thể hiện các chức năng của
OpenCV, các chức năng tập trung vào thu nhập, xử lý ảnh và các thuật toán
phân tích dữ liệu ảnh bào gồm:
 Truy xuất ảnh và phim: đọc ảnh số từ camera, từ file, ghi ảnh và phim;
 Cấu trúc dữ liệu ảnh số và các dữ liệu hỗ trợ cần thiết: ma trận,
vector, chuỗi, xâu và cây.
 Xử lý ảnh căn bản: tìm viền, nhận chuyện động, thay đổi trong không
gian 3D, đối chiếu bản mẫu, xấp xỉ các đơn vị hình học cơ sở- mặt phẳng, đa
giác, ellipse, đường thẳng.
 Phân tích dữ liệu ảnh: nhận dạng đối tượng- thực tế, theo dõi các chi
tiết và phân tích chuyển động.
 Tạo giao diện đơn giản: hiện thị ảnh, thao tác bàn phím, chuột, thanh
trượt để chỉnh thông số (nếu cần thiết các bạn có thể tự tạo thêm các phím điều
khiển thông qua thao tác chuột, hoặc tích hợp thêm các thư viện về giao diện
như wxWidgets).
 Chức năng vẽ, chú thích lên ảnh: chức năng này thường áp dụng cho
các bài toán nhận dạng người trong ảnh. Hiện nay thấy rõ nhất là các chức
năng trên ứng dụng mạng xã hội Facebook.

28
Hình 1.20: Các khía cạnh và ứng dụng của OpenCV

Hình trên cho thấy một vài ví dụ về ứng dụng của OpenCV như nhận dạng
khuôn mặt, nhận dạng viền, nhận dạng biên.
1.4.3. Những đặc trưng của OpenCV
OpenCV có rất nhiều chức năng. Sau đây là những tóm tắt cơ bản về hệ
thống chức năng của các hàm trong OpenCV
 Image và Video I/O: giúp người dùng đọc dược dữ liệu ảnh từ tập tin
hoặc trực tiếp từ video. Người dùng cũng có thể tạo các tập tin ảnh và video.
 Thị giác máy tính và các thuật toán xử lý ảnh: cho phép thao tác với
nhiều chuẩn thị giác máy mà không cần có mã nguồn của chúng.
 Module thị giác máy ở cấp độ cao: OpenCV thêm vào nhận dạng
khuôn mặt, dò tìm, theo dõi. Nó bao gồm luồng thị giác, kích cỡ camera và âm
thanh nổi.
 Trí tuệ nhân tạo và máy học: các ứng dụng của thị giác máy thường
yêu cầu phải học máy hoặc các hình thức trí tuệ nhân tạo khác. Một vài trong
số chúng là có sẵn trong gói OpenCV.
 Lấy mẫu ảnh và phép biến đổi: Thường rất tốt cho quá trình xử lý một
nhóm phần tử ảnh như một đơn vị. OpenCV bao gồm lấy tách ra, lấy ngẫu
nhiên, phục chế, xoay ảnh, làm cong ảnh (warping), thay đổi hiệu ứng của ảnh.
 Cách thức tạo và phân tích ảnh nhị phân: ảnh nhị phân thường xuyên
được dùng trong các hệ thống kiểm tra có khuyết điểm hình dạng hoặc các bộ
phận quan trọng. Sự biểu diễn ảnh cũng rất thuận tiện khi biết rõ vật thể cần
bắt.
29
 Cách thức cho tính toán thông tin 3D: những hàm này rất có ích khi
cần sắp xếp va xác định với một khôi lập thể (with a stereo rig) hoặc với không
gian nhìn phức tạp (multiple views) từ một camera riêng.
 Các phép toán cho xử lý ảnh, thị giác máy và biểu diễn ảnh: OpenCV
sử dụng các phép toán phổ biến như: đại số học, thống kê, và tính toán hình
học.
 Đồ họa: giúp người dùng viết chữ và vẽ trên hình ảnh. Thêm vào đó
những chức năng này được sử dụng nhiều trong ghi nhãn và đánh dấu.
 Phương thức GUI: cung cấp những môi tường API đa phương tiện và
đợn giản để hiện thị hình ảnh, cho phép người dùng nhập dữ liệu thông qua
chuột, bàn phím và điều khiển quá trình.
 Cấu trúc dữ liệu và giải thuật: cho phép giữ lại, tìm kiếm, lưu và các
danh mục điều khiển, các tuyển tập (cũng như các tập hợp lệnh được gọi), đồ
họa và sơ đồ nhánh một cách hiệu quả.
 Khả năng tồn tại lâu dài của dữ liệu: cung cấp các phương thức một
cách thuận lợi để lưu trữ các dạng khác nhau của dữ liệu vào đĩa để có thể khôi
phục khi cần thiết.

30
CHƯƠNG II: TỔNG QUAN ĐỀ TÀI
2.1. Đặt vấn đề và phạm vi đề tài
* Đặt vấn đề:
Trong thời kỳ phát triển mạnh mẽ của công nghệ thông tin, con người đang
dần áp dụng các ứng dụng khoa học máy tính để phục vụ các công việc hằng ngày.
Trong đó, những ứng dụng bảo mật an ninh dựa vào hệ thống thị giác máy tính để
thực hiện việc phát hiện, nhận dạng. Hiện nay, các ứng dụng nhận dạng khuôn mặt
được xây dựng và phát triển trên rất nhiều thiết bị cũng như hệ thống nhằm giúp con
người thuận tiện hơn trong việc quản lý, bảo mật, giám sát hoặc tìm kiếm. Các ứng
dụng nhận diện khuôn mặt, nụ cười trong máy ảnh hoặc smartphone dần trở nên quen
thuộc với mọi người.
Nhận thấy sự cần thiết trong nghiên cứu nhằm giúp con người dễ dàng quản
lý và an tâm hơn trong việc bảo vệ tài sản, kèm theo đó là tiền đề cho việc phát triển
và nghiên cứu nâng cao về hệ thống thị giác máy tính, ứng dụng nhận dạng đối tượng.
Đề tài với tên gọi: “Nghiên cứu thư viện OpenCV- Ứng dụng nhận dạng khuôn mặt
người’ được thực hiện với mong muốn khai thác những khía cạnh về phát hiện và
nhận dạng. Có thể nói, đây là hướng nghiên cứu nhằm phục vụ tốt đáp ứng nhu cầu
xã hội hiện nay.
* Phạm vi đề tài:
Đề tài tập trung nghiên cứu gói thư viện mã nguồn mở OpenCV để giải quyết
bài toán quan sát, phát hiện và nhận dạng đối tượng theo thời gian thực bằng đặc
trưng Haar - Like Features – Cascades of Boosted Classifies.
Triển khai nghiên cứu bằng thu nhập hình ảnh, huấn luyện và giải quyết bài
toán thực tế và nhận dạng khuôn mặt với các tác vụ cơ bản như: lưu hoạt động của
đối tượng dưới hình ảnh và video thông qua Webcam.
Thực hiện ứng dụng nhận diện mặt người để điểm danh trong các lớp học
2.2. Phương pháp nghiên cứu
- Nghiên cứu gói thư viện OpenCV- sử dụng ngôn ngữ lập trình Python
- Sử dụng các hàm trong thư viện OpenCV bằng việc kết hợp đặc trưng Haar
- Like với thuật toán Adaboost với mô hình Cascades of Boosted Classifiers để thực
hiện dò tìm đối tượng trên mặt phẳng ảnh theo thời gian để triển khai giải quyết bài
toán đặt ra.

31
2.3. Phương hướng giải quyết
2.3.1. Quy trình của hệ thống

Hình 2.1: Quy trình của hệ thống


Nếu có đối tượng xuất hiện, hệ thống sẽ dò tìm trên hình ảnh thu được và
nhận dạng đối tượng. Xác định đối tượng hệ thống sẽ khoanh vùng, lưu lại ảnh.
2.3.2. Phát hiện nhận dạng đối tượng với đặc trưng Haar – Like
2.3.2.1. Huấn luyện dữ liệu và nhận dạng dữ liệu
Các bước tiến hành huấn luyện dữ liệu
B1: Thu thập ảnh huấn luyện ảnh có đối tượng
B2: Ghi nhận và đánh dấu vị trí của đối tượng trên ảnh
B3: Sử dụng tập tin .xml để thực hiện phân lớp và nhận dạng với hàm
DetectHaarCascade (…).
Mục đích của việc huấn luyện là tệp tin XML để thực hiện nhận dạng –
đây là tập tin quyết định việc nhận dạng như thế nào. Chi tiết các bước
thực hiện trong đề tài nhưu sau:
Bước 1: Thu thập ảnh
Để xác định đối tượng trên ảnh và để huấn luyện bằng đặc trưng Haar –
Like đòi hỏi bước đầu tiên là cần phải thu thập đầy đủ số lượng ảnh cần
thiết.

Hình 2.2 Ảnh thu thập được qua camera


32
Bước 2: Thực hiện ghi nhận các thông số của đối tượng
Để thực hiện được việc nhận dạng trên đối tượng cần lưu lại thông số của
đối tượng trên ảnh, chúng ta chỉ quan tâm tập tin và thống số của đối tượng
được lưu lại trong file .xml

Hình 2.3: Thư mục chứa ảnh và các mục liên quan

Bước 3: Sử dụng tập tin .xml để thực hiện phân lớp và nhận dạng với hàm
DetectHaarCascade (…)

Hình 2.4: Nhận dạng được đối tượng

2.3.3. Hệ thống nhận diện đối tượng với ngôn ngữ Python
2.3.3.1. Giới thiệu về ngôn ngữ Python
Python là một ngôn ngữ lập trình hướng đối tượng, cấp cao, mạnh mẽ, được
tạo ra bởi Guido van Rossum. Nó dễ dàng để tìm hiểu và đang nổi lên như một trong
những ngôn ngữ lập trình nhập môn tốt nhất cho người lần đầu tiên tiếp xúc với ngôn
ngữ lập trình. Python hoàn toàn tạo kiểu động và sử dụng cơ chế cấp phát bộ nhớ tự
33
động. Python có cấu trúc dữ liệu cấp cao mạnh mẽ và cách tiếp cận đơn giản nhưng
hiệu quả đối với lập trình hướng đối tượng. Cú pháp lệnh của Python là điểm cộng
vô cùng lớn vì sự rõ ràng, dễ hiểu và cách gõ linh động làm cho nó nhanh chóng trở
thành một ngôn nhữ lý tưởng để viết Script và phát triển ứng dụng trong nhiều lĩnh
vực, ở hầu hết các nền tảng.
2.3.1.1. Xử lý ảnh bằng Python và OpenCV
Chương trình tạo tập dữ liệu ảnh của người dùng thu được qua camera:
1. import cv2
2. import os
3. def start_capture(name):
4. path = ".\\data\\”+ name
5. num_of_images = 0
6. detector =
cv2.CascadeClassifier(cv2.data.haarcascades
+"haarcascade_frontalface_default.xml")
7. try:
8. os.makedirs(path)
9. except:
10. print('Directory Already Created')
11. vid = cv2.VideoCapture(0)
12. while True:
13. ret, img = vid.read()
14. grayimg = cv2.cvtColor(img,
cv2.COLOR_BGR2GRAY)
15. face =
detector.detectMultiScale(image=grayimg, scaleFactor=1.1,
minNeighbors=5)
16. for x, y, w, h in face:
17. cv2.rectangle(img, (x, y), (x+w, y+h),
(0, 225, 0), 2)
18. cv2.putText(img, "Face Detected", (x, y-
5), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255))
19. cv2.putText(img,
str(str(num_of_images)+”images captured"), (x, y+h+20),
cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255))
20. cv2.imshow("FaceDetection",img)
21. try:
22.
cv2.imwrite(str(path+"/"+str(num_of_images)+name+".jpg")
, grayimg[y:y+h, x:x+w])
23. num_of_images += 1
34
Trước khi phân tích chương trình ta tìm hiểu hàm detectMultiScale là phần tìm
kiếm khuôn mặt, hàm(hay phương thức) này thuộc lớp CascadeClassifier(lớp phụ vụ
tìm kiếm đối tượng của Opencv), hàm có nguyên mẫu với những tham số như sau:

Tham số cascade chính bộ phân lớp đề cập trong phần I, bộ phân lớp này được
lưu vào các file .xml được xây dựng sẵn trên các bộ cơ sở dữ liệu chuẩn. Dưới đây
là một số bộ phân loại trong thư viện Opencv.

Hình 2.5: Một số bộ phân loại trong OpenCV

Như trong bảng khi cần phát hiện các đối tượng khác nhau ta sẽ sử dụng các
bộ phân lớp khác nhau, tức là load các file .xml tương ứng vào chương trình. Opencv
cũng hỗ trợ chúng ta tự xây dựng một bộ phân lớp riêng cho các đối tượng khác bằng

35
hàm cvCreateHidHaarClassifierCascade, chúng ta có thể xây dưng các bộ phân loại
để phát hiện các đối tượng khác như ôtô, chó, mèo….
Quay lại hàm detectMultiScale, tham số tiếp theo là image chính là bức ảnh
cần phát hiện khuôn mặt.
scale_factor là tỉ lệ tăng kích thước của khung cửa sổ tìm kiếm. Ví dụ nếu
scale_factor=1.1 thì sau khi quét hết bức ảnh 1 lần, khung cửa sổ sẽ tăng kich thước
lên 10% và thực hiện lần quét tiếp theo. Tham số này ảnh hưởng đến tốc độ xử lý và
độ tin cậy của chương trình. Nếu để nó quá lớn thì tốc độ chương trình sẽ tăng lên
do số lần quét giảm đi, tuy nhiên có thể chương trình có thể bỏ qua không phát hiện
được một số khuôn mặt có kích thước nằm giữa 2 khung cửa sổ liên tiếp do độ tăng
kích thước của khung là quá lớn. Nếu để nó quá thấp thì ta có thể không bỏ sót bất
kì khuôn mặt nào nhưng chương trình sẽ tốn thời gian hơn vì tăng số lần quét lên.
min_neighbors giá trị tối thiểu số hình chữ nhật lân cận được gộp lại sau khi
quá trình quét đã xong, tham số này sẽ được giải thích rõ hơn trong phần sau.
min_size là kích thước nhỏ nhất của khung cửa sổ phát hiện khuôn mặt, khung
sẽ bắt đầu quét từ kích thước này, mọi khuôn mặt có diện tích vượt qua kích thước
khung này đều không được phát hiện.
Đó những tham số quan trọng của hàm.
Phân tích chương trình:
Dòng 1,2 là phần khai báo chương trình sẽ sử dụng bộ thư viên là OpenCV
phiên bản 2.x và thư viện os phục vụ việc làm với các đường dẫn thư mục.
Dòng 3 là định nghĩa hàm, truyền vào tham số ‘name’
Dòng 4 khai báo đường dẫn thư mục chứa tập ảnh của mỗi người dùng.
Dòng 5 khởi tạo biến đếm số lượng ảnh thu được
Dòng 6 tạo ra đối tượng thuộc lớp Cascade Classifier là face_cascade để tìm
kiếm mặt, đồng thời load file.xml cho đối tượng này.
Dòng 7, 8, 9, 10 tạo đường dẫn đến thư mục, nếu đã tồn tại thư mục in ra câu
thông báo
Dòng 11 truy cập trực tiếp để lấy hình ảnh từ camera
Dòng 13 đọc dữ liệu từ camera, ret trả về giá trị true, img sẽ trả về kết quả hình
ảnh.
Dòng 14 chuyển ảnh đã đọc được về ảnh xám

36
Dòng 15 dùng hàm detectMultiScale để tìm kiếm khuôn mặt trong ảnh xám.
Sau khi tìm kiếm xong sẽ trả về tọa độ gốc của khung chứa khuôn mặt x,y; chiều dài,
chiều rộng của khung w,h
Dòng 16 đến dòng 2 trong khung vừa xác định được vẽ một khung tên đó hiển
thị Face Detected tức là đang trong quá trình xác định khuôn mặt, số lượng ảnh đã
chụp được, hiển thị khung ảnh chụp lên màn hình, lưu lại ảnh đã chụp và tăng biến
đếm số lượng ảnh lên 1 sau khi lưu.
Chương trình train tập dữ liệu ảnh vừa thu được bên trên
1. path = os.path.join(os.getcwd()+"\\data\\"+name+"\\")
2. faces = []
3. ids = []
4. pictures = {}
5. for root,dirs,files in os.walk(path):
6. pictures = files
7. for pic in pictures:
8. imgpath = path+pic
9. img = Image.open(imgpath).convert('L')
10. imageNp = np.array(img, 'uint8')
11. id = int(pic.split(name)[0])
12. faces.append(imageNp)
13. ids.append(id)
14. ids = np.array(ids)
15. clf = cv2.face.LBPHFaceRecognizer_create()
16. clf.train(faces, ids)
17. clf.write("D:\\HocTap\\New folder\\app\\FaceRecognition-
GUI-APP\\data\\"+name+"_classifier.xml")
Phân tích chương trình:
Dòng 1 khai báo đường dẫn thư mục chứa tập ảnh đã lưu
Dòng 2,3,4 khai báo các mảng cần dùng để lưu các giá trị thu đc ở các bước tiếp
theo
Dòng 5,6 duyệt thư mục chứa tập dữ liệu ảnh từ trên xuống dưới , gán mảng
pictures bằng files
Dòng 7 duyệt các phần tử trong mảng pictures
Dòng 8 khai báo đường dẫn cho từng ảnh
Dòng 9 mở từng ảnh và chuyển ảnh về dạng đen trắng
37
Dòng 10 lưu từng ảnh vào mảng sử dụng thư viện numpy , các ảnh sẽ được lưu
dưới dạng byte (-128 đến 127)
Dòng 11 ,12,13 ,14 tạo id và them các giá trị id , imageNp vào các mảng khai
báo ban đầu
Dòng 15 khai báo sử dụng project có sẵn của opencv là face , cụ thể là phương
thức LBPHFaceRecognizer_create()
Dòng 16 bắt tiến hành train với tham số dầu vào là mảng faces và ids thu được
bên trên
Dòng 17 sau khi train xong thì lưu lại kết quả theo đường dẫn truyền vào và với
định dạng file là .xml
Chương trình tiến hành nhận diện khuôn mặt:
1. recognizer.read(f “D:\\HocTap\\New
folder\\app\\FaceRecognition-GUI-
APP\\data\\{name}_classifier.xml”)
2. cap = cv2.VideoCapture(1)
3. while (true)
4. ret, frame = cap.read()
5. gray = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
6. faces =face_cascade.detectMultiScale(gray,1.3,5)
7. for(x,y,w,h) in faces:
8. roi_gray = gray[y:y+h,x=x+w]
9. id,confidence = recognizer.predict(roi_gray)
10. confidence = 100 – int(confidence)
11. if confidence > 50:
12. text = name.upper()
13. font = cv2.FONT-HERSHEY_PLAIN
14. frame = cv2.rectangle(frame,
(x,y),(x+w,y+h),(0,255,0),2)
15. frame = cv2.putText (frame , text, (x,y-4), font ,
1, (0,0,255) ,1,cv2,LINE_AA)
16. else:
17. text = "UnknownFace"
18. font = cv2.FONT_HERSHEY_PLAIN
19. frame = cv2.rectangle(frame, (x, y), (x + w,
y + h), (0, 0, 255), 2)
20. frame = cv2.putText(frame, text, (x, y-4),
font, 1, (0, 0,255), 1, cv2.LINE_AA)
21. cv2.imshow("image", frame)
38
Phân tích chương trình:
Dòng 1 đọc file dữ liệu đã được train
Dòng 2 truy cập trực tiếp để lấy hình ảnh từ camera
Dòng 4 đọc dữ liệu từ camera , ret trả về giá trị true , frame sẽ trả về kết quả hình
ảnh
Dòng 5 chuyển ảnh đã đọc được về ảnh xám
Dòng 6, 7, 8 dùng hàm detectMultiScale để tìm kiếm khuôn mặt trong ảnh xám .
Sauk hi tìm kiếm xong sẽ trả về tọa độ gốc của khung chứa khuôn mặt x ,y ; chiều
dài , chiều rộng của khung w , h . Cấu trúc for ..in sẽ duyệt qua toàn bộ các bộ giá
trị này . Tạo ra biến ảnh xám cho khuôn mặt đã tìm thấy .
Dòng 9 sau khi cắt xong sẽ cho máy nhận diện xem đối tượng trong ảnh là ai , hai
giá trị trả về là id và độ chính xác
Dòng 10 đặt lại giá trị cho độ chính xác
Dòng 11 – 15 kiểm tra giá trị của độ chính xác nếu lớn hơn 50 thì vẽ khung màu
xanh lá quanh khuôn mặt và hiển thị tên in hoa của người được nhận diện
Dòng 16 – 20 ngược lại , nếu giá trị của độ chính xác không thỏa mãn thì kẻ khung
màu đỏ quanh khuôn mặt và hiển thị UnknowFace tức là khong thể nhận diện
khuôn mặt đó là ai .
Dòng 21 hiển thị frame lên màn hình

39
CHƯƠNG III: KẾT QUẢ THỰC NGHIỆM
Các bước tiến hành điểm danh:
 Khi điểm danh cần mở lên ứng dụng:

Hình 3.1: Giao diện ứng dụng


 Khi người dùng chọn chức năng Add a User thì giao diện sẽ hiện thị:

Hình 3.2: Chức năng Add a User


Ở đây cho phép nhập tên của người dùng -> tên sẽ được thêm vào file
Excel.

40
 Sau khi người dùng nhập tên sẽ có 2 lựa chọn:

Hình 3.3: Chức năng trong Add a User


 Khi người dùng chọn Capture Data Set -> hệ thống sẽ xác nhận lấy 300
ảnh vào dữ liệu -> người dùng sẽ chọn OK để thực hiện.

Hình 3.4: Xác nhận thực hiện chức năng quét khuôn mặt

41
 Quá trình hệ thống quét mặt người dùng để đưa vào dữ liệu.

Hình 3.5: Quá trình quét khuôn mặt


 Hệ thống hoàn tất quá trình quét mặt để đưa ảnh vào trong Data

42
Hình 3.6: Lưu trữ ảnh thành công
 Khi người dùng chọn Train The Model -> Hệ thống sẽ tiến hành Train và
đưa ra màn hình thông báo thành công.

Hình 3.7: Quá trình huấn luyện thành công

 Sau khi người dùng đã được lưu vào dữ liệu thì có thể sử dụng chức năng
điểm danh.

43
Hình 3.8: Chức năng Check a User
 Chương trình đưa ra danh sách các tên có trong hệ thống -> người dùng
tiến hành chọn tên -> Chọn Next để tiến hành điểm danh.

Hình 3.9: Chi tiết chức năng Check a User

 Chương trình tiến hành nhận dạng theo tên đã được chọn

Hình 3.10: Quá trình điểm danh

44
 Nếu nhận dạng thành công chương trình sẽ trả ra kết quả trog file Excel

Hình 3.11: Danh sách sau quá trình điểm danh

45
KẾT LUẬN VÀ ĐỊNH HƯỚNG PHÁT TRIỂN
1. Kết luận:
Qua quá trình nghiên cứu, tìm hiểu và thực hiện đề tài, chúng em đã hoàn
thành mục tiêu đặt ra với các kết quả như sau:
 Tìm hiểu quá trình hình thành, cấu trúc, nội dung và các hàm của gói
thư viện mã nguồn mở OpenCV.
 Tìm hiểu bài toán nhận diện khuôn mặt người trên các đặc trưng được
trích xuất trên mặt ảnh phẳng từ những công trình nghiên cứu.
 Nghiên cứu các rút trích đặc trưng để nhận dạng khuôn mặt. Áp dụng
đặc trưng Haar – Like kết hợp thuật toán Adaboost và bộ phân tầng Cascades
of Boosted Classifiers để thực hiện phân tích và nhận dạng đối tượng. Dựa vào
bài toán của Viola – Jones để thực hiện phân tích và nhận dạng mặt người theo
thời gian thực với việc đáp ứng tốt về mặt thời gian nhận dạng nhằm triển khai
hiệu quả cho vài toán điểm danh (ưu điểm về thời gian – tốc độ xử lý ) bởi các
đặc trưng Haar – Like được tính nhanh nhờ phân tích ảnh, thuật toán AdaBoost
giúp chọn ra các đặc trưng và phân loại hiệu quả bằng cách xây dựng bộ phân
loại mạnh dựa trên những bộ phân loại yếu kết hợp mô hình Cascades of
Boosted Classifiers giúp loại bỏ các mẫu đơn giản và rút ngắn thời gian xử lý.
 Thu thập ảnh (300 ảnh có đối tượng) huấn luyện đối đối tượng nhằm
xuất ra tập tin xml phục vụ cho việc nhận dạng đối tượng.
2. Hướmg phát triển:
 Hệ thống cần được triển khai trên Camera thực có độ phân giải tốt hơn và
môi trường phù hợp. Cần tích hợp độ sáng và bao phủ với vị trí phù hợp để
phát hiện đối tượng theo diện rộng.
 Hệ thống cần tăng cường yếu tố về mặt lưu trữ nhằm giúp ghi nhận thông
tin được nhiều hơn.
 Hệ thống có thể triển khai trên nên Web nhằm giúp người dùng có thể xem
và nâng cao tính năng bảo mật từ xa.
 Hệ thống có thể được triển khai trên Robot nhằm giải quyết bài toán chống
trộm với các sản phẩm tại siêu thị và các nơi chuyên dụng.

46
TÀI LIỆU THAM KHẢO
1. https://docs.opencv.org/master/df/d25/classcv_1_1face_1_1LBPHFaceRecog
nizer.html
2. https://pandas.pydata.org/docs/user_guide/io.html#io-excel-writer
3. https://thigiacmaytinh.com/cau-truc-opencv/
4. Phát hiện khuôn mặt với thuật toán Adaboost – Nguyễn Trí Thành
5. Nghiên cứu thư viện Opencv ứng dụng nhận dạng khuôn mặt người – Nguyễn
Hoàng Phúc
6. https://docs.python.org/3/library/tkinter.html

47

You might also like