Series Nhận diện Idol: Phần 4.1 – Lý thuyết và cơ chế nhận diện khuôn mặt

Toàn bộ series Nhận diện Idol:

Ở phần 3, chúng ta đã có cơ sở dữ liệu của các VAV Idol xinh đẹp. Ở phần này, ban đầu mình cũng định hướng dẫn các bạn sử dụng trực tiếp API của Microsoft luôn.

Tuy vậy, mình nhận được nhiều feedback dạng: Sau không hướng dẫn cách code từ đầu bằng thuật toán mà lại sử dụng API? Xài API có gì hay ho cao siêu đâu?

filtered

Ờ mà cũng đúng thật, dùng API có gì cao siêu đâu nhỉ? Bản thân mình cũng không muốn các bạn chỉ biết cắm đầu dùng API mà không rõ cơ chế hoạt động bên trong.

Nhận diện khuôn mặt là một trong những ứng dụng phổ biến của Machine Learning. Nguyên tắc hoạt động của chúng cũng khá thú vị nên biết thêm một chút cũng không hại gì. Thôi thì tiện tay mình thêm tí “Học thuật” vào bài viết cho nó phức tạp hơn vậy.

Các bạn chịu khó đọc kĩ nguyên lý trước khi nhảy vào code nhé.

Vài lời về chuyện dùng API hay tự viết

  • Thuật toán nhận diện khuôn mặt đã có cách đây… vài chục năm rồi. Việc implement thuật toán, code mẫu v…v rất dễ dàng tìm được trên mạng. Bản thân mình cũng từng tự implement từ đầu các thuật toán nhận diện này trên C++, MATLAB và C#. Xét cho cùng, việc tự tìm hiểu thuật toán, xem code mẫu và implement lại cũng… có gì hay ho cao siêu hơn dùng API đâu?
  • Newton cũng tự nhận là muốn nhìn xa phải biết đứng trên vai người khổng lồ. Sao phải mất thời gian ngồi code đi code lại những thứ người khác đã làm… mấy chục năm trước?.
  • Machine Learning là một lĩnh vực rất rộng lớn, phức tạp, cần nhiều thời gian để nắm vững. Đó là lý do Microsoft cho ra đời Cognitive API, giúp các công ty vừa và nhỏ hoặc developer ít kinh nghiệm có thể áp dụng thành quả của Machine Learning. Việc bạn code tay rồi khinh người khác dùng API  chẳng khác gì bạn tự leo Phanxipang rồi khing những người bỏ tiền đi cáp treo vậy =))
  • Chuyên ngành của mình là Software Engineer, xây dựng phần mềm, chứ không phải là Computer Scientist, nặng về nghiên cứu. Do đó hướng chủ đạo của bài viết nhằm vào xây dựng hệ thống, giao tiếp giữa các thành phần chứ không nặng về thuật toán nhận diện.

screen-shot-2017-01-07-at-9-31-08-pm

Tuy vậy, bạn nào muốn chứng tỏ khả năng bản thân cứ viết bài chuyên sâu về thuật toán và cách code từ đầu, sau đó gửi mail cho mình nhé, mình sẽ bổ sung thêm vào bài viết ;).

Nhận diện hay “phát hiện”

Việt Nam ta chỉ dùng thuật ngữ “Nhận diện khuôn mặt” thật ra cũng không chính xác lắm. Trong thực tế, quá trình nhận diện bao gồm 2 quá trình chính là Face Detection (Tạm gọi là Phát hiện khuôn mặt) và Face Recognization (Nhận diện khuôn mặt). Mỗi quá trình lại sử dụng những thuật toán khác nhau.

1. Face Detection: Đây là quá trình phát hiện khuôn mặt trong ảnh. Các máy ảnh, camera smartphone hiện tại đều có chức năng này.

Có khá nhiều cách để phát hiện khuôn mặt: Thông qua màu sắc, cử động hoặc qua góc cạnh trong ảnh,…. Tuy nhiên, thuật toán được sử dụng phổ biến nhất hiện nay là Viola-Jones (Thư viện OpenCV hỗ trợ nhận diện khuôn mặt theo thuật toán này).

