Trang báo cáo tổng hợp cho Assignment 1 - phần Image Classification, tập trung vào pipeline từ EDA, thiết kế mô hình, huấn luyện trên 8 cấu hình (4 backbone x Aug/No-Aug), trực quan hóa bằng GradCAM/EigenCAM.
Bài toán là phân loại ảnh động vật đa lớp (10 lớp), đầu vào là ảnh RGB được resize về 224x224 và chuẩn hóa theo cấu hình từng backbone. Mục tiêu là tối ưu độ chính xác cho kết quả của mô hình (macro F1/Accuracy) và đánh giá kết quả khi thay đổi backbone và augmentation.
Trực quan hóa phân bố mẫu theo lớp và vài sample ảnh trước bước resize/augmentation để kiểm tra chất lượng dữ liệu.
Kích thước dataset: 26179 ảnh - 10 lớp
Dữ liệu được chia theo tỉ lệ 70/15/15 tương ứng với các tập train/val/test. Mỗi model dùng transform riêng dựa trên data config từ timm.
Data augmentation (cho tập train) bao gồm: RandomResizedCrop, RandomHorizontalFlip, RandomVerticalFlip, RandomRotation, RandomGrayscale, ColorJitter, và Normalize theo config của từng backbone.
transform = transforms.Compose([
transforms.RandomResizedCrop(IMG_SIZE, scale=(0.7, 1.0)),
transforms.RandomHorizontalFlip(),
transforms.RandomVerticalFlip(p=0.1),
transforms.ColorJitter(brightness=0.3, contrast=0.3,
saturation=0.2, hue=0.1),
transforms.RandomRotation(20),
transforms.RandomGrayscale(p=0.05),
transforms.ToTensor(),
transforms.Normalize(mean=mean, std=std),
])
So sánh 2 đại diện CNN (ResNet18, EfficientNet-B0) và 2 Transformer-based models (ViT-B16, Swin-Tiny).
Dùng một head chung cho mọi backbone: Linear -> BatchNorm -> ReLU -> Dropout -> Linear.
class AnimalClassifier(nn.Module):
def __init__(self, timm_name, n_classes, hidden_dim=512):
super().__init__()
self.backbone = timm.create_model(timm_name, pretrained=True, num_classes=0)
in_features = self.get_in_features()
self.head = nn.Sequential(
nn.Linear(in_features, hidden_dim),
nn.BatchNorm1d(hidden_dim),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(hidden_dim, n_classes),
)
def forward(self, x):
return self.head(self.backbone(x))
Chuyển tab để xem các nhóm biểu đồ train/val theo metric
Bảng so sánh tổng hợp các metric chính (accuracy, precision, recall, F1) và các chỉ số chi phí (số lượng tham số, FLOPs, kích thước mô hình) cho các cấu hình khác nhau.
| Model | Acc (%) | Prec (%) | Rec (%) | F1 (%) | Params (M) | FLOPs (G) | Size (MB) |
|---|---|---|---|---|---|---|---|
| EfficientNetB0_noaug | 98.27 | 97.99 | 98.17 | 98.08 | 4.63 | 0.39 | 19.15 |
| EfficientNetB0_aug | 98.17 | 98.09 | 97.91 | 97.99 | 4.63 | 0.39 | 19.15 |
| ResNet18_noaug | 97.51 | 97.33 | 97.15 | 97.24 | 11.45 | 1.82 | 45.89 |
| ResNet18_aug | 97.20 | 96.95 | 96.71 | 96.81 | 11.45 | 1.82 | 45.89 |
| SwinT_aug | 98.32 | 98.08 | 98.07 | 98.07 | 27.90 | 4.37 | 111.82 |
| SwinT_noaug | 98.19 | 98.16 | 97.94 | 98.05 | 27.90 | 4.37 | 111.82 |
| ViT_B16_aug | 97.30 | 97.01 | 96.72 | 96.86 | 86.01 | 16.85 | 344.97 |
| ViT_B16_noaug | 96.51 | 96.11 | 96.12 | 96.11 | 86.01 | 16.85 | 344.97 |
| Model | Acc (%) | Prec (%) | Rec (%) | F1 (%) | Params (M) | FLOPs (G) | Size (MB) |
|---|---|---|---|---|---|---|---|
| EfficientNetB0_aug | 98.17 | 98.09 | 97.91 | 97.99 | 4.63 | 0.39 | 19.15 |
| ResNet18_aug | 97.20 | 96.95 | 96.71 | 96.81 | 11.45 | 1.82 | 45.89 |
| SwinT_aug | 98.32 | 98.08 | 98.07 | 98.07 | 27.90 | 4.37 | 111.82 |
| ViT_B16_aug | 97.30 | 97.01 | 96.72 | 96.86 | 86.01 | 16.85 | 344.97 |
| Model | Acc (%) | Prec (%) | Rec (%) | F1 (%) | Params (M) | FLOPs (G) | Size (MB) |
|---|---|---|---|---|---|---|---|
| EfficientNetB0_noaug | 98.27 | 97.99 | 98.17 | 98.08 | 4.63 | 0.39 | 19.15 |
| ResNet18_noaug | 97.51 | 97.33 | 97.15 | 97.24 | 11.45 | 1.82 | 45.89 |
| SwinT_noaug | 98.19 | 98.16 | 97.94 | 98.05 | 27.90 | 4.37 | 111.82 |
| ViT_B16_noaug | 96.51 | 96.11 | 96.12 | 96.11 | 86.01 | 16.85 | 344.97 |
Trình bày các mẫu model dự đoán và phân tích, trực quan hóa bằng GradCAM/EigenCAM để hiểu vùng ảnh nào mô hình tập trung khi dự đoán. So sánh giữa 4 backbone để thấy sự khác biệt trong cách học đặc trưng.
Gradio - Hugging Face Space
Nếu iframe bị lỗi, bấm nút bên dưới để mở Hugging Face Space ở tab mới.
Mở Hugging Face Space