FingerprintSOM / app.py
Overglitch's picture
Update app.py
fc8fe48 verified
raw
history blame
4.4 kB
from fastapi import FastAPI, File, UploadFile, HTTPException
from PIL import Image
import numpy as np
import pickle
from io import BytesIO
import math
import base64
app = FastAPI()
# Cargar el modelo SOM previamente entrenado
with open("som.pkl", "rb") as tf:
som = pickle.load(tf)
M = np.array([
[ 0., -1., -1., -1., -1., 2., -1., -1., -1., 3.],
[-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
[-1., -1., -1., 1., -1., -1., -1., -1., -1., -1.],
[ 1., -1., -1., -1., -1., -1., -1., -1., -1., 0.],
[-1., -1., -1., -1., 1., -1., -1., -1., -1., -1.],
[-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
[ 3., -1., -1., -1., -1., -1., -1., -1., -1., 3.],
[-1., -1., -1., 0., -1., -1., 3., -1., -1., -1.],
[-1., -1., -1., -1., -1., -1., -1., -1., -1., -1.],
[ 2., -1., -1., -1., 1., -1., -1., -1., -1., 2.]
])
# Funci贸n para realizar la predicci贸n de huellas dactilares
def predict_fingerprint(image):
try:
# Preprocesar la imagen para que coincida con las dimensiones esperadas por el SOM
processed_image = preprocess_image(image)
# Obtener la ubicaci贸n del nodo ganador en el SOM
winner = som.winner(processed_image)
# Asignar la etiqueta correspondiente a la ubicaci贸n ganadora en el SOM
fingerprint_type = get_fingerprint_type(winner)
return fingerprint_type
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
def preprocess_image(image):
# Guardar la imagen en formato TIFF
image.save("temp_image.tif")
# Aplicar el mismo preprocesamiento que a arco1.tif
processed_image = representativo("temp_image.tif")
# Redimensionar la imagen procesada para que coincida con las dimensiones esperadas por el modelo SOM
processed_image_resized = processed_image.reshape(1, -1)
return processed_image_resized
def get_fingerprint_type(winner):
# Usar la matriz M del c贸digo SOM para asignar la etiqueta correspondiente
labels = {0: "LL", 1: "RL", 2: "WH", 3: "AR"} # Mapa de etiquetas
fingerprint_type = labels[int(M[winner[0], winner[1]])]
return fingerprint_type
@app.post("/predict/")
async def predict_fingerprint_api(file: UploadFile = File(...)):
try:
contents = await file.read()
print(f"contents:\n{contents}")
image = Image.open(BytesIO(base64.decodebytes(bytes(base64_str, "utf-8"))))
print(f"image:\n{image}")
fingerprint_type = predict_fingerprint(image)
return {"prediction": fingerprint_type}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
def sobel(I):
m,n = I.shape# I de 254x254
Gx = np.zeros([m-2,n-2],np.float32)# Gx de 252x252
Gy = np.zeros([m-2,n-2],np.float32)# Gy de 252x252
gx = [[-1,0,1],[ -2,0,2],[ -1,0,1]]
gy = [[1,2,1],[ 0,0,0],[ -1,-2,-1]]
for j in range(1,m-2):
for i in range(1,n-2):
Gx[j-1,i-1] = sum(sum(I[j-1:j+2,i-1:i+2]*gx))
Gy[j-1,i-1] = sum(sum(I[j-1:j+2,i-1:i+2]*gy))
return Gx,Gy
def medfilt2(G,d=3):
m,n = G.shape
temp = np.zeros([m+2*(d//2),n+2*(d//2)],np.float32)
salida = np.zeros([m,n],np.float32)
temp[1:m+1,1:n+1] = G
for i in range(1,m):
for j in range(1,n):
A = np.asarray(temp[i-1:i+2,j-1:j+2]).reshape(-1)
salida[i-1,j-1] = np.sort(A)[d+1]
return salida
def orientacion(patron,w):
Gx,Gy = sobel(patron)# patron de 254x254
Gx = medfilt2(Gx)# Gx de 252x252
Gy = medfilt2(Gy)# Gy de 252x252
m,n = Gx.shape
mOrientaciones = np.zeros([m//w,n//w],np.float32)# de una matriz de 18x18
for i in range(m//w):
for j in range(n//w):
YY = sum(sum(2*Gx[i*w:(i+1)*w,j:j+1]*Gy[i*w:(i+1)*w,j:j+1]))
XX = sum(sum(Gx[i*w:(i+1)*w,j:j+1]**2-Gy[i*w:(i+1)*w,j:j+1]**2))
#YY = sum(sum(2*Gx[i*w:(i+1)*w,0:1]*Gy[i*w:(i+1)*w,0:1]))
#XX = sum(sum(Gx[i*w:(i+1)*w,0:1]**2-Gy[i*w:(i+1)*w,0:1]**2))
mOrientaciones[i,j] = (0.5*math.atan2(YY,XX) + math.pi/2.0)*(180.0/math.pi)
return mOrientaciones
def representativo(archivo):
im = Image.open(archivo).convert('L')
m,n = im.size
imarray = np.array(im,np.float32)
patron = imarray[1:m-1,1:n-1]# de 256x256 a 254x254
EE = orientacion(patron,14)# retorna EE de 18x18
return np.asarray(EE).reshape(-1)