CoolFace
Datasetpublic

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.

sourceHugging Facecc-by-4.0updated 4mo agoView on Hugging Face
0likes91downloads
Dataset Card

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:

taxonIDScientific NameCommon NameCount
PSMEMPseudotsuga menziesii var. menziesiiDouglas-fir1,639
TSHETsuga heterophyllaWestern hemlock541
PIPA2Pinus palustrisLongleaf pine295
ABAMAbies amabilisPacific silver fir195
QURUQuercus rubraNorthern red oak166
ACRUAcer rubrumRed maple138
QUALQuercus albaWhite oak103
RUSPRubus spectabilisSalmonberry81
ALRU2Alnus rubraRed alder70
QULA2Quercus laevisTurkey oak69
THPLThuja plicataWestern redcedar57
RUAR9Rubus armeniacusHimalayan blackberry53
QUCO2Quercus coccineaScarlet oak52
NYSYNyssa sylvaticaBlack tupelo45
ACCIAcer circinatumVine maple43
AMLAAmelanchier laevisAllegheny serviceberry43
VAPAVaccinium parvifoliumRed huckleberry42
TABR2Taxus brevifoliaPacific yew28

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:

ColumnDescription
sample_idUnique sample identifier
sourceData source: neon, idtrees, or bc_local
taxonIDStandardized 4-6 letter species code (USDA Plants)
scientificNameFull scientific name
speciesCommon name (grouped; only in unified_dataset.csv)
species_rawRaw species label from source (only in unified_dataset.csv)
pnw_nativeWhether native to Pacific Northwest (boolean)
x_utm10, y_utm10UTM zone 10N coordinates (m)
patch_fileRelative path to point cloud patch (.npy)
n_pointsTotal LiDAR point count
n_vegVegetation return count
n_groundGround return count
ground_elevationGround elevation (m)
height_maxMaximum vegetation height (m)
height_meanMean vegetation height (m)
height_stdHeight standard deviation
height_skewHeight distribution skewness
height_p10/25/50/75/90/95/99Height percentiles (m)
intensity_meanMean return intensity
intensity_stdIntensity standard deviation
intensity_p25/50/75/95Intensity percentiles
pct_single_returnPercentage of single returns
pct_ground_returnPercentage of ground returns
density_understoryPoint density below 2 m
density_mid_canopyPoint density 2-15 m
density_upper_canopyPoint density above 15 m
label_quality_scoreLabel quality confidence (0-1)
measurement_quality_scoreMeasurement quality confidence (0-1)
lidar_quality_scoreLiDAR quality confidence (0-1)
spatial_quality_scoreSpatial quality confidence (0-1)
overall_confidenceOverall confidence score (0-1)
siteIDNEON site code (ABBY, WREF, MLBS, OSBS)
recommendationRecommended usage
splitData split assignment

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

python
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

python
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

python
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

SplitSamplesDescription
train2,850High-confidence + weak supervision training
validation304Held-out validation
test35BC Vancouver Island holdout (geographic generalization)
weak_supervision819Lower confidence labels (included in train_set.csv)
excluded32Samples excluded due to quality concerns

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):

DimensionWeightWhat it measures
Label quality0.35Species-level ID vs genus-level vs unknown; expert verification
Measurement quality0.25Stem diameter, plant health status, data quality flags
LiDAR quality0.30Point density in crown, height consistency, return ratios
Spatial quality0.10Whether crown is fully within tile (not on edge)

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:

bibtex
@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:

bibtex
@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