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) | |