Ở bài viết trước, mình đã giới thiệu về sự ra đời của Nhận Diện Idol. Ở phần này, mình sẽ tập trung về khía cạnh techincal như kiến trúc tổng thể và công nghệ sử dụng trong ứng dụng nhé.
Toàn bộ series Nhận diện Idol:
- Phần 1 – Chuyện ngày xưa – về sự ra đời của Nhận Diện Idol
- Phần 2 – Kiến trúc và các công nghệ sử dụng
- Phần 3 – Nào mình cùng đi cào dữ liệu
- Phần 4 – Nhận diện khuôn mặt với Microsoft Cognitive Service
- Phần 5 – Testing thuật toán – Sự thật về độ chính xác 60-80%
- Phần 6 – Từ demo tới deploy – Vô Thai Kiếm (Serverless Architecture)

Quá trình làm app
Toàn bộ quá trình làm app mất khoảng 3 ngày, từ việc lên ý tưởng cho đến thực hiện, thêm 1 ngày beta test là 4 ngày.
Bước 1 – Thu thập dữ liệu
Trái với dự đoán của mình, đây là bước… khó khăn nhất. Trên internet không có API, database hay bất cứ trang web nào tổng hợp thông tin về các idol cả. Sau một khoảng thời gian lùng sục, tìm kiếm mình cũng đã tìm được một trang khá tốt với thông tin của hơn 15000 idol.
Tuy vậy, để nhận diện tốt, mỗi idol cần ít nhất là 20-30 tấm ảnh. Limit của API Microsoft bản free là 1000 người, Do vậy mình chỉ lọc lấy top 2000 idol hot nhất để làm dữ liệu mẫu. Tất nhiên, với lượng dữ liệu lớn như vậy, mình không thể lưu bằng tay mà viết một chương trình nhỏ để sau đó crawl dữ liệu.

Bước 2 – Dùng dữ liệu để train và test
Có dữ liệu rồi thì chỉ cần submit dữ liệu API của Microsoft Recognitive Service để train thôi. Do limit của API free là 20 request/phút, mình phải viết 1 chương trình nhỏ để submit, sau đó bỏ lên VPS cho nó chạy suốt đêm (10000 tấm = 500 phút = Hơn 8 tiếng).
Tuy nhiên, mình không submit hết toàn bộ mà chỉ submit 90% dữ liệu (training set), để lại 10% dữ liệu để test (test set). Bạn nào học Machine Learning sẽ biết kĩ thuật này (sẽ nói rõ hơn trong phần 5).
Độ chính xác của thuật toán vào khoảng 60-75%, khá ổn so với việc “mò kim đáy biển”. (Đây chỉ là true positive, số liệu negative sẽ có trong phần 6 nhé).

Bước 3 – Xây dựng API
Từ dữ liệu này, mình viết một dựng RestfulAPI cho phép đưa URL của ảnh vào, lòi diễn viên JAV ra. Mình có thể gọi API từ web, console hoặc app di động, nên tương lai nếu mình muốn làm app di dộng cho ứng dụng cũng rất đơn giản.
Bước 4 – Thiết kế UI
Hoàn thành xong API, việc làm một website rất nhanh chóng. Sau nửa ngày hí hoáy là mình đã hoàn thành Nhận Diện Idol. Gắn thêm Firebase và Google Analytics các kiểu để phân tích là xong rồi.
Kiến trúc tổng thế và công nghệ sử dụng
Vốn định làm hai phần riêng biệt, cơ mà do kiến trúc liên quan nhau nhiều quá nên gom chung lại vậy. Đọc xong phần trên thì bạn cũng mường tượng được quá trình làm app và các thành phần chính rồi. Ta cùng tìm hiểu kiến trúc tổng thế của app nhé.

