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.
33
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ự
34
độ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
35
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
36
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ểusố 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.
37
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
38
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)
39
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 .
40
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.
41
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.
42
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
43
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.
44
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
45
Nếu nhận dạng thành công chương trình sẽ trả ra kết quả trog file Excel
46
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.
47
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