Classical CV vs Vision-Language Models for steel defect detection
2026-05-18
How can we prepare for the unknown?
Is computer vision a solved problem?
How can we save time with new tech?




Two Severstal hot-rolled steel-strip close-ups. One is labelled defective, one is not. Which is which?
The bottom strip is the defect: a single pit (pink mask). The top strip is what Severstal annotators flagged as normal — texture and rolling marks, no actionable defect.
Two more close-ups. Both strips are defective. Can you spot the marks, and would you call them the same kind of defect?
The top strip carries small “scratch” blobs (orange); the bottom strip has large “patch” regions (purple). Same dataset, same camera, four totally different defect taxonomies — and the annotator decides which one to call.
We will treat the problem as if they have
no labelled data,
but want us to as quickly as possible provide them with a system that can identify defects on the production line.
Then in this demo, I choose
two datasets that have some similarities to what we might expect from AQ Group as training data
and use another dataset as a holdout set to test how well our models generalise to new domains.
I collapse all the labels to a single binary “defect / no-defect” target, because we don’t know what the defect taxonomy is at AQ Group.
So how do we go about this??
The standard CV taxonomy: classification, detection, segmentation.


AlexNet (2012) — the architecture that ended hand-crafted feature engineering and started the deep-learning era of computer vision.
YOLO11s (COCO pretrained, 80 classes) run on a Severstal hot-rolled steel strip with real defects. The model boxes the actual anomalies — a scratch cluster and a large surface patch — and labels every one a bird. “Steel defect” simply does not exist in its vocabulary.





Classical CV runs on labels.
Every time the camera moves, the lighting changes, or a new defect class shows up, the whole pipeline goes back to the annotator queue.
For AQ Group we don’t yet know:
So the safe bet is a system that can start without labels.

Same task — “is this strip defective?” — wildly different pixels.


For each image: the raw crop, the ResNet Grad-CAM heatmap, and the GPT-5.4 natural-language rationale. The classical model gives a number; the VLM gives a sentence.

No classical recipe gets us there.
Fine-tuning on Kolektor helps — F1 climbs from 0.16 to 0.56 — but still leaves us far short of production-ready.
~11 700 labels in, and the ceiling is a passable model on one mill.
Same three images, two outputs. Middle: ResNet50 Grad-CAM — one scalar p̂(defect) plus a soft “where roughly”. Right: YOLO11s — one or more typed bounding boxes, each with its own confidence. Top two rows are in-domain Severstal; bottom row is out-of-distribution KolektorSDD2.
Launch of ChatGPT. Core engine handles text tokens exclusively.
Massive logical upgrade, but architecture remains text-only.
Stitched pipeline. External vision encoders and audio transcribers translation layers.
Unified architecture. Processes text, native sight, and live audio in one neural space.
Streamlined omni variant maintaining native multimodal processing.
Scales early-fusion to native video generation and seamless token blending.
Train a Large Language Model on text, then add vision as a separate input channel with a translation layer.
Train a Large Language Model on text and images together, with a shared internal representation.

Setup
src/vlm_clients.pyresults/cost_ledger.csv, capped at $50Reading the chart

The headline.
No labels on the new domain, no fine-tuning, no schema changes — just an API call with a prompt.

The loop (scripts/prompt_tune_vlm.py)
summary, common_mistakes[], prompt_addendumThe tuner output is schema-enforced — strict JSON, no free-form prose. The addendum becomes a # DOMAIN-SPECIFIC GUIDANCE block prepended to the student’s user prompt.
TUNER_SCHEMA = {
"type": "object",
"properties": {
"summary": {"type": "string"},
"common_mistakes": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"properties": {
"pattern": {"type": "string"},
"fix": {"type": "string"},
},
"required": ["pattern", "fix"],
},
},
"prompt_addendum": {
"type": "string",
"description": (
"Markdown to append under '# DOMAIN-SPECIFIC GUIDANCE'. "
"Explains the domain, what counts as a defect, and "
"the visual heuristics that disambiguate the hard cases."
),
},
},
"required": ["summary", "common_mistakes", "prompt_addendum"],
}Four images — one normal Severstal frame at the top, then three defective close-ups from KolektorSDD2 and Severstal. Middle: ResNet50 Grad-CAM heatmap (red = pixels that pushed p(defect) up). Right: live GPT-5.4 reasoning for the same image (no fine-tuning, structured-output prompt).

results/vlm/flagship_summary_*.json.

results/cost_ledger.csv.

N_train = 2,332 images and serving a near-free ResNet/YOLO.Three label-cost worlds
Break-even images processed (VLM-only vs label-once-then-classical):
A line running 24/7 hits 26k images in hours. The hybrid (YOLO → escalate 30% to VLM) buys back another 3×.

Setup (scripts/labelling_curve.py)
Reading the chart
What we showed
The recipe for AQ Group
The VLM is the teacher and the safety net, not the production classifier.