Commit bde704f9 authored by Senatilaka T.S.'s avatar Senatilaka T.S.

Upload New File

parent b74c5413
import re
import os
import io
import datetime
import mysql.connector
import uvicorn
from starlette.responses import Response
from fastapi import FastAPI
from yolov5 import yolov5, setModel
from pydantic import BaseModel
HOST_NAME = '132.145.158.63'
USER = 'root'
PASSWORD = 'shenal@7788'
DATABASE = 'AgroEngineDB'
DATE_FORMAT_REGEX = "^([1-9] |1[0-9]| 2[0-9]|3[0-1])(.|-)([1-9] |1[0-2])(.|-|)20[0-9][0-9]$"
# FastAPI
app = FastAPI(
title="AgroEngine A.I API",
description="""Visit [AgroEngine](https://agroengine.cf/) for the Learn about this Project.""",
version="1.0.0",
)
class DateID(BaseModel):
dateId: str
@app.post("/runInspBot/{date}")
def runInspBot(date: str):
x = re.match(
DATE_FORMAT_REGEX, date)
if x is not None:
dateStrList = date.split("-")
dateList = [int(d) for d in dateStrList]
dateList.reverse()
run_ai(dateList)
return {"Response": "Ok"}
else:
return {"Response": "Invalid Date Format"}
@app.get("/getDiseasesData/{date}")
def getDiseasesData(date: str):
x = re.match(
DATE_FORMAT_REGEX, date)
if x is not None:
dateStrList = date.split("-")
dateList = [int(d) for d in dateStrList]
dateList.reverse()
response = getAllDiseases(dateList)
return response
else:
return {"Response": "Invalid Date Format"}
@app.get("/getExactDiseaseData/{date_ID}")
def getExactDiseaseData(date_ID: str):
response = getExactDisease(date_ID)
return response
@app.post("/getDiseaseImage/")
def getDiseaseImage(date_ID: DateID):
response = getExactDiseaseImage(date_ID.dateId)
return response
@app.get("/getStagesData/{date}")
def getStagesData(date: str):
x = re.match(
DATE_FORMAT_REGEX, date)
if x is not None:
dateStrList = date.split("-")
dateList = [int(d) for d in dateStrList]
dateList.reverse()
response = getAllStages(dateList)
return response
else:
return {"Response": "Invalid Date Format"}
@app.get("/getExactStageData/{date_ID}")
def getExactStageData(date_ID: str):
response = getExactStage(date_ID)
return response
@app.post("/getStageImage/")
def getStageImage(date_ID: DateID):
response = getExactStageImage(date_ID.dateId)
return response
def write_file(data, filename):
global filepath
filepath = os.path.join('./temp', filename)
if not os.path.exists('./temp'):
os.makedirs('./temp')
with open(filepath, 'wb') as file:
file.write(data)
def import_all_from_db(date):
global imgID_List
global index_List
global date_List
imgID_List = []
index_List = []
date_List = []
myDB = mysql.connector.Connect(
host=HOST_NAME, user=USER, password=PASSWORD, database=DATABASE)
startDate = datetime.datetime(date[0], date[1], date[2], 0, 0, 0)
endDate = datetime.datetime(date[0], date[1], date[2], 23, 59, 59)
mycursor = myDB.cursor()
mycursor.execute(
"SELECT * FROM plant_imgs WHERE date BETWEEN (%s) AND (%s)", (startDate, endDate,))
index = 0
for x in mycursor.fetchall():
write_file(x[3], str(index) + ".png")
imgID_List.append(x[0])
index_List.append(x[1])
date_List.append(x[2])
index += 1
mycursor.close()
myDB.close()
return index
def run_ai(date):
index = import_all_from_db(date)
if index == 0:
return 1
myDB = mysql.connector.Connect(
host=HOST_NAME, user=USER, password=PASSWORD, database=DATABASE)
mycursor = myDB.cursor()
setModel('dd')
for x in range(index):
image = './temp/' + str(x) + '.png'
classes, confidence, converted_img = yolov5(image)
if len(classes) != 0:
bytes_io = io.BytesIO()
converted_img.save(bytes_io, format='PNG')
diseases_string = ''
for y in classes:
diseases_string += ' ' + y
mycursor.execute(
"INSERT INTO diseases_detected_table (datetime_created, plant_ID, disease_name, detect_confidence, disease_img) VALUES (%s, %s, %s, %s, %s)", (date_List[x], index_List[x], diseases_string, confidence, bytes_io.getvalue()))
myDB.commit()
setModel('gs')
for x in range(index):
image = './temp/' + str(x) + '.png'
classes, confidence, converted_img = yolov5(image)
bytes_io = io.BytesIO()
converted_img.save(bytes_io, format='PNG')
stage_string = ''
for y in classes:
stage_string += ' ' + y
# myDB = mysql.connector.Connect(
# host=HOST_NAME, user=USER, password=PASSWORD, database=DATABASE)
# mycursor = myDB.cursor()
mycursor.execute(
"INSERT INTO growing_stages_table (datetime_created, stages_name, plant_ID, detect_confidence, stage_img) VALUES (%s, %s, %s, %s, %s)", (
date_List[x], stage_string, index_List[x], confidence, bytes_io.getvalue())
)
myDB.commit()
mycursor.close()
myDB.close()
def getAllDiseases(date):
dateTimeList = []
plantIDList = []
diseaseNameList = []
confidenceList = []
myDB = mysql.connector.Connect(
host=HOST_NAME, user=USER, password=PASSWORD, database=DATABASE)
mycursor = myDB.cursor()
startDate = datetime.datetime(date[0], date[1], date[2], 0, 0, 0)
endDate = datetime.datetime(date[0], date[1], date[2], 23, 59, 59)
Query = "SELECT datetime_created,plant_ID, disease_name, detect_confidence FROM diseases_detected_table WHERE datetime_created BETWEEN (%s) AND (%s)"
mycursor.execute(Query, (startDate, endDate))
for x in mycursor.fetchall():
dateTimeList.append(x[0].strftime("%Y-%m-%d %H:%M:%S"))
plantIDList.append(x[1])
diseaseNameList.append(x[2])
confidenceList.append(x[3])
mycursor.close()
myDB.close()
if len(dateTimeList) == 0:
return {"Response": "EMPTY"}
responseDict = {"DATE_TIME": dateTimeList, "PLANT_ID": plantIDList,
"DISEASES_NAME": diseaseNameList, "CONFIDENCE": confidenceList}
return responseDict
def getAllStages(date):
dateTimeList = []
plantIDList = []
stageNameList = []
confidenceList = []
myDB = mysql.connector.Connect(
host=HOST_NAME, user=USER, password=PASSWORD, database=DATABASE)
mycursor = myDB.cursor()
startDate = datetime.datetime(date[0], date[1], date[2], 0, 0, 0)
endDate = datetime.datetime(date[0], date[1], date[2], 23, 59, 59)
Query = "SELECT datetime_created, stages_name, plant_ID, detect_confidence FROM growing_stages_table WHERE datetime_created BETWEEN (%s) AND (%s)"
mycursor.execute(Query, (startDate, endDate))
for x in mycursor.fetchall():
dateTimeList.append(x[0].strftime("%Y-%m-%d %H:%M:%S"))
stageNameList.append(x[1])
plantIDList.append(x[2])
confidenceList.append(x[3])
mycursor.close()
myDB.close()
if len(dateTimeList) == 0:
return {"Response": "EMPTY"}
responseDict = {"DATE_TIME": dateTimeList, "PLANT_ID": plantIDList,
"STAGE_NAME": stageNameList, "CONFIDENCE": confidenceList}
return responseDict
def getExactDisease(date_ID):
myDB = mysql.connector.Connect(
host=HOST_NAME, user=USER, password=PASSWORD, database=DATABASE)
mycursor = myDB.cursor()
Query = "SELECT plant_ID, disease_name, detect_confidence FROM diseases_detected_table WHERE datetime_created LIKE (%s)"
mycursor.execute(Query, (date_ID,))
result = mycursor.fetchone()
if result is None:
return {"Response": "EMPTY"}
responseDict = {
"PLANT_ID": result[0], "DISEASE_NAME": result[1], "CONFIDENCE": result[2]}
return responseDict
def getExactStage(date_ID):
myDB = mysql.connector.Connect(
host=HOST_NAME, user=USER, password=PASSWORD, database=DATABASE)
mycursor = myDB.cursor()
Query = "SELECT stages_name, plant_ID, detect_confidence FROM growing_stages_table WHERE datetime_created LIKE (%s)"
mycursor.execute(Query, (date_ID,))
result = mycursor.fetchone()
if result is None:
return {"Response": "EMPTY"}
responseDict = {
"PLANT_ID": result[1], "STAGE_NAME": result[0], "CONFIDENCE": result[2]}
return responseDict
def getExactDiseaseImage(date_ID):
myDB = mysql.connector.Connect(
host=HOST_NAME, user=USER, password=PASSWORD, database=DATABASE)
mycursor = myDB.cursor()
Query = "SELECT disease_img FROM diseases_detected_table WHERE datetime_created LIKE (%s)"
mycursor.execute(Query, (date_ID,))
result = mycursor.fetchone()
if result is None:
return {"Response": "EMPTY"}
return Response(content=result[0], media_type="image/png")
def getExactStageImage(date_ID):
myDB = mysql.connector.Connect(
host=HOST_NAME, user=USER, password=PASSWORD, database=DATABASE)
mycursor = myDB.cursor()
Query = "SELECT stage_img FROM growing_stages_table WHERE datetime_created LIKE (%s)"
mycursor.execute(Query, (date_ID,))
result = mycursor.fetchone()
if result is None:
return {"Response": "EMPTY"}
return Response(content=result[0], media_type="image/png")
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment