Nhận diện Idol bằng Microsoft Cognitive Services

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

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

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.

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

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.

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.

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

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

Đón đọc chi tiết hơn về cách sử dụng Cognitive Services tại AzureVn.NET trong thời gian sớm nhất.

Phạm Huy Hoàng

Anh Phạm Huy Hoàng hiện đang theo học tại Thạc sĩ về Khoa Học Máy Tính (Computer Science) tại Đại học Lancaster, Anh. Tại Anh, Hoàng cũng làm Full-stack Developer cho trường. Hoàng là chủ blogger Tôi Đi Code Dạo rất nổi tiếng tại Việt Nam. Hoàng có hơn 6 năm kinh nghiệm trong lĩnh vực phần mềm và rất đam mê nghiên cứu về các công nghệ mới như Machine Learning, Cognitive.

hoangph has 3 posts and counting.See all posts by hoangph

Trả lời

Thư điện tử của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *