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