sofc / app.py
Soooma's picture
Update OK.jpg image path (as local file)
5673cfe verified
import torch
from transformers import AutoModel, AutoImageProcessor
from PIL import Image
import gradio as gr
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity
device = "cuda" if torch.cuda.is_available() else "cpu"
# Load DINOv2 model
model_name = "facebook/dinov2-base"
model = AutoModel.from_pretrained(model_name).to(device)
processor = AutoImageProcessor.from_pretrained(model_name)
# Load OK reference image (built-in normal)
#ok_image = Image.open("https://huggingface.co/datasets/Soooma/sofc/blob/main/OK1.jpg")
ok_image = Image.open("OK1.jpg")
# Precompute OK feature embedding
with torch.no_grad():
ok_input = processor(images=ok_image, return_tensors="pt").to(device)
ok_feat = model(**ok_input).last_hidden_state.mean(dim=1)
ok_feat = ok_feat.cpu().numpy()
def detect_anomaly(image):
if image is None:
return "No image uploaded."
with torch.no_grad():
inputs = processor(images=image, return_tensors="pt").to(device)
feat = model(**inputs).last_hidden_state.mean(dim=1)
feat = feat.cpu().numpy()
similarity = cosine_similarity(feat, ok_feat)[0][0]
if similarity < 0.90:
return f"Anomaly Detected | Similarity: {similarity:.3f}"
else:
return f"Normal | Similarity: {similarity:.3f}"
gr.Interface(
fn=detect_anomaly,
inputs=gr.Image(type="pil"),
outputs="text",
title="Anomaly Detector (DINOv2)",
description="Upload an image of a stack. The model compares it to a known OK sample using DINOv2 features."
).launch()