FingerprintSOM / app.py
Overglitch's picture
Update app.py
06a5287 verified
raw
history blame
2.81 kB
from fastapi import FastAPI, File, UploadFile, HTTPException
from PIL import Image
import numpy as np
import pickle
from io import BytesIO
import math
app = FastAPI()
som = load_model()
MM = 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.]
])
@app.post("/predict/")
async def predict_fingerprint_api(file: UploadFile = File(...)):
try:
contents = await file.read()
image = Image.open(BytesIO(contents)).convert('L')
image = np.asarray(image)
print(f"ARRAY{image.size}:\n\n\n{image}")
image = np.array(image.array).reshape(256, 256, 1)
representative_data = representativo(image)
representative_data = representative_data.reshape(1, -1)
w = som.winner(representative_data)
prediction = MM[w]
return {"prediction": prediction}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
def load_model():
with open('som.pkl', 'rb') as fid:
som = pickle.load(fid)
return som
def sobel(I):
m, n = I.shape
Gx = np.zeros([m-2, n-2], np.float32)
Gy = np.zeros([m-2, n-2], np.float32)
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):
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):
mOrientaciones = np.zeros([m//w, n//w], np.float32)
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))
mOrientaciones[i, j] = (0.5 * math.atan2(YY, XX) + math.pi / 2.0) * (180.0 / math.pi)
return mOrientaciones
def representativo(imarray):
imarray = np.squeeze(imarray)
m, n = imarray.shape
patron = imarray[1:m-1, 1:n-1]
EE = orientacion(patron, 14)
return np.asarray(EE).reshape(-1)