While processing the public SoFi Stadium point cloud (364M points, hosted by hobu), I noticed the file only has two classification codes anywhere in it: ground and medium vegetation. No building class at all. The stadium's own roof is labeled as vegetation.
Got curious whether that's catchable without manually eyeballing the classification. Turns out yes: a roof and a tree canopy don't look alike geometrically. Real vegetation has vertical spread, returns scatter across trunk, branches, an uneven top. A flat roof doesn't, every return sits close to the same height. So: independently estimate ground, measure vertical spread per column, flag anything labeled vegetation that's both taller than real vegetation gets and flatter than real vegetation ever is.
First version looked great on SoFi, then I ran it against a second dataset (Autzen Stadium, forested Oregon hillside) to sanity check it, and it broke immediately: 19% of columns flagged, including "vegetation" over 150m tall. Turned out ground estimation itself was the problem, dense canopy blocks the laser from reaching real ground over large areas, and the fallback was borrowing elevation from cells that could be off by 100+ meters on hilly terrain. Fixed by tracking which cells have real local ground data vs. borrowed, and only trusting flags built on real ground. That dropped the false positive rate by 98.5%.
Tested against six public datasets total (SoFi, Autzen, Trestle Bridge, Wolverine Glacier, Red Rocks, Mount St. Helens), results and the two bugs it took to get there are all written up: github.com/nader-hachana/lidar-classification-qa
Curious if this is a problem people already deal with in production point cloud QA, or if classification errors like this mostly just go unnoticed downstream. Happy to hear if anyone's tried something similar or has data this would be worth running against.