File size: 2,782 Bytes
0a08961
5e54705
 
0a08961
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5e54705
 
0a08961
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

import gradio as gr
import numpy as np
import pickle

# Load your trained model
with open("gas_classification_model.pkl", "rb") as f:
    model = pickle.load(f)

# --- Feature Extraction ---

def compute_ema(series, alpha):
    ema = 0
    ema_values = []
    for val in series:
        ema = alpha * val + (1 - alpha) * ema
        ema_values.append(ema)
    return np.array(ema_values)

def extract_features(sensor_data, baseline_range=(0, 20), exposure_range=(20, 80)):
    features = []
    for sensor_id in range(1, 17):
        R = np.array(sensor_data[sensor_id])
        baseline = np.mean(R[baseline_range[0]:baseline_range[1]])
        exposure = R[exposure_range[0]:exposure_range[1]]
        peak = np.max(exposure)
        delta_R = peak - baseline
        norm_delta_R = peak / baseline if baseline != 0 else 0

        peak_index = np.argmax(exposure) + exposure_range[0]
        rising = R[baseline_range[1]:peak_index]
        decaying = R[peak_index:]

        alphas = [0.001, 0.01, 0.1]
        ema_rising = [np.max(compute_ema(rising, a)) for a in alphas]
        ema_decaying = [np.min(compute_ema(decaying, a)) for a in alphas]

        sensor_features = [delta_R, norm_delta_R] + ema_rising + ema_decaying
        features.extend(sensor_features)

    return np.array(features)

# --- Prediction Pipeline ---

def predict(sensor1, sensor2, sensor3, sensor4, sensor5, sensor6, sensor7, sensor8,
            sensor9, sensor10, sensor11, sensor12, sensor13, sensor14, sensor15, sensor16):
    
    # Convert all inputs to float lists
    sensors = [sensor1, sensor2, sensor3, sensor4, sensor5, sensor6, sensor7, sensor8,
               sensor9, sensor10, sensor11, sensor12, sensor13, sensor14, sensor15, sensor16]
    
    sensor_data = {}
    for i in range(16):
        try:
            values = [float(x.strip()) for x in sensors[i].split(",")]
            if len(values) < 100:
                return f"Sensor {i+1} must have at least 100 values."
            sensor_data[i+1] = values
        except:
            return f"Invalid input format for Sensor {i+1}. Use comma-separated numbers."

    features = extract_features(sensor_data)
    prediction = model.predict([features])[0]
    return f"🚨 Predicted Gas Type: {prediction}"

# --- Gradio UI ---

sensor_inputs = [
    gr.Textbox(label=f"Sensor {i+1} Readings (comma-separated, 100+ values)", lines=2, placeholder="e.g. 1.01, 1.02, 1.03, ...")
    for i in range(16)
]

demo = gr.Interface(
    fn=predict,
    inputs=sensor_inputs,
    outputs=gr.Text(label="Prediction"),
    title="MOS Sensor Gas Prediction",
    description="Paste comma-separated time-series readings (100+ values) from each of the 16 sensors to get a gas type prediction."
)

if __name__ == "__main__":
    demo.launch()