Thuật toán này bá đạo ở chỗ nó không chỉ nhận diện được khuôn mặt mà còn có thể nhận diện được đồ vậy, hình dạng. Cơ chế của nó khá đơn giản:

  • Tạo ra một frame hình vuông, lần lượt di chuyển frame này khắp tấm ảnh gốc.
  • Mỗi khi frame di chuyển, check xem khu vực trong frame có phải là khuôn mặt hay đồ vật hay không. (Bằng cách check các vùng sáng tối trong frame).
  • Sau khi di chuyển hết tấm ảnh, tăng kích cỡ frame lên và scan lại từ đầu.
  • Dừng thuật toán khi frame đủ lớn.

Nghe đơn giản vậy, nhưng đi sâu vào nghiên cứu các bạn sẽ thấy nó khá rắc rối với các thuật ngữ như: Haar Feature, Adaboost Training. Hệ thống phải được train với vài ngàn đến vài chục ngàn tấm ảnh để tìm ra đặc điểm của khuôn mặt người.

Tóm lại, dữ liệu đầu vào của quá trình này là một tấm ảnh. Dữ liệu đầu ra là vị trí và kích cỡ của các khuôn mặt trong ảnh.

 

2. Face Recognition: Đây mới là quá trình “nhận diện khuôn mặt”. Từ kết quả của phase trước, ta đã có các khuôn mặt trong ảnh. Các khuôn mặt này sẽ lần lượt được so sánh với các khuôn mặt đã có trong cơ sở dữ liệu để tìm khuôn mặt giống nhất.

Trên Facebook, những hình vuông trắng trắng sau khi up ảnh là kết quả của quá trình Face Detection. Facebook sẽ so sánh khuôn mặt trong hình vuông đó với khuôn mặt của những người quen của bạn và tìm khuôn mặt giống nhất.

Có vô số thuật toán nhận diện khuôn mặt, chúng được phát triển dựa trên các thuật toán cơ sở như: PDA, LCA, MDA, Kernel Method… Gần đây nhất Facebook vừa giới thiệu thuật toán DeepFace với độ chính xác khá… ảo diệu, vượt trội hơn hẳn các thuật toán trước đó.

screen-shot-2017-01-07-at-10-12-42-pm
Performance thuật toán DeepFace của Facebook

Từ thuật toán đến API

Như các bạn đã thấy, việc đọc hiểu và implement thuật toán khá rắc rối và phức tạp, do đó người ta tạo ra API và thư viện. Một thư viện khá nổi tiếng, được cộng đồng sử dụng nhiều là OpenCV. OpenCV có thư viện cho C++, Java, C#. Theo kinh nghiệm của mình, thư viện này cài đặt cũng hơi rườm rà và chạy cũng khá nặng.

Với Microsoft Cognitive API, ta chỉ cần dùng RestAPI mà không cần cài đặt gì. Để đơn giản hơn cho người dùng, Microsoft API đã abstraction các thuật toán họ sử dụng nên ta có thể dùng API mà không cần quan tâm họ dùng thuật toán gì. Điều này có lợi là giúp API dễ tiếp cận hơn, nhưng cũng gây khó chịu cho những người muốn optimize để tăng độ chính xác.

Kết

Định thêm một số code minh họa cơ mà phần “giải trình” và “học thuật” chiếm hết bài viết rồi, thôi thì chúng ta cùng xem code minh họa ở bài sau nhé. Để chuẩn bị trước, các bạn có thể tự tìm hiểu về Face API của Microsoft ở đây nhé: https://www.microsoft.com/cognitive-services/en-us/face-api

 

Để tăng thêm tính “học thuật” cho bài viết, xin tặng thêm cái slide Prezi về nhận diện khuôn mặt ngày xưa của mình làm cho đồ án tốt nghiệp Đại Học . Chắc từ nay mình phải thêm chất “học thuật” vào bài viết kẻo người ta tưởng mình là Thạc Sĩ mà không có khả năng “học thuật” :'(.

screen-shot-2016-12-22-at-8-56-14-pm
http://prezi.com/ner6sbul49bk/?utm_campaign=share&utm_medium=copy&rc=ex0share

Một số link tham khảo:

