Spaces:
Sleeping
Sleeping
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) | |