animeaidetect / src /inference.py
hirawaru's picture
Upload folder using huggingface_hub
847ed80 verified
Raw
History Blame Contribute Delete
4.88 kB
"""
Inference script for AI Image Detection
"""
import argparse
import yaml
import torch
import numpy as np
from PIL import Image
from pathlib import Path
from src.dataset import get_transforms
from src.model import AIImageClassifier
def load_config(config_path='config.yaml'):
"""Load configuration from YAML file"""
with open(config_path, 'r') as f:
config = yaml.safe_load(f)
return config
def predict_image(image_path, model, transform, device, class_names=['Natural', 'Synthetic']):
"""
Predict label for a single image
Args:
image_path (str): Path to image file
model (nn.Module): Trained model
transform (callable): Image transform
device (torch.device): Device to use
class_names (list): List of class names
Returns:
dict: Prediction results
"""
model.eval()
# Load and preprocess image
try:
image = Image.open(image_path).convert('RGB')
except Exception as e:
print(f"Error loading image: {e}")
return None
image_tensor = transform(image).unsqueeze(0).to(device)
# Predict
with torch.no_grad():
outputs = model(image_tensor)
probs = torch.softmax(outputs, dim=1)
confidence, predicted = torch.max(probs, 1)
predicted_class = class_names[predicted.item()]
confidence_score = confidence.item()
probabilities = {class_names[i]: probs[0, i].item() for i in range(len(class_names))}
return {
'predicted_class': predicted_class,
'confidence': confidence_score,
'probabilities': probabilities,
'image_path': str(image_path)
}
def predict_batch(image_dir, model, transform, device, class_names=['Natural', 'Synthetic']):
"""
Predict labels for all images in a directory
Args:
image_dir (str): Path to directory containing images
model (nn.Module): Trained model
transform (callable): Image transform
device (torch.device): Device to use
class_names (list): List of class names
Returns:
list: List of prediction results
"""
image_dir = Path(image_dir)
results = []
for image_path in sorted(image_dir.glob('*')):
if image_path.suffix.lower() in ['.jpg', '.jpeg', '.png', '.bmp', '.gif']:
result = predict_image(image_path, model, transform, device, class_names)
if result:
results.append(result)
print(f"{image_path.name}: {result['predicted_class']} ({result['confidence']:.4f})")
return results
def main():
parser = argparse.ArgumentParser(description='Inference for AI Image Detection')
parser.add_argument('--config', type=str, default='config.yaml', help='Path to config file')
parser.add_argument('--model_path', type=str, help='Path to trained model')
parser.add_argument('--image_path', type=str, help='Path to single image')
parser.add_argument('--image_dir', type=str, help='Path to directory with images')
args = parser.parse_args()
config = load_config(args.config)
device = torch.device('cuda' if torch.cuda.is_available() and config['device'] == 'cuda' else 'cpu')
# Load model
model = AIImageClassifier(
model_name=config['model']['name'],
num_classes=config['model']['num_classes'],
pretrained=False,
dropout=config['model']['dropout']
)
model_path = args.model_path or f"{config['output']['checkpoint_path']}/best_model.pth"
model.load_state_dict(torch.load(model_path, map_location=device))
model = model.to(device)
print(f"Loaded model from {model_path}")
# Get transform
transform = get_transforms(
image_size=config['preprocessing']['image_size'],
mode='val',
normalize_mean=config['preprocessing']['normalize_mean'],
normalize_std=config['preprocessing']['normalize_std']
)
# Predict
if args.image_path:
result = predict_image(args.image_path, model, transform, device)
if result:
print("\n=== Prediction Result ===")
print(f"Image: {result['image_path']}")
print(f"Predicted: {result['predicted_class']}")
print(f"Confidence: {result['confidence']:.4f}")
print(f"Probabilities: {result['probabilities']}")
elif args.image_dir:
results = predict_batch(args.image_dir, model, transform, device)
print(f"\n=== Batch Prediction Complete ===")
print(f"Processed {len(results)} images")
else:
print("Please provide either --image_path or --image_dir")
if __name__ == '__main__':
main()