[Face Recog 2.0] Nhận diện khuôn mặt trong video bằng MTCNN và Facenet

Hello xin chào các anh em Mì AI Blog, sau bài đầu tiên về nhận diện khuôn mặt tại đây http://ainoodle.tech/2019/08/13/face-recognize-thu-lam-he-thong-cham-cong-bang-nhan-dang-khuon-mat/, rất nhiều anh em có comment là phương pháp triển khai, thuật toán trong bài đó có độ chính xác chưa cao.

Mình xác nhận điều đó, nhưng khi mới học thì nên bắt đâu từ những model đơn giản và dễ hiểu để nắm được khái niệm, sau đó sẽ nâng dần lên.

Hôm nay mình sẽ giới thiệu cùng các bạn một bài toán nhận diện khuôn mặt nữa nhưng sẽ áp dụng những công nghệ mới hơn như: phát hiện khuôn mặt bằng MTCNN, trích xuất đặc trưng băng Facenet và dùng SVM để classifier và nhận diện mặt. Nhờ đó, giải pháp lần này có nhiều ưu điểm so với lần trước như: nhận diện được mặt ở nhiều góc khác nhau, ko cần nhìn thẳng, nhận diện chính xác hơn, trích xuất được nhiều đặc trưng khuôn mặt hơn.

Công nghệ này áp dụng nhiều trong thực tế hơn các công nghệ sử dụng trong bài trước. Rồi bây giờ chúng ta sẽ đi tiếp nào.

Phần 1. Tìm hiểu khái niệm

Haiza, cứ nói đến khái niệm trên Mì AI là lại thấy sao sao. Nhưng thôi, vẫn phải định nghĩa qua để các bạn biết.

  • MTCNN là viết tắt của Multi-task Cascaded Convolutional Networks. Nó là bao gồm 3 mạng CNN xếp chồng và đồng thời hoạt động khi detect khuôn mặt. Mỗi mạng có cấu trúc khác nhau và đảm nhiệm vai trò khác nhau trong task. Đầu ra của MTCNN là vị trí khuôn mặt và các điểm trên mặt như: mắt, mũi, miệng…
  • Facenet là của ông Google giới thiệu năm 2015, và thằng model này thì mình cứ nhét ảnh vào (đúng size của nó) thì nó trả ra 1 vector 128 features cho 1 khuôn mặt. Sau đó dùng SVM để phân nhóm các vector đó vào các nhóm để biết vector đó là mặt của ai.

Thôi chắc đại khái thế nhỉ, anh em cần thêm tin chi tiết thì search google để tìm hiểu thêm hoặc comment trên group Mì AI để cùng trao đổi nhé.

Phần 2. Chuẩn bị nguyên vật liệu

Tạo thư mục và clone git:

Như thường lệ, anh em tạo 1 thư muc MiAI_FaceRecog_2 để lưu tất cả các món của bài này nhé. Sau khi tạo xong, anh em gõ lệnh sau để lấy mã nguồn về:

git clone https://github.com/thangnch/MiAI_FaceRecog_2 .

Chú ý có dấu chấm cuối dòng nhé.

Bây giờ các bạn tạo các thư mục như sau:

  • Tạo thư mục Dataset trong MìAI_FaceReg_2, trong đó tạo tiếp thư mục FaceData và dưới FaceData là tạo tiếp 2 thư mục raw và processed.
  • Tạo thư mục Models trong MìAI_FaceReg_2 để chờ sẵn tẹo lưu model sau.

Chuẩn bị ảnh khuôn mặt để train

Bây giờ các bạn sưu tầm ảnh của 2 người trở lên, mỗi người 10 tấm hình rõ mặt (tạm chấp nhận yêu cầu hiện tại của bài này là at least 2 người nhé, mình sẽ tìm hiểu thêm sau). Mình ví dụ 2 người tên là NguyenVanA và LeThiB nhé. Các bạn tạo 02 thư mục NguyenVanA và LeThiB trong thư mục raw và copy ảnh của 2 người vào riêng 2 thư mục đó, ảnh của ai vào thư mục của người đó nhé.

face collection
Ví dụ về các ảnh cần sưu tầm. Nguồn: https://towardsdatascience.com

Chú ý: Trong các ảnh bạn sưu tầm, chỉ có đúng 1 khuôn mặt của người đó, ko được có quá 1 khuôn mặt/ảnh nhé.

