Low-level Design and Implementation Details
Low-level Design and Implementation Details
1. Dataset Preparation
● Purpose: Split the dataset into training and testing sets for model
evaluation.
● Steps:
○ Use torch.utils.data.DataLoader to create separate
DataLoaders for training and testing.
2. Model Architecture
Functions and Steps
3. Training Pipeline
Functions and Steps
3.1 Loss Function
3.2 Optimizer
4. Evaluation
Functions and Steps
5. Explainability
Functions and Steps
5.2 Visualization
1. Dataset Preparation
● Implementation Details:
○ The ImageFolder class from
torchvision.datasets is used to load images from
the CASIA2 dataset.
○ The dataset is structured into two folders: Au for
authentic images and Tp for tampered images.
○ The root parameter points to the dataset directory on
Google Drive, mounted via drive.mount.
● Implementation Details:
○ Images are resized to 224x224 pixels to match
MobileNetV2 input requirements.
○ Pixel values are normalized to align with ImageNet’s
mean and standard deviation.
from torchvision import transforms
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])
])
● Implementation Details:
○ The entire dataset is loaded as a single dataset using
ImageFolder.
○ A DataLoader is used to batch and shuffle the dataset.
dataset_path = '/content/drive/MyDrive/CASIA2'
train_dataset = datasets.ImageFolder(root=dataset_path,
transform=transform)
train_loader = DataLoader(train_dataset, batch_size=32,
shuffle=True)
2. Model Architecture
● Implementation Details:
○ A pre-trained MobileNetV2 model is loaded using
torchvision.models.
○ Pretrained weights are loaded to benefit from ImageNet
training.
class ForgeryDetectionMobileNet(nn.Module):
def __init__(self, num_classes=2):
super(ForgeryDetectionMobileNet, self).__init__()
self.model = models.mobilenet_v2(pretrained=True)
self.model.classifier = nn.Sequential(
nn.Linear(self.model.last_channel, num_classes)
)
● Implementation Details:
○ The original classification head of MobileNetV2 is
replaced with a fully connected layer.
○ The new layer maps to two output classes
(authentic/tampered).
3. Training Pipeline
● Implementation Details:
○ CrossEntropyLoss is used to compute the classification
loss.
criterion = nn.CrossEntropyLoss()
3.2 Optimizer
● Implementation Details:
○ Adam optimizer is used with a learning rate of 0.001.
● Implementation Details:
○ The model is trained for 5 epochs.
○ Each iteration involves a forward pass, loss computation,
backward pass, and parameter update.
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f"Epoch [{epoch+1}/{epochs}], Loss:
{running_loss/len(loader):.4f}")
● Implementation Details:
○ Model weights are saved using torch.save.
torch.save(model.state_dict(),
'/content/drive/MyDrive/casia2_mobilenet_model.pth')
4. Evaluation
● Implementation Details:
○ Accuracy, precision, recall, F1-score, and confusion
matrix are calculated using scikit-learn metrics.
with torch.no_grad():
for images, labels in loader:
images, labels = images.to(device), labels.to(device)
outputs = model(images)
_, preds = torch.max(outputs, 1)
all_preds.extend(preds.cpu().numpy())
all_labels.extend(labels.cpu().numpy())
print("Confusion Matrix:")
print(confusion_matrix(all_labels, all_preds))
print("Classification Report:")
print(classification_report(all_labels, all_preds,
target_names=class_names))
evaluate_metrics(model, train_loader,
list(train_dataset.class_to_idx.keys()))
5. Explainability
● Implementation Details:
○ LIME is used to perturb input images and explain
predictions.
explainer = lime_image.LimeImageExplainer()
explanation = explainer.explain_instance(
transform_to_numpy(image_tensor),
predict_fn=lambda x:
model(torch.stack([torch.Tensor(i).permute(2, 0, 1) for i in
x]).to(device)).cpu().detach().numpy(),
segmentation_fn=lambda x: slic(x, n_segments=100,
compactness=10, sigma=1)
)
return explanation
5.2 Visualization
● Implementation Details:
○ The top 5 influential segments are visualized using
Matplotlib.
def visualize_explanation(explanation):
temp, mask = explanation.get_image_and_mask(
explanation.top_labels[0],
positive_only=False,
num_features=5
)
plt.imshow(temp)
plt.title("LIME Explanation")
plt.axis('off')
plt.show()
6. Testing
● Implementation Details:
○ Images are resized, normalized, and converted into
tensors for inference.
test_transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
])
def preprocess_test_image(image_path):
from PIL import Image
image = Image.open(image_path).convert('RGB')
image_tensor =
test_transform(image).unsqueeze(0).to(device)
return image_tensor
● Implementation Details:
○ The model outputs probabilities for each class, which are
converted into predicted labels.