Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
2022-154
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
2022-154
2022-154
Commits
ce7fddbf
Commit
ce7fddbf
authored
Nov 14, 2022
by
Senatilaka T.S.
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Upload New File
parent
43de463b
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
289 additions
and
0 deletions
+289
-0
iot/InspBot/main.py
iot/InspBot/main.py
+289
-0
No files found.
iot/InspBot/main.py
0 → 100644
View file @
ce7fddbf
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"
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment