Your IP : 216.73.216.79


Current Path : /var/www/pythonian/signature_detection/
Upload File :
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)