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
3 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

ST7565 và ESP8266 - Màn hình LCD bự chà bá chưa đến 100k cho thế giới IoT

Mình rất thích LCD ST7565 này, và đã đặt liền 4 con mà mỗi con quá rẻ có 20k. Nhưng khổ một điều, điện áp hoạt động và IO của LCD ST7565 có 3.3V. Bản thân mình lại không thích việc chơi điện trở để chơi LCD này với Arduino. Lý do đơn giản là phải hàn quá nhiều, mình lại lười crying. Hổm nay, mình đang làm loạt bài về ESP8266 và cũng phải gặp vấn đề điện trở để làm cầu phân áp khi giao tiếp giữa ESP8266 và Arduino.

lên
17 thành viên đã đánh giá bài viết này hữu ích.

Thư viện ST7565 trên Arduino Create - Thử nghiệm đầu tiên: Hoàn hảo!

Mình rất tự hào và hãnh diện, khi thư viện made in Việt Nam đầu tiên của Thái Sơn (Nick Chung) được mình tải lên tại Arduino Create với mục đích thử nghiệm việc biên dịch code online trên Arduino Create đã hoàn thành công việc của nó ngay trong lần thử đầu tiên. Qua bài viết này, mình xin hướng dẫn các bạn lập trình Arduino với Arduino Create thông qua việc làm một ví dụ mẫu về việc cài thư viện và sử dụng nó trên Arduino Create.

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ả

(Phòng chống) Nghệ thuật hắc ám với ESP8266 - Phần 4: Thủ khoa đại học có khó?

Trong bài đầu tiên tui đã hướng dẫn các bạn hack kỳ thi quốc gia với module ESP8266. Dĩ nhiên là không ai cho các bạn cầm theo điện thoại vào phòng thi để mà các bạn mở lên tìm beacon đáp án. Tuy nhiên không ai cấm các bạn mang máy tính casio vào phòng thi cả. Bài này tui sẽ hướng dẫn các bạn gắn wifi vào chiếc máy tính casio huyền thoại để nhận phao thi từ bất kỳ nơi nào trên thế giới. Lưu ý là các bạn nên chế cháo có trách nhiệm, chớ nên kinh doanh buôn bán thành quả nếu các bạn không muốn cục tình báo C2 gõ cửa hỏi thăm. 

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

Lồng tiếng robot cho Raspberry Pi

Raspberry Pi là một board rất thích hợp cho các dự án robot thông minh. Ta có thể làm cho dự án của mình thêm sống động bằng cách phát ra các câu trả lời đơn giản. Bài này tui giới thiệu với các bạn 2 chương trình text-to-speech (chuyển chữ thành phiên âm) điều khiển bởi Python.

lên
15 thành viên đã đánh giá bài viết này hữu ích.