Face Mask Detection, thư viện được sử dụng sẽ là OpenCV. Chương trình được sử dụng với mục tiêu nhận diện những người xuất hiện trong khung hình camera có tích hợp nhận diện đang có hay không đeo khẩu trang. Qua đó cũng góp một phần vào công cuộc phòng chống dịch Covid19.
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN TỬ - VIỄN THÔNG
ĐỒ ÁN I FACE MASK DETECTION USING OPENCV
Nhóm sinh viên thực hiện: Giảng viên hướng dẫn:
Trần Thái Sơn – 20187148 TS Võ Lê Cường
Phạm Thành An - 20187114
Đào Lê Hải - 20187126
Bùi Minh Tiến - 20187497
Hà Nội, 6-2021
Trang 2LỜI NÓI ĐẦU
Trong vòng hơn 1 năm vừa qua, tình hình đại dịch Covid 19 diễn ra cực kỳphức tạp trên toàn thế giới, tính đến thời điểm hiện tại là giữa năm 2021, mọi chuyệnvẫn đã có phần tiến triển hơn khi thế giới đã điều chế được ra Vaccine cho virus Sars-Cov-2 Tuy nhiên, dù như vậy việc tuân thủ các quy tắc phòng dịch vẫn là rất quantrọng và không thể lơ là, dễ thực hiện nhất đó chính là việc đeo khẩu trang
Do vậy nhóm 3 chúng em quyết định thực hiện đồ án với chủ đề Face MaskDetection, thư viện được sử dụng sẽ là OpenCV Chương trình được sử dụng với mụctiêu nhận diện những người xuất hiện trong khung hình camera có tích hợp nhận diệnđang có hay không đeo khẩu trang Qua đó cũng góp một phần vào công cuộc phòngchống dịch Covid-19 Song song với chủ đề Face Mask Detection, chúng em cùngnhau học OpenCV và thực hành đánh giá độ chính xác đếm
Chúng em xin chân thành cảm ơn thầy Võ Lê Cường và các anh, chị ở AICSLab đã hướng dẫn chúng em trong quá trình hoàn thiện đồ án!
Trang 3LỜI CAM ĐOAN
Tôi là Trần Thái Sơn, mã số sinh viên 20187148, sinh viên lớp ET-LUH17, khóa 63.Người hướng dẫn là TS Võ Lê Cường Đại diện cho toàn bộ thành viên nhóm, tôi xin
cam đoan toàn bộ nội dung được trình bày trong đồ án Face Mask Detection Using
OpenCV là kết quả quá trình tìm hiểu và nghiên cứu của nhóm chúng tôi Các thông
tin được ghi trong bài là thành quả tìm hiểu của nhóm chúng tôi, đã được thực hànhtrong thực tế Mọi thông tin trích dẫn, các tài liệu tham khảo được liệt kê rõ ràng Tôixin chịu hoàn toàn trách nhiệm với những nội dung được viết trong đồ án này
Hà Nội, ngày 17 tháng 06 năm 2021
Người cam đoan
Trần Thái Sơn
Trang 4TÓM TẮT ĐỒ ÁN
Về tổng quan, đồ án gồm 3 phần:
Chương 1: Tìm hiểu về OpenCV
Trước hết, để sử dụng được thư viện OpenCV thì chúng ta cần hiểu về nó trước Ngônngữ sử dụng sẽ là Python và C++ Trong đó C++ sẽ sử dụng ở bước tìm hiểu, Python
sẽ được sử dụng trong chương 2
Chương 2: Tìm hiểu và triển khai Face Mask Detection
Trong chương này chúng ta sẽ tìm hiều một chương trình Face Mask Detection gồmnhững gì, cách triển khai và kết quả thu được từ chương trình
Chương 3 Đánh giá và kết luận
Chương cuối dùng để đánh giá, nhận xét về những gì nhóm đã làm và chưa làm đượccũng như là đánh giá của nhóm trưởng về đóng góp của mõi thành viên
Bảng phân công nhiệm vụ:
Trang 5Mục lục
NỘI DUNG CHÍNH Chương 1: Tìm hiểu OpenCV
1 Tìm hiểu chung.
1.1 OpenCV là gì?
OpenCV viết tắt của Open Source Computer Vision được xem là một trong những thư viện mã nguồn mở hàng đầu cho việc xử lý ảnh theo thời gian thực Chính thức ra mắt vào năm 1999 tại Intel bời Gary Bradsky, được phát hành theo giấy phép BSD nên OpenCV là nền tảng miễn phí cho cả học thuật và thương mại OpenCV hỗ trợ các ngôn ngữ phổ biến như C++, C, Python, Java Ngoài ra nó còn hỗ trợ đa nền tảng gồm Windows, Linux, Mac OS, IOS hay Android
Về bản chất, OpenCV được viết bằng cách tối ưu hóa C/C++ tích hợp OpenCL, thư viện có thể tận dụng lợi thế của xử lý đa lõi Thư viện của OpenCV chứa hơn 2500 thuật toán được tối ưu hóa OpenCV được sử dụng rộng rãi trên toàn thế giới, có phạm vi sử dụng trải dài trên nhiều lĩnh vực từ nghệ thuật, tương tác, cho đến lĩnh vực khai thác mỏ, bản đồ trên web hoặc côngnghệ robot
1.2 Các tính năng có trong thư viện OpenCV
Thư viện OpenCV có những tính năng nổi bật như sau :
Trang 6- Giúp xử lý cũng như hiển thị hình ảnh , video, Input hay Output (highgui, coremimgproc)
- Hỗ trợ 2D hay 3D
- Có thể phát hiện ra các vật thể như Object, feature 2D,…
- Nhận diện cử chỉ, khuôn mặt, hành vi
- Tương tác giữa con người và máy tính
- Điều khiển robot
- Hỗ trợ thực tế tăng cường
1.3 Ứng dụng của OpenCV trong thực tế
Là 1 thư viện có tính ứng dụng cao, và thế giới đang bước vào cuộc cách mạngcông nghiệp 4.0, thời điểm trí tuệ nhân tạo được tích hợp vào thực tiễn cuộc sống rấtnhiều, trên thực tế, một số ứng dụng của OpenCV có thể kể đến như:
- Kiểm tra và giám sát tự động
- Robot và xe hơi tự lái
- Phân tích hình ảnh y học
- Tìm kiếm và phục hồi hình ảnh/video
- Phim, game – cấu trúc 3D từ chuyển động
- Nghệ thuật sắp đặt tương tác
1.4 Các module phổ biến trong OpenCV
Trong OpenCV có các cấu trúc module khác nhau và nó bao gồm cả một số thưviện liên kết tĩnh hoặc động (Static Library/Dynamic Library) Một số module phổbiến nhất có thể kể đến như:
- Core (Core functional): được biết đến là một module nhỏ gon, giúp xác địnhcác cấu trúc dữ liệu cơ bản nhất và nó bao gồm cả các mảng đa chiều dày đặc, cácchức năng cơ bản
- Imgproc (Image Processcing): module có chức năng xử lý hình ảnh gồm cólọc hình ảnh tuyến tính, phi tuyến tính, cho phép biến đổi về hình học như chỉnh size,warping, affining, … đồng thời module này có thể chuyển đổi không gian màu, biểu
đồ
- Video (Video Analysis): Module cho phép phân tích các video có tính năng
Trang 7- Cali 3D (Camera Calibration and 3D Reconstruction): thuật toán hình học đachiều cơ bản nhất, có thể hiệu chuẩn máy ảnh single hay stereo cũng như dự đoánđược các đối tượng như âm thanh nổi, các yếu tố giúp tái tạo 3D
- Feature 2D (2D feature framework): module giúp phát hiện được các tínhnăng nổi bật nhất trong bộ nhận diện, thông số đối nghịch hay bộ truy suất thông số
- Objdetect (Object detection): Module giúp phát hiện ra đối tượng, đồng thời
mô phỏng cho các class đã được định sẵn như là con người, khuôn mặt, xe hơi, chó,mèo, …
- Videoio (Video I/O): giao diện sử dụng nhằm thu, mã hóa các video trongOpenCV
- Highgui (high – level GUI): giao diện sử dụng nhằm thực hiện quá trình giaotiếp UI trong OpenCV
2 Những kiến thức OpenCV quan trọng.
2.1 2D Features framework
2.1.1 Feature matching with FLANN
Mục đích: Tìm ra các điểm giống nhau giữa 2 hình ảnh cho trước qua việc
so sánh và khớp các keypoint sử dụng khảng cách euclid (đoạn thẳng nối 2
điểm với nhau trong không gian )
Phương pháp:
• B1: xác định các keypoint và tính toán descriptor để so sánh ( SURF
detection )
Chọn vùng hình chữ nhật của hình ảnh xung quanh keypoint Kích thước
chính xác của vùng được xác định trong giai đoạn phát hiện keypoint,
thường là phương pháp Fast Hessian
Trang 8Sau đó chúng ta lặp lại từng keypoint được phát hiện và chia vùng keypoint
Trang 9• B2: với 2 bộ descriptor áp dụng FLANN để tính toán ra những cặp
có khoảng cách euclid bé nhất ( hay những cặp giống nhau nhất ) và
lọc lấy những cặp phù hợp nhất
• B3: từ các cặp trên vẽ đường nối các cặp điểm và hiển thị ra
- Thực hành:
Trang 10Đọc ảnh đầu vào và chuyển sang ảnh xám
minHessian: ngưỡng cho bộ dò keypoint trong SURF
detectAndCompute: input image, array (ma trận lọc ), bộ keypoint và
descriptor
knnMatch: gồm các bộ mô tả, các cặp keypoint thỏa mãn và hệ số k để đếm
các cặp keypoint thỏa mãn trong descriptor
Lọc ra các cặp điểm thỏa mãn tốt nhất bằng cách so sánh khoảng cách
euclid bé hơn ngưỡng đã đặt bên trên
Trang 11Nối các cặp điểm
drawMatches(): gồm 2 ảnh và bộ keypoint của chúng, những cặp điểm đã
tìm đưuọc output, màu hiển thị các cặp điểm, các điểm, bộ lọc hiển thị
những điểm được lọc và cờ lệnh (không vẽ các điểm đơn)
Kết quả
2.1.2 Features 2D + Homography to find a known object
( Gần tương tự feature matching with FLANN )
Sau khi vẽ các cặp điểm ra ta thực hiện tính ma trận Homography, ma trận
này thể hiện mối quan hệ không gian của hai ảnh Ta sử dụng ma trận
Homography để nắn ảnh 2 về không gian ảnh 1 Lúc này hai ảnh sẽ nằm
trên cùng một mặt phẳng
Trang 12Xác định 4 điểm của vật thể
Kẻ đường thẳng nối 4 điểm đó
line: input, điểm đầu đoạn thẳng, điểm cuối đoạn thẳng, màu, độ dày
Kết quả:
2.1.3 Creating your own corner detector
Mục tiêu
- Tìm eigenvalues (giá trị riêng) và eigenvectors (véc-tơ riêng)
=> xác định xem 1 pixel có phải là 1 góc hay không
Trang 13+ Quét 1 cửa sổ w (x, y) (với độ dịch chuyển u theo hướng x, độ dịch
chuyển v theo hướng y) qua I
+ Tính toán biến thiên của cường độ
Trong đó:
w (x, y): Cửa sổ ở vị trí (x, y)
I (x, y): Cường độ tại (x, y)
Trang 14I (x + u, y + v): Cường độ tại cửa sổ đã di chuyển (x + u, y + v)
- Để tìm các cửa sổ có góc, ta tìm các cửa sổ có biến thiên cường độ lớn
=> tối đa hóa phương trình trên
- Sử dụng Taylor mở rộng
- Biến đổi phương trình dưới dạng ma trận
- 1 điểm được tính cho mỗi cửa sổ
=> xác định xem mỗi cửa sổ có thể chứa 1 góc hay không:
Trang 15- Tải 1 ảnh (“windows.jpg”)
- Chuyển ảnh từ thang màu sang thang xám
- cornerEigenValsAndVecs(): hàm tìm giá trị riêng và vector riêng để xác
định 1 pixel có là góc hay không
- Quét Harris corner detect qua Mc (ma trận pixels của ảnh thang xám)
- Tạo cửa sổ hiển thị cho Harris corner detector
- Tạo thanh ngang mức chất lượng cho Harris corner detector
Trang 16- cornerMinEigenVal(): hàm tìm giá trị riêng min để phát hiện góc
- Tạo cửa sổ hiển thị cho Shi-Tomasi corner detector
- Tạo thanh ngang mức chất lượng cho Shi-Tomasi corner detector
- Hàm Shi - Tomasi corner detector
- Hàm Harris corner detector
- Kết quả
Trang 172.2 2D Video Analysis
2.2.1 Meanshift
Mục tiêu: truy vết đối tượng trong video
Lý thuyết: Cho sẵn 1 số điểm nhất định và 1 window, mục đích là di
chuyển window từ khu vực có mật độ điểm (pixel) thấp sang khu vực có
mật độ cao hơn
- Nhược điểm: yêu cầu phải xác định được bán kính window Điều rất quan
trọng là kích thước của ROI ít nhất phải tương ứng với kích thước của đối
tượng đang được theo dõi
Trang 18
Thực hành
- Lấy video và bắt đầu đọc video
- Track_window: Cài đặt kích thước cho ROI
- Roi: tạo ra khung ROI ban đầu (chiều cao, chiều rộng)
- Hsv_roi: Lấy dải màu chính trong ROI ban đầu để quyết định dải màu sẽ
được theo dõi
Trang 19- Term_crit: Cài đặt điều kiện để dừng tracking( trung tâm ROI không di
chuyển/ tạo ra ROI mới hơn 10 lần)
- Ret,frame: Lấy frame từ video
- cv.cvtColor: chuyển sang không gian màu HSV
- cv.calcBackProject: đối chiếu với histogram để tìm pixel tương ứng với
dải màu của đối tượng trong ROI đầu
- cv.imshow: hiển thị box
Kết quả:
2.2.2 Camshift
- Nếu đối tượng thay đổi kích thước hoặc thay đổi hướng thì meanshift sẽ
có thể không đúng nữa → Camshift
- Giả sử có 1 loạt các điểm X, Y trong không gian: ( yêu cầu phải xác định
trước số nhóm )
Trang 20Bước 1: Thuật toán sẽ tạo ra một số điểm bất kì trong không gian, ví dụ bạn
muốn chia thành 3 nhóm thì k = 3 3 điểm này gọi là centroids
Bước 2: Với mỗi điểm dữ liệu, nó sẽ tạm thời được phân vào một nhóm
(cluster) dựa theo khoảng cách của điểm dữ liệu tới điểm k gần nhất
Bước 3: Với mỗi cluster này, tính mean của các điểm rồi gán điểm mean
này là centroids mới
Bước 4: Người ta sẽ lặp đi lặp lại bước 2 và 3 cho tới khi kết quả không
còn thay đổi nhiều
Trang 21
Ví dụ cho thuật toán Camshift.
- Code: giống meanshift nhưng trả về là 1 box chữ nhật xoay và box
parameter để đối chiếu với lần lặp tiếp theo
- boxPoint: tạo 1 box chữ nhật xoay bao quanh object
- pts: lấy góc nghiêng của box theo object
- polylines: xoay box theo góc nghiêng của object
Trang 222.3 Object Detection
2.3.1 Cascade Classifier.
Mục tiêu:
- Tìm hiểu chức năng hoạt động của trình phát hiện đối tượng theo tầng Haar
- Kiến thức cơ bản về nhận diện khuôn mặt và phát hiện mắt bằng Bộ phân
loại xếp tầng dựa trên Tính năng Haar
Sử dụng cv :: CascadeClassifier để phát hiện các đối tượng trong một luồng
video Sử dụng các chức năng:
cv :: CascadeClassifier :: tải để tải tệp trình phân loại xml Nó có thể là bộ
phân loại Haar hoặc LBP
cv :: CascadeClassifier :: detectorMultiScale để thực hiện việc phát hiện
Lý thuyết
Phát hiện đối tượng bằng cách sử dụng bộ phân loại tầng dựa trên tính năng
Haar là một phương pháp phát hiện đối tượng hiệu quả Đây là một
phương pháp tiếp cận dựa trên máy học, trong đó chức năng cascade được
đào tạo từ rất nhiều hình ảnh tích cực và tiêu cực Sau đó, nó được sử dụng
Trang 23Thuật toán
Làm việc với tính năng nhận diện khuôn mặt Ban đầu, thuật toán cần rất
nhiều ảnh dương (ảnh có khuôn mặt) và ảnh âm (ảnh không có khuôn mặt)
để huấn luyện bộ phân loại Các tính năng Haar hiển thị trong hình ảnh
dưới đây được sử dụng Mỗi đối tượng là một giá trị duy nhất thu được
bằng cách lấy tổng số pixel bên dưới hình chữ nhật màu đen trừ tổng số
pixel bên dưới hình chữ nhật màu đen
Tất cả các kích thước và vị trí có thể có của mỗi hạt nhân được sử dụng để
tính toán rất nhiều tính năng ( Đối với mỗi phép tính đối tượng, chúng ta
cần tìm tổng các pixel dưới các hình chữ nhật màu trắng và đen
=> giới thiệu hình ảnh tích phân
Tuy nhiên hình ảnh của bạn lớn, nó làm giảm các phép tính cho một pixel
nhất định thành một phép toán chỉ liên quan đến bốn pixel
Ví dụ, hãy xem xét hình ảnh dưới đây
Hàng trên cùng cho thấy hai tính năng tốt
-Đặc điểm đầu tiên được chọn dường như tập trung vào đặc tính là vùng
mắt thường sẫm màu hơn vùng mũi và má
- Đặc điểm thứ hai được chọn dựa trên đặc tính là mắt tối hơn sống mũi
Nhưng các cửa sổ tương tự được áp dụng cho má hoặc bất kỳ nơi nào khác
là không liên quan
Trang 24Tính năng tốt nhất trong số 160000+ tính năng? Nó được thực hiện bởi
Adaboost
-Áp dụng từng tính năng trên tất cả các hình ảnh đào tạo Đối với mỗi đặc
điểm, nó sẽ tìm ra ngưỡng tốt nhất sẽ phân loại các mặt thành tích cực và
tiêu cực Rõ ràng là sẽ có sai sót hoặc phân loại sai
-Chọn các tính năng có tỷ lệ lỗi tối thiểu, có nghĩa là chúng là các tính năng
phân loại chính xác nhất hình ảnh có khuôn mặt và không có khuôn mặt \
-Quy trình tương tự được thực hiện Tỷ lệ lỗi mới được tính Cũng có trọng
số mới quy trình được tiếp tục cho đến khi đạt được độ chính xác hoặc tỷ
lệ lỗi cần thiết hoặc số lượng tính năng cần thiết được tìm thấy)
Bộ phân loại cuối cùng là tổng trọng số của các bộ phân loại yếu này Nó
được gọi là yếu vì một mình nó không thể phân loại hình ảnh, nhưng cùng
với những thứ khác tạo thành một bộ phân loại mạnh
Trong một hình ảnh, hầu hết hình ảnh là vùng không có khuôn mặt
=> phương pháp đơn giản để kiểm tra xem cửa sổ có phải là vùng khuôn
mặt hay không
Trang 25Các tính năng được nhóm thành các giai đoạn phân loại khác nhau và áp
dụng từng tính năng một Nếu một cửa sổ không thành công ở giai đoạn
đầu tiên, hãy loại bỏ nó Nếu nó vượt qua, hãy áp dụng giai đoạn thứ hai
của các tính năng và tiếp tục quá trình Cửa sổ vượt qua tất cả các giai đoạn
là một vùng khuôn mặt Kế hoạch đó như thế nào!
Máy dò có hơn 6000 tính năng với 38 giai đoạn với 1, 10, 25, 25 và 50 tính
năng trong năm giai đoạn đầu tiên (Hai tính năng trong hình trên thực sự
được lấy là hai tính năng tốt nhất từ Adaboost) Trung bình 10 tính năng
trong số 6000+ được đánh giá trên mỗi cửa sổ phụ
=>cách hoạt động của tính năng nhận diện khuôn mặt Viola-Jones
2.3.2 Haar-cascade Detection in OpenCV
- OpenCV cung cấp một phương pháp đào tạo hoặc các mô hình được đào
tạo trước, có thể được đọc bằng cách sử dụng phương thức tải
cv :: CascadeClassifier ::
- Ví dụ mã sau đây sẽ sử dụng các mô hình thác Haar được đào tạo trước để
phát hiện khuôn mặt và mắt trong một hình ảnh Đầu tiên, một
cv :: CascadeClassifier được tạo và tệp XML cần thiết được tải bằng
phương thức cv :: CascadeClassifier :: load Sau đó, quá trình phát hiện
được thực hiện bằng cách sử dụng phương thức cv :: CascadeClassifier ::
detectorMultiScale, trả về các hình chữ nhật ranh giới cho các khuôn mặt
hoặc mắt được phát hiện
Giải thích code
Đọc luồng video đầu vào