Files
saw_mill_knot_detection/README.md
2025-12-22 14:20:32 -07:00

5.9 KiB

Saw Mill Knot Detection (YOLOX/YOLO)

This repository contains a complete wood defect detection system using YOLOX/YOLO models, trained to detect 10 different types of wood surface defects. The system includes a web-based annotation GUI, automated training pipeline, and is optimized for deployment on OAK-D cameras.

🎯 Project Overview

  • Model: YOLOX-nano (Ultralytics YOLO framework)
  • Dataset: 20,276 wood surface defect images with 10 defect categories
  • Training: 5 epochs, mAP50: 0.612, mAP50-95: 0.357
  • Deployment Target: OAK-D 4 Pro camera
  • Framework: Ultralytics 8.3.240

📊 Dataset Information

Source: Kaggle Wood Surface Defects Dataset

Classes (10 total):

  • Live knot
  • Dead knot
  • Knot with crack
  • Crack
  • Resin
  • Marrow
  • Quartzity
  • Knot missing
  • Blue stain
  • Overgrown

Dataset Split:

  • Train: 16,220 images
  • Valid: 2,027 images
  • Test: 2,029 images

Format: YOLO format (images/ and labels/ subdirectories with data.yaml configuration)

🚀 Quick Start

1. Environment Setup

# Clone the repository
git clone git@143.244.157.110:dillon_stuff/saw_mill_knot_detection.git
cd saw_mill_knot_detection

# Create virtual environment
python -m venv .venv
source .venv/bin/activate

# Install dependencies
pip install -U pip
pip install ultralytics gradio

2. Download Dataset

The dataset is not included in the repository due to size. Download from Kaggle and organize as follows:

# Download from Kaggle (requires Kaggle API)
kaggle datasets download -d kirs0816/wood-surface-defects
unzip wood-surface-defects.zip

# Run the dataset preparation script
python split_coco_dataset.py
python reorganize_dataset.py

3. Launch Annotation GUI

python annotation_gui.py

Open http://localhost:7860 in your browser to access the web-based annotation interface with:

  • Image navigation with index display
  • Auto-labeling with trained YOLOX model
  • Manual annotation tools
  • Real-time result visualization

4. Train Model

python train_yolox.py --dataset-dir dataset_split --model yolox-nano --epochs 5 --batch-size 4

📁 Project Structure

saw_mill_knot_detection/
├── annotation_gui.py          # Gradio web interface for annotation
├── train_yolox.py            # YOLOX training script
├── split_coco_dataset.py      # Dataset splitting utility
├── reorganize_dataset.py      # Dataset reorganization to YOLO format
├── config.py                  # Configuration settings
├── dataset_split/             # Training data (excluded from git)
│   ├── train/
│   │   ├── images/           # Training images
│   │   └── labels/           # YOLO format labels
│   ├── valid/
│   │   ├── images/           # Validation images
│   │   └── labels/           # YOLO format labels
│   ├── test/
│   │   ├── images/           # Test images
│   │   └── labels/           # YOLO format labels
│   └── data.yaml             # YOLO dataset configuration
├── runs/                     # Training outputs (excluded from git)
│   └── yolox_training/
│       └── training/
│           └── weights/
│               ├── best.pt   # Best model weights
│               └── last.pt   # Latest model weights
├── bbox_coco_dataset.json     # Original COCO annotations
├── requirements.txt           # Python dependencies
├── .gitignore                # Excludes large data files
└── README.md                 # This file

🛠️ Usage Guide

Annotation GUI Features

The Gradio-based annotation interface provides:

  • Image Navigation: Browse through dataset with current index display
  • Auto-Labeling: One-click defect detection using trained YOLOX model
  • Manual Annotation: Draw bounding boxes for corrections
  • Real-time Visualization: Immediate display of detection results
  • Export Options: Save annotations in multiple formats

Training

# Basic training
python train_yolox.py --dataset-dir dataset_split --model yolox-nano --epochs 10

# Advanced training with custom parameters
python train_yolox.py \
  --dataset-dir dataset_split \
  --model yolox-nano \
  --epochs 20 \
  --batch-size 8 \
  --img-size 640

Inference

from ultralytics import YOLO

# Load trained model
model = YOLO('runs/yolox_training/training/weights/best.pt')

# Predict on image
results = model.predict('path/to/image.jpg', conf=0.4)

# Process results
for result in results:
    boxes = result.boxes  # Bounding boxes
    for box in boxes:
        cls = int(box.cls)  # Class index
        conf = float(box.conf)  # Confidence score
        xyxy = box.xyxy.tolist()[0]  # Box coordinates

🔧 Configuration

Key settings in config.py:

DEFAULT_MODEL_WEIGHTS = "runs/yolox_training/training/weights/best.pt"
DEFAULT_IMAGES_DIR = "IMAGE/"
WOOD_DEFECT_CLASSES = [
    'Live knot', 'Dead knot', 'Knot with crack', 'Crack',
    'Resin', 'Marrow', 'Quartzity', 'Knot missing',
    'Blue stain', 'Overgrown'
]

📈 Model Performance

YOLOX-nano Results (5 epochs):

  • mAP50: 0.612
  • mAP50-95: 0.357
  • Precision: 0.68
  • Recall: 0.55

🎯 Deployment on OAK-D

The trained model can be exported for OAK-D deployment:

from ultralytics import YOLO

# Load and export model
model = YOLO('runs/yolox_training/training/weights/best.pt')
model.export(format='onnx')  # Export to ONNX for OAK-D

🤝 Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Test thoroughly
  5. Submit a pull request

📄 License

This project uses the Kaggle Wood Surface Defects dataset. Please refer to the original dataset license for usage terms.

🙏 Acknowledgments

  • Kaggle for providing the wood surface defects dataset
  • Ultralytics for the YOLO framework
  • Gradio for the web interface framework