Mohammedallyl's picture
Upload 27 files
c4dc0b3 verified
raw
history blame
3.31 kB
from fastapi import APIRouter,BackgroundTasks,HTTPException
from os.path import exists
from os import listdir
import subprocess
from passlib.context import CryptContext
import sqlite3
ModelTrainer=APIRouter(prefix="/Trainer")
TrainingProcess={}
def TrainModel(UserId):
global TrainingProcess
if TrainingProcess.get(UserId,False) and TrainingProcess[UserId].poll() is None:
raise HTTPException(status_code=400,detail="Model is already training.")
TrainingProcess=subprocess.Popen(["python","./FaceRecognition/ModelTrainer.py",f"{UserId}"])
@ModelTrainer.post("/TrainFaceModel")
async def SpeachToTextEndPoint(Tasks:BackgroundTasks,Email:str,Password:str):
global TrainingProcess
try:
State=False
pwd_context=CryptContext(schemes=["bcrypt"],deprecated="auto")
connect=sqlite3.connect("DataBase/DataBase.bd")
cursor=connect.execute(f'''
SELECT UserId,Password FROM Users where Email='{Email}'
''')
Data=cursor.fetchall()
if len(Data) !=0 :
if Data[0][0]==None:
return {"Status":True,"Message":"Email or Password Is Incorrect"}
HasedPassword=Data[0][1]
UserId=Data[0][0]
State=pwd_context.verify(Password,HasedPassword)
if exists(f"./FaceRecognition/ExtactedFaces/{UserId}/Train"):
for UserName in listdir(f"./FaceRecognition/ExtactedFaces/{UserId}/Train"):
if len(listdir(f"./FaceRecognition/ExtactedFaces/{UserId}/Train/"+UserName))<2:
return {"Status":False,"Message":f"{UserName} has only {len(listdir(f'./FaceRecognition/ExtactedFaces/{UserId}/Train/'+UserName))} image and it must be 2 or more"}
if not State:
return {"Status":False,"Message":"Email or Password is not correct"}
if TrainingProcess.get(UserId,False) and TrainingProcess[UserId].poll() is None:
raise HTTPException(status_code=400,detail="Model is already training.")
Tasks.add_task(TrainModel ,args=[UserId])
return{"message":"Training Started"}
except Exception as e:
return{"Stats":False,"message":f"{e}"}
@ModelTrainer.post("/TrainFaceModelStatus")
async def SpeachToTextEndPoint(Email:str,Password:str):
global TrainingProcess
try:
State=False
pwd_context=CryptContext(schemes=["bcrypt"],deprecated="auto")
connect=sqlite3.connect("DataBase/DataBase.bd")
cursor=connect.execute(f'''
SELECT UserId,Password FROM Users where Email='{Email}'
''')
if len(cursor.fetchall())==1:
HasedPassword=cursor.fetchall()[0][1]
UserId=cursor.fetchall()[0][0]
State=pwd_context.verify(Password,HasedPassword)
if not State:
return {"Status":False,"Message":"Email or Password is not correct"}
if TrainingProcess.get(UserId,False) and TrainingProcess[UserId].poll() is None:
return{"message":"Model still Training "}
else:
return{"message":"Model Training ended"}
except Exception as e:
return{"Stats":True,"message":f"{e}"}