AI Challenge - Landmark: Kỹ thuật và ý tưởng

Trong bài viết này mình sẽ chia sẻ một số kỹ thuật cũng như ý tưởng có thể trong cuộc thi Zalo AI Challenge - Landmark data do team mình - VietAI - thực hiện.

Dữ Liệu

Dưới đây là phân phối số lượng ảnh trên mỗi la­bel.

Phân phối mẫu trên mỗi lớp, Landmark data. Có khoảng 8 lớp có dưới 250 mẫu/class.

Một số class có số sam­ple tương đối thấp, ta có thể cần 1 số tech­nique để khắc phục vấn đề này.

Một số hình lấy từ tập train, mỗi dòng là các mẫu thuộc 1 địa danh.

Kỹ thuật

Team mình đã sử dụng 9 mod­els khác nhau để train và sau đó stack/​blend lại. Bao gồm:

  • DenseNet121, DenseNet161
  • Resnet50, Resnet152
  • ResNext50, ResNext101
  • Wide-resnet.
  • Inception_v4, Inceptionresnet_v2.

[Mình đã fine­tune 34 mod­els khác nhau với kiến trúc và op­ti­mizer scheme khác nhau (learning rate/ weight de­cay/ data aug­men­ta­tion không tính)]

Để tăng độ chính xác model, tụi mình có sử dụng và thử 1 số phương pháp sau [phần bôi đen là những kỹ thuật rất quan trọng để tăng hiệu quả của model]:

  • Freeze net­work rồi fine­tune, sau đó un­freeze toàn bộ và train. [Thực sự hiệu quả]. Tuy nhiên lưu ý một điều: sau khi un­freeze toàn bộ các layer thì quá trình train sẽ rất chậm, ta cần phải điều chỉnh số lượng epoch ở bước này cho hợp lý.
  • Sử dụng Cyclic Learning Rates (Smith 2017) [Thực sự hiệu quả]. Tham số mà mình thấy ổn nhất, cũng như có thời gian train tương đối chấp nhận được (tầm 20h/ 1 model): cycle_length = 2, cycle_multiplier = 2, num_cycles = 4
  • Adam Optimizer + Weight Decay [Improve 1 cách tương đối]. Adam giúp loss giảm nhanh hơn SGD.
  • Differential Weight Decay tuy vậy không thấy cải thiện được gì.
  • Stochastic Gradient Descent with Warm Restarts: khá tốt.
  • Stochastic Weight Averaging: Không hiệu quả + khiến thời gian train tăng.
  • Differential Learning Rate: im­prove tương đối.
  • Data Augmentation/ Test Time Augmentation: Thực sự hiệu quả. Đây là cách hiệu quả nhất để tránh over­fit­ting.
  • Tăng kích thước ảnh: Thực sự hiệu quả. Tuy nhiên phụ thuộc vào Memory của GPUs và kiến trúc mạng. Bộ ba thần thánh của mình là: 224, 256, 299.
  • Sử dụng fully con­nected lay­ers kết hợp với kNN làm thành 1 clas­si­fier: đây là ý tưởng của team 4th place Google Landmark Recognition - thực sự không hiệu quả trong case này [, hoặc là mình im­ple­ment bậy rồi] .
  • Để han­dle im­bal­ance data: ta có thể dùng up­sam­pling, down­sam­pling hoặc sử dụng dis­tri­b­u­tion khác cho sam­pler (mình đã im­ple­ment multi­n­o­mial dis­tri­b­u­tion thay cho uni­form của py­torch) cũng như sử dụng weighted loss (thêm weight dựa trên số lượng sam­ple/​class). Một số kỹ thuật có thể tham khảo ở đây [Link]. Khá tiếc khi phần này đã bị leader re­ject, trong khi top 1 Landmark đã dùng kỹ thuật này để đạt kết quả tốt ở pri­vate test.
  • Để có thể chọn learn­ing rate hợp lí và nhanh, kỹ thuật trong bài [Cyclical Learning Rates for Training Neural Networks] được sử dụng phổ biến, ta có thể plot nhiều set­ting của một model trên cùng 1 fig­ure để chọn learn­ing phù hợp. Nếu bạn lười, cứ set learn­ing rate là 3e-4. Thánh Karpathy đã ver­ify điều đó (Twitter).

Một số bài viết hỗ trợ trong quá trình fine­tune:

  • Playing around with SGDR [Link]
  • Differential Learning Rates [Link]
  • Optimization tech­niques com­par­i­son in Julia: SGD, Momentum, Adagrad, Adadelta, Adam [Link]

