Spaces:
Runtime error
Runtime error
import gradio as gr | |
from transformers import AutoImageProcessor, AutoModelForImageClassification, AutoModelForCausalLM, AutoTokenizer | |
from PIL import Image | |
import torch | |
import json | |
class SinogramAnalysisSystem: | |
def __init__(self): | |
print("Initializing system...") | |
self.device = "cuda" if torch.cuda.is_available() else "cpu" | |
# Load analysis models | |
print("Loading tumor detection models...") | |
self.tumor_classifier = AutoModelForImageClassification.from_pretrained( | |
"SIATCN/vit_tumor_classifier" | |
).to(self.device) | |
self.tumor_processor = AutoImageProcessor.from_pretrained("SIATCN/vit_tumor_classifier") | |
self.size_classifier = AutoModelForImageClassification.from_pretrained( | |
"SIATCN/vit_tumor_radius_detection_finetuned" | |
).to(self.device) | |
self.size_processor = AutoImageProcessor.from_pretrained( | |
"SIATCN/vit_tumor_radius_detection_finetuned" | |
) | |
# Load Hymba model | |
print("Loading Hymba model...") | |
repo_name = "nvidia/Hymba-1.5B-Base" | |
self.tokenizer = AutoTokenizer.from_pretrained(repo_name, trust_remote_code=True) | |
self.llm = AutoModelForCausalLM.from_pretrained(repo_name, trust_remote_code=True) | |
self.llm = self.llm.to(self.device).to(torch.bfloat16) | |
print("System ready!") | |
def process_sinogram(self, image): | |
if isinstance(image, str): | |
image = Image.open(image) | |
if image.mode != 'RGB': | |
image = image.convert('RGB') | |
return image.resize((224, 224)) | |
def analyze_sinogram(self, processed_image): | |
# Detect tumor | |
inputs = self.tumor_processor(processed_image, return_tensors="pt").to(self.device) | |
outputs = self.tumor_classifier(**inputs) | |
tumor_present = outputs.logits.softmax(dim=-1)[0].cpu() | |
has_tumor = tumor_present[1] > tumor_present[0] | |
# Assess size | |
size_inputs = self.size_processor(processed_image, return_tensors="pt").to(self.device) | |
size_outputs = self.size_classifier(**size_inputs) | |
size_pred = size_outputs.logits.softmax(dim=-1)[0].cpu() | |
sizes = ["no-tumor", "0.5", "1.0", "1.5"] | |
tumor_size = sizes[size_pred.argmax().item()] | |
return has_tumor, tumor_size | |
def generate_report(self, tumor_present, tumor_size): | |
prompt = f"""As a medical professional, provide a brief analysis of these sinogram findings: | |
Findings: | |
- Tumor Detection: {'Positive' if tumor_present else 'Negative'} | |
- Tumor Size: {tumor_size} cm | |
Please provide: | |
1. Brief interpretation | |
2. Clinical recommendations | |
3. Follow-up plan""" | |
# Generate response using Hymba | |
inputs = self.tokenizer(prompt, return_tensors="pt").to(self.device) | |
outputs = self.llm.generate( | |
**inputs, | |
max_length=512, | |
do_sample=True, | |
temperature=0.7, | |
use_cache=True | |
) | |
response = self.tokenizer.decode( | |
outputs[0][inputs['input_ids'].shape[1]:], | |
skip_special_tokens=True | |
) | |
return response.strip() | |
def analyze_image(self, image): | |
try: | |
# Process sinogram | |
processed = self.process_sinogram(image) | |
tumor_present, tumor_size = self.analyze_sinogram(processed) | |
# Generate medical report | |
report = self.generate_report(tumor_present, tumor_size) | |
# Format results | |
return f""" | |
SINOGRAM ANALYSIS: | |
• Tumor Detection: {'Positive' if tumor_present else 'Negative'} | |
• Size Assessment: {tumor_size} cm | |
MEDICAL REPORT: | |
{report} | |
""" | |
except Exception as e: | |
return f"Error during analysis: {str(e)}" | |
def create_interface(): | |
system = SinogramAnalysisSystem() | |
iface = gr.Interface( | |
fn=system.analyze_image, | |
inputs=[ | |
gr.Image(type="pil", label="Upload Sinogram") | |
], | |
outputs=[ | |
gr.Textbox(label="Analysis Results", lines=15) | |
], | |
title="Sinogram Analysis System", | |
description="Upload a sinogram for tumor detection and medical assessment." | |
) | |
return iface | |
if __name__ == "__main__": | |
interface = create_interface() | |
interface.launch(debug=True, share=True) |