|
import torch |
|
import torchvision |
|
from torchvision.models import resnet50 |
|
from torchvision.transforms import transforms |
|
from torch.utils.data import DataLoader, Dataset |
|
|
|
|
|
class RobloxDataset(Dataset): |
|
def __init__(self, root_dir, transform=None): |
|
self.root_dir = root_dir |
|
self.transform = transform |
|
|
|
def __len__(self): |
|
return 200 |
|
|
|
def __getitem__(self, idx): |
|
img_path = f'{self.root_dir}/human_{str(idx+1).zfill(2)}.png' |
|
image = Image.open(img_path).convert('RGB') |
|
|
|
if self.transform: |
|
image = self.transform(image) |
|
|
|
return image |
|
|
|
data_transform = transforms.Compose([ |
|
transforms.Resize((224, 224)), |
|
transforms.ToTensor(), |
|
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) |
|
]) |
|
|
|
dataset = RobloxDataset('/content/dataset', transform=data_transform) |
|
|
|
data_loader = DataLoader(dataset, batch_size=1, shuffle=True) |
|
|
|
model = resnet50(pretrained=True) |
|
model.fc = torch.nn.Linear(in_features=2048, out_features=1) |
|
|
|
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') |
|
model.to(device) |
|
|
|
criterion = torch.nn.BCEWithLogitsLoss() |
|
optimizer = torch.optim.Adam(model.parameters(), lr=0.001) |
|
|
|
|
|
num_epochs = 100 |
|
""" Training the model with more epochs |
|
Pros: |
|
- more accuracy |
|
- less loss (it means the model is improving) |
|
|
|
Con: |
|
- more training time |
|
""" |
|
|
|
for epoch in range(num_epochs): |
|
for images in data_loader: |
|
images = images.to(device) |
|
labels = torch.ones((images.size(0), 1)).to(device) |
|
|
|
outputs = model(images) |
|
loss = criterion(outputs, labels) |
|
|
|
optimizer.zero_grad() |
|
loss.backward() |
|
optimizer.step() |
|
|
|
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item()}') |
|
|
|
|
|
torch.save(model.state_dict(), '/content/zero_shot_classification_model.pth') |