File size: 3,830 Bytes
bd9df5d
 
e094577
4b589f5
bd9df5d
e094577
bd9df5d
 
7edff58
 
e094577
cf8d75d
70ce441
7edff58
 
 
 
cf8d75d
7edff58
 
 
e094577
7edff58
e094577
7edff58
 
 
 
 
16400a1
cf8d75d
bd9df5d
7edff58
bd9df5d
7edff58
 
 
bd9df5d
e094577
 
bd9df5d
 
 
 
 
 
 
 
cf8d75d
bd9df5d
 
 
7edff58
 
 
 
 
 
 
 
 
 
bd9df5d
 
ddfe551
7edff58
ddfe551
e094577
bd9df5d
7edff58
bd9df5d
 
 
 
7edff58
 
 
 
 
 
 
 
bd9df5d
7edff58
 
 
bd9df5d
7edff58
 
bd9df5d
7edff58
 
bd9df5d
7edff58
 
 
 
 
 
 
 
 
 
bd9df5d
 
7edff58
bd9df5d
7edff58
 
 
 
 
bd9df5d
 
7edff58
 
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import os
from unsloth import FastVisionModel
import torch
from PIL import Image
from datasets import load_dataset
from transformers import TextStreamer
import matplotlib.pyplot as plt
import gradio as gr
import random
import numpy as np

device = torch.device("cpu")

def set_seed(seed_value=42):
    random.seed(seed_value)
    np.random.seed(seed_value)
    torch.manual_seed(seed_value)
    #torch.cuda.manual_seed_all(seed_value)
    
    torch.backends.cudnn.deterministic = True
    torch.backends.cudnn.benchmark = False

set_seed(42)

model, tokenizer = FastVisionModel.from_pretrained(
    "0llheaven/llama-3.2-11B-Vision-Instruct-Finetune",
    load_in_4bit = True,
    use_gradient_checkpointing = "unsloth",
)

#FastVisionModel.for_inference(model)

instruction = "You are an expert radiographer. Describe accurately what you see in this image."

def predict_radiology_description(image, temperature, use_top_p, top_p_value, use_min_p, min_p_value):
    try:
        set_seed(42)
        messages = [{"role": "user", "content": [
            {"type": "image"},
            {"type": "text", "text": instruction}
        ]}]
        input_text = tokenizer.apply_chat_template(messages, add_generation_prompt=True)

        inputs = tokenizer(
            image,
            input_text,
            add_special_tokens=False,
            return_tensors="pt",
        ).to(device)

        text_streamer = TextStreamer(tokenizer, skip_prompt=True)

        generate_kwargs = {
            "max_new_tokens": 512,
            "use_cache": True,
            "temperature": temperature,
        }
        if use_top_p:
            generate_kwargs["top_p"] = top_p_value
        if use_min_p:
            generate_kwargs["min_p"] = min_p_value

        output_ids = model.generate(
            **inputs,
            streamer=text_streamer,
            **generate_kwargs
        )

        generated_text = tokenizer.decode(output_ids[0], skip_special_tokens=True)
        return generated_text.replace("assistant", "\n\nassistant").strip()

    except Exception as e:
        return f"Error: {str(e)}"

with gr.Blocks() as interface:
    gr.Markdown("<h1><center>Radiology Image Description Generator</center></h1>")
    gr.Markdown("Upload a radiology image, adjust temperature and top-p, and the model will describe the findings in the image")
    with gr.Row(): 
        with gr.Column():
            image_input = gr.Image(type="pil", label="Upload")
        with gr.Column():
            output_text = gr.Textbox(label="Generated Description")

    with gr.Row():
        with gr.Column(scale=0.5):
            temperature_slider = gr.Slider(0.1, 2.0, step=0.1, value=1.0, label="temperature")

            use_top_p_checkbox = gr.Checkbox(label="Use top-p", value=True)
            top_p_slider = gr.Slider(0.1, 1.0, step=0.05, value=0.9, label="top-p")

            use_min_p_checkbox = gr.Checkbox(label="Use min-p", value=False)
            min_p_slider = gr.Slider(0.0, 1.0, step=0.05, value=0.1, label="min-p", visible=False)

            # Update visibility of sliders
            use_top_p_checkbox.change(
                lambda use_top_p: gr.update(visible=use_top_p),
                inputs=use_top_p_checkbox,
                outputs=top_p_slider
            )
            use_min_p_checkbox.change(
                lambda use_min_p: gr.update(visible=use_min_p),
                inputs=use_min_p_checkbox,
                outputs=min_p_slider
            )

    generate_button = gr.Button("Generate Description")

    # Link function to UI
    generate_button.click(
        predict_radiology_description,
        inputs=[image_input, temperature_slider, use_top_p_checkbox, top_p_slider, use_min_p_checkbox, min_p_slider],
        outputs=output_text
    )

# Gradio
interface.launch(share=True, debug=True)