| 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) |
|
|