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
- Dùng
resnet18pretrained, bỏ tầngfc, lấy vector 512 chiều sau global average pooling. - 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.npyvàlabels.npy. - Đ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ách | Yêu cầu |
|---|---|
| Brute-force | Tích vô hướng features @ q, lấy top-k bằng argpartition |
| k-d tree | Bản ngày 69 (hoặc scipy.spatial.cKDTree) |
| PCA + k-d tree | Giảm còn 32 chiều rồi dựng cây |
| (Tùy chọn) FAISS | IndexFlatIP 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)
- Web nhỏ (Streamlit hoặc Gradio): tải ảnh lên, hiện 12 ảnh gần nhất kèm độ tương đồng.
- 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ụ.
- 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.