File size: 2,739 Bytes
13a3c1c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2f77190
 
 
 
 
 
 
 
 
 
 
 
13a3c1c
 
 
 
 
 
 
 
 
 
 
 
 
2f77190
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13a3c1c
 
 
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
84
85
86
87
88
89
90
91
92
93
import gradio as gr
import numpy as np
import joblib
import tensorflow as tf
from huggingface_hub import hf_hub_download

# 1) 허브에서 모델·스케일러 파일 다운로드
model_path = hf_hub_download(repo_id="dklee2013/rc-column-predictor",
                             filename="model0526.keras")
sx_path    = hf_hub_download(repo_id="dklee2013/rc-column-predictor",
                             filename="sx.save")
sy_path    = hf_hub_download(repo_id="dklee2013/rc-column-predictor",
                             filename="sy.save")

model    = tf.keras.models.load_model(model_path)
scaler_X = joblib.load(sx_path)
scaler_y = joblib.load(sy_path)

def predict(f_ck, f_yk, N_Ed, M_Edz, M_Edy, cover, rebar_dia, dc_ratio):
    # 1차 예측
    X1 = np.array([f_ck, f_yk, N_Ed, M_Edz, M_Edy, cover, rebar_dia]).reshape(1,-1)
    Y1 = scaler_y.inverse_transform(model.predict(scaler_X.transform(X1)))
    a  = Y1[0,5]

    # 모멘트 보정
    M_Edz_sc = M_Edz * (1/dc_ratio)**a
    M_Edy_sc = M_Edy * (1/dc_ratio)**a

    # 2차 예측
    X2 = np.array([f_ck, f_yk, N_Ed, M_Edz_sc, M_Edy_sc, cover, rebar_dia]).reshape(1,-1)
    Y2 = scaler_y.inverse_transform(model.predict(scaler_X.transform(X2)))

    # 결과
    b_pred = int(round(Y2[0,0]/50)*50)
    h_pred = int(round(Y2[0,1]/50)*50)
    rr     = float(Y2[0,2])
    rx     = int(round(Y2[0,3]))
    ry     = int(round(Y2[0,4]))
    z1_a   = float(Y2[0,5])
    z2_N   = float(Y2[0,6])
    z3_Mz  = float(Y2[0,7])
    z4_My  = float(Y2[0,8])
    SF     = (M_Edz / z3_Mz)**z1_a + (M_Edy / z4_My)**z1_a

    return (
      b_pred,
      h_pred,
      rr,
      rx,
      ry,
      z1_a,
      z2_N,
      z3_Mz,
      z4_My,
      SF
    )

# 3) Gradio UI 정의
inputs = [
  gr.Number(label="f_ck (MPa)", value=40),
  gr.Number(label="f_yk (MPa)", value=500),
  gr.Number(label="N_Ed (kN)", value=500),
  gr.Number(label="M_Edz (kN·m)", value=100),
  gr.Number(label="M_Edy (kN·m)", value=150),
  gr.Number(label="cover (mm)", value=40),
  gr.Number(label="rebar_dia (mm)", value=25),
  gr.Number(label="dc_ratio", value=0.9, precision=2)
]

outputs = [
  gr.Number(label="b_pred (mm)"),
  gr.Number(label="h_pred (mm)"),
  gr.Number(label="reinforcement_ratio"),
  gr.Number(label="rebar_x (개)"),
  gr.Number(label="rebar_y (개)"),
  gr.Number(label="exponent a"),
  gr.Number(label="N_Rd"),
  gr.Number(label="M_Rdz"),
  gr.Number(label="M_Rdy"),
  gr.Number(label="SF")
]

demo = gr.Interface(
    fn=predict,
    inputs=inputs,
    outputs=outputs,
    title="🔧 RC 기둥 단면 예측기",
    description="Eurocode 2 기반 ML 모델"
)tion="Eurocode 2 기반 ML 모델을 이용한 RC 기둥 단면 예측")

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