vinithius commited on
Commit
e47948f
·
verified ·
1 Parent(s): 799fee9

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +57 -0
app.py ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from torch import nn
3
+ from transformers import AutoImageProcessor, AutoModel
4
+ from PIL import Image
5
+ import base64
6
+ from io import BytesIO
7
+ from fastapi import FastAPI, HTTPException
8
+ from pydantic import BaseModel
9
+
10
+ # Nome do modelo no Hugging Face Hub
11
+ MODEL_NAME = "facebook/dinov2-small"
12
+
13
+ # Carregando processador e modelo
14
+ processor = AutoImageProcessor.from_pretrained(MODEL_NAME)
15
+ model = AutoModel.from_pretrained(MODEL_NAME)
16
+
17
+ # Projeção para 512D
18
+ projection = nn.Linear(model.config.hidden_size, 512)
19
+
20
+ # Inicializa o FastAPI
21
+ app = FastAPI(
22
+ title="API de Embedding de Imagem",
23
+ description="Endpoint para obter o embedding de uma imagem usando o modelo DINOv2.",
24
+ version="1.0.0"
25
+ )
26
+
27
+ # Define o modelo de dados para a requisição
28
+ class ImageRequest(BaseModel):
29
+ image: str
30
+
31
+ # Define o endpoint para o embedding da imagem
32
+ @app.post("/embed")
33
+ async def get_embedding(request: ImageRequest):
34
+ try:
35
+ # Extrai a string Base64 do formato "data:image/png;base64,..."
36
+ header, img_base64 = request.image.split(",", 1)
37
+
38
+ # Decodifica a string Base64
39
+ image_data = base64.b64decode(img_base64)
40
+
41
+ # Abre a imagem com Pillow
42
+ image = Image.open(BytesIO(image_data))
43
+
44
+ # Preprocessamento
45
+ inputs = processor(images=image, return_tensors="pt")
46
+
47
+ with torch.no_grad():
48
+ outputs = model(**inputs)
49
+ last_hidden_state = outputs.last_hidden_state
50
+ embedding = last_hidden_state[:, 0]
51
+ embedding_512 = projection(embedding)
52
+
53
+ # Converte para lista Python e retorna
54
+ return {"embedding": embedding_512.squeeze().tolist()}
55
+
56
+ except Exception as e:
57
+ raise HTTPException(status_code=400, detail=f"Erro ao processar a imagem: {e}")