3.3.2.1 Thu thập dữ liệu
Để thu thập dữ liệu, thay vì lấy nguồn dữ liệu có sẵn trên mạng, nhóm nghiên cứu đã thực hiện thu thập bằng chương trình được viết trên ngôn ngữ python, sử dụng thư viện mã nguồn mở OpenCV để phát hiện khuôn mặt người. Hình 3-19 thể hiện thuật toán thu thập dữ liệu.
33 Lưu đồ thuật toán:
Hình 3-20 Lưu đồ thuật toán thu thập dữ liệu
Dữ liệu sau khi được thu thập dưới dạng file ảnh . jpg sẽ được lưu trữ ở 2 file riêng biệt : 1 file chứa 500 bức ảnh mô tả khuôn mặt đeo khẩu trang và file còn lại chứa 500 bức ảnh mô tả khuôn mặt không đeo khẩu trang. Mỗi file dữ liệu trên sẽ được chia làm 2 phần chính nhờ hàm split trong python, bao gồm:
- Tập dữ liệu phục vụ quá trình thử nghiệm cuối cùng – Testing set (chiếm 20%) - Tập dữ liệu phục vụ quá trình train model (chiếm 80%), trong quá trình thu thập dữ liệu, điều kiện ánh sáng phải được đảm bảo để không làm ảnh hưởng đén chất lượng tạo mô hình sau này.
34
Hình 3-21 Tập dữ liệu người đeo khẩu trang
35 3.3.2.2 Thuật toán huấn luyện mô hình:
Lưu đồ thuật toán:
Hình 3-23 Lưu đồ thuật toán huấn luyện mô hình
Mô hình huấn luyện được xây dựng dựa trên mô hình mạng Nơ-ron tích chập CNN với thuật toán như trên hình3- 22.
a, Import các thư viện cần thiết
Nhập các thư viện cần thiết như OpenCV, Keras Numpy (để xử lí dữ liệu), Os (để quản lí file), Tensorflow, Pyqt5 …
b, Tạo đường dẫn tới thư mục dữ liệu và xác định các thông số Các đối số dòng lệnh của model bao gồm:
--dataset: đường dẫn đến tập dữ liệu đầu vào của các khuôn mặt đeo khẩu trang và không đeo khẩu trang.
36
--plot: Đường dẫn đến biểu đồ thể hiện lịch sử huấn luyện model qua đó đánh giá được sự chính xác của model có hoạt động tốt hay không. Việc này sẽ được làm đơn giản bởi thư viện matplotlib.
--model: Đường dẫn đến mô hình phân loại khẩu trang được tuần tự hóa kết quả. • Xác định tham số học sâu
Ban đầu chúng ta cần train 500 bức ảnh trong 20 lần nhưng do số lượng lớn mỗi lần train chỉ được 32 bức ảnh trong số 500 bức ảnh đã thu thập (epochs=20, bs=32)
c, Tiền xử lí dữ liệu
Những công việc này được xử lí đơn giản bới các hàm trong thư viện Cv2 hay numpy trên ngôn ngữ python.
Bước đầu bắt đầu vòng lặp vô hạn các khung hình trong video. Sau đó tiến hành bước tiền xử lý bằng cách thay đổi kích thước nó để có chiều rộng là 224pixel và chuyển sang màu xám với câu lệnh trong OpenCV.
Trong xử lý ảnh, việc chuyển đổi ảnh màu sang ảnh xám là công việc vô cùng phổ biến. Ảnh màu thực chất chỉ là tập hợp của những ma trận số có cùng kích thước. Khi muốn xử lý thông tin trên ảnh, sẽ dễ dàng hơn nếu ta chỉ xử lý dữ liệu trên một ma trận số thay vì nhiều ma trận số. Việc biến đổi ảnh màu về ảnh số (Grayscale converting) xuất hiện vì mục đích trên - biến đổi thông tin ảnh về một ma trận số hai chiều duy nhất.
37
Hình 3-24 Cấu tạo ảnh RGB
Thông thường hình ảnh được lưu trữ dưới dạng RGB (Red-Green-Blue). Điều này có nghĩa có ba ma trận xám tương ứng cho màu Red, Green, Blue. Công việc phải làm là tìm cách tổng hợp ba ma trận này về thành một ma trận duy nhất. Một trong số các công thức phổ biến để thực hiện việc đó là:
Y = 0.2126R + 0.7152G + 0.0722B Trong đó: Y: ma trận xám cần tìm R: ma trận xám đỏ của ảnh G: ma trận xám lục của ảnh B: ma trận xám lam của ảnh Sử dụng lệnh cvtColor:
Lệnh cvtColor (source, dest, mode) cho phép chuyển đổi ảnh màu source sang ảnh xám và lưu vào dest với độ chuyển đổi màu là mode. CV_BGR2GRAY là chế độ cho phép chuyển từ ảnh màu lưu ở format BGR sang ảnh xám.
Những công việc này được thực hiện đơn giản bởi các hàm chức năng có trong các thư viện đã import ở phía trên.
38
Hình 3-25 Chuyển ảnh RGB sang ảnh xám
d, Xây dựng các lớp cho mô hình
Các lớp được xây dựng dựa trên mô hình mạng nơ-ron tích chập CNN (mạng nơ- ron tích chập được thiết kế đặc biệt để xử lí dữ liệu đầu vào). Kiến trúc của mạng CNN gồm 3 phần chính:
Phần 1: Một lớp phức hợp trích xuất đặc tính từ ảnh ban đầu.
Phần 2: Một lớp tổng hợp để giảm kích thước của nơron đi và tập trung vào các phần tử quan trọng nhất
Phần 3: Một lớp kết nối đầy đủ làm phẳng các đối tượng được xác định trong các lớp trước đó thành một vecto và dự đoán ảnh có thể thuộc về một nhãn nào đó.
e, Biên dịch mô hình:
Thực hiện các thuật toán tối ưu và biên dịch chương trình. Xuất ra các biểu đồ và tỉ lệ thành công hay thất bại của model thể hiện sự chính xác của model.
39
Bảng 3-2 Đánh giá huấn luyện mô hình
Lần train Thời gian(s)
Loss Accuracy Val_loss Val_accurracy
1 49 0.8343 0.6261 0.3932 0.805 2 50 0.4339 0.7987 0.2218 0.93 3 53 0.2503 0.9007 0.1433 0.945 4 52 0.1726 0.949 0.114 0.955 5 52 0.1405 0.9582 0.0907 0.97 6 59 0.1336 0.949 0.077 0.98 7 57 0.0957 0.9752 0.0974 0.98 8 48 0.0802 0.9752 0.0674 0.098 9 49 0.0718 0.948 0.0548 0.9850 10 46 0.0846 0.9673 0.0481 0.98 11 43 0.0728 0.9778 0.0428 0.985 12 48 0.0507 0.9817 0.0399 0.995 13 60 0.0423 0.9869 0.0372 0.99 14 74 0.055 0.9843 0.0373 0.99 15 77 0.042 0.9883 0.0333 0.995 16 71 0.0406 0.9869 0.0307 0.995 17 57 0.0383 0.9895 0.0331 0.99 18 57 0.0407 0.9869 0.0268 0.995 19 55 0.0324 0.99 0.029 0.9922 20 42 0.0322 0.99 0.0297 0.992
Tiến hành huấn luyện với tốc độ học 0.0001, sai 20 lần lặp với số lượng mẫu (Batch_size) sử dụng cho mỗi lần cập nhật trọng số là 32 ta thu được kết quả nhưng bảng trên. Nhìn vào bảng trên ta có thể thấy sau 20 lần lặp, mô hình đạt được độ chính
40
xác khoảng 99% trên bộ thử nghiệm (bộ kiểm tra). Đây là một giá trị tương đối cao mặc dù còn phát sinh một số lỗi nhất định nhưng có thể tạm chấp nhận được.
3.3.2.3 Thuật toán phát hiện người đeo khẩu trang trong thời gian thực: Sơ đồ thuật toán:
41
Hình 3-26 Sơ đồ phát hiện người không đeo khẩu trang trên video/ webcam
42
Tương tự như hai bước thu thập dữ liệu và huấn luyện mô hình. Nhập các thư viện cần thiết như OpenCV, Keras, Numpy (để xử lí dữ liệu), Os (để quản lí file), Tensorflow, Pyqt5 …
b, Truy xuất vào model nhận diện khuôn mặt.
Áp dụng OpenCV DNN(là một thuật toán của open CV để phục vụ cho việc nhận diệ khuôn mặt) để nhận diện khuôn mặt trong hình ảnh đầu vào
faceNet.setInput(blob)
detections = faceNet.forward()
c, Trích xuất ảnh từ camera và tiền xử lí
Trích xuất ảnh từ camera sau đó ta cũng thực hiện các bước tiền xử lý với ảnh đầu vào như bước train model. Bước này giúp ảnh có đúng kích thước và màu sắc để phục vụ cho các bước xử lý tiếp theo.
d, Tiến hành phát hiện khuôn mặt từ ảnh đầu vào đã được tiền xử lí.
Chức năng này phát hiện xem có khuôn mặt nào có trong khung hình hay không qua đó gửi về vị trí và danh sách về bộ xử lí.
Để thực hiện công việc quyết định là phát hiện khẩu trang thì nhóm xây dựng một hàm “def detect_and_predict_mask(frame, faceNet, maskNet):”
Trong hàm này sẽ có 3 thông số tương đương với 3 công việc nhỏ hơn Frame: Nhận luồng ảnh từ video lấy từ webcam
FaceNet: Mô hình được sử dụng để phát hiện vị trí khuôn mặt trong ảnh. maskNet: Mô hình phân loại khẩu trang của nhóm nghiên cứu
43
Hình 3-27 Rất nhiều khuôn mặt giả được phát hiện
Sau khi dự đoán được rất nhiều khuôn mặt nhưng còn xuất hiện nhiều khuôn mặt giả nên những khuôn mặt này sẽ đi vào 1 vòng lặp để tìm ra khuôn mặt thật chính xác phục vụ cho quá trình nhận diện có đeo khẩu trang hay không ở bước kế tiếp.
Bên trong vòng lặp này nhóm đã lọc ra những phát hiện yếu và trích xuất được ra khuôn mặt chuẩn bao gồm tọa độ của khuôn mặt.
Tiếp theo tiến hành xử lí ảnh vùng khuôn mặt đó, chuyển ảnh về cùng kích thước với ảnh được train trong model bằng hàm “resize”, chuyển ảnh từ dạng BRG sang RGB
44
Hình 3-28 Khuôn mặt thật được phát hiện
e, Phát hiện người không đeo khẩu trang
Sau khi đã có dữ liệu khuôn mặt thì công việc tiếp theo đã sẵn sàng là chạy những khuôn mặt đó trong file model nhận diện khẩu trang để nhận diện xem người đó có đang đeo khâu trang hay không.
Những đối số dòng lệnh trong khối lệnh trên bao gồm:
--face: Đường dẫn đến khuôn mặt vừa được xác định và lưu trong bộ nhớ tạm --model: Đường dẫn đến trình phân loại khẩu trang được đào tạo của nhóm nghiên cứu
--confidence: Ngưỡng xác xuất tối thiểu để lọc các trường hợp.
Kết quả phát hiện nhận diện người đeo khẩu trang trên thời gian thực.
TH1: Đeo khẩu trang => Giá trị thu được từ camera so sánh lớn hơn giá trị ngưỡng đã chọn là 0.8. Kết luận đeo khẩu trang (Mask).
45
TH2: Không đeo khẩu trang vùng miệng và mũi sẽ hở ra hoặc đeo sai quy cách => Giá trị thu được từ camera so sánh nhỏ hơn giá trị ngưỡng đã chọn là 0.8. Kết luận không đeo khẩu trang(No mask).
Hình 3-30 Kết quả dự đoán trường hợp đeo khẩu trang