Về phần stack/​blend, mình nhường lại cho leader Khả Ái (Phát); hầu như các so­lu­tion trên Forum Machine Learning Cơ Bản mà các bạn top 3 post đều nằm trong plan thực hiện của Khả Ái. Nên mình tin nếu lúc đó mình làm đúng plan thì kết quả bên Landmark lẫn Music đã rất khác rồi.

[Nhân đây: Noi theo tấm gương sáng ngời cùng đường lối sáng suốt của leader , mình phát động phong trào đẩy mạnh học tập và làm theo tư tưởng, đạo đức Hoàng Quý Phát]

T-SNE của ResNet50 features 1 subset của train data (feature: ResNet50)

Other

  • Mình dùng 1 Titan X, 2 1080 Ti, 1 P100 để train. Trước dead­line vài ngày có dùng 1 máy Google Cloud.
  • Rất nhiều hình gif bị save thành jpg, ta có thể dùng trick để avoid lỗi những ảnh này.
  • Đừng sa lầy bởi code đểu, đừng nghe dân mạng chém gió và cố gắng bám sát vào plan của mình. Chỉ nên tin những nguồn đáng tin cậy.
  • Sử dụng no­tion.so để quản lý ghi chú, kết quả thí nghiệm và lên kế hoạch.

Các ý tưởng khác

Image Retrieval - KNN

Để sử dụng kỹ thuật im­age re­trieval hiệu quả (Radenović et al. 2019) [tức là im­age re­trieval thực sự out­per­form clas­si­fi­ca­tion] thì dataset cần hội đủ các yếu tố:

  1. Dataset có số lượng la­bel rất lớn.
  2. Phân phối train­ing sam­ples không đều và chênh lệch lớn.
  3. Mối tương quan giữa các ảnh trong cùng 1 class thấp.

Ví dụ điển hình là tập Google Landmark với 1.5 triệu ảnh, và 15K la­bel (landmark) khác nhau. Hình dưới cho thấy rất nhiều la­bel có số lượng train­ing ít.

Trong 3 điều kiện trên thì tập Landmark của Zalo thỏa được (2) và (3) phần nào đó. Ví dụ ở class 0 và 1, độ tương quan khá thấp, và nếu không biết trước được rằng các hình nằm chung 1 class thì mình nghĩ đến cả hu­man còn nhầm đây là các địa điểm khác nhau:

Ở các kỹ thuật trong re­trieval có thể đơn giản hóa như sau:

  • Tận dụng lo­cal fea­tures làm rep­re­sen­ta­tion và search dựa trên Euclidean dis­tance.
  • Dùng k-NN kết hợp với kd tree (exact search) hoặc PQ (approximate search) để giảm thời gian search (lưu ý ràng buộc 6 tiếng in­fer­ence) [dĩ nhiên với dataset nhỏ thì cứ dùng k-NN].
  • Dùng các kỹ thuật Pooling hoặc Masking (Noh et al. 2017) thay vì dùng trực tiếp fea­ture tầng cuối của net­work. Và như vậy, ta sẽ pool­ing ở tầng conv thay vì tầng fully con­nected.

Local fea­tures như RootSIFT+BoW hoặc RootSIFT+Triemb hoạt động rất tốt trong case này:

Nguồn: slide - Ranked 3rd Google Landmark Recognition Challenge

Với kỹ thuật này, ta có thể ap­ply 1 số tech­nique hay ho như:

Image Retrieval cùng với các kỹ thuật này đã đạt kết quả rất tốt ở hai cuộc thi là Landmark Retrieval và Landmark Recognition của Google [Link]. Mình nghĩ ít nhiều nó sẽ giúp im­prove per­for­mance, đặc biệt là với class có in­tra-class cor­re­la­tion thấp.

Fine-grained Classification

Nếu ta xem xét các la­bels và thứ tự của nó, ta nhận ra rằng các lớp chung 1 cat­e­gory sẽ nằm cạnh nhau. Ví dụ:

  • Từ la­bel 17 → 23: các thể loại cầu; bao gồm: Cầu Chương Dương, Cầu Tràng Tiền, Cầu Rồng, Cầu Tình Yêu, Cầu Tay Vàng Bà Nà.
  • Label từ 25 → 28: các thể loại cột cờ: Cột cờ Hà Nội, Cột cờ Hà Giang, Cột cờ Đảo Trường Sa và Cột cờ Cà Mau.
  • Label 9 → 11: các chợ: Chợ Bến Thành, chợ Nổi và chợ Đồng Xuân.
  • Label 71 → 79: các nhà thờ Công Giáo: Nhà Thờ Đức Bà, Nhà Thờ Nha Trang, Nhà Thờ ở Phú Yên, …

