"""
Original Algorithm:
- https://github.com/GreenCUBIC/AudiogramDigitization
Source:
- huggingface app
- https://huggingface.co/spaces/aravinds1811/neural-style-transfer/blob/main/app.py
- https://huggingface.co/spaces/keras-io/ocr-for-captcha/blob/main/app.py
- https://huggingface.co/spaces/hugginglearners/image-style-transfer/blob/main/app.py
- https://tmabraham.github.io/blog/gradio_hf_spaces_tutorial
- huggingface push
- https://huggingface.co/welcome
"""
import os
import sys
from pathlib import Path
from PIL import Image
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import gradio as gr
sys.path.append(os.path.join(os.path.dirname(__file__), "src"))
from digitizer.digitization import generate_partial_annotation, extract_thresholds
EXAMPLES_PATH = Path('./examples')
max_length = 5
img_width = 200
img_height = 50
def load_image(path, zoom=1):
return OffsetImage(plt.imread(path), zoom=zoom)
def plot_audiogram(digital_result):
thresholds = pd.DataFrame(digital_result)
# Figure
fig = plt.figure()
ax = fig.add_subplot(111)
# x axis
axis = [250, 500, 1000, 2000, 4000, 8000, 16000]
ax.set_xscale('log')
ax.xaxis.tick_top()
ax.xaxis.set_major_formatter(plt.FuncFormatter('{:.0f}'.format))
ax.set_xlabel('Frequency (Hz)')
ax.xaxis.set_label_position('top')
ax.set_xlim(125,16000)
plt.xticks(axis)
# y axis
ax.set_ylim(-20, 120)
ax.invert_yaxis()
ax.set_ylabel('Threshold (dB HL)')
plt.grid()
for conduction in ("air", "bone"):
for masking in (True, False):
for ear in ("left", "right"):
symbol_name = f"{ear}_{conduction}_{'unmasked' if not masking else 'masked'}"
selection = thresholds[(thresholds.conduction == conduction) & (thresholds.ear == ear) & (thresholds.masking == masking)]
selection = selection.sort_values("frequency")
# Plot the symbols
for i, threshold in selection.iterrows():
ab = AnnotationBbox(load_image(f"src/digitizer/assets/symbols/{symbol_name}.png", zoom=0.1), (threshold.frequency, threshold.threshold), frameon=False)
ax.add_artist(ab)
# Add joining line for air conduction thresholds
if conduction == "air":
plt.plot(selection.frequency, selection.threshold, color="red" if ear == "right" else "blue", linewidth=0.5)
return plt.gcf()
# Function for Audiogram Digit Recognition
def audiogram_digit_recognition(img_path):
digital_result = extract_thresholds(img_path, gpu=False)
return [plot_audiogram(digital_result), digital_result]
output = [gr.Plot(), gr.JSON()]
examples = [
f'{EXAMPLES_PATH}/audiogram_example01.png',
f'{EXAMPLES_PATH}/audiogram_example02.png'
]
iface = gr.Interface(
fn=audiogram_digit_recognition,
inputs = gr.inputs.Image(type='filepath'),
outputs = output , #"image",
title=" AudiogramDigitization",
description = "facilitate the digitization of audiology reports based on pytorch",
article = "Algorithm Authors: Francois Charih \
and James R. Green . \
Based on the AudiogramDigitization github repo",
examples = examples,
allow_flagging='never',
cache_examples=False,
)
iface.launch(
enable_queue=True, debug=False, inbrowser=False
)