|
|
--- |
|
|
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` và `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ệ. |