""" Mock model for UI development This allows parallel development while the actual model is being trained """ import torch import torch.nn as nn import numpy as np class MockPlantDiseaseModel(nn.Module): """ Mock CNN model that mimics the structure of a real plant disease classifier Returns realistic-looking predictions for UI testing """ def __init__(self, num_classes=39): super(MockPlantDiseaseModel, self).__init__() # Simple architecture that matches expected input/output self.features = nn.Sequential( nn.Conv2d(3, 32, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(2), nn.Conv2d(32, 64, kernel_size=3, padding=1), nn.ReLU(), nn.MaxPool2d(2), nn.AdaptiveAvgPool2d((1, 1)) ) self.classifier = nn.Sequential( nn.Flatten(), nn.Linear(64, num_classes) ) self.num_classes = num_classes def forward(self, x): """ Forward pass that returns realistic probabilities """ x = self.features(x) x = self.classifier(x) # Add some controlled randomness to make predictions look realistic # In a real model, this would be learned weights return x def create_mock_predictions(class_names): """ Create realistic-looking mock predictions Returns a dict with class names and probabilities """ num_classes = len(class_names) # Create random probabilities that sum to 1 # Give higher weight to a few "predicted" classes logits = np.random.randn(num_classes) logits[np.random.randint(0, num_classes)] += 3 # Make one class likely logits[np.random.randint(0, num_classes)] += 1.5 # Make another somewhat likely # Convert to probabilities using softmax probs = np.exp(logits) / np.sum(np.exp(logits)) # Create prediction dict predictions = {name: float(prob) for name, prob in zip(class_names, probs)} return predictions def get_mock_model(): """ Returns a mock model instance """ model = MockPlantDiseaseModel(num_classes=39) model.eval() # Set to evaluation mode return model if __name__ == "__main__": # Test the mock model print("Testing mock model...") model = get_mock_model() # Test with random input test_input = torch.randn(1, 3, 256, 256) with torch.no_grad(): output = model(test_input) print(f"Output shape: {output.shape}") print(f"Sample logits: {output[0][:5]}") # Test mock predictions from config import CLASS_NAMES predictions = create_mock_predictions(CLASS_NAMES) top_5 = sorted(predictions.items(), key=lambda x: x[1], reverse=True)[:5] print("\nTop 5 predictions:") for name, prob in top_5: print(f" {name}: {prob:.4f}")