|
import gradio as gr |
|
import matplotlib.pyplot as plt |
|
import numpy as np |
|
import os |
|
import PIL |
|
import tensorflow as tf |
|
|
|
from tensorflow import keras |
|
from tensorflow.keras import layers |
|
from tensorflow.keras.models import Sequential |
|
|
|
from PIL import Image |
|
import gdown |
|
import zipfile |
|
import pathlib |
|
|
|
|
|
gdrive_url = 'https://drive.google.com/file/d/1HjHYlQyRz5oWt8kehkt1TiOGRRlKFsv8/view?usp=drive_link' |
|
|
|
|
|
file_id = gdrive_url.split('/d/')[1].split('/view')[0] |
|
direct_download_url = f'https://drive.google.com/uc?id={file_id}' |
|
|
|
|
|
local_zip_file = 'file.zip' |
|
|
|
|
|
gdown.download(direct_download_url, local_zip_file, quiet=False) |
|
|
|
|
|
extracted_path = 'extracted_files' |
|
|
|
|
|
try: |
|
with zipfile.ZipFile(local_zip_file, 'r') as zip_ref: |
|
zip_ref.extractall(extracted_path) |
|
print("Extraction successful!") |
|
except zipfile.BadZipFile: |
|
print("Error: The downloaded file is not a valid ZIP file.") |
|
|
|
|
|
os.remove(local_zip_file) |
|
|
|
|
|
data_dir = pathlib.Path(extracted_path) |
|
|
|
|
|
for root, dirs, files in os.walk(extracted_path): |
|
level = root.replace(extracted_path, '').count(os.sep) |
|
indent = ' ' * 4 * (level) |
|
print(f"{indent}{os.path.basename(root)}/") |
|
subindent = ' ' * 4 * (level + 1) |
|
for f in files: |
|
print(f"{subindent}{f}") |
|
|
|
|
|
data_dir = pathlib.Path('extracted_files/Pest_Dataset') |
|
|
|
img_height, img_width = 180, 180 |
|
batch_size = 32 |
|
|
|
train_ds = tf.keras.preprocessing.image_dataset_from_directory( |
|
data_dir, |
|
validation_split=0.2, |
|
subset="training", |
|
seed=123, |
|
image_size=(img_height, img_width), |
|
batch_size=batch_size |
|
) |
|
|
|
val_ds = tf.keras.preprocessing.image_dataset_from_directory( |
|
data_dir, |
|
validation_split=0.2, |
|
subset="validation", |
|
seed=123, |
|
image_size=(img_height, img_width), |
|
batch_size=batch_size |
|
) |
|
|
|
class_names = train_ds.class_names |
|
print(class_names) |
|
|
|
plt.figure(figsize=(10, 10)) |
|
for images, labels in train_ds.take(1): |
|
for i in range(9): |
|
ax = plt.subplot(3, 3, i + 1) |
|
plt.imshow(images[i].numpy().astype("uint8")) |
|
plt.title(class_names[labels[i]]) |
|
plt.axis("off") |
|
|
|
|
|
data_augmentation = keras.Sequential([ |
|
layers.RandomFlip("horizontal", input_shape=(img_height, img_width, 3)), |
|
layers.RandomRotation(0.1), |
|
layers.RandomZoom(0.1), |
|
]) |
|
|
|
num_classes = 12 |
|
|
|
model = Sequential([ |
|
data_augmentation, |
|
layers.Rescaling(1./255), |
|
layers.Conv2D(16, 3, padding='same', activation='relu'), |
|
layers.MaxPooling2D(), |
|
layers.Conv2D(32, 3, padding='same', activation='relu'), |
|
layers.MaxPooling2D(), |
|
layers.Conv2D(64, 3, padding='same', activation='relu'), |
|
layers.MaxPooling2D(), |
|
layers.Dropout(0.2), |
|
layers.Flatten(), |
|
layers.Dense(128, activation='relu'), |
|
layers.Dense(num_classes, name="outputs") |
|
]) |
|
|
|
model.compile(optimizer='adam', |
|
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True), |
|
metrics=['accuracy']) |
|
|
|
epochs = 10 |
|
history = model.fit( |
|
train_ds, |
|
validation_data=val_ds, |
|
epochs=epochs |
|
) |
|
|
|
def predict_image(img): |
|
img = np.array(img) |
|
img_resized = tf.image.resize(img, (180, 180)) |
|
img_4d = tf.expand_dims(img_resized, axis=0) |
|
prediction = model.predict(img_4d)[0] |
|
return {class_names[i]: float(prediction[i]) for i in range(len(class_names))} |
|
|
|
image = gr.Image() |
|
label = gr.Label(num_top_classes=5) |
|
|
|
gr.Interface( |
|
fn=predict_image, |
|
inputs=image, |
|
outputs=label, |
|
title="Pest Classification", |
|
description="Upload an image of a pest to classify it into one of the predefined categories." |
|
).launch(debug=True) |
|
|