test / app.py
artcracker's picture
Update app.py
1619535 verified
raw
history blame
3.28 kB
import gradio as gr
from transformers import AutoImageProcessor, AutoModel
import torch
from PIL import Image
import os
import json
import uuid
import numpy as np
# Загрузка модели DINOv2
processor = AutoImageProcessor.from_pretrained("facebook/dino-vits16")
model = AutoModel.from_pretrained("facebook/dino-vits16")
# Функция для извлечения эмбеддинга
def extract_features(img):
inputs = processor(images=img, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
return outputs.last_hidden_state[:, 0].squeeze().numpy()
# Косинусное расстояние между двумя эмбеддингами
def cosine_similarity(vec1, vec2):
a = np.array(vec1)
b = np.array(vec2)
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# Путь к базе
db_path = "embeddings2.json"
# Сохранение фото в базу
def save_embedding(image, building_name):
if not building_name:
return "Ошибка: нужно указать название здания."
embedding = extract_features(image).tolist()
entry = {
"id": str(uuid.uuid4()),
"building_name": building_name,
"embedding": embedding
}
if os.path.exists(db_path):
with open(db_path, "r") as f:
data = json.load(f)
else:
data = []
data.append(entry)
with open(db_path, "w") as f:
json.dump(data, f, indent=2)
return f"Фото сохранено для здания: {building_name}"
# Поиск похожего здания
def identify_building(image):
if not os.path.exists(db_path):
return "База данных пуста. Добавьте здания."
with open(db_path, "r") as f:
data = json.load(f)
if not data:
return "База данных пуста."
embedding = extract_features(image).tolist()
similarities = []
for item in data:
score = cosine_similarity(item["embedding"], embedding)
similarities.append({
"building_name": item["building_name"],
"score": score
})
similarities.sort(key=lambda x: x["score"], reverse=True)
best = similarities[0]
return f"Похоже на: {best['building_name']}\nСовпадение: {best['score']:.4f}"
# Интерфейс
with gr.Blocks() as demo:
gr.Markdown("## 🏛 Распознавание зданий и пополнение базы")
with gr.Tab("🔍 Найти здание"):
with gr.Row():
img_input = gr.Image(type="pil")
recognize_button = gr.Button("Распознать здание")
result_text = gr.Textbox()
recognize_button.click(fn=identify_building, inputs=img_input, outputs=result_text)
with gr.Tab("➕ Добавить новое здание"):
with gr.Row():
img_save = gr.Image(type="pil")
building_name = gr.Textbox(label="Название здания")
save_button = gr.Button("Сохранить в базу")
save_result = gr.Textbox()
save_button.click(fn=save_embedding, inputs=[img_save, building_name], outputs=save_result)
demo.launch()