Một ý tưởng đơn giản đó là ta gom hết các data trong các nhóm đó lại với nhau thành 1 la­bel lớn: ví dụ chợ”, cầu”, cột cờ” và xây dựng bộ clas­si­fier trên đó (tạm gọi là Classifier-A). Kết quả có thể đem làm trọng số cho clas­si­fier chính với 103 classes. Ngoài ra, ta có thể random” trong trường hợp kết quả ra thấp: Nếu bộ clas­si­fier 103 lớp không clas­sify được, nhưng bộ Classifier-A ra kết quả là cầu” với con­fi­dence cao, ta có thể ran­dom trong đó [Dĩ nhiên, có những phương pháp fancy hơn để in­fer­ence ra kết quả]; ngay cả với ran­dom, giả sử groundtruth là 1 trong 7 loại cầu: thì ta có xác suất 1 – 6C3/7C3 = 42.8571 %. Theo bản thân mình, đây cũng là cách mà con người nhận biết land­mark. Fancy hơn, bạn có thể dùng Maximum Spanning Tree Clustering [Link]

Đồng thời, với quan sát như trên, ta có thể sử dụng 1 số phương pháp fine-grained clas­si­fi­ca­tion để cải thiện độ chính xác. Bởi theo như quan sát, các kiến trúc cầu, nhà thờ, hay cột cờ có độ tương đồng hình ảnh khá giống nhau, thậm chí nếu chụp ở 1 góc nào đó thì kể cả con người cũng khó phân biệt được. Nên data như vậy rất phù hợp với kỹ thuật fine-grained clas­si­fi­ca­tion.

Fun stuff

  • Với query là ảnh con cá này:

Model pre­dict ra cơ sở nước mắm Phú Quốc.

model của team mình pre­dict ra la­bel 70 - Cơ sở chế biến nước mắm Phú Quốc. Mặc dù sau khi kiểm tra 497 hình của class 70 này bằng mắt, không hình nào trong train­ing data có hình con cá. Mình gọi đây là: The next level of AI.

  • Hình tượng chúa ở Brazil được cho làm query, trong khi đây là cuộc thi Landmark ở Việt Nam, hình này còn xuất hiện vài lần trong tập test.

  • Mình rất muốn đi DisneyLand ở Việt Nam 😦

  • Rất nhiều hình trong train­ing data sử dụng ảnh của các site khác, mình tò mò là bên Zalo đã xin phép bản quyền chưa.

P.s: I love Vietnam

Mình không biết 3 hình này thuộc địa danh nào ở Việt Nam, nhưng rất đẹp.

Xin chân thành cảm ơn sự giúp đỡ và hỗ trợ của VietAI trong quá trình mình tham gia cuộc thi. Dù không được vào Top 3 nhưng cũng là 1 trải nghiệm thú vị với nhiều điều đáng học hỏi.

References

  • Chum, Ondřej, James Philbin, Josef Sivic, Michael Isard, and Andrew Zisserman. 2007. Total Recall: Automatic Query Expansion with a Generative Feature Model for Object Retrieval.” In IEEE International Conference on Computer Vision (ICCV).
  • Iscen, Ahmet, Giorgos Tolias, Yannis Avrithis, Teddy Furon, and Ondřej Chum. 2017. Efficient Diffusion on Region Manifolds: Recovering Small Objects with Compact CNN Representations.” In IEEE Conference on Computer Vision and Pattern Recognition (CVPR).
  • Noh, Hyeonwoo, Andre Araujo, Jack Sim, Tobias Weyand, and Bohyung Han. 2017. Large-Scale Image Retrieval with Attentive Deep Local Features.” In IEEE International Conference on Computer Vision (ICCV).
  • Radenović, Filip, Giorgos Tolias, and Ondřej Chum. 2019. Fine-Tuning CNN Image Retrieval with No Human Annotation.” IEEE Transactions on Pattern Analysis and Machine Intelligence.
  • Smith, Leslie N. 2017. Cyclical Learning Rates for Training Neural Networks.” In IEEE Winter Conference on Applications of Computer Vision (WACV).