Ví dụ cây thư mục của mình để các bạn tham khảo:

|-FaceData
|---processed
|-----Hacd
|-----ThangnC
|---raw
|-----Hacd
|-----ThangnC

Cài đặt các thư viện cần thiết

Các bạn đứng ở thư mục MiAI_FaceRecog_2 chạy lệnh sau để cài tất cả các thư viện cần thiết:

pip install -r requirements.txt

Tiền xử lý dữ liệu để cắt khuôn mặt từ ảnh gốc

Với chỗ ảnh mà bạn đã sưu tầm bên trên, có thể là ảnh cả người, bây giờ chúng ta sẽ cắt riêng khuôn mặt ra để train nhé. Các bạn chuyển về thư mục MiAI_FaceRecog_2 và chạy lệnh :

python src/align_dataset_mtcnn.py Dataset/FaceData/raw Dataset/FaceData/processed --image_size 160 --margin 32 --random_order --gpu_memory_fraction 0.25

Chạy xong thấy nó hiển thị dạng “Total number of images: …” là thành công rồi đó. Các bạn để ý sẽ thấy có thêm thư mục processed có cấu trúc tương tự thư mục raw nhưng chỉ chứa dữ liệu khuôn mặt dã được xử lý. Ví dụ như ảnh dưới:

face detection
Tiền xử lý ảnh. Nguồn : https://towardsdatascience.com

Tải dữ liệu pretrain của Facenet về máy:

Các bạn tải weights pretrain về tại link này : Tại đây (nếu có khó khăn khi tải, các bạn bấm vào đây để xem hướng dẫn nhé). Sau khi tải xong về, các bạn copy toàn bộ file tải về vào thư mục Models, chú ý chỉ lấy file, bỏ hết các thư mục như hình bên dưới của mình (không có file facemodel.pkl như bên dưới đâu nhé, mình chụp nhầm chút).

model facenet pretrain

Okie rồi, vậy là các công cuộc chuẩn bị nguyên liệu và sơ chế đã xong. Bây giờ sang bước Train thôi nào. Nứng quá rồi!

Phần 3. Tiến hành train model để nhận diện khuôn mặt

Bây giờ các bạn chuyển về thư mục MiAI_FaceRecog_2 nếu đang đứng ở thư mục khác nhé. Sau đó chạy lệnh train:

python src/classifier.py TRAIN Dataset/FaceData/processed Models/20180402-114759.pb Models/facemodel.pkl --batch_size 1000

Bây giờ các bạn đi lấy một tách trà và ngồi đợi nhé, khi nào màn hình hiện lên chữ “Saved classifier model to file “Models/facemodel.pkl” là done! Chúng ta đã train xong rồi, tận hưởng thành quả thôi.

Phần 4. Tận hưởng thành quả

Hôm nay chúng ta sẽ kiểm thử model đã train với 2 nguồn video: một là từ webcam và 2 là nhận diện trong một file video có sẵn. Bắt đầu nhé

Kiểm thử với webcam:

Các bạn chạy file face_rec_cam.py bằng lệnh sau:

python src/face_rec_cam.py

Bạn đợi model load 1 chút và màn hình webcam sẽ hiện lên như sau, nhận chuẩn ra phết 😀

Rồi bây giờ chúng ta thử nhận diện qua video xem sao nhé. Các bạn chạy lệnh:

python src/face_rec.py --path video/camtest.mp4

Chú ý ở đây mình ví dụ với file camtest.mp4 của mình, các bạn có thể thử với bất kì file video nào của các bạn. Chú ý là giảm độ phân giải xuống tầm 320×200 hoặc 640×480 nếu máy bạn không có GPU hoặc cấu hình thấp nhé, ko là giật tung lên đấy 😀

Và đây là thành quả của chúng ta, các bạn hãy xem video bên dưới nhé:

Rồi như vậy các bạn đã sở hữu cộng cụ “gần như mạnh nhất” hiện nay để phát hiện khuôn mặt, các hệ thống chấm công đơn giản đã có thể chạy được rồi. Mình rất mong có nhiều hệ thống thực được các bạn triển khai từ sample này. Nếu có thành quả hoặc có khó khăn gì, các bạn cứ chia sẻ cùng Mì AI trên group nhé: Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup .

Còn bây giờ, xin tạm biệt. Trong bài sau mình sẽ viết về 1 vấn đề là chống giả mạo bằng hình ảnh/video trong nhận diện khuôn mặt nhé.

Chúc các bạn vui vẻ và thành công!

Fanpage: http://facebook.com/miaiblog
Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup
Website: http://ainoodle.tech
Youtube: http://bit.ly/miaiyoutube

mm
Nguyễn Chiến Thắng

Một người đam mê những điều mới mẻ và công nghệ hiện đại. Uớc mơ cháy bỏng dùng AI, ML để làm cho cuộc sống tốt đẹp hơn! Liên hệ: thangnch@gmail.com hoặc facebook.com/thangnch

Related Post

16 Replies to “[Face Recog 2.0] Nhận diện khuôn mặt trong video bằng MTCNN và Facenet”

  1. Hi anh Thắng!
    Em thử làm theo hướng dẫn của anh.
    1. Trên Mac OS thì ok.
    2. Trên Windows 10, Ubuntu 18, Google Colab bị lỗi giống nhau:
    Calculating features for images
    2019-09-12 07:24:19.714032: I tensorflow/stream_executor/platform/default/dso_loader.cc:42] Successfully opened dynamic library libcublas.so.10.0
    2019-09-12 07:24:19.976744: I tensorflow/stream_executor/platform/default/dso_loader.cc:42] Successfully opened dynamic library libcudnn.so.7
    Training classifier
    Traceback (most recent call last):
    File “src/classifier.py”, line 170, in
    main(parse_arguments(sys.argv[1:]))
    File “src/classifier.py”, line 96, in main
    model.fit(emb_array, labels)
    File “/usr/local/lib/python3.6/dist-packages/sklearn/svm/base.py”, line 147, in fit
    y = self._validate_targets(y)
    File “/usr/local/lib/python3.6/dist-packages/sklearn/svm/base.py”, line 521, in _validate_targets
    ” class” % len(cls))
    ValueError: The number of classes has to be greater than one; got 1 class

    Anh Thắng có gặp lỗi này chưa.
    Cảm ơn anh.

  2. Chào anh em muốn lập trình cho vi xử lý nhận biết vật thể cản trở đường đi qua 2 mắt camera thường và ra lệnh trực tiếp ( đơn giản thôi như : đá to , đường có ổ voi hoặc hố không thể đi được cho robot ). Thì có làm như trên được không ạ
    Code có nạp được vào vi xử lý không ạ hay phải đòi hỏi vi xử lý như thế nào ạ
    + đo khoảng cách để tự điều hướng thì có cần phải là camera chuyên dụng không ạ
    Cảm ơn anh trước ạ

    1. Phần này và đặc biệt là vi xử lý anh chưa nghiên cứu đến. Em post thử lên group xem có bạn nào có kinh nghiệm không nhé.

      Group trao đổi, chia sẻ: https://www.facebook.com/groups/miaigroup

  3. Em dùng Ubuntu 18.04, đến bước: Tiền xử lý dữ liệu để cắt khuôn mặt từ ảnh gốc
    Thì gặp lỗi:
    File “src/align_dataset_mtcnn.py”, line 35, in
    import align.detect_face
    ImportError: No module named align.detect_face

    Em thử export PYTHONPATH các thứ nhưng ko ăn thua ạ

  4. Bạn cập nhật lại nhé, vi nó sẽ install tf 2.0 và numpy 1.17.2 nên sẽ bị lỗi
    tensorflow==1.15.0
    scipy==1.1.0
    scikit-learn
    opencv-python
    h5py
    matplotlib
    Pillow
    requests
    psutil
    numpy==1.16.2

  5. mình đã thử train 3 folders của 3 người nhưng ra tới 4 classes. và khi detect thì chỉ hình người này nhận ra tên người khác (chỉ 1 người nhận ra, 2 người còn lại thì không detect được). Giúp mình với, thanks

  6. bạn thử đem cái detect_face.py ra ngoài cái src chứ đừng để trong file align nữa thử xem, mình làm v thì nó hết bị á

  7. anh thắng ơi cho em hỏi cái này lúc thêm người mới vô là phải train lai ảnh ca t cả luôn hay train ảnh người mới thôi ạ?

Leave a Reply

Your email address will not be published. Required fields are marked *