1. Crawler: Mình viết con crawler này để thu thập dữ liệu và submit dữ liệu lên Microsoft API. Do nhà nghèo, ko có điều kiện cài Win nên mình dùng .NET Core để viết con Crawler này chạy trên Mac, sẵn tiện chứng mình rằng .NET vẫn chạy ngon trên các hệ điều hành khác.
2. Recognize API: Đây là API thần thánh của Microsoft. Mình tạo 1 list các idol, mỗi idol post vài chục tấm ảnh làm dữ liệu, sau đó cho máy bắt đầu train (Sẽ nói kĩ hơn trong phần 4).
3. Idol Database: Database chứa thông tin các idol là 1 file JSON được lưu trữ trên Amazon S3. Lý do là vì định dạng này dễ lưu, dễ đọc, dễ chỉnh sửa, không cần dùng thư viện. Một phần cũng do mình lười viết code insert dữ liệu, cứ dump hết ra cho nhanh.
4. Cache Server: Gọi API của Microsoft sẽ khá tốn tiền (1000 call/1.5 $). Để tiết kiệm, API của mình có áp dụng Redis Cache để … tiết kiệm tiền, thay vì gọi API của Microsoft thì kiểm tra kết quả trong cache trước đã. Azure cũng có Redis Cache nhưng giá 10$/tháng nên mình đành ngậm ngùi dùng của Amazon Web Service EC2.
5. API chính: API này nhận vào URL của hình ảnh, gọi API của Microsoft, tra dữ liệu trong Idol Database và trả kết quả JSON về. Vốn lười, mình không muốn viết code rồi deploy lên server riêng. Vì vậy, mình dùng Azure Function. Với Azure Funtion, mình chỉ cần viết code, Azure sẽ tự lo mọi việc từ Server cho đến RAM, tự động Scale khi cần. Mỗi tháng còn được 4 triệu request miễn phí để dùng thả giàn nhé.
6. Website: Do toàn bộ xử lý đều nằm trong API, mình chỉ việc viết file HTML tĩnh và sử dụng Github Pages để host. Server Github thì không lo các trò DDOS v…v, ngàn user cùng lúc cũng chơi tốt.
Nhằm tiết kiệm thời gian code và design, mình dùng AngularJS kết hợp với Semantic-UI tạo giao diện. Để hiển thị realtime feed, mình sử dụng Firebase và thư viện đi kèm. Do chưa có API upload, lười nên mình nhét API của Cloudinary vào luôn.
Kiến trúc này hơi over-engineering, một phần là do “thiếu tiền”, một phần do mình muốn test công nghệ. Đừng lo, trong phần hướng dẫn, mình sẽ lượt bớt một số thành phần để đơn giản hóa, giúp các bạn dễ làm theo hơn.

