Phuneil's picture
Update Readme
0777bc8 verified
---
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ệ.