Thử làm model nhận diện diễn viên Ji A Vê trong video bằng Facenet

Chào anh em, đợt trước mình đã có giới thiệu qua về model Facenet tại đây. Tuy nhiên đó là bài làm việc trực tiếp trên source của Facenet để nếu anh em có train lại hay cấu hình, tinh chỉnh gì đó thì mới cần. Hôm nay tranh thủ rảnh rang chút mình triển khai bài toán nhận diện mặt trong video dùng Facenet pretrain trên Keras để anh em biết thêm 1 cách nữa nhé. Và cũng là để cho bài toán có tính chất thú vị, đỡ buồn ngủ thì mình có mời mấy em Japan Anti Virus gọi tắt là JAV về tham dự với vai trò làm model cho vui kaka.

Tóm tắt vấn đề:

  • Bài toán: Nhận diện diễn viên JAV trong video.
  • Các kiến thức sẽ học được:
    • Kỹ năng tách ảnh nhỏ từ ảnh to sử dụng slice numpy array
    • Kỹ năng cài đặt và triển khai model Facenet trên Keras

OK! Let’s go!

Đầu tiên là anh em tạo cho mình cái thư mục MìAI_JAV đã nào, chứa các thứ cho gọn. Sau đó là clone cái git về đã nhé

Xong thì cài đặt các thư viện bằng lệnh:

Cài xong thì anh em tải cái pretrain facenet.h5 về nhé. Link tải tại đây, tải về anh em copy vào thư mục có mấy file .py ấy nhé.

Phần 1 – Nói qua về Facenet trên Keras

Facenet thì quá nổi tiếng rồi và bữa trước mình đã có làm việc với project FaceNet by David Sandberg. Project này viết bằng TF và giờ có một đại ca khác convert sang Keras cho chúng ta tại đây FaceNet by Hiroki Taniai. Với anh em mới học thì cú pháp của Keras vẫn dễ đọc, dễ hiểu hơn thằng TF. Do đó hôm nay chúng ta sẽ sử dụng pretrain Facenet của bác này để làm việc nhé.

Phần 2 – Các bước triển khai model Facenet trên Keras

Nhiều bạn vẫn chưa hiểu khi sử dụng pretrain thế thì sẽ làm như nào, các bước ra sao nên mình cùng bắt đầu từng bước luôn nha.

Bước 1 – Tiền xử lý ảnh

Bài này nếu đúng ra phải collect ảnh của đầy đủ các diên viên, càng nhiều càng tốt, càng nhiều “tư thế” càng tốt thì kết quả sẽ cao hơn. Tuy nhiên đây là bản demo và đợt này mình cũng bận dự án nên chơi các lazy, mà nhờ cách lazy mà ta lại học thêm được một tý về xử lý ảnh.

Cách lazy của mình là kiếm 1 cái ảnh tổng hợp các “thánh nữ” như sau:

keras facenet mtccnn

Bây giờ cúng ta cần tách các khuôn mặt này ra thành các folder riêng, mỗi folder chứa ảnh 1 khuôn mặt để chút nữa train Facenet SVM cho dễ.

Đại khái chúng ta nhìn qua sẽ có 50 ảnh chia thành 10 cột và 5 dòng, chúng ta sẽ lặp và dùng slice để lấy riêng từng ảnh ra (và chú ý trừ độ cao đi 1 chút dể bỏ đi phần tên bên dưới hạn chế nhiễu khi train). Đoạn code như sau:

Sau khi xử lý xong chúng ta sẽ có được thư mục data/raw chứa đầy ảnh các em, mỗi em một folder. Các bạn chú ý tạo trước trong thư mục MiAI_JAV một thư mục data và một thư mục raw trong thư mục data đó nhé.

Công việc tiền xử lý mình để trong file preprocess.py.

Bước 2 – Trích xuất khuôn mặt từ ảnh raw

Với bài toán thông thường thì ảnh raw đầu vào sẽ phong phú và đa dạng lắm, đủ các tư thế đứng, ngồi, nằm với các chi tiết thừa xung quanh nên để có ảnh chất lượng để train chúng ta sẽ chỉ trích xuất đúng khuôn mặt thôi.

Ví dụ như sau:

keras facenet

Với bài toán này chúng ta không cần thực hiện việc đó vì mặt các em đã được CROP sẵn rồi, tuy nhiên với các bài toán khác các bạn cần chạy một đoạn script như sau để crop mặt và lưu sang thư mục data/processed với cấu trúc tương tự (mỗi em 1 folder và trong các folder chỉ còn mặt, các khúc khác bỏ đi).

Hàm trích khuôn mặt như sau:

Bước 3 – Tạo vector đặc trưng / embeding vector từ các khuôn mặt

Sau bước số 2 chúng ta đã có các khuôn mặt lưu trong data/processed. Bây giờ chúng ta sẽ tạo vector đặc trưng bằng cách sử dụng pretrain model keras-facenet. Nói nôm na là ta dưa ảnh qua cái pretrain model này và nhận đầu ra 1 vector đặc trưng cho cái ảnh đó.

Đầu tiền là load model facenet:

Sau đó chúng ta lặp qua các ảnh trong thư mục data/processed và tạo vector embeding lưu vào X_train. Ta cũng lưu label vào y_train và thực hiện LabelEncode cái y_train đó luôn (chuyển từ “Maria”, “Yuna”…. thành 0,1,2,3…).

Sau khi làm xong ta lưu các vector đó vào file faces_data.npz để dùng lần sau.

Bước 4 – Train model SVM để predict các em

Bây giờ ta tạo một model SVM, sử dụng kernel linear để classify mấy em này dựa vào chỗ vector đặc trưng đã tạo ở trên.

Sau khi train xong thì ta lưu vào file faces_svm.pkl để load ra dùng ở bước test nhé.

Tất cả các bước này các bạn xem trong file facenet_svm_train.py nhé.

Phần 3- Kiểm thử bằng cách nhận diện video Ji A Vê

Rồi bây giờ các bạn chuyển sang phase test. Về phase này thì chúng ta sẽ làm như sau:

Bước 1 – Load các model chúng ta đã train

Có model SVM và cái LabelEncoder đã lưu, chúng ta thực hiện load lên chờ sẵn:

Bước 2 – Đọc từng frame ảnh từ video và xử lý

Cách làm tương tự như phase train. Với mỗi ảnh có được chúng ta detect xem có mặt trong đó không, nếu có chúng ta sẽ đưa qua model facenet pretrain để lấy vector embedding.

Sau khi có vector đó rồi đưa vào model SVM đã train để nó classify ra là em nào và viết tên em ấy lên màn hình thôi 😀

Các bạn đọc chi tiết trong file facenet_svm_test.py nha!

Và thành quả của các anh em đây rồi, ảnh GIF luôn cho nó nóng 😀

keras facenet

Phần 4 – Tổng kết

Vậy là bài này mình đã chỉ anh em cách dùng facenet trên keras đơn giản hơn lần trước. Anh em có thể dùng cách này nếu như không có nhu cầu train lại Facenet bằng dataset của mình.

Tuy nhiên, bài này mình đang làm ở mức cơ bản nhất, anh em có thể tăng độ chính xác bằng cách search các keyword về : augment face, align face… để model chính xác hơn nhé.

Chúc anh em thành công! Hãy join cùng Mì AI nhé!

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

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

Leave a Reply

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