Series Nhận diện Idol: Phần 2 – Kiến trúc tổng thể và các công nghệ sử dụng

Ở 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:

screen-shot-2016-12-18-at-1-10-50-am
Các công nghệ được sử dụng

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.

screen-shot-2016-12-18-at-7-21-16-pm
Dữ liệu đã crawl

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é).

screen-shot-2016-12-18-at-6-12-58-pm
Kết quả test: HIT là nhận dạng đúng, MISS là sai. Tổng số đúng 196/254

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 FirebaseGoogle 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é.

architecture
Bấm vào để xem hình lớn

 

netcore1. 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.


cognitive2. 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).

amazons33. 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.

redis4. 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.

azure5. 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é.

github6. 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.

angularsemanticNhằ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.

screen-shot-2016-12-18-at-7-06-49-pm
Vì chỉ có HTML tĩnh nên trang load khá nhanh

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é.

 

34 thoughts on “Series Nhận diện Idol: Phần 2 – Kiến trúc tổng thể và các công nghệ sử dụng”

  1. 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?

    Like

      1. 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

        Like

  2. 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ứ?

    Like

      1. 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? 😀

        Like

      2. 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)

        Like

  3. 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.

    Like

  4. 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

    Like

  5. 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)

    Like

    1. 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.

      Like

Leave a reply to Du Van Nguyen Cancel reply