Skip to main content

YOLOv8 Cocoa Plant Detection + GIS AI Pipeline with CLI

Project description

Cocoa AI Detector Banner

๐ŸŒฑ Cocoa Plant Detection + GIS Pipeline with YOLOv8 + Streamlit

repo-banner YOLOv8 QGIS License

Live Demo GitHub Repo


Table of Contents


Demo Notebook

๐Ÿ“Œ Note: GitHub may truncate full notebook preview due to image-heavy output โ€” download or open locally for complete view.


Overview

This repository delivers a production-ready AI pipeline for detecting cocoa plants and planting holes from high-resolution aerial imagery using YOLOv8 and QGIS.

It includes:

  • ๐Ÿงฉ Tiling of large orthomosaic images
  • ๐Ÿง  Batch object detection on tiles
  • ๐Ÿงญ Spatial deduplication and coordinate conversion
  • ๐Ÿ—‚๏ธ GeoJSON/GPKG export for GIS tools

๐Ÿš€ Features

  • ๐Ÿงฑ Orthomosaic tiling with overlap
  • ๐Ÿง  YOLOv8 CLI + Streamlit interface
  • ๐ŸŒ GeoJSON/GPKG GIS-ready outputs
  • ๐ŸŽฏ UTM coordinate conversion + deduplication
  • ๐Ÿงช Notebook: training, inference, and QGIS integration

๐Ÿงช Installation

Clone the repo and install dependencies:

git clone https://github.com/NiiOsa1/cocoa-plant-detector.git
cd cocoa-plant-detector
pip install -r requirements.txt

๐Ÿง  Model Auto-Download

The trained YOLOv8s model will be downloaded automatically when you run the CLI or Streamlit app โ€” no manual setup needed.

๐Ÿ”— Backup link (optional): Download from Google Drive


Project Structure

cocoa-plant-detector/
โ”œโ”€โ”€ cocoa_cli_pipeline/         # ๐Ÿ”ง CLI entrypoints (tile, infer, geoconvert)
โ”‚   โ”œโ”€โ”€ cli.py                  # โ”œโ”€โ”€ CLI command dispatcher
โ”‚   โ”œโ”€โ”€ infer.py                # โ”œโ”€โ”€ CLI: batch inference
โ”‚   โ”œโ”€โ”€ geoconvert.py           # โ”œโ”€โ”€ CLI: label โ†’ GeoJSON conversion
โ”‚   โ””โ”€โ”€ tiler.py                # โ””โ”€โ”€ CLI: tile large .tif orthomosaics
โ”œโ”€โ”€ cocoa_pipeline_core/        # ๐Ÿง  Core reusable logic (non-CLI)
โ”‚   โ”œโ”€โ”€ tile_creator.py         # โ”œโ”€โ”€ Manual tile generator (1024px w/ overlap)
โ”‚   โ”œโ”€โ”€ batch_infer_yolov8.py   # โ”œโ”€โ”€ Scripted batch inference (auto-downloads model)
โ”‚   โ”œโ”€โ”€ deduplicate_and_filter.py  # โ”œโ”€โ”€ Deduplicate + convert YOLO txt to GeoJSON
โ”‚   โ””โ”€โ”€ utils.py                # โ””โ”€โ”€ Utility functions (e.g., download model)
โ”œโ”€โ”€ streamlit_app/              # ๐ŸŒ Web UI (live tile prediction)
โ”‚   โ””โ”€โ”€ app.py
โ”œโ”€โ”€ notebooks/                  # ๐Ÿ““ Training + inference walkthrough
โ”‚   โ””โ”€โ”€ CocoaPlant_YOLOv8_Training_QGIS_Deployment.ipynb
โ”œโ”€โ”€ examples/                   # ๐Ÿ“ธ Visual results: metrics, outputs, overlays
โ”‚   โ”œโ”€โ”€ val_batch0_pred.jpg     # โ”œโ”€โ”€ Predicted validation samples
โ”‚   โ”œโ”€โ”€ StreamlitApp.png        # โ””โ”€โ”€ UI + overlay visualizations
โ”œโ”€โ”€ test_data/                  # ๐Ÿงช Sample tiles + labels for quick testing
โ”‚   โ””โ”€โ”€ tile_31200_22400.tif
โ”œโ”€โ”€ runs/                       # ๐Ÿ“‚ Outputs from inference (auto-created, .gitignored)
โ”œโ”€โ”€ requirements.txt            # ๐Ÿ“ฆ Dependencies for pip install
โ”œโ”€โ”€ setup.py                    # ๐Ÿ“ฆ Enables pip install . and CLI registration
โ”œโ”€โ”€ .gitignore                  # ๐Ÿงผ Cleans output, model weights, build artifacts
โ””โ”€โ”€ README.md                   # ๐Ÿ“– You're looking at it

