dfichuk/tree-species-vancouver-island
Vancouver Island Tree Species LiDAR Dataset Dataset Description 4,040 labeled tree crowns extracted from airborne LiDAR point clouds for classifying tree species native to Vancouver Island and the Pacific Northwest. Each sample includes 25 engineered LiDAR features (height percentiles, intensity statistics, canopy structure metrics) plus a raw point cloud patch (.npy file), a species label, quality confidence scores, and train/val/test split assignment.… See the full description on the dataset page: https://huggingface.co/datasets/dfichuk/tree-species-vancouver-island.
Vancouver Island Tree Species LiDAR Dataset
Dataset Description
4,040 labeled tree crowns extracted from airborne LiDAR point clouds for classifying tree species native to Vancouver Island and the Pacific Northwest. Each sample includes 25 engineered LiDAR features (height percentiles, intensity statistics, canopy structure metrics) plus a raw point cloud patch (.npy file), a species label, quality confidence scores, and train/val/test split assignment.
Species
The dataset contains 4,040 samples across 74 taxonIDs (76 unique scientificName entries), with the following dominant species:
Plus 56 more species (see unified_metadata.json for the full list).
Data Sources
The dataset is compiled from three sources:
NEON WREF/ABBY (2,949 samples)
- Sites: Wind River Experimental Forest (WREF) and Abby Road (ABBY), Washington, USA
- Ecosystem: Pacific Northwest conifer forests
- Data: NEON DP1.10098.001 Vegetation Structure (labels) + DP1.30003.001 discrete-return LiDAR (2023 RELEASE-2026)
- Split: Train/validation
- Citation: National Ecological Observatory Network. https://www.neonscience.org/data
IDTReeS Competition (1,055 samples)
- Sites: Mountain Lake Biological Station (MLBS, VA) and Ordway-Swisher Biological Station (OSBS, FL), USA
- Ecosystem: Eastern deciduous and southeastern mixed forest
- Data: Individual Tree Crowns polygons from CHM, with species labels
- Split: Train/validation
- Citation: Weinstein, B. G., et al. (2022). Individual Tree Crowns and Species from NEON (IDTReeS). https://doi.org/10.5281/zenodo.5553697
BC Vancouver Island Local (36 samples)
- Location: Vancouver Island, British Columbia, Canada
- Ecosystem: Coastal temperate rainforest
- Data: GPS-located tree stems with field crew species labels; BC government airborne LiDAR (~5 pts/m²)
- Split: Test (holdout — geographic generalization test)
- Note: These field-labeled samples from Vancouver Island serve as a true geographic holdout.
Data Format
Tabular data (CSV files)
unified_dataset.csv contains 4,040 samples with 44 columns:
Split files (42 columns each, excluding species and species_raw) are provided for convenience:
train_set.csv(2,850 samples: train + weak_supervision)validation_set.csv(304 samples)test_set.csv(35 samples: BC holdout)
Note: The species and species_raw columns are only available in unified_dataset.csv. Use the unified file if you need these columns.
Point cloud patches (.npy files)
Each sample has a corresponding point cloud patch stored as a NumPy .npy array of shape (N, 3) containing [x, y, z] coordinates. Patches are 5m-radius cylinders centered on each tree stem.
Patches are available as a compressed archive:
patches.tar.gz
├── patches/ # BC Vancouver Island (36 files)
├── neon_lidar/patches/ # NEON WREF/ABBY (2,949 files)
└── idtrees/patches/ # IDTReeS competition (1,055 files)Usage
Load tabular data
import pandas as pd
from datasets import load_dataset
dataset = load_dataset("dfichuk/tree-species-vancouver-island")
df_train = dataset['train'].to_pandas()
df_val = dataset['validation'].to_pandas()
df_test = dataset['test'].to_pandas()Load point cloud patches
import urllib.request
import tarfile
import numpy as np
import os
# Download and extract patches (~83 MB compressed)
url = "https://huggingface.co/datasets/dfichuk/tree-species-vancouver-island/resolve/main/patches.tar.gz"
tar_path = "patches.tar.gz"
urllib.request.urlretrieve(url, tar_path)
with tarfile.open(tar_path, "r:gz") as tar:
tar.extractall()
# Load a specific patch
patch_path = df_train.iloc[0]["patch_file"]
patch = np.load(patch_path)
print(f"Patch shape: {patch.shape}") # (N, 3)Feature-based classifier
import pandas as pd
from xgboost import XGBClassifier
from sklearn.metrics import classification_report
from datasets import load_dataset
dataset = load_dataset("dfichuk/tree-species-vancouver-island")
train = dataset['train'].to_pandas()
val = dataset['validation'].to_pandas()
feature_cols = [c for c in train.columns if c.startswith(('height_', 'intensity_', 'pct_', 'density_'))]
# Train on PNW-native NEON data
mask = (train['source'] == 'neon') & (train['pnw_native'] == True)
X_train = train.loc[mask, feature_cols]
y_train = train.loc[mask, 'taxonID']
X_val = val[feature_cols]
y_val = val['taxonID']
model = XGBClassifier()
model.fit(X_train, y_train)
print(classification_report(y_val, model.predict(X_val)))Data Splits
For higher quality training, use recommendation == 'train_high_quality' or filter by overall_confidence >= 0.7.
Quality Scores
Each sample has four component quality scores and an overall confidence score (0-1):
Overall confidence is the weighted average of available dimensions. Range: 0.3 -- 0.9.
Citation
If you use this dataset, please cite the source datasets:
@misc{neon_data,
title = {National Ecological Observatory Network Data Products},
url = {https://www.neonscience.org/data}
}
@software{weinstein2022idtreees,
author = {Weinstein, Ben G. and others},
title = {Individual Tree Crowns and Species from NEON (IDTReeS)},
year = {2022},
doi = {10.5281/zenodo.5553697}
}And the derived dataset:
@misc{fichuk2025tree,
title = {Vancouver Island Tree Species LiDAR Dataset},
author = {Fichuk, Dexter},
year = {2025},
publisher = {Hugging Face}
}License
CC-BY-4.0. Individual source data may have their own terms (NEON data: CC0, IDTReeS: CC-BY-4.0).
Repository Structure
├── unified_dataset.csv # All 4,040 samples (44 columns, includes species/species_raw)
├── train_set.csv # 2,850 training samples (42 columns)
├── validation_set.csv # 304 validation samples (42 columns)
├── test_set.csv # 35 BC holdout samples (42 columns)
├── unified_metadata.json # Dataset summary and species list
├── patches.tar.gz # Point cloud patches (~83 MB)
├── README.md # This file
└── download_patches.py # Patch download and extraction script