|
import gradio as gr |
|
import tensorflow as tf |
|
import joblib |
|
import numpy as np |
|
import zipfile |
|
import os |
|
import re |
|
|
|
|
|
unzip_dir = "unzipped_models" |
|
zip_file = "Models.zip" |
|
|
|
if not os.path.exists(unzip_dir): |
|
print("Extracting model zip file...") |
|
with zipfile.ZipFile(zip_file, 'r') as zip_ref: |
|
zip_ref.extractall(unzip_dir) |
|
print("Extraction complete.") |
|
|
|
|
|
|
|
model_root = os.path.join(unzip_dir, 'Models') |
|
|
|
activations = [] |
|
seeds_dict = dict() |
|
neurons_dict = dict() |
|
|
|
for act in os.listdir(model_root): |
|
act_path = os.path.join(model_root, act) |
|
if os.path.isdir(act_path) and not act.startswith("linear_models"): |
|
activations.append(act) |
|
seeds = [] |
|
for seed_folder in os.listdir(act_path): |
|
seed_path = os.path.join(act_path, seed_folder) |
|
if os.path.isdir(seed_path): |
|
seeds.append(seed_folder) |
|
neuron_list = [] |
|
for model_file in os.listdir(seed_path): |
|
match = re.match(r"model_(\d+)\.keras", model_file) |
|
if match: |
|
neuron_list.append(int(match.group(1))) |
|
neurons_dict[(act, seed_folder)] = sorted(neuron_list) |
|
seeds_dict[act] = sorted(seeds) |
|
|
|
activations = sorted(activations) |
|
|
|
|
|
def predict(r, g, b, activation, seed, neurons): |
|
try: |
|
|
|
r = r/256 |
|
g = g/256 |
|
b = b/256 |
|
|
|
X = np.array([[r, g, b]]) |
|
|
|
|
|
lin_pred_rgb = (1.9221 * r) - (1.3817 * g) + (1.4058 * b) - 0.1318 |
|
|
|
|
|
keras_path = os.path.join(model_root, activation, seed, f"model_{neurons}.keras") |
|
if not os.path.exists(keras_path): |
|
raise FileNotFoundError(f"Model not found: {keras_path}") |
|
|
|
model = tf.keras.models.load_model(keras_path) |
|
ann_pred = model.predict(X)[0][0] |
|
|
|
|
|
if ann_pred < 0: |
|
ann_pred = 0; |
|
if lin_pred_rgb < 0: |
|
lin_pred_rgb = 0; |
|
return ann_pred*50, lin_pred_rgb*50 |
|
|
|
except Exception as e: |
|
return f"Error: {str(e)}", "" |
|
|
|
|
|
def update_seeds(activation): |
|
return gr.update(choices=seeds_dict[activation], value=seeds_dict[activation][0]) |
|
|
|
def update_neurons(activation, seed): |
|
neurons = neurons_dict[(activation, seed)] |
|
return gr.update(choices=neurons, value=neurons[0]) |
|
|
|
|
|
with gr.Blocks() as demo: |
|
gr.Markdown("# **Au@CeO₂ Nanozyme-Based Smart Colourimetric Sensor for Cholesterol:**") |
|
gr.Markdown("# **A Neural Network-Powered Point-of-Care Solution Model**") |
|
gr.Markdown("### **Cholestrol Concentration Prediction Models (CCPM) - Linear and ANN Models**") |
|
gr.Markdown("**Licence: Creative Commons Attribution Non Commercial Share Alike 4.0 cc-by-nc-sa-4.0**") |
|
gr.Markdown("Dynamically select models and predict cholesterol concentration. For more information on dataset preparation and the associated experiment, kindly refer to and cite the journal article.") |
|
|
|
with gr.Row(): |
|
r = gr.Number(label="Mean R (0 -255)") |
|
g = gr.Number(label="Mean G (0 -255)") |
|
b = gr.Number(label="Mean B (0 -255)") |
|
|
|
with gr.Row(): |
|
activation = gr.Dropdown(choices=activations, label="Activation Function", interactive=True) |
|
seed = gr.Dropdown(choices=seeds, label="Seed", interactive=True) |
|
neurons = gr.Dropdown(choices=neuron_list, label="Neurons", interactive=True) |
|
|
|
activation.change(update_seeds, inputs=[activation], outputs=[seed]) |
|
seed.change(update_neurons, inputs=[activation, seed], outputs=[neurons]) |
|
|
|
with gr.Row(): |
|
btn = gr.Button("Predict") |
|
|
|
with gr.Row(): |
|
ann_output = gr.Text(label="Cholestrol Conentration (mM) - ANN Model Prediction ") |
|
lin_rgb_output = gr.Text(label="Cholestrol Conentration (mM) - Linear Model Prediction") |
|
|
|
gr.Markdown("* Predicted negative concentration adjusted to zero.") |
|
|
|
gr.Markdown("This study presents Artificial Neural Networks (ANNs) and Linear Regression models for predicting cholesterol concentration from RGB colourimetric measurements. Around 2,500 single hidden layered ANN models, with varying activation functions, seed initialisations, and neuron counts were trained to approximate the non-linear relationship between colour channels and concentration levels. The trained models follow a 3-×-1 architecture with three input features (mean R, mean G, mean B), a single hidden layer of varying neurons, and one output neuron. A simple linear regression model was developed alongside as a baseline for comparison. The interface allows users to dynamically select the ANN model configuration and compare its predictions against the linear model. It also supports model selection, and performance evaluation for colour-based biosensing applications.") |
|
|
|
|
|
|
|
gr.Markdown("### **Authors:**") |
|
gr.Markdown(""" |
|
**Poornima G** |
|
Research Scholar, Centre for Nanoscience and Technology, Pondicherry University, Puducherry-605 014 |
|
[Google Scholar](https://scholar.google.com/citations?user=N2uAkJEAAAAJ&hl=en) | [ORCiD](https://orcid.org/0000-0002-7398-5651) |
|
|
|
**Nihad Alungal** |
|
Research Scholar, Centre for Nanoscience and Technology, Pondicherry University, Puducherry-605 014 |
|
[Google Scholar](https://scholar.google.com/citations?hl=en&user=Qi-xkEYAAAAJ) | [ORCiD](https://orcid.org/0009-0000-4561-1874) |
|
|
|
**Caxton Emerald S** |
|
Research Scholar, Department of Computer Science, School of Engineering and Technology, Pondicherry University, Puducherry - 605 014 |
|
[Google Scholar](https://scholar.google.com/citations?user=OgCHQv4AAAAJ&hl=en) | [ORCiD](https://orcid.org/0000-0002-7763-3987) |
|
|
|
**Dr. S. Kannan** |
|
Professor, Centre for Nanoscience and Technology, Pondicherry University, Puducherry-605 014 |
|
[Web Page](http://www.pondiuni.edu.in/profile/dr-s-kannan) |
|
""") |
|
|
|
btn.click( |
|
fn=predict, |
|
inputs=[r, g, b, activation, seed, neurons], |
|
outputs=[ann_output, lin_rgb_output] |
|
) |
|
|
|
if __name__ == "__main__": |
|
demo.launch() |
|
|