Phần 2 đến đây là hết rồi! Cùng chuẩn bị tinh thần làm theo hướng dẫn của mình để code ra “Nhận diện Idol v2” ở những phần tiếp theo nhé.
Mỗi công nghệ mình đều có đính kèm link để các bạn tìm hiểu. Nếu có câu hỏi gì các bạn cứ đăng trong phần comment nhé.
Em hơi thắc mắc về phần Redis cache, không biết anh dựa vào gì để kiểm tra kết quả trong cache vậy?
LikeLike
Dựa vào image url e nhé
LikeLike
e hiểu rồi thanks a 😀
LikeLike
😀 lúc đọc em còn tưởng anh kiểm tra bằng md5 cơ
LikeLike
Chào bạn, bạn có thể cho mình hỏi quy trình nhận diện khuôn mặt của Face API được không ạ ? Với lại mình chưa hiểu chỗ dữ liệu khi trainning thì nó sẽ lưu ở đâu trên Cloud của Azure hay như thế nào ạ ? Cảm ơn bạn
LikeLike
Bạn xem mấy phần sau nhé
LikeLike
Hay quá ạ
LikeLike
Do nhà nghèo, ko có điều kiện cài Win =))
LikeLiked by 1 person
code của angular 1, ảnh của angular 2 ạ 😅
LikeLike
Ơ Angular2 nó đổi logo à, a tưởng logo 2 thằng như nhau chứ 😅
LikeLike
vâng, ảnh hiện tại anh minh họa là của angular 2 :p
LikeLike
API Microsoft bản free là 1000 người sao anh xử được 2000 idol nhỉ? Mà mỗi idol tầm 20 – 30 ảnh nữa chứ?
LikeLike
Hiện tại anh chỉ mới upload 500 người thôi :D. Vả lại xài account Azure 20$/tháng thì upload thoải mái, ko bị limit.
LikeLike
Em thấy có gói $0.5/ 1000 hình. Anh có thể cho more detail về gói anh đang dùng không? Nếu dùng gói $20 mà mình vẫn dùng Face API tier free được không anh Hoàng? 😀
LikeLike
Anh dùng gói này, mỗi tháng được tặng 20$, cứ thế mà phang API có phí thôi:
https://www.visualstudio.com/dev-essentials/
Sau khi đăng kí API có phí trên Azure, em có thể vào mục pricing chuyển lại thành Free được 😀
LikeLiked by 1 person
Phí store ảnh ($0.5/1000 ảnh) là tính ảnh mình lưu khi train thôi hay tính cả ảnh store khi user reuqest nữa anh? (khi user request thì API sẽ lưu 1 face trong 24h để lấy face ID rồi pass qua cho thằng identify)
LikeLike
Phí lưu khi train thôi em, tính theo tháng. User request thì tính phí theo mỗi 1k request. Face từ request sẽ được xóa sau 24h nên không tính phí store.
LikeLiked by 1 person
Bạn làm tut hướng dẫn chi tiết một tí nhé. Mình cũng muốn làm thử. Bạn làm có mất chi phí gì cho dịch vụ nào đó không vậy.
LikeLike
Giai đoạn test thì không cần. Giai đoạn deploy thì mình dùng account Azure. Account này free nhưng cần credit card mới đăng kí được bạn :D.
LikeLike
Microsoft Cognitive Service được sử dụng là chuẩn rồi, mỗi là MS limit free 😀
LikeLiked by 1 person
Không liên quan nhưng lên báo rồi nha a Hoàng : http://genk.vn/toi-di-code-dao-thieu-ki-nang-google-lap-trinh-vien-viet-nam-co-gioi-toi-may-cung-kho-song-20161228152538062.chn .
Chúc mừng a ! Mong a có thêm nhiều bài viết ngôn lù và kiếm hiệp hay ho cho 500 a e được quay tay . . . à không,được học hỏi nhiều hơn.
LikeLiked by 1 person
Cảm ơn e ;). Chắc là viết kiếm hiệp thôi chứ ngôn lù a viết 1 lần là tởn rồi =))
LikeLike
Hay quá an ơi 😀
LikeLike
Cảm ơn đại cả rất nhiều T______T
LikeLike
Blogger cho em hỏi: API của microsoft đã dùng những thuật toán nào để nhận diện và traing dữ liệu nào ạ? Em cảm ơn
LikeLike
Cái này thì Microsoft ko công bố nên anh cũng ko biết :))
LikeLike
E thấy tổng thể thì con API của MS đóng vai trò quan trọng nhất. Vậy cho e hỏi có hướng nào mà đừng động vào đồ có phí không anh. (đại ý là dùng API nào đó kiểu opensource mình không mất phí bản quyền ấy)
LikeLike
OpenCV hoặc một số thằng khác nhé 😀
LikeLike
Bác dùng phần mềm gì để vẽ sơ đồ thế?
LikeLike
Draw.io bạn ơi :3
LikeLike
hi anh Hoàng, tư vấn giúp em với mô hình client server, lưu trữ ảnh trên server chứ không trên cloud ạ?
LikeLike
Ko trên Cloud thì em có thể thử dùng thư viện OpenCV cũng có nhận diện khuon mặt nhé.
Cơ chế thì cũng tương tự như Cloud trong phần 5 thôi.
LikeLike
em gà mờ, giải thích cho em với, em muốn sử dụng các api này nhưng lưu trữ ảnh trên server của mình thì có được không ạ? em cảm ơn anh.
LikeLike
Ko được em nhé 😉
LikeLike