Full Detection Pipeline

  1. ๐Ÿงฑ Tile Large Aerial Image

    python cocoa_pipeline_core/tile_creator.py
    

    Input: Image_4.tif

    Output: tiles1/ (1024ร—1024 px tiles with 22% overlap)

  2. ๐Ÿง  YOLOv8 Batch Inference

    You can now run the inference script with your own tile folder like this:

    python cocoa_pipeline_core/batch_infer_yolov8.py \
     --tiles test_data/ \
     --output runs/test_output
    

๐Ÿ” The script will automatically:

  • Download best.pt from Google Drive if missing

  • Predict on all .tif tiles in the folder

  • Save detection labels and visual outputs

    Inference across all tiles

    Confidence: conf=0.22, IoU: 0.73

    Outputs YOLO .txt format

  1. ๐ŸŒ Convert to GeoJSON/GPKG

    python cocoa_pipeline_core/deduplicate_and_filter.py
    

    python deduplicate_and_filter_final.py

    Converts to map-based UTM coordinates

    Deduplicates detections from overlapping tiles

    Saves:

    qgis_ready6_detections.geojson

QGIS Integration

This repo includes a ready-to-open QGIS project:

๐Ÿ“„ Project_Cocoa.qgz

Includes:

Image_4.tif as the basemap

Pre-styled detection layer (holes + cocoa plants)

Correct CRS, colors, symbology

๐Ÿš€ To use: Open QGIS (v3.28+ recommended)

Load Project_Cocoa.qgz

All layers and styles will auto-load ๐ŸŽฏ

๐Ÿ—บ๏ธ GIS Integration Output

Final Detection Overlay in QGIS Bounding boxes converted to UTM, deduplicated, and displayed on the original orthomosaic.

QGIS Overlay

๐Ÿš€ Streamlit Web Demo

A live demo is available to test cocoa plant and planting hole detection directly in your browser:

๐Ÿ‘‰ Launch the Streamlit App

You can upload .tif, .jpg, or .png tiles and get YOLOv8-predicted outputs in real time โ€” powered by the same model used in the pipeline.

๐Ÿš€ Streamlit Demo

Live Tile Prediction (via Streamlit) This tile was uploaded through the Streamlit UI and predicted live using the trained model.

Streamlit App

Predicted Detection Output Detection Output

Command-Line Interface (CLI)

The full pipeline is also usable via a single terminal command. After installing the package with:

pip install .

You get access to:

cocoa-cli --help

Available Subcommands:

Command	      Description
tile	      Tile large aerial image
infer	      Run YOLOv8 batch inference
geoconvert    Convert YOLO labels to deduplicated GeoJSON

Example Usage:

 1. Tile large .tif image
cocoa-cli tile --input path/to/Image_4.tif --output tiles/

 2. Run batch inference
cocoa-cli infer --tiles tiles/ --output predictions/

 3. Convert YOLO txt โ†’ GeoJSON (deduplicated, GIS-ready)
cocoa-cli geoconvert --input predictions/ --output output.geojson

๐Ÿ’ก The trained model is automatically downloaded if missing. You do not need to manually specify --weights unless using a custom model.

Geo-Referencing Details

