animeaidetect / src /model.py
hirawaru's picture
Upload folder using huggingface_hub
847ed80 verified
Raw
History Blame Contribute Delete
2.9 kB
"""
Model architectures for AI Image Detection
"""
import torch
import torch.nn as nn
import torchvision.models as models
def create_model(model_name='efficientnet_b3', num_classes=2, pretrained=True, dropout=0.3):
"""
Create a model for image classification
Args:
model_name (str): Name of model architecture
num_classes (int): Number of output classes
pretrained (bool): Whether to use pretrained weights
dropout (float): Dropout probability
Returns:
nn.Module: Model instance
"""
if model_name == 'resnet50':
model = models.resnet50(pretrained=pretrained)
# Modify final layer
in_features = model.fc.in_features
model.fc = nn.Sequential(
nn.Dropout(dropout),
nn.Linear(in_features, num_classes)
)
elif model_name == 'efficientnet_b3':
model = models.efficientnet_b3(pretrained=pretrained)
# Modify classifier
in_features = model.classifier[1].in_features
model.classifier = nn.Sequential(
nn.Dropout(dropout),
nn.Linear(in_features, num_classes)
)
elif model_name == 'vit_b_32':
model = models.vit_b_32(pretrained=pretrained)
# Modify head
in_features = model.heads.head.in_features
model.heads.head = nn.Sequential(
nn.Dropout(dropout),
nn.Linear(in_features, num_classes)
)
else:
raise ValueError(f"Unknown model: {model_name}")
return model
class AIImageClassifier(nn.Module):
"""Wrapper for AI Image classification model"""
def __init__(self, model_name='efficientnet_b3', num_classes=2, pretrained=True, dropout=0.3):
super().__init__()
self.model = create_model(model_name, num_classes, pretrained, dropout)
self.num_classes = num_classes
def forward(self, x):
return self.model(x)
def freeze_backbone(self):
"""Freeze all layers except classifier"""
for param in self.model.parameters():
param.requires_grad = False
# Unfreeze classifier layers
if hasattr(self.model, 'fc'):
for param in self.model.fc.parameters():
param.requires_grad = True
elif hasattr(self.model, 'classifier'):
for param in self.model.classifier.parameters():
param.requires_grad = True
elif hasattr(self.model, 'heads'):
for param in self.model.heads.parameters():
param.requires_grad = True
def unfreeze_backbone(self, num_layers=None):
"""Unfreeze backbone layers (for fine-tuning)"""
for param in self.model.parameters():
param.requires_grad = True