| Current Path : /var/www/pythonian/signature_detection/ |
| Current File : /var/www/pythonian/signature_detection/main.py |
from fastapi import FastAPI, File, UploadFile
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
from fastapi.staticfiles import StaticFiles
from pathlib import Path
import shutil
import cv2
import matplotlib.pyplot as plt
import numpy as np
import os
from src.signature_detect.loader import Loader
from src.signature_detect.extractor import Extractor
from src.signature_detect.cropper import Cropper
from src.signature_detect.judger import Judger
app = FastAPI()
# Enable CORS
origins = ["*"] # Allow all for development
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Directory to save uploaded files
UPLOAD_DIR = Path("uploads")
UPLOAD_DIR.mkdir(exist_ok=True)
# Mount static files so they can be accessed via URL
app.mount("/uploads", StaticFiles(directory=UPLOAD_DIR), name="uploads")
@app.get("/")
async def home() :
return {"test gateway"}
@app.post("/upload/")
async def upload_file(file: UploadFile = File(...)):
file_location = UPLOAD_DIR / file.filename
with file_location.open("wb") as buffer:
shutil.copyfileobj(file.file, buffer)
# URL to access the file
file_url = f"./uploads/{file.filename}"
basename = os.path.basename(file_url)
ext = os.path.splitext(basename)[1][1:].lower()
if ext == "pdf":
file_path = file_url
loader = Loader()
extractor = Extractor(amplfier=15)
cropper = Cropper(border_ratio=0)
judger = Judger()
masks = loader.get_masks(file_path)
is_signed = False
for i in range(len(masks)):
labeled_mask = extractor.extract(masks[i])
#show_image(labeled_mask)
# plt.imsave('./data/output/labeled_mask_{}.jpeg'.format(i), labeled_mask)
results = cropper.run(labeled_mask)
for result in results.values():
is_signed = judger.judge(result["cropped_mask"])
if is_signed:
# show_image(result["cropped_mask"])
plt.imsave(f"./uploads/sign-{file.filename}.jpeg".format(i), result["cropped_mask"])
break
if is_signed:
break
return JSONResponse(content={
"signed": is_signed,
"filename": file.filename,
"message": "File uploaded successfully",
"file_url": f"uploads/sign-{file.filename}.jpeg"
})
elif ext in ("jpg", "jpeg", "png", "tif", "tiff"):
path: str = file_url
image = cv2.imread(f"./uploads/{file.filename}")
#show_image(image)
loader = Loader()
#print(loader)
mask = loader.get_masks(path)[0]
# print(mask)
# print(np.unique(mask))
#show_image(mask)
extractor = Extractor(amplfier=15)
#print(extractor)
labeled_mask = extractor.extract(mask)
cropper = Cropper()
results = cropper.run(labeled_mask)
signature = results[0]["cropped_mask"]
#print(np.unique(signature))
#show_image(signature)
plt.imsave(f"./uploads/signed-{file.filename}", signature, cmap='gray')
judger = Judger()
result = judger.judge(signature)
return JSONResponse(content={
"signed": result,
"filename": file.filename,
"message": "File uploaded successfully",
"file_url": f"uploads/signed-{file.filename}"
})
else:
raise Exception("Document must be jpg/jpeg, png, tif, or pdf.")
def show_image(img):
fig, ax = plt.subplots(figsize=(10, 6))
ax.imshow(img, cmap='gray')
ax.set_axis_off()
plt.tight_layout()
plt.show()
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)