These values were extracted from the original orthomosaic (Image_4.tif) and used to convert pixel detections into map-based coordinates (UTM):

Origin X      = 525765.6597     โ† Upper-left X in UTM meters
Origin Y      = 8702143.3199    โ† Upper-left Y in UTM meters
Pixel Width   = 0.01298099167   โ† ~1.3 cm per pixel
Pixel Height  = -0.01298099167  โ† Negative = North-up

๐Ÿ“Œ Important: These values are dataset-specific. Always extract your raster metadata when working with a different image.

Dataset Notes

Total training images: 1500

1089 expertly labeled

411 cleaned pseudo-labeled

Classes:

0 = cocoa-plant

1 = hole

Model Performance

| Set        | mAP@0.5 | Precision | Recall | F1 Score |
|------------|---------|-----------|--------|----------|
| Train      | 0.907   | 0.861     | 0.876  | 0.868    |
| Validation | 0.844   | 0.846     | 0.797  | 0.821    |
| Test       | 0.779   | 0.835     | 0.738  | 0.784    |

โœ… Model: YOLOv8s (22.6MB)

โšก Fast inference: ~16ms per image

๐ŸŽฏ Balanced detection for both classes

๐Ÿ”’ No signs of overfitting despite small dataset

Reproducibility

Run the pipeline locally:

  1. Tile image python cocoa_pipeline_core/tile_creator.py

  2. Run inference python cocoa_pipeline_core/batch_infer_yolov8.py

  3. Convert & deduplicate python cocoa_pipeline_core/deduplicate_and_filter.py

Optional: Streamlit UI streamlit run streamlit_app/app.py


Example Visuals

Hereโ€™s a quick walkthrough of the pipeline in action:

A few visual highlights from model performance and predictions:

๐Ÿ“Š Training Metrics & Model Behavior

F1 Score vs Confidence
F1 Curve

Precision vs Confidence
Precision Curve


๐Ÿง  Sample Predictions on Validation Tiles

Sample Prediction โ€“ val_batch0
Prediction 0

Sample Prediction โ€“ val_batch1
Prediction 1


๐Ÿงช Try It Yourself

Want to test the pipeline locally with included sample tiles?

streamlit run streamlit_app/app.py

Upload from test_data/ and see the same prediction pipeline running on your machine.

License

This repository is licensed under the MIT License. Youโ€™re free to use, modify, and distribute โ€” with credit to the author.

Maintainer

Michael Mensah Ofeor ๐Ÿ”— GitHub โ€“ @NiiOsa1 ๐Ÿ“ฉ michaelofeor2011@yahoo.com

โšก Built for real-world cocoa analysis. Powered by geospatial logic, YOLOv8, and a deep love for clean AI pipelines.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cocoa_plant_detector-0.1.1.tar.gz (6.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cocoa_plant_detector-0.1.1-py3-none-any.whl (5.5 kB view details)

Uploaded Python 3

File details

Details for the file cocoa_plant_detector-0.1.1.tar.gz.

File metadata

  • Download URL: cocoa_plant_detector-0.1.1.tar.gz
  • Upload date:
  • Size: 6.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.3

File hashes

Hashes for cocoa_plant_detector-0.1.1.tar.gz
Algorithm Hash digest
SHA256 6e732027a56bce57114fe7b8a9ea3ebb24b025c3bdb1238f98cb79333adfa16e
MD5 5e582c67994bd70dc125f3e0ad84e948
BLAKE2b-256 ec4003a15bdef0817ec077e154c01e0f2e0ebf5cb844c68e6bcfdc83207321db

See more details on using hashes here.

File details

Details for the file cocoa_plant_detector-0.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for cocoa_plant_detector-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 6b760d1e676a18c2f7ef5e60dc5573d618f722c16333e449127819cd06cb7c74
MD5 715314f3d285b67c49c8f83cd0ed048b
BLAKE2b-256 6bcd5a360508bef72c79d10760fa6c74735859545b0fa2354929248ad5070e36

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page