Spaces:
Sleeping
Sleeping
Download features/real_forged_classifier/preprocessor.py from can-org/Testing-AI-Contain: direct link, hf CLI and curl.
- Browser
- Download file 2.32 kB
-
https://huggingface.co/spaces/can-org/Testing-AI-Contain/resolve/main/features/real_forged_classifier/preprocessor.py
- Command line
-
hf download hf://spaces/can-org/Testing-AI-Contain/features/real_forged_classifier/preprocessor.py
-
curl -L -o preprocessor.py https://huggingface.co/spaces/can-org/Testing-AI-Contain/resolve/main/features/real_forged_classifier/preprocessor.py
2.32 kB
| from PIL import Image | |
| import torch | |
| import numpy as np | |
| from typing import IO | |
| import cv2 | |
| from torchvision import transforms | |
| # Import the globally loaded models instance | |
| from .model_loader import models | |
| class ImagePreprocessor: | |
| """ | |
| Handles preprocessing of images for the FFT CNN model. | |
| """ | |
| def __init__(self): | |
| """ | |
| Initializes the preprocessor. | |
| """ | |
| self.device = models.device | |
| # Define the image transformations, matching the training process | |
| self.transform = transforms.Compose([ | |
| transforms.ToPILImage(), | |
| transforms.Resize((224, 224)), | |
| transforms.ToTensor(), | |
| ]) | |
| def process(self, image_file: IO) -> torch.Tensor: | |
| """ | |
| Opens an image file, applies FFT, preprocesses it, and returns a tensor. | |
| Args: | |
| image_file (IO): The image file object (e.g., from a file upload). | |
| Returns: | |
| torch.Tensor: The preprocessed image as a tensor, ready for the model. | |
| """ | |
| try: | |
| # Read the image file into a numpy array | |
| image_np = np.frombuffer(image_file.read(), np.uint8) | |
| # Decode the image as grayscale | |
| img = cv2.imdecode(image_np, cv2.IMREAD_GRAYSCALE) | |
| except Exception as e: | |
| print(f"Error reading or decoding image: {e}") | |
| raise ValueError("Invalid or corrupted image file.") | |
| if img is None: | |
| raise ValueError("Could not decode image. File may be empty or corrupted.") | |
| # 1. Apply Fast Fourier Transform (FFT) | |
| f = np.fft.fft2(img) | |
| fshift = np.fft.fftshift(f) | |
| magnitude_spectrum = 20 * np.log(np.abs(fshift) + 1) # Add 1 to avoid log(0) | |
| # Normalize the magnitude spectrum to be in the range [0, 255] | |
| magnitude_spectrum = cv2.normalize(magnitude_spectrum, None, 0, 255, cv2.NORM_MINMAX) | |
| magnitude_spectrum = np.uint8(magnitude_spectrum) | |
| # 2. Apply torchvision transforms | |
| image_tensor = self.transform(magnitude_spectrum) | |
| # Add a batch dimension and move to the correct device | |
| image_tensor = image_tensor.unsqueeze(0).to(self.device) | |
| return image_tensor | |
| # Create a single instance of the preprocessor | |
| preprocessor = ImagePreprocessor() | |