# Corn Detection Model This repository contains an implementation of a corn detection model using the EfficientNet architecture. The model distinguishes between "Healthy corn" and "Infected" corn based on input images. --- ## Overview The project uses **EfficientNetB3** as the base model and is fine-tuned for corn health detection. It supports image classification by preprocessing input images to the required dimensions and scale, and then outputs predictions with associated confidence scores. --- ## Model Details - **Model Type:** EfficientNet - **Base Model:** EfficientNetB3 - **Weights File:** `EfficientNetB3-corn-100.0.h5` - **License:** MIT - **Language:** English - **Main Metric:** Accuracy - **Pipeline Tag:** Image Classification ### Classes 1. **Healthy corn** - **ID:** 0 - **Input Size:** 224 x 224 pixels - **Scale Factor:** 1 2. **Infected** - **ID:** 1 - **Input Size:** 224 x 224 pixels - **Scale Factor:** 1 ### Preprocessing - **Resize:** `[224, 224]` - **Scale:** Images are scaled by `255` (i.e., pixel values are normalized) --- ## Installation Ensure you have Python installed along with the necessary dependencies. You can install the required packages with pip: ```bash pip install tensorflow huggingface_hub numpy pillow requests ``` --- ## Usage ### Custom Depthwise Convolution Layer Due to a potential mismatch with the default Keras implementation, a custom wrapper for the `DepthwiseConv2D` layer is provided that ignores the `groups` parameter. This wrapper is then used when loading the model. ### Loading the Model The model is downloaded from the Hugging Face Hub using the `hf_hub_download` function and loaded with the custom `DepthwiseConv2D` object: ```python from tensorflow.keras.layers import DepthwiseConv2D as OriginalDepthwiseConv2D from huggingface_hub import hf_hub_download from tensorflow.keras.models import load_model # Define a wrapper that ignores the 'groups' argument def DepthwiseConv2D(*args, **kwargs): kwargs.pop('groups', None) # Remove the groups parameter if present return OriginalDepthwiseConv2D(*args, **kwargs) # Download the model weights from the Hugging Face Hub model_path = hf_hub_download( repo_id="Luwayy/corn-detection", # Your HF repository ID filename="EfficientNetB3-corn-100.0.h5" ) custom_objects = {'DepthwiseConv2D': DepthwiseConv2D} model = load_model(model_path, custom_objects=custom_objects) ``` ### Preprocessing and Prediction The code below demonstrates how to load and preprocess an image, and then perform prediction: ```python import numpy as np from tensorflow.keras.applications.efficientnet import preprocess_input from PIL import Image import requests from io import BytesIO # Class labels labels = ["Healthy corn", "Infected"] # Function to load and preprocess the image def load_and_preprocess_image(image_url): response = requests.get(image_url) img = Image.open(BytesIO(response.content)).convert("RGB") img = img.resize((224, 224)) # Resize to model input dimensions img_array = np.array(img) img_array = preprocess_input(img_array) # EfficientNet preprocessing img_array = np.expand_dims(img_array, axis=0) # Add batch dimension return img_array # Prediction function def predict(image_url): img = load_and_preprocess_image(image_url) preds = model.predict(img)[0] pred_index = np.argmax(preds) confidence = preds[pred_index] return labels[pred_index], confidence # Example usage image_url = "https://www.harvestplus.org/wp-content/uploads/2021/08/Orange-maize-2.png" # Replace with your image URL predicted_class, confidence = predict(image_url) print(f"Predicted: {predicted_class} (Confidence: {confidence:.2f})") ``` Upon running the example, you might see an output similar to: ``` Predicted: Healthy corn (Confidence: 0.80) ``` ---