Views
No views yet

| Dataset | Jina Reranker m0 (Baseline) | QwenLogitReranker |
|---|---|---|
| UlrickBL/vidore_benchmark_economics_reports_v2_reranker_adapted | 0.735 | 0.799 |
| UlrickBL/vidore_benchmark_2_biomedical_lectures_v2_reranker_adapted | 0.763 | 0.755 |
| UlrickBL/vidore_benchmark_2_esg_reports_human_labeled_v2_reranker_adapted | 0.851 | 0.820 |
| UlrickBL/vidore_benchmark_arxivqa_reranker_adapted | 0.767 | 0.747 |
| UlrickBL/vidore_benchmark_2_esg_reports_v2_reranker_adapted | 0.920 | 0.910 |
| Inference time (4898*2810 image, T4 GPU) | 2.212 s | 1.161 s |
1 import torch
2 from PIL import Image
3 from torch import nn
4 from peft import PeftModel, PeftConfig
5 from huggingface_hub import hf_hub_download
6 from transformers import Qwen2_5_VLForConditionalGeneration, AutoTokenizer, AutoProcessor
7 from qwen_vl_utils import process_vision_info
8
9
10 class Qwen2_5Reranker(nn.Module):
11 def __init__(self, base_model):
12 super().__init__()
13 self.base_model = base_model
14 def forward(self, input_ids,pixel_values, attention_mask,image_grid_thw,original_length=None,labels=None):
15 # Readapt pixel values
16 if len(pixel_values.shape)==3 :
17 pixel_values = pixel_values.transpose(0, 1).reshape(-1, pixel_values.shape[-1])
18 pixel_values = pixel_values[:original_length[0].item()]
19
20
21 generated_ids = self.base_model.forward(input_ids=input_ids,pixel_values=pixel_values,image_grid_thw=image_grid_thw, attention_mask=attention_mask)
22
23 logits =generated_ids.logits
24 batch_size = logits.size(0)
25 batch_indices = torch.arange(batch_size, device=logits.device)
26
27 lengths = attention_mask.sum(dim=1)
28 token_pos = lengths -1
29 token_id_yes = 9454
30 token_id_no = 2753
31
32 selected_logits = logits[batch_indices, token_pos]
33
34 yes_logits = selected_logits[:, token_id_yes] # shape: [batch_size]
35 no_logits = selected_logits[:, token_id_no] # shape: [batch_size]
36
37 logit_diff = yes_logits - no_logits
38
39 prob_yes = torch.sigmoid(logit_diff)
40
41 return prob_yes
42
43 # Load the model
44 max_pixels = 1080*28*28
45 model_qwen = Qwen2_5_VLForConditionalGeneration.from_pretrained(
46 "Qwen/Qwen2.5-VL-3B-Instruct", torch_dtype=torch.bfloat16, device_map="auto", output_hidden_states=True,
47 )
48 processor = AutoProcessor.from_pretrained("Qwen/Qwen2.5-VL-3B-Instruct",max_pixels=max_pixels)
49
50 base = PeftModel.from_pretrained(model_qwen, "UlrickBL/qwen_vl_reranker_adapter_V2")
51
52 model = Qwen2_5Reranker(base_model=base, hidden_dim=2048)
53
54 model=model.to("cuda")
55 model.eval()1 import time
2
3 start_time = time.time()
4
5 url = "https://oto.hms.harvard.edu/sites/g/files/omnuum8391/files/2025-04/PowerPoint-Presentation-Graphic.jpg"
6
7 response = requests.get(url)
8 image = Image.open(BytesIO(response.content))
9
10 query = "<|im_start|>system\nYou will be given an picture and a query. Answer 'Yes' if the answer to the query can be found in the picture, else 'No'<|im_end|>\n<|im_start|>user\n<|vision_start|><|image_pad|><|vision_end|>Query : "+"What is the Harvard study departement in the question ?"+" \nAre the picture and query related ?<|im_end|>\n<|im_start|>assistant\n"
11
12 inputs = processor(
13 text=[query],
14 images=[image],
15 padding=True,
16 return_tensors="pt",
17 )
18
19 inputs.to("cuda")
20
21 with torch.no_grad():
22 batch_scores = model(**inputs)
23 end_time = time.time()
24
25 print(f"Time taken : {end_time - start_time:.4f} seconds")