Raspberry Pi Thiên Lý Nhãn (Phần 3): Khóa thông minh nhận dạng khuôn mặt với Raspberry Pi và OpenCV

Mô tả dự án: 

Trong bài trước tui đã giới thiệu về việc nhận diện khuôn mặt với Raspberry Pi và webcam. Tuy nhiên bài chỉ dừng lại ở việc Raspberry Pi có thể nhận diện được khuôn mặt của bất kỳ ai đứng trước webcam mà thôi. Bài toán đặt ra là làm thế nào để Raspberry Pi nhận được khuôn mặt của chính bạn? Đây là một bài toán khó và thú vị. Khó là vì chúng ta cần thuật toán và khả năng xử lí hình ảnh mạnh. Thú vị là do ta có thể "chế cháo" kết hợp với các hệ thống bảo mật khác như vân tay, mật khẩu để tăng tính an ninh cho đề án của bạn. Vì độ phức tạp của đề án này nên tui sẽ chia ra làm 2 phần.

  • Phần đầu tiên là "phần mềm": chúng ta sẽ ghi lại khoảng 200 tấm hình webcam với khuôn mặt của bạn và huấn luyện máy tính với thuật toán chính diện (eigenfaces) của OpenCV. Do tài nguyên của Pi hạn hẹp nên bạn cần chạy phần này trên máy tính của mình. 
  • Phần tiếp theo là "phần cứng": ta nối Pi với relay và cho webcam chụp ảnh. Nếu Pi nhận diện được chính khuôn mặt của bạn thì sẽ kích relay.

Lưu ý là các bạn phải tải OpenCV về trên cả Pi và máy tính. Các bạn vào đây để download code và các tập tin cần thiết nữa: https://github.com/johnkimdinh/Facial-recognition-Raspberry-Pi-OpenCV

Chuẩn bị Webcam

Đầu tiên ta phải dò xem OpenCV và máy tính của bạn giao tiếp qua webcam ID nào. Các bạn cắm webcam và chạy python multiple_camera.py. Nếu webcam hiện lên thì ok. Bấm phím q để thoát. Nếu báo lỗi thì thay webcamID bằng 0,1,2 etc để tìm được ID. Thông thường thì ID mặc định sẽ là 0 nếu dùng webcam có sẵn trên laptop và 1 nếu dùng USB webcam. Nếu bạn lười thì chỉnh thành -1 để chọn camera đầu tiên máy nhận được.

Các bạn cũng có thể dùng module này để chỉnh sửa vị trí của webcam làm sao cho khuôn mặt bạn nằm gọn trong khung hình.

Sau đó các bạn mở tập tin python config.py và sửa lại webcamID vừa tìm được.

Thu thập dữ liệu

Các bạn giải nén tập tin training.zip rồi chạy capture-positives.py. Webcam sẽ liên tục chụp lại hình của bạn và thông báo xem có nhận được khuôn mặt của các bạn hay không. Nếu báo "NO FACE DETECTED!" thì các bạn di chuyển mặt mình 1 chút để thay đổi góc chụp. 

Nếu bạn muốn xem trước khi camera chụp hình thi uncomment 3 dòng sau trong capture_positives.py. Webcam sẽ hiện lên khung hình để bạn chỉnh sửa tư thế ngồi. Bạn sau đó phải bấm 1 phím bất kỳ để webcam chụp lại hình.

Chương trình sẽ tự động dừng lại khi webcam đã thu thập được 200 tấm. Bạn có thế chỉnh sửa thông số này với MAX_NUMBER_OF_IMAGES trong tập tin config.py

Các tấm ảnh chụp xong sẽ được lưu vào tập tin \training\positive. Bạn có thế chạy chương trình này nhiều lần với các điều kiện ánh sáng, trang phục mũ nón tóc tai khác nhau để tăng thêm tính chính xác. Tuy nhiên hình càng nhiều thì thời gian training càng lâu. 

Tập tin \training\negative chứa 400 khuôn mặt của 40 người khác nhau dùng để train cho thuật toán. Các bạn có thể đọc thêm ở đây.

Training

Các bạn chạy module python train.py và chờ khoảng 5-10 phút tùy số lượng hình bạn thu thập được. Python sẽ so sánh từng hình trong thư mục \training\positive với các khuôn mặt định sẵn trong thư mục \training\negative và xuất ra các thông số cần thiết:

