File size: 3,587 Bytes
aea3610
ba29f94
aea3610
 
 
ba29f94
aea3610
ba29f94
 
aea3610
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fe6e7b2
aea3610
 
fe6e7b2
ba29f94
 
aea3610
 
 
 
 
 
 
 
 
 
 
ba29f94
fe6e7b2
 
 
 
 
 
aea3610
fe6e7b2
 
 
ba29f94
fe6e7b2
aea3610
 
 
 
 
 
 
ba29f94
aea3610
fe6e7b2
ba29f94
fe6e7b2
 
 
aea3610
 
 
fe6e7b2
 
 
aea3610
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import easyocr
from transformers import AutoModelForTokenClassification, AutoTokenizer, pipeline
from PIL import Image
import numpy as np

# Initialize EasyOCR for text extraction
reader = easyocr.Reader(['en'])

# Load ClinicalBERT for NER (Named Entity Recognition)
model_name = "emilyalsentzer/Bio_ClinicalBERT"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForTokenClassification.from_pretrained(model_name)
nlp = pipeline("ner", model=model, tokenizer=tokenizer)

# Mock function for validating test results
def validate_medical_value(test_name, test_value):
    reference_ranges = {
        "Blood Pressure": (90, 120),  # Example range: systolic
        "Glucose": (70, 100),  # Normal range for glucose in mg/dL
    }
    
    if test_name in reference_ranges:
        min_range, max_range = reference_ranges[test_name]
        if test_value < min_range:
            return f"{test_name} is low."
        elif test_value > max_range:
            return f"{test_name} is high."
        else:
            return f"{test_name} is within the normal range."
    else:
        return f"{test_name} range is unknown."

# Function to extract text from image
def extract_text_from_image(image):
    result = reader.readtext(image)
    text = ' '.join([item[1] for item in result])
    return text

# Function to check image clarity (basic approach using edge detection)
def check_image_clarity(image):
    # Convert image to grayscale
    gray_image = image.convert("L")
    image_np = np.array(gray_image)
    
    # Simple edge detection (Laplacian method)
    laplacian_var = cv2.Laplacian(image_np, cv2.CV_64F).var()
    
    # Threshold for determining clarity
    return laplacian_var > 100  # This threshold can be adjusted

# Function to extract medical entities (test results) from text
def extract_medical_values(text):
    entities = nlp(text)
    medical_data = {}
    
    for entity in entities:
        if entity['entity_group'] in ['LAB_RESULT', 'DISEASE', 'MEDICATION']:  # Modify based on actual labels
            medical_data[entity['word']] = entity['score']
    
    return medical_data

# Function to analyze medical report
def analyze_report(image):
    # Step 1: Check image clarity
    if not check_image_clarity(image):
        return "Image is unclear, please upload a clearer image."
    
    # Step 2: Extract text from the medical report image
    text = extract_text_from_image(image)
    
    # Step 3: Extract medical values using ClinicalBERT
    medical_values = extract_medical_values(text)
    
    analysis_results = []
    
    for test_name, test_value in medical_values.items():
        # Step 4: Validate test value against normal range
        validation_result = validate_medical_value(test_name, test_value)
        analysis_results.append(validation_result)
    
    return analysis_results

# Streamlit UI
st.title("Medical Report Analyzer")
st.write("Upload your medical report image to analyze the test results.")

# Upload the image
uploaded_image = st.file_uploader("Upload Image", type=["jpg", "png", "jpeg"])

if uploaded_image is not None:
    # Open the uploaded image
    image = Image.open(uploaded_image)
    
    # Show image for verification
    st.image(image, caption="Uploaded Medical Report", use_column_width=True)
    
    # Analyze the report
    analysis_results = analyze_report(image)
    
    # Display results
    if isinstance(analysis_results, list):
        for result in analysis_results:
            st.write(result)
    else:
        st.write(analysis_results)