App: tìm ảnh với CNN và similarity search

Xây app tìm ảnh tương tự: trích đặc trưng CNN pretrained, index similarity bằng k-d tree và brute-force, đo recall và độ trễ.
Chuyên giaThuật toán ~120 phút

Ôn lại trước khi học

Giới thiệu

Bài này xây app tìm ảnh giống nhau. Tải 1 ảnh mèo lên là ra thêm nhiều ảnh mèo.

Kiến thức cần nhớ

Đặc trưng CNN pretrained

  • Dùng CNN có sẵn, cắt đầu phân loại lấy vector giữa.
  • Chuẩn hóa L2 để so cosine thành tích vô hướng.
  • Không cần huấn luyện lại từ đầu nên rất rẻ.
  • Ví dụ đời thường: mượn mắt thợ ảnh chuyên nghiệp để mô tả ảnh.

2 bản index nhanh và chuẩn

  • Brute-force so với hết mọi ảnh làm chuẩn đúng.
  • K-d tree chia không gian để tìm lân cận nhanh hơn.
  • Chiều rất cao 512+ thì k-d tree có thể thua brute-force.
  • Phải đo thực tế thay vì tin lý thuyết suông.

Đo chất lượng tìm kiếm

  • Precision at K: trong K ảnh trả về có mấy ảnh đúng lớp.
  • Recall: bản nhanh bắt được bao nhiêu so với bản chuẩn.
  • Ghi bảng theo từng lớp để lộ lớp khó dễ nhầm.
  • Mục tiêu mẫu: precision trên 0.7, recall trên 0.95.

Ví dụ

  • Input: ảnh mèo hỏi top-10. Output: trên 7 ảnh mèo trong kết quả.
  • Giải thích: vector mèo gần nhau nên lân cận toàn mèo.
  • Input: 200 query so 2 index. Output: k-d tree recall trên 0.95, nhanh gấp 3 lần.
  • Giải thích: gần đúng bỏ chút chính xác để đổi tốc độ.

💻 Bài tập

Ngôn ngữ: Python 3 với PyTorch, torchvision. Dùng code ngày 69 hoặc 119. Nộp vào day-140-image-search/.

Bài 1: Trích đặc trưng

  1. Dùng resnet18 pretrained, bỏ tầng fc, lấy vector 512 chiều sau global average pooling.
  2. Chạy trên 10.000 ảnh CIFAR-10 (hoặc thư mục ảnh của bạn). Chuẩn hóa L2. Lưu ra features.npy và labels.npy.
  3. Đo thời gian trích (ảnh/giây) trên CPU và GPU nếu có.

Bài 2: Ba cách tìm kiếm

CáchYêu cầu
Brute-forceTích vô hướng features @ q, lấy top-k bằng argpartition
k-d treeBản ngày 69 (hoặc scipy.spatial.cKDTree)
PCA + k-d treeGiảm còn 32 chiều rồi dựng cây
(Tùy chọn) FAISSIndexFlatIP và IndexIVFFlat
cách              thời_gian/truy_vấn   precision@10   recall_so_brute_force
brute-force       ...                  ...            1.0
kd-tree 512D      ...                  ...            1.0
pca32 + kd-tree   ...                  ...            ...

Precision@10: tỉ lệ ảnh trả về cùng lớp với ảnh truy vấn.

Bài 3: Giao diện và phân tích (nâng cao)

  1. Web nhỏ (Streamlit hoặc Gradio): tải ảnh lên, hiện 12 ảnh gần nhất kèm độ tương đồng.
  2. Precision@10 theo từng lớp CIFAR. Chỉ ra 2 lớp hay bị nhầm với nhau và hiện ví dụ.
  3. So với histogram màu ngày 119: precision@10 và 1 ví dụ trực quan cho thấy CNN hiểu "nội dung" tốt hơn.

✅ Tiêu chí hoàn thành

  • File đặc trưng lưu được, chuẩn hóa L2 đúng.
  • Bảng 3 cách có số thật, chỉ ra k-d tree ở 512 chiều không nhanh hơn brute-force.
  • Giao diện chạy được.
  • Bảng precision theo lớp và so sánh với histogram màu.

❓ Câu hỏi ôn tập

  • Vì sao dùng CNN pretrained thay vì train mới?
  • Chuẩn hóa L2 giúp so ảnh thế nào?
  • Brute-force làm chuẩn vàng để làm gì?
  • Precision at K và recall mỗi cái đo điều gì?

🌕 Bạn đã hoàn thành ngày 140. Làm hết bài tập phía trên rồi sang ngày tiếp theo.

Bớt paste mù, hiểu sâu từng dòng mình viết.

180 Days Challenge. 180 ngày cai nghiện vibe code.