What Keep-Correct-Revise (KCR) means
Keep-Correct-Revise (KCR) is the data recipe behind the model this run starts from. An SFT plus GRPO
policy generates its own reasoning traces on Real-IAD images. Each trace is then kept when the verdict
is correct, corrected by a teacher model when the verdict is wrong, and revised by a teacher model
when the verdict is correct but the reasoning is only weakly grounded in the image. The base model is
then fine-tuned from scratch on the curated 6,000-trace result. That fine-tune is the KCR model.
This model is one more GRPO stage stacked on top of that KCR model.
Why "future work" and not a result
GRPO on the already-strong KCR init edges the SFT ceiling on average but the trajectory bounces
across epoch 3 rather than climbing monotonically, so the gain is small and not yet clearly stable.
The thesis therefore reports the KCR SFT model as the headline and holds this run as future work.
Do not read these numbers as "GRPO beat SFT".
Balanced accuracy (checkpoint-954)
Balanced accuracy BA = 0.5 * (TP/(TP+FN) + TN/(TN+FP)), recomputed from the raw tp/tn/fp/fn of
each eval JSON (shipped in the code repo).
Table with columns: Benchmark, BA, tp, tn, fp, fn, n| Benchmark | BA | tp | tn | fp | fn | n |
|---|
| DS-MVTec | 82.95 | 1004 | 373 | 71 | 222 | 1670 |
| VisA | 72.62 | 719 | 804 | 140 | 478 | 2141 |
Average 77.78, versus the KCR init's 77.44 (82.80 / 72.07).
The AnomalyThink Qwen family for context
Table with columns: Model, DS-MVTec, VisA, Note| Model | DS-MVTec | VisA | Note |
|---|
…-7B-KCR | 82.80 | 72.07 | thesis headline |
…-7B-SFT | 80.16 | 64.78 | plain SFT baseline |
|
Usage
from transformers import Qwen2_5_VLForConditionalGeneration, AutoProcessorfrom qwen_vl_utils import process_vision_info model_id = "aacudad/AnomalyThink-Qwen2.5-VL-7B-KCR-GRPO"model = Qwen2_5_VLForConditionalGeneration.from_pretrained(model_id, torch_dtype="auto", device_map="auto")processor = AutoProcessor.from_pretrained(model_id) messages = [{"role": "user", "content": [ {"type": "image", "image": "file:///path/to/part.png"}, {"type": "text", "text": "Is there a defect in this product? Analyze and answer yes or no."},]}]text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)imgs, vids = process_vision_info(messages)inputs = processor(text=[text], images=imgs, videos=vids, padding=True, return_tensors="pt").to(model.device)out = model.generate(**inputs, max_new_tokens=512)print(processor.batch_decode(out[:, inputs.input_ids.shape[1]:], skip_special_tokens=True)[0])
Links
Citation
@mastersthesis{acudad2026reasoning, author = {Acudad, A.}, title = {Reasoning-Enhanced Vision-Language Models for Explainable Industrial Anomaly Detection}, school = {Delft University of Technology}, year = {2026}, type = {Master's thesis}, url = {https://resolver.tudelft.nl/uuid:65c62420-79c0-447f-b095-7fb11d4474fc}}
Thesis: https://resolver.tudelft.nl/uuid:65c62420-79c0-447f-b095-7fb11d4474fc. Code and evaluation files: https://github.com/aacudad/IAD-VLMs.
License
Derived from Qwen2.5-VL-7B-Instruct (Apache-2.0). Evaluated on DS-MVTec and VisA (MMAD protocol),
trained on AnomalyThink traces distilled from Gemini-2.5-Flash over Real-IAD.