Update Readme
Browse files
README.md
CHANGED
|
@@ -1,3 +1,123 @@
|
|
| 1 |
-
---
|
| 2 |
-
license: mit
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
license: mit
|
| 3 |
+
metrics:
|
| 4 |
+
- accuracy
|
| 5 |
+
pipeline_tag: image-classification
|
| 6 |
+
tags:
|
| 7 |
+
- images
|
| 8 |
+
---
|
| 9 |
+
# CatDogEfficientNetB0 - Phân loại ảnh mèo và chó
|
| 10 |
+
|
| 11 |
+
## Mô tả dự án
|
| 12 |
+
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`.
|
| 13 |
+
|
| 14 |
+
---
|
| 15 |
+
|
| 16 |
+
## Cấu trúc dự án
|
| 17 |
+
- **`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.
|
| 18 |
+
- **`train_efficientnet.py`**: File huấn luyện mô hình, bao gồm:
|
| 19 |
+
- Tiền xử lý dữ liệu.
|
| 20 |
+
- Huấn luyện mô hình với thanh tiến trình hiển thị % hoàn thành.
|
| 21 |
+
- Lưu checkpoint khi đạt độ chính xác cao nhất trên tập validation.
|
| 22 |
+
- **`efficientnet_best.pth`**: Checkpoint của mô hình với độ chính xác cao nhất trên tập validation.
|
| 23 |
+
- **`efficientnet_model_final.pth`**: Mô hình cuối cùng sau khi hoàn thành tất cả các epoch.
|
| 24 |
+
|
| 25 |
+
---
|
| 26 |
+
|
| 27 |
+
## Mô hình `CatDogEfficientNetB0`
|
| 28 |
+
Mô hình được định nghĩa trong file `model_efficientnet.py`:
|
| 29 |
+
- Sử dụng **EfficientNet-B0** với trọng số ImageNet (`EfficientNet_B0_Weights.DEFAULT`).
|
| 30 |
+
- Đóng băng các trọng số của mô hình gốc (`param.requires_grad = False`).
|
| 31 |
+
- 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ó).
|
| 32 |
+
|
| 33 |
+
### Code mẫu:
|
| 34 |
+
```python
|
| 35 |
+
class CatDogEfficientNetB0(nn.Module):
|
| 36 |
+
def __init__(self):
|
| 37 |
+
super().__init__()
|
| 38 |
+
weights = EfficientNet_B0_Weights.DEFAULT
|
| 39 |
+
self.base = efficientnet_b0(weights=weights)
|
| 40 |
+
for param in self.base.parameters():
|
| 41 |
+
param.requires_grad = False
|
| 42 |
+
in_features = self.base.classifier[1].in_features
|
| 43 |
+
self.base.classifier[1] = nn.Linear(in_features, 2)
|
| 44 |
+
|
| 45 |
+
def forward(self, x):
|
| 46 |
+
return self.base(x)
|
| 47 |
+
```
|
| 48 |
+
|
| 49 |
+
---
|
| 50 |
+
|
| 51 |
+
## Huấn luyện mô hình
|
| 52 |
+
File `train_efficientnet.py` thực hiện các bước sau:
|
| 53 |
+
1. **Tiền xử lý dữ liệu**:
|
| 54 |
+
- Resize ảnh về kích thước 224x224.
|
| 55 |
+
- Normalize ảnh theo chuẩn ImageNet.
|
| 56 |
+
2. **Cấu hình huấn luyện**:
|
| 57 |
+
- Sử dụng `Adam` làm optimizer.
|
| 58 |
+
- Sử dụng `CrossEntropyLoss` làm hàm mất mát.
|
| 59 |
+
- Huấn luyện trong 10 epoch với batch size 32.
|
| 60 |
+
3. **Hiển thị tiến trình**:
|
| 61 |
+
- Sử dụng thư viện `tqdm` để hiển thị tiến trình huấn luyện theo từng batch.
|
| 62 |
+
4. **Lưu checkpoint**:
|
| 63 |
+
- Lưu mô hình (`efficientnet_best.pth`) khi đạt độ chính xác cao nhất trên tập validation.
|
| 64 |
+
- 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.
|
| 65 |
+
|
| 66 |
+
### Code mẫu:
|
| 67 |
+
```python
|
| 68 |
+
for epoch in range(EPOCHS):
|
| 69 |
+
model.train()
|
| 70 |
+
train_bar = tqdm(train_loader, desc=f"Epoch {epoch+1}/{EPOCHS}", unit="batch")
|
| 71 |
+
for images, labels in train_bar:
|
| 72 |
+
images, labels = images.to(device), labels.to(device)
|
| 73 |
+
optimizer.zero_grad()
|
| 74 |
+
outputs = model(images)
|
| 75 |
+
loss = criterion(outputs, labels)
|
| 76 |
+
loss.backward()
|
| 77 |
+
optimizer.step()
|
| 78 |
+
train_bar.set_postfix(loss=loss.item())
|
| 79 |
+
```
|
| 80 |
+
|
| 81 |
+
---
|
| 82 |
+
|
| 83 |
+
## Cách sử dụng
|
| 84 |
+
1. **Chuẩn bị dữ liệu**:
|
| 85 |
+
- Đặt dữ liệu vào thư mục `data/train` và `data/val` theo cấu trúc:
|
| 86 |
+
```
|
| 87 |
+
data/
|
| 88 |
+
├── train/
|
| 89 |
+
│ ├── cat/
|
| 90 |
+
│ └── dog/
|
| 91 |
+
├── val/
|
| 92 |
+
│ ├── cat/
|
| 93 |
+
│ └── dog/
|
| 94 |
+
```
|
| 95 |
+
2. **Huấn luyện mô hình**:
|
| 96 |
+
- Chạy file `train_efficientnet.py`:
|
| 97 |
+
```bash
|
| 98 |
+
python train_efficientnet.py
|
| 99 |
+
```
|
| 100 |
+
3. **Dự đoán**:
|
| 101 |
+
- Sử dụng mô hình đã lưu (`efficientnet_best.pth`) để dự đoán ảnh mới.
|
| 102 |
+
|
| 103 |
+
---
|
| 104 |
+
|
| 105 |
+
## Yêu cầu
|
| 106 |
+
- Python >= 3.8
|
| 107 |
+
- Thư viện:
|
| 108 |
+
- `torch`
|
| 109 |
+
- `torchvision`
|
| 110 |
+
- `tqdm`
|
| 111 |
+
- `Pillow`
|
| 112 |
+
|
| 113 |
+
---
|
| 114 |
+
|
| 115 |
+
## Kết quả
|
| 116 |
+
- Mô hình đạt độ chính xác cao nhất trên tập validation được lưu trong file `efficientnet_best.pth`.
|
| 117 |
+
- 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`.
|
| 118 |
+
|
| 119 |
+
---
|
| 120 |
+
|
| 121 |
+
## Ghi chú
|
| 122 |
+
- Đảm bảo GPU được bật để tăng tốc quá trình huấn luyện.
|
| 123 |
+
- Kiểm tra dữ liệu đầu vào để tránh ảnh lỗi hoặc không hợp lệ.
|