Detecting CAD symbols nobody had labelled
A blueprint-reading system for construction cost estimation, trained entirely on synthetic data because the real labels did not exist and were never going to.
- Role
- AI Engineer and Project Lead · 3-person team
- Result
- 85% across 30+ classes
The problem
Construction cost estimation starts with a human reading a blueprint and counting things: symbols, fixtures, annotations, across dozens of categories. It is slow, and the people doing it are expensive and would rather be doing something else.
The obvious approach is object detection. The obvious blocker is that detecting 30+ symbol classes needs a labelled dataset of blueprints, and no such dataset existed. Producing one by hand would have consumed the entire project budget before any modelling started.
The constraint that decided everything
No labels, no budget to make them, and a long tail of rare symbols. Even if we had paid for annotation, the rare classes would still have had almost no examples, which is exactly where a detector fails and exactly where a costing error is expensive.
What I decided
Generate the data instead of collecting it. The symbols are defined shapes. Blueprints have predictable structure. That combination is unusually friendly to synthesis: I built pipelines in Blender, Unreal and OpenCV that produced labelled pages directly, with the annotation coming free because the generator already knows what it drew.
Treat class balance as a parameter, not a fact. The decisive advantage of synthetic data is not volume, it is control. Rare symbols stop being rare, because you choose how often they appear. That single property is what made 30+ classes tractable.
Vary the things that break detectors. Scale, rotation, line weight, overlap, and the noise that comes from real scans, rather than generating clean pages that would only teach the model the easy case.
Outcome
85% accuracy across more than 30 classes, with zero manual annotation, and several prototypes adopted by customers for production use.
What this taught me
Data scarcity is often a modelling problem in disguise. Before accepting “we don’t have the data”, it is worth asking whether the data can be constructed, and whether constructing it gives you control you would not have had otherwise. The synthetic route is not always cheaper. When the labels come free from the generator, it usually is.