Look Again 0.8B — wind turbine finder and blade counter

A LoRA adapter for Qwen3.5-0.8B, fine-tuned on distil labs at a hackathon on 19 October 2026.

It answers three kinds of question about rendered wind-farm landscapes:

Prompt Input Output
Find full landscape JSON list of [x0, y0, x1, y1] boxes in 0-1000 coordinates, one per tall structure
Judge zoomed crop of one structure one label: turbine_2, turbine_3, turbine_4, pylon, mast
Count full landscape integer: turbines with exactly N blades

The intended use is a look-again loop: the model finds every structure, code crops and enlarges each one, the model judges each crop, and code counts the matches.

Results

150 held-out test rows (50 of each prompt), scored exactly against the scene generator.

Find (IoU 0.5) Judge a zoomed crop Count in one look
Qwen3.5-0.8B, untrained no usable box list 0% 4%
This adapter 98% precision, 96% recall 74% 14%
Kimi K3 (teacher reference) 98% / 98%, but in pixels, not the requested format 74% 42%

The small model cannot count blades from the full image, but it judges a zoomed crop as well as Kimi K3. That is the premise of the loop. The end-to-end loop has not been scored yet.

Training

  • 1,500 rows: 500 synthetic scenes × the three prompts. Every label comes from the scene generator, not from a model or a person.
  • LoRA r 64, alpha 64, 3 epochs, batch 1 × gradient accumulation 8, bf16.
  • The job description below was used as the system prompt in training. Use it at inference.

How to use

import torch
from peft import PeftModel
from transformers import AutoModelForImageTextToText, AutoProcessor

base = AutoModelForImageTextToText.from_pretrained("Qwen/Qwen3.5-0.8B", dtype=torch.bfloat16)
model = PeftModel.from_pretrained(base, "Alptraum/look-again-0.8b").eval()
processor = AutoProcessor.from_pretrained("Qwen/Qwen3.5-0.8B")

messages = [
    {"role": "system", "content": [{"type": "text", "text": SYSTEM_PROMPT}]},
    {"role": "user", "content": [{"type": "image", "image": image},
                                 {"type": "text", "text": "[img 00000000] How many wind turbines in this image have exactly 3 blades? Power pylons and telecom masts are not wind turbines. Answer with one integer and nothing else."}]},
]
inputs = processor.apply_chat_template(messages, add_generation_prompt=True, tokenize=True,
                                       return_dict=True, return_tensors="pt", enable_thinking=False)
print(processor.decode(model.generate(**inputs, max_new_tokens=8)[0, inputs["input_ids"].shape[1]:],
                       skip_special_tokens=True))

Every training question starts with a neutral [img xxxxxxxx] tag (8 hex characters). It carries no meaning; any value works. SYSTEM_PROMPT and the exact question templates are in the project's job_description.json and build.py.

Limits

  • Trained only on synthetic, rendered scenes: simple shapes, fixed 1024×640 size. It has not seen photographs.
  • Untested on the held-out probe families (occlusion, blur and JPEG damage, a blade hidden along the tower).
  • Single-pass counting is weak (14%). Use the loop.

Licence

This adapter is distributed under the distil labs R&D licence in LICENSE: non-commercial prototyping and research only, with use limited to the United States and the European Economic Area, and the licence must travel with any copy. The base model is Apache 2.0 (STUDENT_LICENSE). The teacher used for evaluation is MIT (TEACHER_LICENSE).

Downloads last month
14
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for Alptraum/look-again-0.8b

Adapter
(472)
this model