Editorial illustration of a simplified architect plan and elevation with window openings scattered across the walls, one opening tucked near the roofline marked in terracotta

A window-and-door takeoff pipeline for a Quebec fenestration installer

Architect's PDF in, priced takeoff out. The hard part was building a visual recognition pipeline that produces the same answer for the same drawing, every time — because a takeoff with forty-seven windows must be exactly forty-seven windows, not forty-six or forty-eight.

What this could do for your organization

If your business responds to quote requests from drawings — a fenestration supplier quoting on architect's plans, a millwork vendor reading floor plans, a flooring or HVAC or roofing company estimating from sets, a precast plant sizing from engineering drawings — you know where the hours go. An estimator spends an hour, sometimes more, per prospect. Most of those prospects go elsewhere. The time you spent on the ones that didn't convert is gone.

This is the shape of what I do: I build a pipeline that reads the drawing and produces the takeoff — same input, same output, every time. For the fenestration case I'm building right now, an architect's PDF becomes a six-sheet Excel workbook (windows, entry doors, patio doors, garage doors, fire-separation doors, summary), in your industry vocabulary, in minutes rather than hours. Every item on the sheet is backed by a click-to-zoom link to the exact location on the exact drawing page, so your estimator doesn't start from a blank spreadsheet — they start from a checked sheet they can accept, adjust, or reject line by line.

The practical effect: the estimator's hour per prospect becomes a review pass they can do over coffee. Your team responds to more RFQs in the same time, and because every takeoff is schema-locked — every number backed by a rule, every item traceable to a location on the drawing — you catch the mistakes before the quote goes out, not after the project starts.

What your team gets back

A walkthrough on your actual drawings comes first — so you see what the pipeline does with your real inputs, not a synthetic demo. If the shape fits, you get a custom takeoff pipeline tuned to your industry's drawings, your item taxonomy (for fenestration: four categories of opening; for millwork: cabinets and countertops; for flooring: rooms and surface types), and your output format — Excel workbook, database import, ERP integration, whatever your estimating team already uses.

Your estimators work the two-panel review interface: drawing on the left, extracted items on the right, click any row to zoom to the exact location on the exact page. Edit fields, pick from dropdowns, export the corrected workbook. The pipeline is the draft; your estimator is still the one who signs off — but they're signing off on a checked sheet, not transcribing from scratch.

Before any cloud AI touches a client's drawing, the PII in the title block (names, addresses, cadastral lots, phone, postal code) gets scrubbed by the same anonymizer that runs on the other side of this site. Law 25 handled at the front door, not bolted on at the end.

How I did it

When someone builds a new house in Quebec, they hire an architect and get back a set of plans. The plans then land on the desk of a vendor that specializes in exterior windows and doors — one of several vendors the customer is shopping for a quote. The vendor's estimator reads the plans by hand, counts every exterior opening (windows, patio doors, entry doors, garage doors, fire doors), matches each one to a product from a manufacturer partner, and sends the quote back. An hour or two of spreadsheet work for every prospect, most of whom will go elsewhere. I'm building my client a tool that does the takeoff in a few minutes — same input, same output, every time. Getting to "every time" is the part that took real engineering.

The first version used a pure large-language-model vision pipeline. Same drawing, three runs, three different counts — because LLMs are non-deterministic by design. A takeoff is not an essay: forty-seven windows must be forty-seven windows every run. So I pivoted to a pipeline that does the vision work with a trained object detector and uses LLMs only for classification and text extraction — with structured output schemas and temperature locked to zero.

Attempt 01 · LLM vision only
non-deterministic by design
RUN 1 · SAME PDF
47
windows found
RUN 2 · SAME PDF
46
windows found
RUN 3 · SAME PDF
48
windows found
The same drawing produces different counts. A takeoff needs the same answer every run.
↓ Pivot to a deterministic architecture
YOLO detection + structured LLM
temperature = 0 · schema-locked output
RUN 1 · SAME PDF
47
windows found
RUN 2 · SAME PDF
47
windows found
RUN 3 · SAME PDF
47
windows found
Same input, same output. Reviewable, reproducible, defensible.

The object detector is a YOLO model I train on synthetic architect plans. Labelled real data at the scale YOLO needs doesn't exist in this industry, so I built a generator that derives synthetic drawings from five real architects' plans, in the five CAD styles residential architects actually use. A semi-automated loop wires the generator to Google Colab, trains a new model, and hands back an ONNX file ready to deploy on the VPS.

Stage 01
5 real architect plans
Stage 02
Synthetic generator
Five CAD styles residential architects use
AutoCAD
ArchiCAD
Revit
Chief Arch.
SoftPlan
Stage 03
~500 labelled synthetic plans
Stage 04
Google Colab
T4 GPU · 150 epochs · ~20 min
semi-autonomous loop
Stage 05
ONNX model
CPU inference on VPS · ~2 s per page

Before any of this runs, the PDF passes through my anonymizer — the same one on the other side of this site, tuned for architectural drawings. Client name, address, cadastral lot, phone, postal code — all scrubbed from the title block before a single image goes to a cloud model. Law 25 handled at the front door, not bolted on at the end.

