Pixcribe / image_processor_manager.py
DawnC's picture
Upload 22 files
6a3bd1f verified
Raw History Blame Contribute Delete
2.61 kB
import torch
import numpy as np
from PIL import Image
from typing import Tuple, Optional, Union
import torchvision.transforms as transforms
class ImageProcessorManager:
"""Image validation, preprocessing and format standardization"""
def __init__(self):
self.supported_formats = ['JPEG', 'PNG', 'WEBP', 'JPG']
self.min_resolution = (224, 224)
# CLIP preprocessing transform
self.clip_transform = transforms.Compose([
transforms.Resize((336, 336), interpolation=transforms.InterpolationMode.BICUBIC),
transforms.ToTensor(),
transforms.Normalize(
mean=[0.48145466, 0.4578275, 0.40821073],
std=[0.26862954, 0.26130258, 0.27577711]
)
])
def load_image(self, file_path: Union[str, Image.Image]) -> Image.Image:
"""Load and validate image"""
if isinstance(file_path, Image.Image):
image = file_path
else:
try:
image = Image.open(file_path)
except Exception as e:
raise ValueError(f"Failed to load image: {e}")
# Convert to RGB
if image.mode != 'RGB':
image = image.convert('RGB')
# Check resolution
if image.size[0] < self.min_resolution[0] or image.size[1] < self.min_resolution[1]:
raise ValueError(f"Image resolution too low, minimum required: {self.min_resolution}")
return image
def preprocess_for_yolo(self, image: Image.Image) -> np.ndarray:
"""Preprocess image for YOLO (keep original format)"""
return np.array(image)
def preprocess_for_clip(self, image: Image.Image) -> torch.Tensor:
"""Preprocess image for CLIP (336x336, ImageNet normalization)"""
return self.clip_transform(image)
def preprocess_for_qwen(self, image: Image.Image) -> Image.Image:
"""Preprocess image for Qwen2.5-VL (dynamic resolution)"""
return image
def resize_with_aspect_ratio(self, image: Image.Image, max_size: int = 1024) -> Image.Image:
"""Resize image while maintaining aspect ratio"""
width, height = image.size
if max(width, height) > max_size:
if width > height:
new_width = max_size
new_height = int(height * (max_size / width))
else:
new_height = max_size
new_width = int(width * (max_size / height))
image = image.resize((new_width, new_height), Image.Resampling.LANCZOS)
return image
print("✓ ImageProcessorManager defined")