mean: đây là khuôn mặt trung bình của tui sau 200 tấm hình cool
positive: Đây là điểm khác nhau giữa khuôn mặt của tui với 400 tấm hình mẫu. Nếu webcam chụp được hình nào gần giống với tấm này thì sẽ cho kết quả dương tính và mở chìa.
negative: Đây là điểm giống nhau giữa khuôn mặt tui với 400 hình mẫu. Nếu webcam chụp được hình nào gần giống với tấm này thì cho kết quả âm tính và không cho mở chìa.

Ngoài ra OpenCV còn xuất ra 1 tập dữ liệu khá lớn tên training.xml (~175MB cho 200 tấm hình training). Tập dữ liệu này chứa kết quả training mà Raspberry Pi sẽ dùng để đoán khuôn mặt của bạn. 

Căn chỉnh

Để xem chương trình hiệu quả đến mức nào, ta chạy tập tin python box.py 

Tui chạy 2 lần và python cho ra 2 kết quả như sau:

Lần đầu tiên python so sánh hình webcam chụp giống với tui (POSITIVE) nhưng không đủ tự tin (confidence > 2000) => không nhận diện khuôn mặt

Lần thứ 2 python nhận ra hình webcam chụp giống với tui (POSITIVE) và với mức tự tin dưới ngưỡng (confidence < 2000) => nhận diện khuôn mặt.

Với logic này thì các bạn có thể có thể suy ra cho trường hợp NEGATIVE ha!

Các bạn có thể chỉnh ngưỡng này trong tập tin config.py:

Lưu ý: nếu code box.py báo lỗi thi có nghĩa là webcam không chụp được mặt của bạn để so sánh. Bạn chỉnh lại sao cho mặt mình nằm trọn trong khung hình với tập tin python multiple_camera.py. Chúc các bạn thành công!

Mời các bạn đọc bài kế tiếp để tạo dự án hoàn chỉnh đầy đủ phần mềm và phần cứng. 

lên
2 thành viên đã đánh giá bài viết này hữu ích.
Từ khóa: 
Các dự án được truyền cảm hứng

Attiny13 học lệnh từ remote, điều khiển on/off 3 kênh

Có bao giờ bạn có tự hỏi như mình: liệu có thể làm một thiết bị remote từ xa sử dụng điều khiển TV hay không? Với bài viết Infrared remote control (điều khiển bằng hồng ngoại) với Arduino của bạn NTP_PRO, mình đã làm được điều đó. Nhưng thực sự Arduino UNO quá đắt để làm được việc này! Vì vậy, mình dùng một dòng chip khác là ATtiny13. Và hôm nay, mình sẽ hướng dẫn các bạn làm nên mạch này!

lên
7 thành viên đã đánh giá bài viết này hữu ích.
Các bài viết cùng tác giả

Raspberry Pi Thiên Lý Nhãn (Phần 4): Demo khóa thông minh nhận dạng khuôn mặt

Bài trước tui đã hướng dẫn các bạn chuẩn bị phầm mềm cho dự án khóa thông minh nhận diện khuôn mặt, cụ thể là phần training lấy dữ liệu bằng python. Bài này ta sẽ bắt tay vào phần cứng và demo thử xem dữ liệu training của ta tốt đến đâu.

lên
5 thành viên đã đánh giá bài viết này hữu ích.
Từ khóa: 

(Phòng chống) Nghệ thuật hắc ám với ESP8266 - Phần 1: Thích thì phát beacon hoy

ESP8266 là 1 module rất bá đạo cho việc truyền dữ liệu từ xa không dây. Tuy nhiên vì giá thành thấp và khả năng wifi khá tốt nên module này rất dễ bị lạm dụng vào các chuyện mờ ám. Đây là bài đầu tiên trong chuỗi bài chứng tỏ khả năng hắc ám của module này. Tui sẽ hướng dẫn các bạn phát beacon thông tin để quậy phá và cách phòng chống. Lưu ý là các bạn nên thực hành có trách nhiệm nếu không muốn cục tình báo C2 gõ cửa hỏi thăm.

lên
3 thành viên đã đánh giá bài viết này hữu ích.
Từ khóa: