About Project
The project is a Flower Classification and Information System
that combines a Graphical User Interface (GUI), a machine
learning model, and MySQL database integration.
The GUI, developed using Tkinter, allows users to upload
flower images for classification. The machine learning model,
a pre-trained Convolutional Neural Network (VGG16) with
TensorFlow and Keras, processes and classifies the images. The
MySQL database, named “flowers”, stores and retrieves
information about different flower classes.
The workflow involves the user uploading an image, the ML
model predicting the flower class, and the GUI displaying
detailed information about the predicted flower class
retrieved from the MySQL database.
The project aims to provide users with an interactive platform
to classify flower images and obtain detailed information
about the predicted flower class. Potential extensions include
GUI enhancements, integration of more advanced ML models,
and expansion of the database to include additional flower
classes and information.
1
List Of Libraries
Name Uses
Tkinter GUI Library for Python.
Python Imaging Library, used for
PIL(Pillow) opening, manipulating, and saving
many different image file formats.
An open-source machine learning
TensorFlow library.
A high-level neural networks API,
Keras running on top of Tensorflow.
mysql-connector A MySQL driver for python
2
List Of Functions And Classes
Name Library Use
Displays information about a predicted class,
‘infor()’ function Tkinter including its definition, regions, and medical
advantages.
Destroys the main canvas. Calls the
‘information()’ function Tkinter
infor function.
Loads an image file using file dialog. Performs
‘next_page()’ function Tkinter predictions using a pre-trained model.
Updates the GUI accordingly.
‘Tk’ class Tkinter The main application window.
Used for drawing shapes and displaying
‘Canvas’ class Tkinter
elements in the GUI.
‘Label’ class Tkinter Displays text or images.
‘Button’ class Tkinter Creates buttons for user interaction.
‘Image’ class PIL(pillow) Represents an image.
‘ImageTk’ class PIL(pillow) Used for displaying images in Tkinter.
Linear stack of layers for building neural
‘Sequential’ class Keras
network models.
‘Flatten’ class Keras Flattens the input.
Fully connected layer in a neural network.
‘Dense’ class Keras
Used for connecting to a MySQL database.
‘[Link]’ class MySQL
3
GUI Code
from tkinter import *
from tkinter import filedialog
from PIL import Image, ImageTk
import tensorflow as tf
from tensorflow import keras
import [Link] as don
mydb=[Link](host="localhost",user="root",password="Mouse@2010",database="flowers")
cur=[Link]()
bredth=600
high=600
root=Tk()
[Link](f"{bredth}x{high}")
[Link](bredth,high)
[Link](bredth,high)
#########################################################################################
# information page
#########################################################################################
def infor():
in_canvas=Canvas(root,width=bredth,height=high,bg="#f2eadf")
in_canvas.pack()
heading=Label(in_canvas,text=predicted_class_label.swapcase(),fg="black",bg="#f2eadf",font=("helvatica",
30,"bold"),underline=30)
in_canvas.create_window(300,30,window=heading)
[Link](f"select * from {predicted_class_label}")
data=[Link]()
intro=data[0][0]
4
region1=data[0][1]
region2=data[0][2]
region3=data[0][3]
region4=data[0][4]
region5=data[0][5]
imp1=data[0][6]
imp2=data[0][7]
imp3=data[0][8]
definations=Label(in_canvas,text="DEFINITION",font=("helvetica", 20, "bold"),bg="#f2eadf",fg="black")
in_canvas.create_window(300,100,window=definations)
define=Label(in_canvas,text=f"# {intro}",font=("helvetica", 10),anchor=W,wraplength=600,
justify=LEFT,bg="#f2eadf",fg="black")
in_canvas.create_window(300,150,window=define)
regions=Label(in_canvas,text="REGIONS",font=("helvetica", 20, "bold"),bg="#f2eadf",fg="black")
in_canvas.create_window(300,250,window=regions)
reg1=Label(in_canvas,text=f"# {region1}",anchor=W,font=("helvetica", 10),bg="#f2eadf", justify=LEFT,fg="black")
in_canvas.create_window(20,280,window=reg1,anchor=W)
reg2=Label(in_canvas,text=f"# {region2}",anchor=W,font=("helvetica", 10),bg="#f2eadf", justify=LEFT,fg="black")
in_canvas.create_window(20,300,window=reg2,anchor=W)
reg3=Label(in_canvas,text=f"# {region3}",anchor=W,font=("helvetica", 10),bg="#f2eadf", justify=LEFT,fg="black")
in_canvas.create_window(20,320,window=reg3,anchor=W)
reg4=Label(in_canvas,text=f"# {region4}",anchor=W,font=("helvetica", 10),bg="#f2eadf", justify=LEFT,fg="black")
in_canvas.create_window(20,340,window=reg4,anchor=W)
reg5=Label(in_canvas,text=f"# {region5}",anchor=W,font=("helvetica", 10),bg="#f2eadf", justify=LEFT,fg="black")
in_canvas.create_window(20,360,window=reg5,anchor=W)
med_perspective=Label(in_canvas,text="MEDICAL ADVANTAGES",font=("helvetica", 20,
"bold"),bg="#f2eadf",fg="black",underline=30)
in_canvas.create_window(300,400,window=med_perspective)
med1=Label(in_canvas,text=f"# {imp1}",font=("helvetica", 10),wraplength=550,
justify=LEFT,bg="#f2eadf",fg="black")
in_canvas.create_window(20,450,window=med1,anchor=W)
5
med2=Label(in_canvas,text=f"# {imp2}",font=("helvetica", 10),wraplength=550,
justify=LEFT,bg="#f2eadf",fg="black")
in_canvas.create_window(20,500,window=med2,anchor=W)
med3=Label(in_canvas,text=f"# {imp3}",font=("helvetica", 10),wraplength=550,
justify=LEFT,bg="#f2eadf",fg="black")
in_canvas.create_window(20,550,window=med3,anchor=W)
#########################################################################################
# after uploading
#########################################################################################
def next_page():
def information():
main_canvas.destroy()
infor()
global predicted_class_label
global up_image
filename = [Link](initialdir="/", title="Select file", filetypes=(("Image files",
"*.png;*.gif;*.ppm;*.pgm"), ("all files", "*.*")))
img=[Link](filename)
resized__img = [Link]((200, 200), [Link])
up_image=[Link](resized__img)
[Link](image=up_image,width=200,height=200,borderwidth=0)
loaded_model = [Link].load_model('flower_classification_model.h5')
img = [Link].load_img(filename, target_size=(150, 150))
img_array = [Link].img_to_array(img)
img_array = img_array / 255.0 # Normalize the image
img_array = tf.expand_dims(img_array, 0)
predictions = loaded_model.predict(img_array)
predicted_class_index = [Link](predictions[0]).numpy()
class_labels = ['astilbe', 'bellflower', 'black_eyed_susan', 'calendula', 'california_poppy', 'carnation',
'common_daisy', 'coreopsis', 'daffodil', 'dandelion', 'iris', 'magnolia', 'rose', 'sunflower', 'tulip', 'water_lily']
6
predicted_class_label = class_labels[predicted_class_index]
b2=Button(main_canvas,text="->",width=3,height=1,command=information)
main_canvas.create_window(550,300,window=b2)
[Link](text=predicted_class_label.swapcase(),bg="#f2eadf",font=("itallic", 30 ,"bold"),fg="#475a63")
############################################################################################
#main page design
############################################################################################
main_canvas=Canvas(root,width=bredth,height=high, bg="light green")
main_canvas.pack()
upload_im=[Link]("[Link]")
resized_upload_image = upload_im.resize((150, 100), [Link])
upload_img=[Link](resized_upload_image)
back=[Link]("[Link]")
resized_back_image = [Link]((600, 600), [Link])
backimg=[Link](resized_back_image)
main_canvas.create_image(300,300,image=backimg)
main_label=Label(main_canvas,text="BOTANICAL SEARCH", font=("itallic",20, "bold"),fg="#475a63",bg="#f2eadf")
main_canvas.create_window(300,150,window=main_label)
b1=Button(main_canvas,image=upload_img,width=150,height=100,command=next_page,borderwidth=10)
main_canvas.create_window(300,300,window=b1)
l1 = Label(main_canvas, text="Upload your image", bg="#f2eadf",fg="#475a63", font=("cursive", 20))
main_canvas.create_window(300,450,window=l1)
[Link]()
7
Machine Learning Code
import tensorflow from tensorflow
import keras from keras
import Sequential from [Link]
import Dense,Flatten
from [Link].vgg16 import VGG16
conv_base = VGG16(weights='imagenet', include_top = False, input_shape=(150, 150, 3))
model = Sequential()
[Link](conv_base) [Link](Flatten())
[Link](Dense(256,activation='relu'))
[Link](Dense(16,activation='softmax'))
conv_base.trainable = False
train_ds = [Link].image_dataset_from_directory(directory = '/content/flowers', labels='inferred', label_mode =
'categorical',batch_size=32, image_size=(150,150))
def process(image,label): image = [Link](image/255. ,tensorflow.float32) return image,label
train_ds = train_ds.map(process) [Link](optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
history = [Link](train_ds,epochs=10)
[Link]('flower_classification_model.h5')
8
MySQL Code
import [Link] as don
try:
mydb = [Link](host="localhost", user="root", password="Mouse@2010", database="flowers") cur =
[Link]()
lst = ['astilbe', 'bellflower', 'black_eyed_susan', 'calendula', 'california_poppy', 'carnation', 'common_daisy',
'coreopsis', 'daffodil', 'dandelion', 'iris', 'magnolia', 'rose', 'sunflower', 'tulip', 'water_lily']
for i in lst:
intro = input(f"Introduction for {i}: ")
state1 = input("State 1: ")
state2 = input("State 2: ")
state3 = input("State 3: ")
state4 = input("State 4: ")
state5 = input("State 5: ")
imp1 = input("Important point 1: ")
imp2 = input("Important point 2: ")
imp3 = input("Important point 3: ")
query = f"INSERT INTO {i} (intro, region1, region2, region3, region4, region5, imp1, imp2, imp3) VALUES
(%s, %s, %s, %s, %s, %s, %s, %s, %s)"
values = (intro, state1, state2, state3, state4, state5, imp1, imp2, imp3)
[Link](query, values)
# Commit the changes to the database
[Link]()
except [Link] as e:
print(f"Error: {e}")
finally:
# Close the cursor and database connection
if 'cur' in locals() and cur:
[Link]()
if 'mydb' in locals() and mydb:
[Link]()
9
Output
10