Nhận diện khuôn mặt sử dụng DEEPID1
Nhận diện khuôn mặt giờ đây đã trở nên rất phổ biến. Các bạn dùng facebook khi tag mặt bạn bè một thời gian sau khi bạn upload ảnh có người đó, facebook sẽ biết đó là người bạn của bạn. Tương tự như Android và Iphone hiện tại cũng sử dụng mắt hoặc mặt để mở khóa màn hình! Có khá nhiều công nghê ...
Nhận diện khuôn mặt giờ đây đã trở nên rất phổ biến. Các bạn dùng facebook khi tag mặt bạn bè một thời gian sau khi bạn upload ảnh có người đó, facebook sẽ biết đó là người bạn của bạn. Tương tự như Android và Iphone hiện tại cũng sử dụng mắt hoặc mặt để mở khóa màn hình! Có khá nhiều công nghê được sử dụng để nhận diện khuôn mặt mà các "ông lớn" đã và đang sử dụng, hôm nay mình sẽ giới thiệu 1 loại model được sử dụng để nhận diện khuôn mặt là DEEPID1.
1. Đặt vấn đề
Deeplearning là một trong những cách tiếp cận hiệu quả của Machine Learning Một mạng noron được cấu thành từ các lớp mạng xếp chồng lên nhau Có nhiều loại mạng khác nhau áp dụng cho các trường hợp khác nhau như : * CNN (convolutional neural network) thường được sử dụng cho xử lý về ảnh * RNN (Recurrent Neural Networks) thường được sử dụng xử lý ngôn ngữ tự nhiên * LSTM (Long short-term memory) là mô hình cải tiến từ RNN
2. Convolutional Neural Network
CNN (Convolutional Neural Network) là mạng tích chập được sử dụng phổ biến nhất cho việc xử lý liên quan đến ảnh Sự kết hợp : * Các lớp convolution. * Các hàm kích hoạt phi tuyến như ReLU , Sigmod * Backpropagation ( lan truyền ngược)
- Convolution
Mô hình hóa mạng tích chập bằng hình ảnh dưới đây: Ma trận màu vàng gọi là cửa sổ trượt ( ở vd này là 3x3, kích thước cửa sổ tùy thuộc vào việc hình ảnh của bạn có thay đổi quá nhiều trong một khoảng không gian ngắn hay không) , nó sẽ trượt qua cả ma trận xanh để thu được ma trận màu hồng bên phải
- Một số hàm kích hoạt phi tuyến
- Một số model sử dụng cho nhận diện khuôn mặt
* DeepID1 * DeepID2 * DeepID3 * Face++ * VGGFace
Tuy nhiên để dễ và nhẹ nhất mình sẽ sử dụng DEEPID1
3. Mô hình mạng của DeepID1
Mô hình có input đầu vào là ảnh 39x31 và là sự kết hợp của các lớp như convolution , ReLU , Max-pooling,Full-connected,.... để tạo thành 8 lớp chính * Lớp 1 : Convolutional (4x4x20) * Lớp 2 : Max-pooling (2x2x20) * Lớp 3 : Convolutional (3x3x40) * Lớp 4 : Max-pooling (2x2x40) * Lớp 5 : Convolutional (3x3x60) * Lớp 6 : Max-pooling (2x2x60) * Lớp 7 : Convolutional (2x2x80) * Lớp 8 : Full-connected Ví dụ cách thức hoạt động của các lớp
- Lớp convolution :
Ví dụ với lớp đầu tiên: có 20 cửa sổ 4x4 , được hiểu là 20 x 3 ( độ sâu bằng số ma trận phía trước là 3 vì đầu vào là ảnh mầu có 3 ma trận tương ứng R G B) => có 60 ma trận , sau khi qua lớp này ta thu được 20 ma trận mới (mỗi ma trận là tổng của 1 ma trận 4x4 có độ sâu là 3 (độ sâu là 3 tương ứng với có 3 ma trận 4x4 , như ảnh trên và mỗi ma trận lại convolution với 1 ma trận tương ứng của lớp trước rồi tính tổng lại)
- Lớp ReLU :
Trong model này không sử dụng nhưng trong các model khác sẽ thường đi ngay sau lớp convolution , mỗi ma trận sau khi qua lớp convolution sẽ đi qua lớp ReLU để phi tuyến tính
- Lớp Max-pooling :
Ví dụ với lớp thứ 2: Max-pooling thì không có độ sâu , trượt trên ma trận nào thì sinh luôn ra 1 ma trận mới
- Lớp Full-connected :
Ví dụ với lớp thứ 8 : là 1 lớp nó gần giống với convolution , nhưng khác là ma trận cửa sổ trượt của lớp này sẽ có kích thước bằng ma trận của lớp trước, số lượng ma trận của lớp này bằng đúng với số lượng label cần phân loại (để trả ra giá trị tương ứng cho từng label)
- Lớp Soft-max :
Lớp sau cùng để chuyển các giá trị đã nhận được sau 3 lớp đầu về dạng % , theo công thức công thức dưới dạng Neural Network như sau
Để tăng độ chính xác, sau khi train các mạng noron sẽ có cơ chế lan truyền ngược để tự động điểu chỉnh các tham số , để train mạng ta dùng 1 list ảnh có sắn tương ứng với label có dạng là một vector One-Hot
4. Ý tưởng thực hiện
Chia tập dữ liệu đã thu thập thành 2 phần: Tập train và tập test với tỉ lệ 80:20 và thực hiện crop nhận dạng khuôn mặt cho các ảnh. (Ở đây mình sẽ không nhắc tới phần crop khuôn mặt)
- Với tập train Bước 1: Từ ảnh đầu vào thực thiện crop ảnh về kích thước 39x31 và thực hiện gán nhãn cho các ảnh Bước 2: Đưa tập input và gán nhãn biến ảnh về dạng ma trận ảnh (trong code mình có lưu thành file TFRecord) Bước 3: Đưa vào training với model DEEPID1 với batch-size = 32
- Với tập test Bước 1: Từ ảnh ban đầu đưa vào face_recognition để tiến hành crop và resize khuôn mặt Bước 2: Dưa vào dự doán sử dụng DEEPID1, khi đó chúng ta sẽ nhận được nhãn của ảnh
5. Đánh giá
Với 100 ảnh train mỗi epoch và tổng cộng là 100 Epoch epoch 100: accuracy: 0.561753 - loss: 1.13073 Độ chính xác này khá thấp nên ta train lại với tập model đã nhận được Sau 3 lần train lại như vậy, ta nhận được 1 kết quả accuracy: accurracy 0.956175 - loss: 0.275992 Tuy kết quả tốt hơn nhưng với nhiều lần train có thể dẫn tới overfitting (kết qủa tốt hơn với tập train nhưng lại kém đi so với tập test)
Tham khảo code tại https://github.com/DoanVanToan/AIProject