File size: 4,506 Bytes
0777bc8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
---
license: mit
metrics:
- accuracy
pipeline_tag: image-classification
tags:
- images
---
# CatDogEfficientNetB0 - Phân loại ảnh mèo và chó

## Mô tả dự án
Dự án này sử dụng mô hình **EfficientNet-B0** để phân loại ảnh mèo và chó. Mô hình được tùy chỉnh để phù hợp với bài toán phân loại 2 lớp (mèo và chó). Dữ liệu được xử lý và huấn luyện thông qua file `train_efficientnet.py`, và mô hình được định nghĩa trong file `model_efficientnet.py`.

---

## Cấu trúc dự án
- **`model_efficientnet.py`**: Định nghĩa mô hình `CatDogEfficientNetB0`, sử dụng EfficientNet-B0 với lớp cuối được tùy chỉnh để phân loại 2 lớp.
- **`train_efficientnet.py`**: File huấn luyện mô hình, bao gồm:
  - Tiền xử lý dữ liệu.
  - Huấn luyện mô hình với thanh tiến trình hiển thị % hoàn thành.
  - Lưu checkpoint khi đạt độ chính xác cao nhất trên tập validation.
- **`efficientnet_best.pth`**: Checkpoint của mô hình với độ chính xác cao nhất trên tập validation.
- **`efficientnet_model_final.pth`**: Mô hình cuối cùng sau khi hoàn thành tất cả các epoch.

---

## Mô hình `CatDogEfficientNetB0`
Mô hình được định nghĩa trong file `model_efficientnet.py`:
- Sử dụng **EfficientNet-B0** với trọng số ImageNet (`EfficientNet_B0_Weights.DEFAULT`).
- Đóng băng các trọng số của mô hình gốc (`param.requires_grad = False`).
- Thay thế lớp phân loại cuối cùng bằng một lớp `nn.Linear` với 2 đầu ra (mèo và chó).

### Code mẫu:
```python
class CatDogEfficientNetB0(nn.Module):
    def __init__(self):
        super().__init__()
        weights = EfficientNet_B0_Weights.DEFAULT
        self.base = efficientnet_b0(weights=weights)
        for param in self.base.parameters():
            param.requires_grad = False
        in_features = self.base.classifier[1].in_features
        self.base.classifier[1] = nn.Linear(in_features, 2)

    def forward(self, x):
        return self.base(x)
```

---

## Huấn luyện mô hình
File `train_efficientnet.py` thực hiện các bước sau:
1. **Tiền xử lý dữ liệu**:
   - Resize ảnh về kích thước 224x224.
   - Normalize ảnh theo chuẩn ImageNet.
2. **Cấu hình huấn luyện**:
   - Sử dụng `Adam` làm optimizer.
   - Sử dụng `CrossEntropyLoss` làm hàm mất mát.
   - Huấn luyện trong 10 epoch với batch size 32.
3. **Hiển thị tiến trình**:
   - Sử dụng thư viện `tqdm` để hiển thị tiến trình huấn luyện theo từng batch.
4. **Lưu checkpoint**:
   - Lưu mô hình (`efficientnet_best.pth`) khi đạt độ chính xác cao nhất trên tập validation.
   - Lưu mô hình cuối cùng (`efficientnet_model_final.pth`) sau khi hoàn thành tất cả các epoch.

### Code mẫu:
```python
for epoch in range(EPOCHS):
    model.train()
    train_bar = tqdm(train_loader, desc=f"Epoch {epoch+1}/{EPOCHS}", unit="batch")
    for images, labels in train_bar:
        images, labels = images.to(device), labels.to(device)
        optimizer.zero_grad()
        outputs = model(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        train_bar.set_postfix(loss=loss.item())
```

---

## Cách sử dụng
1. **Chuẩn bị dữ liệu**:
   - Đặt dữ liệu vào thư mục `data/train``data/val` theo cấu trúc:
     ```
     data/
     ├── train/
     │   ├── cat/
     │   └── dog/
     ├── val/
     │   ├── cat/
     │   └── dog/
     ```
2. **Huấn luyện mô hình**:
   - Chạy file `train_efficientnet.py`:
     ```bash
     python train_efficientnet.py
     ```
3. **Dự đoán**:
   - Sử dụng mô hình đã lưu (`efficientnet_best.pth`) để dự đoán ảnh mới.

---

## Yêu cầu
- Python >= 3.8
- Thư viện:
  - `torch`
  - `torchvision`
  - `tqdm`
  - `Pillow`

---

## Kết quả
- Mô hình đạt độ chính xác cao nhất trên tập validation được lưu trong file `efficientnet_best.pth`.
- Mô hình cuối cùng sau khi hoàn thành tất cả các epoch được lưu trong file `efficientnet_model_final.pth`.

---

## Ghi chú
- Đảm bảo GPU được bật để tăng tốc quá trình huấn luyện.
- Kiểm tra dữ liệu đầu vào để tránh ảnh lỗi hoặc không hợp lệ.