Skip to content
← Projects

Geospatial · Remote Sensing · Urban Forestry · 2025

Denver Urban Tree Classification

Cities like Denver keep an inventory of their street and park trees, but checking each one in person is slow and expensive. I wanted to find out something practical: could free imagery, the kind anyone can download, tell me enough about a city's trees to be useful before crews are ever sent out to inspect them on the ground?

Dual-panel chart showing management class composition (left: 3,088 trees across 5 classes) and per-class recall from LDA classification (right: 26–49%)
Study composition and classification results at a glance. Left: tree sample by management class, Hale neighborhood, Denver. Right: recall per class from the management-class LDA at 38.3% overall accuracy. Ash is the highest-priority and best-detected class.
Study area
Denver's Hale neighborhood, ~4.59 km²
Imagery
NAIP 4-band multispectral imagery, September 25, 2023
Ground truth
Denver Parks & Recreation certified arborist inventory, 2019–2023
Sample
3,088 independently classified trees across 10 species
Affiliation
University of Colorado Denver, Alumni Research

Project Summary

I started with the most ambitious version of the question, which is telling one species of tree from another from the air. This is called species-level classification, and the appeal is obvious: if I could reliably tell an ash tree from an elm in an aerial image, a city could plan its field work from a desk instead of sending crews to look at every tree.

It did not really work. Across 10 species it reached only 17.0% accuracy, which is nowhere near reliable enough to map species or to stand in for a proper inventory.

So I changed the question. Instead of asking the imagery to name the exact species, I grouped the trees by how a forestry crew would actually treat them and asked it to sort trees into those groups. I put the ash species together because they all matter for emerald ash borer (EAB) planning, the elms together for Dutch elm disease risk, the maples together because of how much water they need, and the conifers together because they handle drought and heat differently from the broadleaf trees around them.

Asked that easier question, the same imagery did much better, reaching 38.3% accuracy. That is a 2.26× improvement over the species-level attempt, and enough of a jump to change what the result could actually be used for.

ApproachAccuracyCorrect / Total
Species-level17.0%524 / 3,088
Management classes38.3%1,184 / 3,088
Improvement2.26×p < 0.001, McNemar's χ² = 339.28

To be sure the improvement was real and not luck, I checked the confidence intervals, the ranges the true accuracy almost certainly falls within. They did not overlap:

  • Species-level classification: 15.8–18.2%
  • Management-class classification: 36.7–39.9%

Effect size: Cohen's κ = 0.293

I do not think this failure was something I could have fixed by tuning the model. I tried several different methods and saw the same confusion every time, on two separate imagery sources (NAIP aerial photos and Sentinel-2 satellite images). The real limit is the imagery itself. NAIP records only four bands of light (red, green, blue, and near-infrared), and from those four numbers closely related species simply look too much alike, overlapping by roughly 88–94%. There was not enough information in the pixels to tell them apart.

That is why the answer was not to keep hunting for a cleverer classifier. The useful move was to change what I asked the imagery to do, down to something it could actually deliver.

Bar chart comparing species-level vs management-class classification accuracy
Accuracy comparison: species-level (17.0%) vs management-class (38.3%) classification from the same NAIP imagery.

Management Groups

Since the imagery could not tell species apart, I built the five groups around what an arborist would actually do with the trees, not around botanical names. Each group shares a single management concern, so getting a tree into the right group is useful even when its exact species stays unknown.

Management ClassSpeciesN% of Canopy
Ash_EAB_RiskFraxinus pennsylvanica, F. americana75124.3%
Elm_DED_RiskUlmus americana, U. pumila70722.9%
Other_DeciduousGleditsia, Pyrus, Celtis, Populus94430.6%
Maple_WaterDemandingAcer saccharinum, A. platanoides38512.5%
Conifer_Drought_TolerantPicea pungens, Pinus nigra, P. ponderosa3019.7%

I would not use this output to sign off on treating, removing, or replacing any tree. What it is good for is shortening the list, so crews check a focused set of likely trees instead of walking the whole city.

That narrowing down is the one job I trust it to do.

NDVI probability distributions by management class showing species-level overlap and management-class separation
NDVI probability distributions by management class. Top: species-level distributions overlap heavily, making reliable discrimination difficult. Bottom: management-class groupings show improved separation, particularly for conifers.

Per-Class Performance

ClassNRecallPrecisionF1
Ash_EAB_Risk75149.1%49.3%0.492
Other_Deciduous94444.0%37.1%0.402
Elm_DED_Risk70730.4%34.8%0.325
Conifer_Drought_Tolerant30128.2%47.5%0.354
Maple_WaterDemanding38526.0%23.6%0.248

Of the five groups, the ash result is the one I care about most, because ash is the group most exposed to a lethal pest.

Its recall was 49.1%, which means the model found about half of the actual ash trees. As a finished inventory that is weak, but for triage it is still worth having, because the two kinds of mistake do not cost the same. If the model wrongly flags a tree, someone wastes a short field visit. If it misses one, a mature ash can go unnoticed until it dies and becomes an expensive removal and replacement.

Because those two mistakes are so lopsided, I judged the model by what it would cost and save in the field, not by its accuracy score alone.

Confusion matrix across the five management classes
Confusion matrix across the five management classes. The ash and elm groups show the strongest off-diagonal overlap; conifers are the most reliably separated class.
Per-class recall and F1-score across the five management groups
Recall and F1-score per management class. Ash_EAB_Risk is the strongest performer at 49.1% recall; Maple_WaterDemanding is the weakest at 26.0%.

Cost Framing

To show why a shorter field list matters, I put rough costs on it. Published work by Nowak and colleagues puts a ground survey at about $7 per tree. Denver has an estimated 300,000-tree inventory, so surveying every tree would cost roughly:

