Tôi đã dùng Machine Learning để tán đổ nàng thế nào?
Bài viết của tác giả Đỗ Trọng Nguyên đăng trên giaosucan.blogspot.com Chuyện xưa kể lại rằng, ở một công ty phần mềm nọ, có một chàng thanh niên làm nghề Cuder. Là một fresher mới rời ghế nhà trường, lại tình cờ sân si một cô gái lạ mà không biết cách nào tán đổ nàng. Một đêm ngủ, ...
Bài viết của tác giả Đỗ Trọng Nguyên đăng trên giaosucan.blogspot.com
Chuyện xưa kể lại rằng, ở một công ty phần mềm nọ, có một chàng thanh niên làm nghề Cuder. Là một fresher mới rời ghế nhà trường, lại tình cờ sân si một cô gái lạ mà không biết cách nào tán đổ nàng. Một đêm ngủ, chằng nằm mơ thấy bụt mách nước, dùng Machine Learning để tán đổ nàng…
Vào một ngày nọ, trong lúc đang mải mê ngồi code thì vô tình chàng nhìn thấy một cô gái vô cùng xinh đẹp. Nàng có làn da trắng hồng, đôi mắt đen to tròn như mắt bồ câu, hàng lông mi dài cong vút và một mái tóc dài đen nhánh óng ả.
Chàng cuder ngây ngất trước vẻ đẹp của cô gái. Chàng rất muốn tìm hiểu thông tin về cô gái mà tủi thân phận mình nghèo nên chỉ dám ngắm nàng từ xa. Rồi chàng bỗng nảy ra một ý nghĩ
“Nếu mình có thể phát triển một ứng dụng, chỉ cần chụp hình một người và tự output ra thông tin người đó như tên, tuổi địa chỉ, facebook thì tuyệt vời làm sao”
Thế rồi, chàng đã dành thời gian nghiên cứu về các thuật toán face recognition như egeinface, face histograms, PCA (Principle Competent Analysis), LDA (Linear Discriminant Analysis) với mục tiêu làm được ứng dụng ấy. Tuy nhiên, chàng đã nhanh chóng nhận thấy những nhược điểm của thuận toán face recognition truyền thống.
Chất lượng hình ảnh
Chất lượng hình ảnh ảnh hưởng nhiều đến thuật toán mà chàng sử dụng. Vì nhà nghèo nên chàng chỉ có chiếc điện thoại cùi bắp, không phải là iPhone 6S camera FullHD nên mỗi khi chụp hình cô gái, hình ảnh chất lượng quá thấp làm cho thuật toán không detect được.
Kích thước hình ảnh
Sau khi mượn của BUL chiếc iPhone xịn để chụp hình cô gái, chàng lại gặp phải vấn đề. Do chụp trộm nên chỉ dám chụp cô gái từ xa, dẫn tới khi detect được mặt thì face size quá bé khiến thuật toán cũng không thể nhận dạng được.
Góc quay của mặt và ánh sáng(Face Angle)
Cô gái của chàng rất thích selfie với nhiều tư thế khác nhau. Lúc thì cười, lúc thì khóc, có lúc lại quay nghiêng quay ngửa, có lúc thì chụp trong phòng tắm, lúc thì trên giường ngủ, điều kiện ánh sáng thay đổi liên tục. Góc của khuôn mặt nàng cũng luôn thay đổi theo từng bức ảnh selfi, dẫn tới thuật toán cũng đành bó tay.
Performance
Bài toán xử lý ảnh luôn đòi hỏi phải performance cao, nhất là khi nhận dạng số lượng lớn mặt trong thời gian ngắn, đòi hỏi các thuật toán phải luôn được optimize. Đó là một vấn đề nan giải.
Chàng buồn lắm, nhưng vẫn không chịu bỏ cuộc. Rồi tình cờ, chàng tìm được một bài báo khoa học của Facebook giới thiệu công nghệ DeepFace sử dụng Deep Learning để nhận dạng khuôn mặt. Chàng đã tìm ra được giải pháp cho bài toán của mình đó là dùng Machine Learning.Chàng đã phát triển một ứng dụng gọi là Magic Mirror, chạy trên nền tảng Web, mobile và Desktop cho phép nhận dạng mặt của một người và output thông tin của người đó.
Đây là giải pháp mà chàng đã nghiên cứu
Kiến trúc
Client: Application chạy trên nền tảng Web viết bằng HTML5, Javascript
Mobile Application chạy trên nền tảng Android (có thể phát triển cross-platform trong tương lai)
Phần quan trọng nhất của hệ thống là Recognition Service thực hiện việc nhận dạng và trả về kết quả cho Client.
Webservice và Database sử dụng Web C#API và MSSQL, tất cả được deploy trên Amazon EC2 và Amazon RDS để tận dụng sức mạnh của nền tảng cloud computing.
Nguyên tắc hoạt động
Xây dựng dữ liệu
Do sử dụng Machine Learning để nhận dạng mặt, nên việc quan trọng đầu tiên là xây dựng tập dữ liệu để training. Nguồn dữ liệu lớn nhất chính là Google và Facebook.
Biết các cô gái hay có sở thích selfie rồi upload lên Facebook, cho nên đây là nguồn để tìm kiếm dữ liệu và thông tin dễ dàng nhất.
Câu hỏi đặt ra là dữ liệu lớn như vậy thì lấy bằng cách nào??
Chàng Cuder đã tìm ra một giải pháp đó là phát triển một Crawler có tính năng sau
Lấy tên một người bất kì nhập từ bàn phím hoặc từ CSV file
Tự động tìm kiếm trên internet và facebook để lấy tên tuổi thông tin, ảnh của người đó lưu trong máy tính
Giao diện của Crawler
User nhập Person Name vào và thực hiện tìm kiếm, Crawler cho phép chọn số lượng ảnh cần down, get ảnh về, dựa vào tên tìm ra địa chỉ Facebook của người đó, từ đó get ra luôn thông tin về tên tuổi, ngày sinh, địa chỉ. Những thông tin mà chàng muốn tìm kiếm.
Công nghệ sử dụng để phát triển Crawler cũng rất bình dân, developer nào cũng có thể tiếp cận. Đó là sử dụng Facebook Graph API, Bing Search API và một số thuật toán Crawler thông dụng như ParseHTML để làm.
Recognition Service
Sau khi đã có dữ liệu, giờ là lúc cần phát triển module nhận dạng. Chàng Cuder đã tìm ra 2 giải pháp
Microsoft Cognitive Service : Một service do Micrsoft phát triển, cung cấp một bộ các API ứng dụng trí tuệ nhân tạo thông minh cho phép xử lý hình ảnh, âm thanh, giọng nói. Tóm lại là All in One. Đây là cách làm đơn giản vì chỉ cần gọi API, nhưng có nhược điểm là phải trả phí sử dụng dịch vụ.
OpenFace: Một framework về nhận dạng mặt sử dụng deeplearning, viết bằng torch và python. Chàng cuder viết code và deploy service của mình trên một máy Linux server có GPU mạnh để thực hiện việc training.
Training
Sau khi đã có đủ dữ liệu, và recognition service thì cần phải thực hiện training. Chàng cuder sử dụng giải pháp Training có giám sát (Supervised training)
Supervised learning là thuật toán dự đoán đầu ra (outcome) của một dữ liệu mới (new input) dựa trên các cặp (input, outcome) đã biết từ trước. Cặp dữ liệu này còn được gọi là (data, label), tức (dữ liệu, nhãn). Supervised learning là nhóm phổ biến nhất trong các thuật toán Machine Learning.
Để tránh tình trạng chương trình “học vẹt” nên chàng Cuder chỉ dùng 90% data để train, còn 10% dùng để test dữ liệu
Một ảnh dữ liệu được đưa vào và gán nhãn ví dụ “Hoàng Thùy Linh”
Khi một ảnh được đưa vào training, service sẽ thực hiện detect khuôn mặt, rồi generate ra một vector đặc trưng của khuôn mặt
Ví dụ như cô gái Hoàng Thùy Linh ở trên có đặc trưng của mặt là (Mặt trái xoan, mắt bồ câu, mũi tẹt…)
Khi thực hiện test, một ảnh dữ liệu bất kỳ được đưa vào, service sẽ extract vector đặc trưng ở trên rồi so sánh với những gì đã được training để xác định đó có phải là Hoàng Thùy Linh hay không
Sau khi được training, service sẽ generate một faceID và gán cho khuôn mặt đó sau đó lưu vào trong database Microsoft SQL Server cùng với tên tuổi, link facebook…
Chạy Test
Ứng dụng mobile hay desktop sẽ chụp hình khuôn mặt hoặc đơn giản là lấy trên internet sau đó gửi tới service để thực hiện nhận dạng. Nếu service nhận ra khuôn mặt nó đã được training thì sẽ trả về faceID tương ứng, còn nếu không thì trả về null.
Ứng dụng sẽ call Restful API request tới web service tới faceID ở trên. Web Service truy cập vào cơ sở dữ liệu và trả về thông tin. Ứng dụng hiển thị thông tin → done.
Từ ngày phát triển ứng dụng này, chàng Cuder đã tìm được Facebook và thông tin của cô gái. Chàng đã có đủ can đảm để làm quen với nàng. Cô gái vô cùng khâm phục tài năng của chàng Cuder và đem lòng yêu chàng.
Cuối năm đó hai người làm đám cưới và sống hạnh phúc đến trọn đời.
Techtalk Via Giaosucan