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ìnhCatDogEfficientNetB0, 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.Linearvới 2 đầu ra (mèo và chó).
Code mẫu:
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:
- Tiền xử lý dữ liệu:
- Resize ảnh về kích thước 224x224.
- Normalize ảnh theo chuẩn ImageNet.
- Cấu hình huấn luyện:
- Sử dụng
Adamlàm optimizer. - Sử dụng
CrossEntropyLosslàm hàm mất mát. - Huấn luyện trong 10 epoch với batch size 32.
- Sử dụng
- 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.
- Sử dụng thư viện
- 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.
- Lưu mô hình (
Code mẫu:
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
- Chuẩn bị dữ liệu:
- Đặt dữ liệu vào thư mục
data/trainvàdata/valtheo cấu trúc:data/ ├── train/ │ ├── cat/ │ └── dog/ ├── val/ │ ├── cat/ │ └── dog/
- Đặt dữ liệu vào thư mục
- Huấn luyện mô hình:
- Chạy file
train_efficientnet.py:python train_efficientnet.py
- Chạy file
- Dự đoán:
- Sử dụng mô hình đã lưu (
efficientnet_best.pth) để dự đoán ảnh mới.
- Sử dụng mô hình đã lưu (
Yêu cầu
- Python >= 3.8
- Thư viện:
torchtorchvisiontqdmPillow
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ệ.