20 thoughts on “Series Nhận diện Idol: Phần 4.1 – Lý thuyết và cơ chế nhận diện khuôn mặt”

  1. Một series bài viết thì nó có một mục đích cố định, hướng một đối tượng cố đinh :v Mấy ông muốn nghiên cứu thuật toán nhận diện khuôn mặt thì ra google gõ vô tìm. Ai cứ đòi vô đây cao siêu chứ em ở đây để nhận diện idol thôi :v

    Liked by 1 person

    1. Bạn Google OCR – Optical Character Recognition nhé. Hiện tại api nhận diện chữ tiếng Anh rất nhiều và độ chính xác khá ổn. Nếu tiếng Việt thì chắc là hơi khó vì chưa có.

      Like

  2. Tôi thề là mấy tên anti kia là fresher hoặc junior hoặc rất nông cạn. Việc dùng api hay tools có sẵn để tạo thành sản phẩm hoàn chỉnh là cả một cuộc quá trình gian khổ đấy.

    Liked by 1 person

  3. cám ơn Hoàng đã cho ra những bài blog chất lượng như vậy, rất thích đọc blog của Hoàng nhưng toàn đọc rồi thôi, mà hôm nay thấy những feedback mà Hoàng đưa ra trong bài này thì đành phải comment. Rất ít các devs Việt đóng góp cho cộng đồng mà toàn chê bai người khác, lấy ví dụ như trên stackoverflow cộng đồng người Việt rất ít đó là tính rất xấu chỉ muốn nhận mà không muốn chia sẽ. Thay vì chăm chăm chê bai người khác thì tại sao lại không học hỏi lẫn nhau để cùng tiến bộ.

    Liked by 2 people

  4. Cảm ơn bạn đã chia sẻ! Bài viết rất tuyệt (y) Không quá nặng phần học thuật hay đậm chất hàn lâm và giúp cho người đọc nắm được khái quát cách xử lý sơ bộ bên trong những API đó. Còn nếu chỉ đơn thuần dừng ở mức “hướng dẫn sử dụng API” thì nó sẽ khá sơ sài (dù mình không đủ background CS hay software engineering nhưng vẫn có cùng quan điểm với người bình luận bị che mặt :v) 😉

    Like

  5. Bác ơi, thế giờ e muốn biết Face API sử dụng phương pháp gì để nhận diện thì có cách nào biết đc k ạ?

    Like

  6. Cám ơn Hoàng, bài viết rất hay, rất hữu ích cho các bạn làm về Architecture. Mặc dù mình thạc sỹ bên Data Science, nhưng mình hiểu được value thật sư mà series này mang lại. Mình học được rất nhiều kiến thức từ các series của Hoàng. Chúc Hoàng có nhiều sức khỏe và cho ra nhiều bài viết hay như thế này nữa.

    Liked by 1 person

  7. Đàu tiên cảm ơn Hoàng về các kiến thức đã chia sẻ rất bổ ích.
    Mình có thử dùng thư viện OPENCV để Face Detection và Face Recognization, nhưng kết quả thật sự không được tốt (Detection có vẻ ổn còn train data và Recognization không được tốt). Cho mình hỏi có phải thuật toán nhận diện khuôn mặt OPENCV không phải là duy nhất để cho ra kết quả mong đợi không ạ, có nghĩa là dùng OPENCV để Detection và dùng thuật toán khác để training data và nhận diện khuôn mặt chính xác hơn!
    Thanks!

    Like

  8. Xin chào mọi người, Mình đang cần nhận diện trong bức ảnh tìm được con người bao gồm cơ thể và khuôn mặt, muốn nhận diện màu da, màu mắt, màu tóc thì tiếp cận như thế nào ạ ? Mình xin cảm ơn

    Like

  9. Lập trình viên có gì là cao siêu đâu. Giờ đây lập trình viên cũng như người đánh máy, gõ lại theo mẫu thôi…. Bạn có thể học lập trình trong 6 tháng, học tiếng anh trong 6 tháng và đạt được cấp độ tương đối. Bởi vì lập trình bây giờ các công cụ support đến tận răng rồi, các thư viện, API có sẵn hết rồi.
    Trên mạng đầy những quảng cáo học lập trình trong 3 tháng, 6 tháng có việc làm nhưng không bao giờ có mục học toán trong 3 tháng, 6 tháng cả. Đủ để biết lập trình dễ như thế nào rồi (trừ những lĩnh vực AI, đồ hoạ…)
    Và trên các phương tiện truyền thông lúc nào cũng nói thiếu lập trình viên tất cả chỉ là lừa đảo. Vì sao? Vì những lập trình viên già, có kinh nghiệm thì phải trả lương cao trong khi thuê các lập trình viên trẻ thì mức lương sẽ thấp vẫn chỉ là soạn code thôi thì cần gì lão luyện chứ? Thế nên các lập trình viên già phải chuyển nghề, phải bị sa thải là vì thế. Không phải vì họ không theo kịp mà vì phải tăng lương cho cùng công việc đánh máy!!!!

    Like

Leave a comment