Input · architect’s title block
Résidence · sheet 1 of 12
Scale 1/4″=1′
Project
Résidence Tremblay – ground-floor renovation
Client
Mme Sophie Tremblay
Address
4374, avenue Girouard, Montréal (Québec) H4A 3C8
Cadastre
Lot n° 1 468 237 · Circonscription foncière de Montréal
Phone
514 337-4300
Architect
Studio Dubois-Lafrance Architecture inc.
PII
Anonymizer
Law 25
Scrubbed · safe to process
Résidence · sheet 1 of 12
Scale 1/4″=1′
Project
Résidence   – ground-floor renovation
Client
 
Address
 
Cadastre
Lot n°   · Circonscription foncière de Montréal
Phone
 
Architect
Studio Dubois-Lafrance Architecture inc. · preserved (firm allow-list)

Stage one of the pipeline works the way a human estimator would: the YOLO detector walks every floor plan sheet looking for four categories of opening — exterior windows, patio doors, entry doors, and garage doors. It knows to ignore interior doors, closet doors, and other distractions a human would also skip. What comes out is a clean inventory: count, category, floor, location.

Floor plan · ground floor
YOLO detection overlay
Detected openings
Exterior windows
8
Patio doors
1
Entry doors
1
Garage doors
1
Ignored
Interior doors, closet doors, walk-through openings — same distractions a human estimator skips.

Stage two switches to the elevation sheets and pulls the per-unit details. For windows: pane configuration, grill pattern, glass type, hinge direction. For doors: swing direction, transom, sidelites, glazing, style. Two parallel tracks, each a structured LLM call against the rendered elevation page. Deterministic because the output schema is locked — every field strict-typed, every value validated against the schema before it lands in the sheet.

South elevation
rendered at 400 DPI
Track W · Windows
schema-locked
Per-unit fields pulled from elevation
pane · F·O·F
grill · 3h
glass · double, low-e
hinge · right
type · casement
Track D · Doors
runs in parallel
Per-unit fields pulled from elevation
swing · in, right
transom · yes
sidelite · left
glazing · full
style · Shaker
temperature = 0 · every field validated against schema before it lands

Stage three is the review pass. Everything the pipeline extracted goes into a two-panel interface. The left panel is the architect's drawing. The right panel is the item list. Click on any item — the drawing zooms to its exact location on its exact page. Wrong dimension? Edit the field. Wrong type? Pick from the dropdown. Hit export and a corrected XLSX drops out.

Verification interface
extraction.systemescalibre.ca/verify/…
PDF viewer · South elevation · Page 4 of 12
zoom 145% · panzoom
Click any item → drawing zooms to its exact location on its exact page
Items · 47 windows · 4 doors
all pages
F01
Fenêtre 1220×1500 · salon
F02
Fenêtre 1220×1500 · cuisine
F03
Fenêtre 2440×1800 · dining room
F04
Fenêtre 915×1500 · ch. principale
P01
Porte-patio 1830×2130 · dining room
F03 · Fenêtre 2440×1800
Flagged: dimension confidence
Pane config
F·O·F ▾
Width · mm
2440
Height · mm
1800
Grill
horizontal ×3 ▾
Glass
double, low-e ▾

The deliverable is a six-sheet Excel workbook — windows, entry doors, patio doors, garage doors, fire-separation doors, and a summary — in Quebec French industry vocabulary, plus an annotated PDF showing which opening on which sheet matches which row. The estimator doesn't start from a blank spreadsheet anymore. He starts from a checked sheet.

Deliverable · six-sheet Excel workbook
Sommaire
Fenêtres
Portes d’entrée
Portes-patio
Portes de garage
Portes coupe-feu
Impression
#TagDimensions (mm)Config. carreauxVitragePièce · étage
2F011220 × 1500O · grill 3hDouble low-eSalon · RdC
3F021220 × 1500O · grill 3hDouble low-eCuisine · RdC
4F03 ▲2440 × 1800F·O·FTriple low-eSalle à manger · RdC
5F04915 × 1500FixeDouble low-eCh. principale · 1er
6F05915 × 1500FixeDouble low-eCh. 2 · 1er
7F06610 × 915FixeDouble low-eS. de bain · 1er
Quebec French industry vocabulary · ▲ flags items the reviewer should double-check
+ Annotated PDF
elevation-sud-annotee.pdf · page 4 of 12
Every tag on the PDF matches the row on the sheet. Estimator starts from a checked sheet, not a blank one.

Building this has given me deep expertise in visual recognition for technical drawings — how to wire up a semi-autonomous training loop, how to make a probabilistic pipeline produce deterministic output, how to combine object detection with LLM-based classification so each does the part it's actually good at. That expertise transfers directly to any engagement where you need structured data out of drawings, schematics, or scanned forms.

If you have drawings, schematics, or forms that need to become structured, deterministic, reviewable data — drop me a line.

Let's talk →

Related projects