Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 64 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
64
Dung lượng
3,4 MB
Nội dung
Mục Lục Lời mở đầu Lời cảm ơn Chương Tổng quan toán nhận diện người đeo trang 1.1 Giới thiệu chương 1.2 Bài toán đặt 1.3 Đề xuất hướng nghiên cứu đề tài 1.3.1 Phương pháp nghiên cứu phát đối tượng 1.3.2 Phương pháp nghiên cứu phân loại đối tượng 1.4 Tổng quan mô hình đề xuất .6 1.5 Kết luận chương Chương Tổng quan lý thuyết 2.1 Giới thiệu chương 2.2 Mơ hình phát đối tượng Haar Cascade 2.2.1 Lý thuyết Haar Cascade 2.2.2 Lý thuyết đặc trưng Haar .10 2.2.3 Tính tốn Integral Image 11 2.3.4 Bộ phân loại AdaBoost .12 2.3 Phương pháp trích đặc trưng HOG .14 2.3.1 Quy trình thực HOG 14 2.3.2 Tính tốn Gradient 15 2.3.3 Tính tốn Histogram 15 2.3.4 Chuẩn hóa histogram .18 2.4 Phương pháp nhận diện SVM .18 2.4.1 Các khái niệm chung 20 2.4.2 Hard Support Vector Machine .22 2.4.3 Soft Support Vector Machine 24 2.5 Tổng kết chương 26 Chương Thực nghiệm đánh giá kết 27 3.1 Giới thiệu chương 27 3.2 Mơ hình phát khn mặt Haar Cascade 27 3.3 Tiền xử lí liệu .28 3.4 Trích xuất đặc trưng HOG 30 3.5 Mơ hình phân loại sử dụng Soft SVM 32 3.5.1 Phân loại nhị phân cho toán đa lớp 32 3.5.2 Phân loại đa lớp sử dụng Soft SVM 33 3.5.3 Kết mơ hình phân loại .34 3.5.4 Đánh giá mơ hình phân loại sử dụng Soft SVM 40 3.5.5 Đề xuất tăng độ ứng dụng cho mơ hình phân loại 41 3.6 Mơ hình hồn thiện 42 3.7 Kết luận chương 45 Kết luận Hướng phát triển 46 Tài liệu tham khảo 47 Phụ lục .48 Lời mở đầu Những năm gần đây, tình hình dịch bệnh trở thành vấn đề phức tạp nóng hổi cần ưu tiên hàng đầu người Chủng virus corona hay gọi covid19 hoành hành toàn giới vấn đề cấp bách người đương thời cần đối mặt, bên cạnh cịn có vấn đề nhiễm mơi trường, khói bụi khơng khí, nóng lên tồn cầu… Dịch bệnh ảnh hưởng tới nước ta phương diện kinh tế, y tế, giao thông, giáo dục, người… Kinh tế tăng trưởng chậm, y tế q tải, giao thơng đình trệ, giáo dục bất cập tác động rõ ràng covid-19 lên đất nước giới nên để hạn chế dịch bệnh ngồi sách đắn phủ cần ý thức người dân tuân thủ quy định Một quy định việc đeo trang y tế, trang chuyên dụng nơi đông người yêu cầu bắt buộc với người dân Thế vấn đề tranh cãi số phận thiếu ý thức không chấp hành nơi công cộng Từ mong muốn xuất ý tưởng mơ hình phát nhận diện người đeo trang đúng, sai không đeo trang dựa toán computer vision Bài toán giúp giải vấn đề không đeo trang nơi cơng cộng với mục đích cảnh báo nhắc nhở Các bước xây dựng mơ hình dựa machine learning truyền thống Từ ý tưởng ban đầu đến hồn thành sản phẩm có tính ứng dụng vào thiết bị cảnh báo, nhắc nhở, xử phạt trường hợp khơng tn thủ quy định phịng dịch nơi đông người, thiết bị tự động chấm công, mở cửa tự động… Lời cảm ơn Xin chân thành cảm ơn thầy cô khoa Điện Tử Viễn Thông đại học Bách khoa Đà Nẵng xây dựng kiến thức tảng vững để hỗ trợ hồn thành đồ án Cảm ơn Hồng Lê Uyên Thục trực tiếp hỗ trỡ giúp đỡ q trình hồn thành đồ án Cũng tác giả Vũ Hữu Tiệp với chuỗi blog Machine Learning (https://machinelearningcoban.com/about/) giúp sức trình tìm hiểu xây dựng mơ hình nhận diện sử dụng SVM Cuối cảm ơn thành viên tạo phát triển hai tập liệu MaskedFace-Net (https://github.com/cabani/Masked Face-Net) tập liệu Flickr-Faces-HQ (https://github.com/NVlabs/ffhq-dataset) sử dụng đồ án Sinh viên thực Đặng Công Minh – Nguyễn Quang Vũ Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang Chương Tổng quan toán nhận diện người đeo trang 1.1 Giới thiệu chương Với mục đích phát triển dự án giúp đỡ cộng đồng ghế nhà trường nên vấn đề máy tính nhận dạng người đeo trang hướng nghiên cứu thiết thực có tính ứng dụng thời gian dịch covid cịn hồnh hành Qua trình tìm hiểu ứng dụng kiến thức từ môn học cũ tạo mơ hình nhận diện người đeo trang góp phần thúc đẩy khả nhận diện máy tính người đeo trang Chương tổng quan cách giải tốn mơ hình lựa chọn cuối sau cân nhắc 1.2 Bài toán đặt Sự cần thiết đề tài nghiên cứu phát nhận diện người không đeo trang, người đeo trang người đeo trang sai khẩn cấp thời kì dịch bệnh, ý thức cộng đồng việc đeo trang nơi công cộng yêu cầu tối thiểu để hạn chế lây lan dịch bệnh Đặc biệt thời kì bình thường việc đeo trang lại cấp thiết hết Nhưng phận cộng đồng lại thờ với quy định cách có chủ ý vô ý nên đề tài đời với mục đích nhắc nhở, cảnh báo phận cộng đồng chưa có ý thức cao phịng tránh dịch nơi cơng cộng Bài tốn đặt thách thức việc phát khuôn mặt người đeo trang, thách thức nguồn liệu người đeo trang khan không chia sẻ rộng rãi Mục tiêu toán đặt ra: - Xây dựng lượng sở liệu vừa đủ để tăng độ xác - Xây dựng mơ hình thực tế có khả phát khn mặt người với độ xác 80% Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang - Xây dựng mô hình phân loại đối tượng đeo trang đúng, đeo trang sai không đeo trang với độ xác khoảng 90% - Hồn thiện mơ hình góp phần thúc đẩy kết bái tốn phát người không đeo trang 1.3 Đề xuất hướng nghiên cứu đề tài Trong thời gian khoảng tháng bắt đầu xây dựng mơ hình phát nhận diện người đeo trang, không đeo trang đeo trang sai cách Có tính ứng dụng thực tế, vận dụng dựa kiến thức học tìm hiểu Giới hạn phạm vi nghiên cứu: mơ hình giới hạn đối tượng cần nhận diện người không đeo trang, đeo trang đeo trang không cách Số lượng liệu từ 16000 đến 20000 mẫu, có mẫu người châu á, châu âu, châu phi, mỹ la tinh, đủ độ tuổi từ trẻ em đến người lớn thu thập từ hai tập liệu MaskedFace-Net Flickr-Faces-HQ với mục đích dùng cho phi lợi nhuận 1.3.1 Phương pháp nghiên cứu phát đối tượng: có mơ hình ứng dụng sẵn R-CNN, Fast-RCNN, Faster-RCNN, RetinaNet… ngồi có mơ hình với độ ứng dụng tin cậy cao SSD YOLO Trong mơ hình Deep Learning tích hợp nhận diện phát đối tượng nên ứng dụng mơ hình Haar Cascade chun dùng cho phát đối tượng ứng dụng phân loại khuôn mặt Sau phát phân loại khuôn mặt sử dụng HOG với SVM để nhận diện đối tượng Lý lựa chọn mơ hình Haar Cascade: Ưu điểm: - Độ ứng dụng dễ dàng - Lý thuyết cấu trúc mơ hình đơn giản - Phù hợp với yêu cầu phát khuôn mặt nên không dư thừa việc nhận diện khuôn mặt Nhược điểm: - Độ xác khơng cao đặc biệt đối tượng đeo trang - Có thể phát lỗi vị trí khơng phải khn mặt Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang - Tùy vào ảnh ta điều chỉnh tham số kết tốt việc tự động 1.3.2 Phương pháp nghiên cứu phân loại đối tượng: theo hai hướng Deep Learning Machine Learning: Theo hướng Deep Learning sử dụng mơ ANN, CNN, MobileNetV2… Theo hướng Machine Learning truyển thống trích đặc trưng dựa vào hình dáng, biên độ hướng, màu sắc, độ tương phản… sử dụng K-Means, KNN, SVM… để phân loại Sau tìm hiểu xem xét mơ hình định xây dựng Machine Learning truyền thống kết hợp trích đặc trưng HOG (Histogram Of Oriented Gradients) nhận diên SVM (Support Vector Machine) Lý lựa chọn mơ hình: Ưu điểm: - Lượng liệu cần cho Machine Learning so với Deep Learning - Mơ hình đơn giản dễ tìm hiểu thực - Trích đặc trưng HOG dựa vào hình dáng biên độ hướng nên phù hợp để phân loại cho đối tượng - SVM thuật toán hoạt động xác với lượng liệu ít, số đối tượng phân loại hai nhiều cách để tối ưu hóa mơ hình Nhược điểm: - Mơ hình cần lựa chọn thử tối ưu hóa nhiều lần để đạt kết tốt - Tập liệu cần có tuyến tính để mơ hình hoạt động tốt - Phân chia đối tượng dẫn tới bị lỗi (Ví dụ người lấy tay che miệng đối tượng đeo trang, người đeo trang hở miệng nhận nhầm thành khơng đeo trang…) 1.4 Tổng quan mơ hình đề xuất Việc nghiên cứu ứng dụng mơ hình vào nhận diện người đeo trang khơng đeo trang xuất thời kì dịch bệnh đạt Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang thành nghiên cứu định Bài toán mang tới đề tài diện mạo cho lĩnh vực Computer Vision, khơng phải cịn tốn nhận dạng khn mặt mà tích hợp thêm khả nhận diện người đeo trang khơng đeo trang thời kì dịch bệnh Với cấp thiết khả ứng dụng cao nên mơ hình đề tài đời Mơ hình nhận diện xây dựng dựa machine learning truyền thống Với chức ứng dụng mô hình phát khn mặt với tập liệu có sẵn để phân loại đối tượng khuôn mặt người ảnh từ nhận diện đối tượng không đeo trang, đeo trang cách đeo trang sai cách dựa mơ hình tự xây dựng với tập liệu tự tìm kiếm bổ sung Tổng quan quy trình thực trình bày Hình 1.1 Hình 1.1 Sơ đồ quy trình thực Dữ liệu đầu vào ảnh sau qua mơ hình Haar Cascade phát đối tượng khn mặt người có ảnh Từ đối tượng phát trích xuất đặc trưng HOG chuyển vector đưa vào mơ hình nhận diện sử dụng SVM để phân loại Ở trình xây dựng mơ hình nhận diện sử dụng Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang SVM sử dụng hai lần tính tốn SVM nhận diện tốt có hai lớp nên chấp nhận hy sinh mặt thời gian để tăng độ xác 1.5 Kết luận chương Sau nghiên cứu tìm hiểu tổng quan tốn phát người khơng đeo trang hồn thiện mục tiêu đề tìm mơ hình phù hợp với khả ứng dụng vào tốn Với mơ hình tổng quan đề xuất khơng u cầu cao lượng liệu, đơn giản trình tìm hiểu xây dựng nên lựa chọn mơ hình hồn thiện cuối hướng tới Mơ hình hồn thiện áp dụng phát đối tượng Haar Cascade phân loại đối tượng kết hợp HOG SVM Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang Chương Tổng quan lý thuyết 2.1 Giới thiệu chương Mô hình sử dụng theo machine learning kết hợp phương pháp phát khn mặt theo mơ hình Haar Cascade với trích đặc trưng sử dụng HOG cộng với phân loại SVM Trong chương trình bày phần lý thuyết quan trọng sử dụng đồ án mơ hình Haar Cascade, trích đặc trưng HOG thuật toán SVM Từ khái niệm để lấy làm tảng ứng dụng cho kết thu chương 2.2 Mơ hình phát đối tượng Haar Cascade Haar Cascade là thuật toán tạo dựa tính để phát đối tượng (có thể khn mặt, mắt, tay, đồ vật,…) đề xuất vào năm 2001 bởi Paul Viola và Michael Jones trong báo họ với khẳng định “Phát đối tượng cách nhanh chóng cách sử dụng tầng (Cascade) tăng cường tính đơn giản” Haar Cascade lớp model giúp nhận diện khuôn mặt (Haar Cascade face detection) đối tượng khác dựa tập đặc trưng có sẵn. Mơ hình sử dụng đặc trưng Haar, sau áp dụng đặc trưng qua nhiều tầng (Cascade) từ tạo thành một cỗ máy phát đối tượng hoàn chỉnh Mục đích ứng dụng lần Haar Cascade dùng để phát khn mặt diện phận khuôn mặt mắt, mũi, miệng Sau ứng dụng phát phận thể khác thân trên, nụ cười, tay, chân nhiều đồ vật khác ứng dụng rộng rãi 2.2.1 Lý thuyết Haar Cascade Với đầu vào ảnh mơ hình minh họa Hình 2.1 cụ thể hóa qua bước sau: Bước 1: Chuyển ảnh dạng ảnh xám Sau chia nhỏ khung hình thành cửa sổ nhỏ (subwindows) gửi tới phận phân loại Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang Phụ lục File: Extract_Object.py import import import import os cv2 imutils argparse def extract(link): arr_error=[] current_directory=os.getcwd() #Delete file in folder Object os.chdir(current_directory+'/Object') arr=os.listdir() for name in arr: os.remove(name) os.chdir(current_directory) #Load image image=cv2.imread(link) gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) #Load the face detector and detect faces in the image detector=cv2.CascadeClassifier('Models/haarcascade_frontalface_default.xml') if imutils.is_cv2(): faceRects=detector.detectMultiScale(gray,scaleFactor=1.05,minNeighbors=5, minSize=(30,30),flags=cv2.cv.CV_HAAR_SCALE_IMAGE) else: faceRects=detector.detectMultiScale(gray,scaleFactor=1.05,minNeighbors=5, minSize=(30,30),flags=cv2.CASCADE_SCALE_IMAGE) for i in range(len(faceRects)): try: x,y,w,h=faceRects[i] img=image[y:y+h+int(h*0.15),x:x+w,:] cv2.imwrite('Object/Object_'+str(i)+'.jpg',img) except: 49 Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang arr_error.append(i) return faceRects if name ==" main ": pass File: Features_Extraction.py import import import import def cv2 csv os numpy as np histogram(ori:list,mag:list)->list: #Use method ans=np.array([0]*9) for i in range(8): for j in range(8): x=int(ori[i][j]//20) if x==8 or x==9: x=8 ans[x]+=mag[i][j] else: ans[x]+=(((x+1)*20-ori[i][j])/20)*mag[i][j] ans[x+1]+=((ori[i][j]-x*20)/20)*mag[i][j] return ans def hog_result(link:str,col=32,row=64)->list: im=cv2.imread(link,0) im=cv2.resize(im,(col,row)) #Calculate gradient follow mask line x_mask=np.array([[-1,0,1]]) y_mask=x_mask.T # x_mask=np.array([[-1,-2,-1],[0,0,0],[1,2,1]]) # y_mask=x_mask.T fx=cv2.filter2D(im,cv2.CV_32F,x_mask) fy=cv2.filter2D(im,cv2.CV_32F,y_mask) #Calculate magnitude magnitude=np.sqrt(np.square(fx)+np.square(fy)) orientation=np.arctan(np.divide(fy,fx+0.00001)) #Translate to degrees(độ) because auto change -90 to 90 so plus 90 to output to 180 orientation=np.degrees(orientation)+90 50 Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang #Calculate cell and block cell_x=im.shape[1]//8 cell_y=im.shape[0]//8 #Create histogram of gradient hollow( is shortened value degrees) hist_shorten=np.zeros([cell_y,cell_x,9]) #16x8x9 #Calculate histogram of gradient for x in range(cell_x): for y in range(cell_y): #Take orientation and magnitude on a cell ori=orientation[y*8:y*8+8,x*8:x*8+8] mag=magnitude[y*8:y*8+8,x*8:x*8+8] #Create histogram for a cell hist_shorten[y,x,:]=histogram(ori,mag) #16,8,9 #Create normalization matrix hollow feature_hog=np.zeros([cell_y-1,cell_x-1,36]) #Normalization for x in range(cell_x-1): for y in range(cell_y-1): k=np.sqrt(np.sum(np.square(hist_shorten[y:y+2,x:x+2,:]))) feature=hist_shorten[y:y+2,x:x+2,:]/k feature=feature.flatten() feature_hog[y,x,:]=feature return feature_hog.flatten() def main(): list_state=['Test','Train'] list_name=['Correct','Incorrect','Mask','Not_Mask'] curr_dict=os.getcwd() for name in list_state: for i in range(4): link='C:/Users/minh dung/Desktop/Python/Computer Project/Dataset/'+name+'/'+list_name[i] os.chdir(link) arr=os.listdir() os.chdir(curr_dict) with open(name+'_'+list_name[i]+'.csv','w+') as file: writer=csv.writer(file,delimiter=',',quotechar='"',quoting=csv.QUOTE_MINIMAL) for word in arr: feature=hog_result(link+'/'+word) 51 Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang writer.writerow(feature) if name ==" main ": main() File: SVM_Classification.py from sklearn.svm import SVC import os import csv import numpy as np import pandas as pd import matplotlib.pyplot as plt from Features_Extraction import hog_result #from Detach_Background import detach dict_train={'Incorrect':3415,'Correct':3545,'Mask':6960,'Not_Mask':6857} dict_test={'Incorrect':660,'Correct':710,'Mask':1370,'Not_Mask':1353} def load_data(name:str,size:str)->list: result=pd.read_csv('HOG_Features/Sobel_Mask/'+size+'/Train/Train_'+name+'.csv',hea der=None) result=np.array(result) return result def sum_data(name1:str,name2:str,num1:int,num2:int,size:str)->[list,list]: mat1,mat2=load_data(name1,size),load_data(name2,size) X_train=np.append(mat1,mat2,axis=0) y=np.concatenate((np.ones(num1),-np.ones(num2)),axis=0) return X_train,y def training_models(name1:str,name2:str,size:str,num:int,c:float)->None: X_train,y=sum_data(name1,name2,dict_train[name1],dict_train[name2],size) model=SVC(kernel='linear',C=c) model.fit(X_train,y) weight=model.coef_ bias=model.intercept_ with open('Train_'+str(num)+'.csv','w+') as file: writer=csv.writer(file,delimiter=',',quotechar='"',quoting=csv.QUOTE_MINIMAL) writer.writerow(weight[0]) writer.writerow(bias) writer.writerow([c]) 52 Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang def accuracy_percent(mask:str,size:str,num:int)->None: data=pd.read_excel('Results/Confusion_Matrix/'+mask+'_'+size+'.xlsx') data=np.array(data) percent=sum([data[num,i] for i in [0,4,8]])/2723 return percent*100 def output_accuracy(mask:str,size:str): value_c=[0.001,0.01,0.1,1,10,100] value=[0]*6 for num in range(6): percent=accuracy_percent(mask,size,num) value[num]=percent with open(mask+'_'+size+'.csv','w+') as file: writer=csv.writer(file,delimiter=',',quotechar='"',quoting=csv.QUOTE_MINIMAL) writer.writerow(value) def output_confusion_matrix(mask:str,size:str,name:str,c:int)->[int,int]: data_test=pd.read_csv('HOG_Features/'+mask+'_Mask/'+size+'/Test/Test_'+name+'.csv' ,header=None) data_test=np.array(data_test) train=pd.read_csv('Models/'+mask+'_Mask/'+size+'/'+str(c) +'/Train_1.csv',header=None) weight=np.array(train.values[0,:]) bias=np.array(train.values[1,0]) arr=[] for i in range(len(data_test)): temp=data_test[i].dot(weight.T)+bias if temp>0: train_0=pd.read_csv('Models/'+mask+'_Mask/'+size+'/'+str(c) +'/Train_2.csv',header=None) weight_0=np.array(train_0.values[0,:]) bias_0=np.array(train_0.values[1,0]) temp_0=data_test[i].dot(weight_0.T)+bias_0 if temp_0>0: arr.append('Incorrect') else: arr.append('Correct') else: arr.append('Not_Mask') 53 Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang # 1: Not_Mask, 2: Correct, 3: Incorrect return arr.count('Incorrect'),arr.count('Correct'),arr.count('Not_Mask') def results_for_GUI(mask:str,size:str,c:int)->list: data_test=[] #Get feature image curr_dict=os.getcwd() os.chdir(curr_dict+'/Object') arr=os.listdir() os.chdir(curr_dict) # Have detach background # detach(arr) # for name in arr: # data_test.append(hog_result('Object/BG_'+name)) #Don't detach background if size=='16x32': for name in arr: data_test.append(hog_result('Object/'+name,16,32)) else: for name in arr: data_test.append(hog_result('Object/'+name)) result,percent1,percent2=np.array([0]*len(data_test)),np.array([0]*len(data_test)) ,np.array([0]*len(data_test)) # 1: Not_Mask, 2: Correct, 3: Incorrect data_test=np.array(data_test) os.chdir(curr_dict) train=pd.read_csv('Models/'+mask+'/'+size+'/'+str(c) +'/Train_1.csv',header=None) weight=np.array(train.values[0,:]) bias=np.array(train.values[1,0]) for i in range(len(data_test)): temp=data_test[i].dot(weight.T)+bias if temp>0: train_0=pd.read_csv('Models/'+mask+'/'+size+'/'+str(c) +'/Train_2.csv',header=None) weight_0=np.array(train_0.values[0,:]) bias_0=np.array(train_0.values[1,0]) temp_0=data_test[i].dot(weight_0.T)+bias_0 if temp_0>0: percent1[i]=100.0 if temp>=1 else abs(temp*100) percent2[i]=100.0 if temp_0>=1 else temp_0*100 result[i]=3 else: percent1[i]=100.0 if temp>=1 else temp*100 54 Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang percent2[i]=100.0 if temp_0str: smallfont=pygame.font.SysFont(font,size) text=smallfont.render(word,True,color) return text tx=Text_data() #Create button for function draw_screen display class Button: def init (self): self.mouse=None self.start=pygame.image.load('Images/start.png') self.view=pygame.image.load('Images/view.jpg') self.left=pygame.image.load('Images/left.png') self.right=pygame.image.load('Images/right.png') def upload_button(self, x:int, y:int, width:int, height:int, mid:int, center:int, text:str)->None: 56 Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang Tong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trangTong.quan.bai.toan.nhan.dien.nguoi.deo.khau.trang if x