# Kiến trúc hệ thống ## Tổng quan Hệ thống gồm 3 lớp chính: 1. **Template Matching (OpenCV)**: so khớp template với ảnh cần so sánh theo nhiều tỉ lệ và góc xoay. 2. **NMS**: loại bỏ bbox trùng lặp theo IoU. 3. **CNN Verification (tùy chọn)**: cắt crop bbox, resize template tương ứng về cùng kích thước, trích xuất embedding và tính cosine similarity. ## Thành phần - `template_matcher.py`: class `TemplateMatcher` chứa hàm `find` trả về danh sách bbox và thông tin khớp. - `models.py`: class `ModelManager` tải model timm, tiền xử lý ảnh, và tính cosine similarity. - `utils.py`: các hàm hỗ trợ (rotate, resize, NMS, vẽ bbox, JSON). - `app.py`: giao diện Gradio. - `main.py`: CLI. ## Pipeline xử lý 1. **Đọc ảnh đầu vào** và danh sách template. 2. **Sinh biến thể template**: - Xoay theo các góc: 0, 45, 90, 135, 180, 225, 270, 315. - Scale từ `scale_min` đến `scale_max` theo `scale_steps`. 3. **Template matching** với `cv2.matchTemplate` (TM_CCOEFF_NORMED). 4. **Lấy các điểm >= match_threshold**, tạo bbox, gom tất cả ứng viên. 5. **NMS** để giảm trùng lặp. 6. **CNN (tùy chọn)**: - Crop theo bbox, resize template tương ứng về cùng kích thước crop. - Trích xuất embedding bằng model chọn trong UI. - Tính cosine similarity và lọc theo ngưỡng. 7. **Vẽ bbox** và xuất JSON kết quả. ## JSON output Mỗi phần tử có các trường: - `template_name`: tên file template. - `bbox`: (x, y, w, h). - `match_score`: điểm template matching. - `angle`: góc xoay template. - `scale`: tỉ lệ scale. - `cosine_similarity`: điểm CNN (có thể null nếu tắt CNN). ## Lưu ý - Template quá lớn sẽ tự động bị bỏ qua ở tỉ lệ không phù hợp. - Thời gian xử lý tăng theo số lượng template, góc xoay, và số bước scale. - CNN giúp lọc nhiều false positive nhưng sẽ làm chậm hệ thống.