Spaces:
Sleeping
Sleeping
import gradio as gr | |
import os | |
from npc_bert_models.gradio_demo import * | |
from npc_bert_models.mlm_module import NpcBertMLM | |
from npc_bert_models.cls_module import NpcBertCLS | |
import json | |
class main_window(): | |
def __init__(self): | |
self.interface = None | |
self.examples = json.load(open("examples.json", 'r')) | |
def initialize(self): | |
#! Initialize MLM | |
self.npc_mlm = NpcBertMLM() | |
self.npc_mlm.load() | |
with gr.Blocks() as self.mlm_interface: | |
gr.Markdown("# Masked work prediction\n" | |
"Enter any sentence. Use the token `[MASK]` to see what the model predicts.\n" | |
"## Our examples:\n" | |
"|Input masked sequence|Ground-truth masked word|\n" | |
"|---------------------|------------------------|\n" | |
+ "\n".join([f"|{a}|{b}|" for a, b in zip(self.examples['mlm-inp'], self.examples['mlm-inp-GT'])])) | |
with gr.Row(): | |
with gr.Column(): | |
inp = gr.Textbox("The tumor is confined in the [MASK].", label='mlm-inp') | |
btn = gr.Button("Run", variant='primary') | |
with gr.Column(): | |
out = gr.Label(num_top_classes=5) | |
gr.Examples(self.examples['mlm-inp'], inputs=inp, label='mlm-inp') | |
btn.click(fn=self.npc_mlm.__call__, inputs=inp, outputs=out) | |
inp.submit(fn=self.npc_mlm.__call__, inputs=inp, outputs=out) | |
#! Initialize report classification | |
self.npc_cls = NpcBertCLS() | |
self.npc_cls.load() | |
with gr.Blocks() as self.cls_interface: | |
gr.Markdown(""" | |
# Report discrimination | |
In this example we explored how the fine-tuned BERT aids downstream task. We further trained it | |
to do a simple task of discriminating between reports written for non-NPC patients and NPC patients. | |
# Disclaimer | |
The examples are mock reports that is created with reference to authentic reports, they do not | |
represent any real patients. However, it was written to be an authentic representation of NPC or | |
patient under investigation for suspected NPC but with negative imaging findings. | |
""") | |
with gr.Row(): | |
with gr.Column(): | |
inp = gr.TextArea(placeholder="Use examples at the bottom to load example text reports.") | |
inf = gr.File(file_types=['.txt'], label="Report file (plaintext)", show_label=True, interactive=True) | |
inf.upload(fn=self._set_report_file_helper, inputs=inf, outputs=inp) | |
inf.change(fn=self._set_report_file_helper, inputs=inf, outputs=inp) | |
btn = gr.Button("Run", variant='primary') | |
with gr.Column(): | |
out = gr.Label(num_top_classes=2) | |
# gr.Examples(examples=list(self.examples['reports'].values()), inputs=inp) | |
gr.Examples(examples="./report_examples", inputs=inf) | |
btn.click(fn=self.npc_cls.__call__, inputs=inp, outputs=out) | |
inp.submit(fn=self.npc_cls.__call__, inputs=inp, outputs=out) | |
with gr.Blocks() as self.interface: | |
gr.Markdown(""" | |
# Introduction | |
This is a demo for displaying the potential of language models fine tunned using the carefully curated dataset | |
of structured MRI radiology reports for nasopharyngeal carcinoma (NPC) examination. Our team has an established | |
track record for researching the role of AI in early detectio for NPC. We have already developed an AI system | |
with high sensitivty and specificity > 90%. However. we explanability of the system is currently a major challenge | |
for translation. In fact, this is a general problem for AI's developement in radiology. Therefore, in this pilot | |
study, we investigate language model in understanding the context of the disease to explore the possibility of incorporating | |
language model in our existing system for explanability. | |
# Affliations | |
* Dr. M.Lun Wong, Dept. Imaging and Interventional Radiology. The Chinese University of Hong Kong | |
# Disclaimer | |
This software is provided as is and it is not a clinically validated software. The authors disclaim any responsibility | |
arising as a consequence from using this demo. | |
""") | |
tabs = gr.TabbedInterface([self.mlm_interface, self.cls_interface], tab_names=["Masked Language Model", "Report classification"]) | |
def lauch(self): | |
self.interface.launch() | |
pass | |
def _set_report_file_helper(self, file_in): | |
try: | |
text = open(file_in, 'r').read() | |
return text | |
except: | |
print(f"Cannot read file {file_in}") | |
# Do nothing | |
pass | |
if __name__ == '__main__': | |
mw = main_window() | |
mw.initialize() | |
mw.lauch() | |