Qwen3-VL-2B Aftermarket Auto Parts Detector

LoRA-адаптер для Qwen3-VL-2B-Instruct, обученный определять производителя автозапчасти по фото и тексту объявления.

Задача

Модель анализирует фотографию детали и текст объявления (заголовок + описание), находит бренд производителя и сравнивает его с маркой автомобиля.

Три класса:

  • ORIGINAL — бренд производителя совпадает с маркой авто (оригинальная деталь)
  • AFTERMARKET — бренд производителя отличается от марки авто (неоригинал)
  • UNKNOWN_BRAND — бренд производителя не удалось определить

Как это работает

Модель обучена логике сравнения, а не запоминанию брендов:

  1. Находит бренд производителя на фото (логотип, упаковка) или в тексте
  2. Различает контексты: марка авто (совместимость) vs название магазина vs бренд детали
  3. Сравнивает: совпадает с маркой авто → ORIGINAL, не совпадает → AFTERMARKET

Использование

from unsloth import FastVisionModel
from peft import PeftModel
from PIL import Image

model, tokenizer = FastVisionModel.from_pretrained(
    "unsloth/Qwen3-VL-2B-Instruct-bnb-4bit",
    load_in_4bit=True,
)
model = PeftModel.from_pretrained(model, "Stepan222/qwen3vl-2b-aftermarket-detector")
FastVisionModel.for_inference(model)

img = Image.open("part_photo.jpg").convert("RGB")

messages = [
    {"role": "system", "content": (
        "По фото и тексту объявления определи производителя детали. "
        "Найди бренд производителя, сравни с маркой автомобиля. "
        "Не путай: марка авто = совместимость, название магазина = не бренд. "
        "Ответь кратко: бренд, сравнение, вывод."
    )},
    {"role": "user", "content": [
        {"type": "image"},
        {"type": "text", "text": "Радиатор охлаждения BMW G30. Производитель Nissens."},
    ]},
]

input_text = tokenizer.apply_chat_template(messages, add_generation_prompt=True, enable_thinking=False)
inputs = tokenizer(img, input_text, add_special_tokens=False, return_tensors="pt").to("cuda")
output = model.generate(**inputs, max_new_tokens=128, temperature=0.1, min_p=0.1)
print(tokenizer.decode(output[0][inputs.input_ids.shape[1]:], skip_special_tokens=True))
# → "Производитель детали — Nissens, марка авто — BMW. Nissens и BMW не совпадают → AFTERMARKET"

Обучение

Параметр Значение
Base model Qwen3-VL-2B-Instruct
Method QLoRA (4-bit) via Unsloth
LoRA rank 16
LoRA alpha 16
Train samples 316
Val samples 56
Epochs 5
Batch size 1 (grad accum 16)
Learning rate 1e-4
Max seq length 1024
Image size 512x512

Данные

  • Объявления автозапчастей с Avito (фото + текст)
  • Разметка: ORIGINAL / AFTERMARKET / UNKNOWN_BRAND
  • Chain-of-thought рассуждения (2-3 предложения)
  • Валидация на held-out брендах (бренды, которых нет в train)

Ограничения

  • Не знает о корпоративных группах (VAG ≠ Audi → ошибочно AFTERMARKET)
  • Обучена на ~300 примерах — может ошибаться на редких кейсах
  • Оптимизирована для российского авторынка (русский текст)
Downloads last month
2
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for Stepan222/qwen3vl-2b-aftermarket-detector

Adapter
(58)
this model