Delete models
Browse files- models/image_analyzer.py +0 -43
- models/multimodal_fusion.py +0 -58
- models/text_analyzer.py +0 -72
models/image_analyzer.py
DELETED
@@ -1,43 +0,0 @@
|
|
1 |
-
import torch
|
2 |
-
from transformers import AutoFeatureExtractor, AutoModelForImageClassification
|
3 |
-
|
4 |
-
|
5 |
-
class ImageAnalyzer:
|
6 |
-
def __init__(self):
|
7 |
-
# Load the chest X-ray analysis model
|
8 |
-
try:
|
9 |
-
model_name = "facebook/deit-base-patch16-224-medical-cxr"
|
10 |
-
self.feature_extractor = AutoFeatureExtractor.from_pretrained(model_name)
|
11 |
-
self.model = AutoModelForImageClassification.from_pretrained(model_name)
|
12 |
-
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
13 |
-
self.model.to(self.device)
|
14 |
-
print(f"Image model loaded on {self.device}")
|
15 |
-
except Exception as e:
|
16 |
-
print(f"Error loading image model: {e}")
|
17 |
-
# Fallback to a dummy model
|
18 |
-
self.model = None
|
19 |
-
self.feature_extractor = None
|
20 |
-
|
21 |
-
def analyze(self, image):
|
22 |
-
"""Analyze an X-ray image and return predictions with confidence scores"""
|
23 |
-
if self.model is None or self.feature_extractor is None:
|
24 |
-
return {"No findings": 0.7, "Abnormal": 0.3} # Dummy results
|
25 |
-
|
26 |
-
try:
|
27 |
-
inputs = self.feature_extractor(images=image, return_tensors="pt").to(
|
28 |
-
self.device
|
29 |
-
)
|
30 |
-
with torch.no_grad():
|
31 |
-
outputs = self.model(**inputs)
|
32 |
-
|
33 |
-
# Process outputs to get predicted class and confidence
|
34 |
-
probabilities = torch.nn.functional.softmax(outputs.logits, dim=1)[0]
|
35 |
-
predictions = {}
|
36 |
-
for i, prob in enumerate(probabilities):
|
37 |
-
label = self.model.config.id2label[i]
|
38 |
-
predictions[label] = float(prob)
|
39 |
-
|
40 |
-
return predictions
|
41 |
-
except Exception as e:
|
42 |
-
print(f"Error during image analysis: {e}")
|
43 |
-
return {"Error": "Could not analyze image"}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
models/multimodal_fusion.py
DELETED
@@ -1,58 +0,0 @@
|
|
1 |
-
class MultimodalFusion:
|
2 |
-
"""
|
3 |
-
Combines insights from image analysis and text analysis
|
4 |
-
to provide comprehensive medical assessment
|
5 |
-
"""
|
6 |
-
|
7 |
-
def __init__(self):
|
8 |
-
pass
|
9 |
-
|
10 |
-
def fuse_insights(self, image_results, text_results):
|
11 |
-
"""
|
12 |
-
Fuse insights from image and text analysis
|
13 |
-
|
14 |
-
Args:
|
15 |
-
image_results (dict): Results from image analysis
|
16 |
-
text_results (dict): Results from text analysis
|
17 |
-
|
18 |
-
Returns:
|
19 |
-
dict: Combined insights with recommendation
|
20 |
-
"""
|
21 |
-
# In a real implementation, this would use more sophisticated fusion techniques
|
22 |
-
combined_insights = {
|
23 |
-
"Image findings": image_results,
|
24 |
-
"Text findings": text_results,
|
25 |
-
}
|
26 |
-
|
27 |
-
# Simple fusion logic
|
28 |
-
confidence_scores = [
|
29 |
-
value for key, value in image_results.items() if isinstance(value, float)
|
30 |
-
]
|
31 |
-
avg_confidence = (
|
32 |
-
sum(confidence_scores) / len(confidence_scores) if confidence_scores else 0
|
33 |
-
)
|
34 |
-
|
35 |
-
# Determine if any abnormalities are detected in image
|
36 |
-
image_abnormal = any(
|
37 |
-
key != "No findings" and value > 0.5
|
38 |
-
for key, value in image_results.items()
|
39 |
-
if isinstance(value, float)
|
40 |
-
)
|
41 |
-
|
42 |
-
# Check if text analysis found concerning elements
|
43 |
-
text_concerning = text_results.get("Sentiment") == "Concerning"
|
44 |
-
|
45 |
-
# Generate recommendation
|
46 |
-
if image_abnormal and text_concerning:
|
47 |
-
recommendation = "High priority: Both image and text indicate abnormalities"
|
48 |
-
elif image_abnormal:
|
49 |
-
recommendation = "Medium priority: Image shows potential abnormalities"
|
50 |
-
elif text_concerning:
|
51 |
-
recommendation = "Medium priority: Text report indicates concerns"
|
52 |
-
else:
|
53 |
-
recommendation = "Low priority: No significant findings detected"
|
54 |
-
|
55 |
-
combined_insights["Recommendation"] = recommendation
|
56 |
-
combined_insights["Confidence"] = f"{avg_confidence:.2f}"
|
57 |
-
|
58 |
-
return combined_insights
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
models/text_analyzer.py
DELETED
@@ -1,72 +0,0 @@
|
|
1 |
-
import torch
|
2 |
-
from transformers import AutoModelForSequenceClassification, AutoTokenizer, pipeline
|
3 |
-
|
4 |
-
|
5 |
-
class TextAnalyzer:
|
6 |
-
def __init__(self):
|
7 |
-
# Load the medical text analysis model
|
8 |
-
try:
|
9 |
-
model_name = "medicalai/ClinicalBERT"
|
10 |
-
self.tokenizer = AutoTokenizer.from_pretrained(model_name)
|
11 |
-
self.model = AutoModelForSequenceClassification.from_pretrained(model_name)
|
12 |
-
self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
13 |
-
self.model.to(self.device)
|
14 |
-
|
15 |
-
# NER pipeline for medical entities
|
16 |
-
self.ner_pipeline = pipeline(
|
17 |
-
"ner", model="samrawal/bert-base-uncased_medical-ner"
|
18 |
-
)
|
19 |
-
print(f"Text model loaded on {self.device}")
|
20 |
-
except Exception as e:
|
21 |
-
print(f"Error loading text model: {e}")
|
22 |
-
# Fallback to dummy functionality
|
23 |
-
self.model = None
|
24 |
-
self.tokenizer = None
|
25 |
-
self.ner_pipeline = None
|
26 |
-
|
27 |
-
def analyze(self, text):
|
28 |
-
"""Analyze medical report text and extract key insights"""
|
29 |
-
if text.strip() == "":
|
30 |
-
return {"Insights": "No text provided"}
|
31 |
-
|
32 |
-
if self.model is None or self.tokenizer is None:
|
33 |
-
# Dummy analysis
|
34 |
-
return {
|
35 |
-
"Entities": ["fever", "cough"],
|
36 |
-
"Sentiment": "Concerning",
|
37 |
-
"Key findings": "Patient shows symptoms of respiratory illness",
|
38 |
-
}
|
39 |
-
|
40 |
-
try:
|
41 |
-
# Extract medical entities
|
42 |
-
if self.ner_pipeline:
|
43 |
-
entities = self.ner_pipeline(text)
|
44 |
-
unique_entities = list(set([entity["word"] for entity in entities]))
|
45 |
-
else:
|
46 |
-
unique_entities = []
|
47 |
-
|
48 |
-
# Simple text classification (in real app, would be more sophisticated)
|
49 |
-
inputs = self.tokenizer(
|
50 |
-
text, return_tensors="pt", padding=True, truncation=True
|
51 |
-
).to(self.device)
|
52 |
-
with torch.no_grad():
|
53 |
-
outputs = self.model(**inputs)
|
54 |
-
|
55 |
-
# This is a placeholder - in reality would depend on the actual model output
|
56 |
-
sentiment = (
|
57 |
-
"Concerning" if torch.sigmoid(outputs.logits).item() > 0.5 else "Normal"
|
58 |
-
)
|
59 |
-
|
60 |
-
# Generate key findings (simplified)
|
61 |
-
key_findings = f"Report indicates {'abnormal' if sentiment == 'Concerning' else 'normal'} findings"
|
62 |
-
if unique_entities:
|
63 |
-
key_findings += f" with mentions of {', '.join(unique_entities[:5])}"
|
64 |
-
|
65 |
-
return {
|
66 |
-
"Entities": unique_entities[:10],
|
67 |
-
"Sentiment": sentiment,
|
68 |
-
"Key findings": key_findings,
|
69 |
-
}
|
70 |
-
except Exception as e:
|
71 |
-
print(f"Error during text analysis: {e}")
|
72 |
-
return {"Error": "Could not analyze text"}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|