bloodlab / app.py
mohammad2928git's picture
Update app.py
a25a6d2 verified
import gradio as gr
import os
# Let's pick the desired backend
# os.environ['USE_TF'] = '1'
os.environ['USE_TORCH'] = '1'
import matplotlib.pyplot as plt
from doctr.io import DocumentFile
from doctr.models import ocr_predictor
from PIL import Image
import numpy as np
# util functions
def prepreocess(text):
"""
convert to lowercase
removing . from words
convert string numbers to number
"""
text = text.lower()
try:
text = float(text)
return text
except:
pass
text = text.replace('.', '')
return text
normal_values = {
'wbc': {"min": 4000, "max": 11000, "minwarning": "هپاتیت و آرتریت", "maxwarning": "وجود عفونت"},
'rbc': {"min": 4.5, "max": 6.1, "minwarning": "بی‌ نظمی در گلوبول های قرمز خون", "maxwarning": "بی‌ نظمی در گلوبول های قرمز خون"},
'hb': {"min": 12.3, "max": 17.50, "minwarning": "هموگلوبین کم است", "maxwarning": "هموگلوبین زیاد است"},
'hgb': {"min": 12.3, "max": 17.50, "minwarning": "هموگلوبین کم است", "maxwarning": "هموگلوبین زیاد است"},
'hct': {"min": 36.00, "max": 45.00, "minwarning": "نسبت گلوبولهای قرمر به خون نامتناسب است", "maxwarning": "نسبت گلوبولهای قرمر به خون نامتناسب است "},
'mch': {"min": 27, "max": 33, "minwarning": "احتمال سوء تغذیه", "maxwarning": "احتمال کم خونی"},
'mchc': {"min": 27, "max": 33, "minwarning": "احتمال سوء تغذیه", "maxwarning": "احتمال کم خونی"},
'mcv': {"min": 80, "max": 96, "minwarning": "نشانه ای از کم خونی یا سندرم خستگی مزمن", "maxwarning": "نشانه ای از کم خونی یا سندرم خستگی مزمن"},
'mchc': {"min": 33.4, "max": 35.5, "minwarning": "احتمال سوء تغذیه", "maxwarning": "احتمال کم خونی"},
'plt': {"min": 150, "max": 450, "minwarning": "سطح تخمیر نرمال نیست", "maxwarning": "سطح تخمیر نرمال نیست"},
'fbs': {"min": 70, "max": 100, "minwarning": "قند خون پایین", "maxwarning": "قند خون بالا"},
'hbalc': {"min": 4000, "max": 11000, "minwarning": "", "maxwarning": ""},
'urea': {"min": 4000, "max": 11000, "minwarning": "", "maxwarning": ""},
'creatinine': {"min": 4000, "max": 11000, "minwarning": "", "maxwarning": ""},
'cholesterol': {"min": 4000, "max": 11000, "minwarning": "", "maxwarning": ""},
'triglycerides': {"min": 4000, "max": 11000, "minwarning": "", "maxwarning": ""},
'hdl': {"min": 40, "max": 11000, "minwarning": "خطر ابتلا به بیماری قلبی عروقی", "maxwarning": ""},
'ldl': {"min": 70, "max": 100, "minwarning": "خطر ابتلا به بیماری قلبی عروقی", "maxwarning": "خطر ابتلا به بیماری قلبی عروقی"},
"rdw": {"min": 4000, "max": 11000, "minwarning": "", "maxwarning": ""},
'rcdw': {"min": 4000, "max": 11000, "minwarning": "", "maxwarning": ""},
'hgb': {"min": 4000, "max": 11000, "minwarning": "", "maxwarning": ""},
'bp': {"min": 80, "max": 120, "minwarning": "فشار خون پایین", "maxwarning": "فشار خون بالا"},
'bg': {"min": 70, "max": 150, "minwarning": "قند خون پایین", "maxwarning": "قند خون بالا"},
'esr': {"min": 0, "max": 20, "minwarning": "امکان عفونت و یا التهاب", "maxwarning": " امکان عفونت و یا التهاب "},
'crp': {"min": 0, "max": 1000, "minwarning": "امکان عفونت و یا التهاب", "maxwarning": " امکان عفونت و یا التهاب "},
}
predictor = ocr_predictor(pretrained=True)
def proceed(image):
print("image: ", image)
im = Image.fromarray(np.array(image))
im.save("temp.jpg")
doc = DocumentFile.from_images("temp.jpg") #reading input image
result = predictor(doc) # extract words
json_export = result.export() # convert to json
out_words = [[prepreocess(w['value']) for w in line['words'] ] for line in json_export['pages'][0]['blocks'][0]['lines']] # extracting words
final_words = []
for item in out_words:
final_words += item
wanted = {
'wbc': 'nan',
'rbc': 'nan',
'hb': 'nan',
'hgb': 'nan',
'hct': 'nan',
'mcv': 'nan',
'mch': 'nan',
'mchc': 'nan',
'mchc': 'nan',
'plt': 'nan',
'fbs': 'nan',
'hbalc': 'nan',
'urea': 'nan',
'creatinine': 'nan',
'cholesterol': 'nan',
'triglycerides': 'nan',
'hdl': 'nan',
'ldl': 'nan',
"rdw": 'nan',
'rcdw': 'nan',
'hgb': 'nan',
'bp': 'nan',
'esr': 'nan',
'crp': 'nan',
}
# extracting value per each wanted keyword
counter = 0
while counter < len(final_words):
if wanted.get(final_words[counter], 0)== 'nan':
if type(final_words[counter+1]) == float:
wanted[final_words[counter]] = final_words[counter+1]
counter += 1
if type(final_words[counter+2]) == float:
wanted[final_words[counter]] = final_words[counter+2]
counter += 2
counter += 1
# print(f"out is {out_gen}")
# checking for normal values
printed_result = []
for k,v in wanted.items():
if v == 'nan':
continue
normal_value = normal_values.get(k, {})
if v < normal_value.get('min', -1000):
printed_result.append(normal_value.get('minwarning', ''))
if v > normal_value.get('max', 100000):
printed_result.append(normal_value.get('maxwarning', ''))
printed_result = list(set(printed_result))
return '\n'.join(printed_result)
demo = gr.Interface(fn=proceed, inputs=gr.Image(interactive=True), outputs="text")
demo.launch(debug=True, share=True)