HuggingFace-like interface for petrographic thin section analysis with RF-DETR and SAHI
Automated instance segmentation and morphological analysis of petrographic thin sections using state-of-the-art computer vision models. Provides a clean, modern workflow for both researchers running inference with pretrained models and developers training custom models.
For running inference with pretrained models:
library(petrographer)
# Load model from public hub
model <- from_pretrained("inclusions")
# Run prediction on an image
results <- predict(model, "my_image.jpg")
# Analyze results
summarize_by_image(results)
get_population_stats(results)
For training custom models:
library(petrographer)
# Validate dataset structure + pin it
validate_dataset("data/processed/my_dataset")
pin_dataset("data/processed/my_dataset", dataset_id = "my_dataset")
# Train model (automatically pins to .petrographer/)
train_model(
dataset_id = "my_dataset",
model_id = "my_model",
model_variant = "small", # nano | small | medium | large
epochs = 50,
batch_size = 4,
device = "cuda" # or "cpu", "mps"
)
# Load your trained model
model <- from_pretrained("my_model", board = "local")
results <- predict(model, "test_image.jpg")
# Install from GitHub
# remotes::install_github("flmnh-ai/petrographer")
install.packages("petrographer", repos = c('https://flmnh-ai.r-universe.dev', 'https://cloud.r-project.org'))
Python dependencies are managed automatically via reticulate. The package will guide you through setup on first use.
Models are managed via the pins package with automatic versioning and caching:
Hosted at:
# Download and load pretrained model
model <- from_pretrained("shell_v3", device = "cpu", confidence = 0.5)
# Browse available models
list_models()
# Get model details
model_info("shell_v3")
Automatically created at .petrographer/ in your project when training models:
# List your locally trained models
list_trained_models()
# Load a local model
model <- from_pretrained("my_model", board = "local")
Advanced users can specify their own boards:
my_board <- pins::board_folder("~/shared-models", versioned = TRUE)
model <- from_pretrained("model_id", board = my_board)
pin_dataset("data/processed/shell_dataset", dataset_id = "shell_dataset")
train_model(
dataset_id = "shell_dataset",
model_id = "shell_detector_v4",
model_variant = "small", # nano | small | medium | large | xlarge | 2xlarge | preview
epochs = 50,
batch_size = 4, # grad_accum auto-calculated for effective batch 16
device = "cuda" # or "cpu", "mps"
)
Key parameters:
model_variant - RF-DETR size; pick one of nano | small | medium | large | xlarge | 2xlarge | preview
epochs - Training length (e.g. 40-100 for fine-tuning)batch_size - Per-GPU batch size; grad_accum_steps auto-calculated so batch_size × grad_accum_steps = 16
learning_rate - Optional override (RF-DETR defaults are sensible)device - cuda, mps, or cpu
The package automatically:
num_classes from COCO annotations.petrographer/models/ with full metadataOrganize data in COCO format:
data/processed/my_dataset/
├── train/
│ ├── _annotations.coco.json
│ └── [training images]
└── val/
├── _annotations.coco.json
└── [validation images]
Validate before training:
validate_dataset("data/processed/my_dataset")
For images with highly variable sizes, use SAHI slicing:
slice_dataset(
input_dir = "data/raw/my_dataset",
output_dir = "data/processed/my_dataset_sliced",
slice_size = 512,
overlap = 0.2
)
# Simple prediction (saves visualization by default)
results <- predict(model, "image.jpg")
# With custom SAHI parameters
results <- predict_image(
image_path = "image.jpg",
model = model,
use_slicing = TRUE,
slice_size = 512,
overlap = 0.2,
save_visualizations = TRUE
)
results <- predict_images(
input_dir = "images/",
model = model,
output_dir = "results/"
)
# Evaluate training metrics (reads metrics.csv / log.txt from the pin)
evaluate_training("my_model")
# Evaluate on COCO dataset
metrics <- evaluate_model_sahi(
model = model,
data_dir = "data/processed/test_dataset"
)
Each detected object includes comprehensive morphological properties:
# Per-image summary statistics
image_stats <- summarize_by_image(results)
# Population-level statistics
pop_stats <- get_population_stats(results)
from_pretrained() - Load model from hub, local board, or custom boardlist_models() / list_trained_models() - List available modelsmodel_info() - Show model metadata and validation metricspin_model() - Publish model to board (maintainers only)validate_dataset() - Check COCO format and show diagnosticsslice_dataset() - SAHI dataset slicing for mixed image sizespin_dataset() / list_datasets() - Dataset versioning and distributiontrain_model() - Unified training interface (local or HPC)evaluate_training() - Parse training metrics (metrics.csv / log.txt)predict() - S3 method for PetrographyModel objectspredict_image() - Single image inference with SAHI + morphologypredict_images() - Batch processing with parallel supportevaluate_model_sahi() - COCO evaluation metricssummarize_by_image() - Per-image statisticsget_population_stats() - Population-level metricsFor training on HPC clusters with SLURM (e.g., UF HiPerGator):
Configure HPC defaults in .Renviron:
usethis::edit_r_environ("project")
Add these lines:
PETROGRAPHER_HPC_HOST="hpg"
PETROGRAPHER_HPC_BASE_DIR="/blue/yourlab/youruser"
Restart R for changes to take effect.
# Configure HPC (only needed once per session)
hipergator::hpg_configure(host = "hpg", base_dir = "/blue/yourlab/youruser")
# Train on HPC by passing time_hours (triggers SLURM submission)
model_id <- train_model(
dataset_id = "my_dataset",
model_id = "my_model",
model_variant = "small",
epochs = 50,
batch_size = 4,
time_hours = 8 # HPC dispatch when set
)
The package automatically:
# Monitor job status
hpg_status(job)
# Wait for completion with progress
hpg_wait(job)
# Cancel running job
hpg_cancel(job)
# Get job details
hpg_job_info(job)
inst/notebooks/ for complete workflows:
model_from_pretrained.qmd - Loading and using pretrained modelspetrography_analysis.qmd - End-to-end analysis workflowtraining_*.qmd - Training examples for different use casesOptimize for your data:
model <- from_pretrained(
"shell_v3",
confidence = 0.5, # Detection threshold (0.3-0.7 typical)
device = "cuda" # "cpu", "cuda", or "mps"
)
results <- predict_image(
image_path = "image.jpg",
model = model,
slice_size = 512, # Slice dimensions (512 recommended)
overlap = 0.2 # Overlap between slices (0.2 typical)
)
Optional configuration:
PETROGRAPHER_HUB_URL - Custom model hub URLPETROGRAPHER_BOARD_PATH - Custom local board locationPETROGRAPHER_HPC_HOST - Default HPC hostnamePETROGRAPHER_HPC_BASE_DIR - Default HPC working directorybatch_size (1-2) — grad_accum_steps auto-compensatesmodel_variant
epochs or adjust learning_rate
reticulate::py_config()
fs::path_abs()
hpg_job_info(job)
petrographer/
├── R/ # Package functions
│ ├── pins.R # Model/dataset distribution via pins
│ ├── model.R # Model loading utilities
│ ├── training.R # Training orchestration (local + HPC)
│ ├── prediction.R # Inference + evaluation
│ ├── dataset.R # Dataset utilities
│ ├── morphology.R # Property extraction via scikit-image
│ └── summary.R # Analysis and aggregation
├── inst/
│ ├── python/
│ │ ├── train.py # RF-DETR training script
│ │ └── slice_dataset.py # SAHI dataset slicing utility
│ └── notebooks/ # Example workflows
├── vignettes/ # Package documentation
│ ├── model-library.qmd # Browse trained models
│ ├── training-models.qmd # Training guide
│ └── whole-slide-basics.qmd # Large image workflows
├── tests/ # Unit tests
└── .petrographer/ # Local training board (auto-created)
├── models/ # Trained models with versions
└── datasets/ # Pinned datasets
slice_size = 512 and overlap = 0.2
confidence to capture faint objects, filter downstreammodel_variant that meets accuracy needs (nano → small → medium → large)batch_size sets per-step memory; grad_accum_steps keeps the effective batch at 16 for stable convergencedevice = "cuda" and a suitable time_hours budgetThis is research software under active development. Breaking changes may occur between versions. See CLAUDE.md for development guidelines and philosophy.
If you use this package in your research, please cite:
@software{petrographer,
title = {petrographer: Petrographic Thin Section Analysis with Deep Learning},
author = {Nicolas Gauthier and Ashley Rutkoski},
year = {2025},
url = {https://github.com/flmnh-ai/petrographer},
note = {R package version 0.0.0.9000}
}