Detecting Invasive Plants from Space · Part 2 of 3
Three Ways to Miss an Invasive Plant
May 2025
In Part 1, I described a rule-based Sentinel-2 pipeline designed to detect known invasive plant sites in Northern Virginia using phenological timing alone. The first result was 1 out of 5 — one correct detection, four misses.
The easy interpretation is that phenology-based detection doesn't work. But when I looked at the data for each missed site, I noticed something: the four failures weren't all failing for the same reason. They were failing differently. And that distinction turned out to be the most useful thing I learned from the whole project.
Miss #1 — Scotts Run: The Threshold Was Too Strict
Scotts Run Nature Preserve is well-documented English ivy territory. Ivy carpets the understory under the hardwood canopy — evergreen, dense, and visually obvious if you walk the trails in January.
Here is what the NDVI data actually showed, comparing Scotts Run to the native control at Manassas Battlefield:
| Season | Scotts Run vs. control (Δ) |
|---|---|
| Early spring | +0.095 |
| Summer | +0.068 |
| Late autumn | +0.053 |
| Winter | +0.072 |
Every single season shows Scotts Run elevated above the control. The signal is consistent, directionally correct, and — in hindsight — exactly what you'd expect from an evergreen understory species: not an explosive seasonal spike, but a persistent mild elevation across the whole year.
My early spring rule required a delta of >0.10 above the native control. Scotts Run came in at +0.095 — missing the threshold by 0.005. Every other seasonal rule failed for the same reason: the signal was real but mild, and my rules were designed to catch single strong features, not broad weak ones. The system looked for a loud anomaly and walked straight past a quiet one.
Miss #2 — Dyke Marsh: The Rule Didn't Exist
Dyke Marsh, on the Virginia shore of the Potomac, is one of the largest freshwater tidal marshes left in the DC area — and a well-documented Phragmites site. The invasive reed has crowded out native marsh vegetation across much of the preserve.
The summer data for Dyke Marsh vs. the native control: +0.10. That's a meaningful signal — Phragmites pushes dense, tall biomass in high summer, producing higher NDVI than the native control site.
So why did the classifier miss it? Because my summer rule was written as an absolutethreshold: flag a site if summer NDVI exceeds 0.85. That threshold was calibrated for kudzu, which genuinely saturates the canopy. Phragmites is invasive and vigorous, but it's not kudzu — its summer NDVI stays in a reasonable range. The signal I needed was not “unusually high summer NDVI” but “summer NDVI unusually high relative to the control.”
I had written a rule for the wrong quantity. The signal existed in the data. I just hadn't written any code that could catch it.
Miss #3 — Great Falls: The Coordinate Was Wrong
Great Falls is the most humbling failure.
The site is a well-known kudzu location — visible from the trail, documented in invasive species surveys. I expected the phenology signal to be strong: kudzu leafs out aggressively in spring and pushes high NDVI through summer. Instead, the data showed something strange:
| Season | Great Falls vs. control (Δ) |
|---|---|
| Early spring | −0.113 |
| Summer | +0.022 |
| Late autumn | −0.072 |
| Winter | −0.119 |
Not just lower than expected — lower than the native control. In spring and winter, Great Falls was registering less vegetation than a native deciduous forest. How is that possible at a kudzu site?
My first hypothesis: the 500-meter buffer was too large. Averaging over 500 meters around the site center would pull in river water, bare rock, and non-kudzu canopy, diluting the invasive signal. I re-ran the pipeline with a 100-meter buffer.
The signal got worse. Early spring dropped further below the control. Winter NDVI fell even lower.
That result is the opposite of what buffer dilution would predict — if the problem were averaging over too-large an area, shrinking the buffer would concentrate the sample over the kudzu patch and the signal should have strengthened. Instead, shrinking the buffer made everything worse.
Which meant the problem wasn't the buffer size. It was the coordinate itself.
When I checked the map more carefully, the site point I had labeled “Great Falls (Kudzu)” was sitting on the rocky overlook above the falls — a dramatic viewpoint over the Potomac, almost no vegetation in any direction. Shrinking the buffer from 500 meters to 100 meters didn't center the sample over the kudzu patch. It concentrated the sample over bare rock and open water.
No algorithm could fix this. It was a field-knowledge failure dressed up as a remote-sensing problem. The kudzu is real; my coordinate was just in the wrong place.
Three Different Failure Modes

Seasonal NDVI deltas vs. native control for each missed site. Each site's failure has a visually distinct signature.
The three missed invasive sites failed for three completely different reasons:
Threshold too strict. The signal was there — mild, broad, consistent — but my rules were calibrated for sharp single-season anomalies. A composite across all four seasons would have caught it.
Rule design gap. The signal was real (+0.10 summer vs. control), but I had written a rule that checked the wrong quantity. The data was fine; the code was incomplete.
Sampling error. The coordinate was in the wrong location. No amount of algorithm improvement changes what the satellite sees when you're pointing it at bare rock.
These are three orthogonal axes of failure. Conflating them — calling the result “the method doesn't work” — loses all of that structure. Separating them tells you exactly what to fix next, and what kind of fix each problem requires.
In Part 3, I'll describe what I fixed, what I deliberately left unfixed, and what the revised detection rate says about where this approach goes from here.
Wenxuan Tang · DC area · Interactive dashboard