corn-detection / README.md
Luwayy's picture
Update README.md
399055c verified
# 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)
```
---