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
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.
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.
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.
2.3. Phương hướng giải quyết2.3.1. Quy trình của hệ thống 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.
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ự
độ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
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
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 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 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)
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 .
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.
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.
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ì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