File size: 1,967 Bytes
739b192 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | from transformers import CLIPProcessor, CLIPModel
from PIL import Image
import torch
import io
import base64
from core.globals import ml_models
from core.logging_config import logger
def load_vision_models():
try:
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
ml_models["clip_model"] = model
ml_models["clip_processor"] = processor
logger.info("✅ CLIP Vision model loaded.")
except Exception as e:
logger.error(f"❌ Failed to load CLIP model: {e}")
async def calculate_fraud_risk(uploaded_image_b64: str, product_image_b64: str) -> float:
model = ml_models.get("clip_model")
processor = ml_models.get("clip_processor")
if not model or not processor:
return 0.0
try:
# Decode base64 images
uploaded_image = Image.open(io.BytesIO(base64.b64decode(uploaded_image_b64))).convert("RGB")
product_image = Image.open(io.BytesIO(base64.b64decode(product_image_b64))).convert("RGB")
# Process images
inputs = processor(images=[uploaded_image, product_image], return_tensors="pt")
# Get image embeddings
with torch.no_grad():
image_features = model.get_image_features(**inputs)
# Normalize features
image_features = image_features / image_features.norm(p=2, dim=-1, keepdim=True)
# Calculate cosine similarity
similarity = torch.nn.functional.cosine_similarity(image_features[0].unsqueeze(0), image_features[1].unsqueeze(0))
similarity_score = similarity.item()
# Fraud risk is inverse of similarity (0 similarity = 100% fraud risk)
fraud_risk = max(0.0, 1.0 - similarity_score)
return float(fraud_risk)
except Exception as e:
logger.error(f"Vision fraud calculation error: {e}")
return 0.0
|