File size: 1,863 Bytes
34b0f43
d3cd155
 
 
 
 
 
 
 
34b0f43
d3cd155
 
 
 
 
 
 
 
 
08cd424
 
 
d3cd155
 
 
 
08cd424
 
d3cd155
 
 
 
 
 
 
 
 
 
08cd424
 
 
d3cd155
 
 
 
 
 
 
08cd424
d3cd155
 
 
 
 
 
 
 
 
 
 
 
 
 
 
08cd424
 
 
d3cd155
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
---
library_name: transformers
pipeline_tag: image-text-to-text
base_model: Qwen/Qwen3-VL-8B-Instruct
tags:
  - qwen3-vl
  - vision-language
  - reward-model
  - image-ranking
---

# VerifierReward Qwen3-VL 8B

```python
import torch
from transformers import AutoProcessor, Qwen3VLForConditionalGeneration

model_id = "JanHutter/verifierreward"

processor = AutoProcessor.from_pretrained(
    model_id, max_pixels=512 * 512, fix_mistral_regex=False,
)
model = Qwen3VLForConditionalGeneration.from_pretrained(
    model_id,
    dtype=torch.bfloat16,
    device_map="auto",
    attn_implementation="sdpa",
).eval()
```


## Score image-prompt alignment

The model was trained to answer `yes` or `no`. The scalar reward used during
evaluation is the full-vocabulary probability of the next token being `yes`.

```python
import torch
from PIL import Image

image = Image.open("image.jpg").convert("RGB")

instruction = """You are an AI assistant specializing in image analysis and ranking. Your task is to analyze and compare image based on how well they match the given prompt.
The given prompt is:{prompt}. Please consider the prompt and the image to make a decision and response directly with 'yes' or 'no'."""

messages = [{
    "role": "user",
    "content": [
        {"type": "image", "image": image},
        {"type": "text", "text": instruction.format(prompt="a red car in snow")},
    ],
}]

inputs = processor.apply_chat_template(
    [messages],
    tokenize=True,
    add_generation_prompt=True,
    return_dict=True,
    return_tensors="pt",
).to(model.device)

with torch.inference_mode():
    logits = model(**inputs, use_cache=False).logits[:, -1, :].float()

yes_ids = processor.tokenizer.encode("yes", add_special_tokens=False)
assert len(yes_ids) == 1
yes_id = yes_ids[0]
reward = torch.softmax(logits, dim=-1)[:, yes_id]
print(reward.item())
```