300,000 × $7 = $2,100,000

A targeted approach would instead start from the trees my classifier flags and send crews only to those, which changes the math:

ScenarioTrees SurveyedCost
Full ground survey300,000$2,100,000
Management triage + targeted field validation~72,765~$509,000
Estimated savings$1.59M

Estimated survey savings: 75.7%

Benefit-cost ratio: 228:1

These are back-of-envelope numbers, meant to show the scale of the saving rather than to serve as a real city budget. The point I am making with them is small and specific: free imagery can shrink the field list before anyone spends time and money checking trees on the ground.


Ash Risk in the Hale Sample

In the area I studied, ash made up 24.3% of the study canopy. That is a lot of trees resting on the fate of a single pest.

Emerald ash borer is a beetle that kills ash trees, and it has been spreading west. Colorado first confirmed it in Boulder County in 2013, and it reached the Denver metro area by 2022. In states where it arrived earlier, it has killed such a high share of the ash that a neighborhood with a lot of ash should be treated as carrying real risk.

If the ash share I measured in Hale held across Denver's estimated 300,000 trees, that would work out to:

24.3% × 300,000 trees = ~72,900 ash trees

I want to be clear that stretching one neighborhood's number across the whole city is rough. Hale is a single area, not a random sample of Denver, so I treat this as a screening figure, not a real count.

Even so, the number is big enough that it clearly warrants a closer look.

Ash tree killed by emerald ash borer infestation
Ash tree killed by emerald ash borer. USDA Forest Service photograph, public domain.

Urban Heat and Cooling Value

Losing trees is not only about the trees. It changes how hot a place gets, how much energy people spend on cooling, and how long the canopy takes to recover.

To put a number on that, I used the cautious low-end value from McPherson and colleagues for dry western cities:

$31/tree/year in energy-related cooling value

Applied to the ash trees at risk, that works out to:

  • Hale study area: 751 ash trees × $31 = $23,281/year
  • Citywide extrapolation: ~72,900 ash trees × $31 = $2.26M/year

At the high-end value of $98/tree/year, the citywide cooling value at risk rises to:

~$7.14M/year

These are not exact predictions for Denver. They are published low and high estimates applied to the ash share I measured, and I include them because they turn an abstract risk into a dollar range that planners and operations teams can actually reason about.


Replacement Exposure

Replacing a mature tree is not cheap. At about $5,000 per tree, replacing the estimated ~72,900 ash trees would represent:

~$364.5M in replacement asset value

That is not a bill anyone expects to actually pay. I include it for the sense of scale, because mature canopy is costly to replace, slow to grow back, and spread unevenly across neighborhoods.

When the asset at stake is that large, catching problems early and prioritizing field visits is worth doing even with a model that is far from perfect.


Preventive Treatment Comparison

Ash trees can be protected with a preventive injection called TreeAzin, usually cited at around $40–$80 per tree.

At its 49.1% ash recall, the workflow would point to roughly:

~35,762 ash trees

Estimated preventive treatment cost:

$1.4M–$2.9M

Estimated replacement cost if those trees were lost:

~$178.8M

Approximate treatment ROI versus replacement:

62:1 to 124:1

I would not let the model decide who gets treated. What it produces is a sensible inspection queue, and once those trees are checked in person the treatment decision goes back to the normal forestry process.


Main Finding

In this study, free four-band imagery was not good enough to identify urban tree species reliably.

The same imagery became useful once I asked it for management groups instead of species.

That shift gave a 2.26× improvement in accuracy, and it produced a triage workflow a city forestry team could realistically use.

Main takeaways:

  1. Species-level classification from free multispectral imagery should be treated cautiously.
  2. Management groups are a better fit for low-resolution public imagery.
  3. Remote sensing can help prioritize field work.
  4. Field verification is still required.
  5. The useful product is a review queue for field crews rather than an automated inventory.

Technical Stack

Imagery

NAIP 4-band multispectral imagery, USDA public domain

Ground truth

Denver Parks & Recreation certified arborist inventory

Classification

Linear Discriminant Analysis, with multiple methods cross-validated

Validation

McNemar's χ², 95% confidence intervals, Cohen's κ

Tools

Python · GDAL · QGIS · scikit-learn

Tree classification workflow diagram showing the path from NAIP imagery and arborist inventory through species-level failure to management-class regrouping, validation, field review queue, and cost framing
Classification workflow. Species-level LDA failed at 17.0% due to spectral overlap between closely related taxa. Reframing to five management classes reached 38.3% and produced a usable field review queue.

References

  1. Middel, A., et al. (2014). Impact of urban form and design on mid-afternoon microclimate in Phoenix Local Climate Zones. Landscape and Urban Planning, 122, 16–28. https://doi.org/10.1016/j.landurbplan.2013.11.004
  2. McPherson, E. G., et al. (2005). Municipal forest benefits and costs in five US cities. Journal of Forestry, 103(8), 411–416.
  3. EPA. (2023). Heat Island Effect. https://www.epa.gov/heat-islands
  4. Colorado State Forest Service. (2022). Emerald Ash Borer in Colorado. https://csfs.colostate.edu/forest-management/emerald-ash-borer/
  5. Emerald Ash Borer Information Network / USDA APHIS. Treatment options for EAB. https://www.emeraldashborer.info/
  6. Poland, T. M., & McCullough, D. G. (2006). Emerald ash borer: Invasion of the urban forest and the threat to North America's ash resource. Journal of Forestry, 104(3), 118–124.
  7. Nowak, D. J., et al. (2018). Urban forest structure, ecosystem services and change in Syracuse, NY. Urban Ecosystems, 21(1), 75–87. https://doi.org/10.1007/s11252-017-0689-3