File size: 4,183 Bytes
cd6b2f5 1138794 cd6b2f5 a8da724 cd6b2f5 a8da724 cd6b2f5 4fd374a a8da724 4fd374a 9e4acbd 4fd374a 47e5b46 4fd374a 47e5b46 4fd374a b97a1bd 4fd374a cd6b2f5 4fd374a 1138794 cd6b2f5 a8da724 cd6b2f5 1138794 a8da724 1138794 a8da724 cd6b2f5 a8da724 1138794 cd6b2f5 a8da724 1138794 cd6b2f5 1138794 a8da724 cd6b2f5 1138794 cd6b2f5 |
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 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
import streamlit as st
from PIL import Image
import pytesseract
import pandas as pd
import re
import openai
# Setup OpenAI API key (replace with your OpenAI API key)
openai.api_key = "your-api-key-here"
# Function to extract text from the image
def extract_text(image):
"""
Extract text from the image using Tesseract.
"""
return pytesseract.image_to_string(image)
# Function to parse and clean the extracted text
def clean_and_parse_extracted_text(raw_text):
"""
Parse and clean the raw text to extract structured data.
"""
lines = raw_text.split("\n")
lines = [line.strip() for line in lines if line.strip()]
data = []
for line in lines:
match = re.match(
r"^(.*?)(\d+(\.\d+)?)(\s*-?\s*\d+(\.\d+)?\s*-?\s*\d+(\.\d+)?)?\s*([a-zA-Z/%]+)?\s*(H|L|Normal)?$",
line,
)
if match:
component = match.group(1).strip()
value = float(match.group(2))
range_match = match.group(4)
if range_match:
ranges = re.findall(r"[\d.]+", range_match)
min_val = float(ranges[0]) if len(ranges) > 0 else None
max_val = float(ranges[1]) if len(ranges) > 1 else None
else:
min_val = None
max_val = None
unit = match.group(7)
flag = "Normal" # Default flag
if min_val is not None and max_val is not None:
if value < min_val:
flag = "L"
elif value > max_val:
flag = "H"
if flag != "Normal":
data.append([component, value, min_val, max_val, unit, flag])
df = pd.DataFrame(data, columns=["Component", "Your Value", "Min", "Max", "Units", "Flag"])
correction_map = {
"emoglobin": "Hemoglobin",
"ematocrit": "Hematocrit",
"% Platelet Count": "Platelet Count",
"ymphocyte %": "Lymphocyte %",
"L Differential Type Automated": "Differential Type",
}
df["Component"] = df["Component"].replace(correction_map)
return df
# Function to generate AI-powered recommendations using OpenAI GPT
def generate_medical_recommendation(test_results):
"""
Generate medical recommendations using OpenAI GPT model based on abnormal test results.
"""
# Create a structured input for the model
prompt = f"Given the following blood test results: {test_results}, provide medical recommendations for a patient."
response = openai.Completion.create(
model="gpt-4", # Use GPT-4 for medical-based responses
prompt=prompt,
max_tokens=150
)
return response.choices[0].text.strip()
# Function to display results
def display_results(df):
"""
Display the flagged abnormalities and medical recommendations in a table format.
"""
# Generate a summary of the abnormal test results for the AI model
abnormal_results = df[df['Flag'] != 'Normal'].to_string(index=False)
recommendation = generate_medical_recommendation(abnormal_results)
# Display the DataFrame and the recommendation
st.subheader("Flagged Abnormalities")
st.dataframe(df, use_container_width=True)
st.subheader("Medical Recommendations from AI")
st.write(recommendation)
# Streamlit app
st.title("Blood Report Analyzer with AI Recommendations")
st.write("Upload an image of a blood test report to analyze and get AI-powered recommendations.")
uploaded_file = st.file_uploader("Upload Image", type=["png", "jpg", "jpeg"])
if uploaded_file is not None:
try:
# Load the image
image = Image.open(uploaded_file)
# Display the uploaded image
st.image(image, caption="Uploaded Image", use_container_width=True)
# Extract text from the image
extracted_text = extract_text(image)
# Parse the extracted text into a structured format
parsed_data = clean_and_parse_extracted_text(extracted_text)
# Display the structured data with AI recommendations
display_results(parsed_data)
except Exception as e:
st.error(f"An error occurred: {e}")
|