reyhane1222 commited on
Commit
245f5a7
·
verified ·
1 Parent(s): 7188320

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +71 -95
app.py CHANGED
@@ -6,23 +6,23 @@ from PIL import Image
6
  import torch
7
  import math
8
 
9
- # ============================== (همان پارامترها و توابع قبلی)
10
  material_params = {
11
- "brick": {"alpha": 0.3, "eps": 0.9, "I": 1600, "name": "آجر"},
12
- "stone": {"alpha": 0.25, "eps": 0.92, "I": 2000, "name": "سنگ"},
13
- "polishedstone": {"alpha": 0.2, "eps": 0.9, "I": 2100, "name": "سنگ صیقلی"},
14
- "concrete": {"alpha": 0.35, "eps": 0.9, "I": 1800, "name": "بتن"},
15
- "metal": {"alpha": 0.5, "eps": 0.2, "I": 4000, "name": "فلز"},
16
- "glass": {"alpha": 0.1, "eps": 0.85, "I": 1500, "name": "شیشه"},
17
- "wood": {"alpha": 0.35, "eps": 0.9, "I": 800, "name": "چوب"},
18
- "tile": {"alpha": 0.4, "eps": 0.9, "I": 1200, "name": "کاشی"},
19
- "ceramic": {"alpha": 0.45, "eps": 0.92, "I": 1300, "name": "سرامیک"},
20
- "painted": {"alpha": 0.3, "eps": 0.9, "I": 1000, "name": "سطح رنگ‌شده"},
21
- "plastic": {"alpha": 0.1, "eps": 0.95, "I": 800, "name": "پلاستیک"},
22
- "paper": {"alpha": 0.6, "eps": 0.95, "I": 500, "name": "کاغذ"},
23
- "mirror": {"alpha": 0.7, "eps": 0.1, "I": 2000, "name": "آینه"},
24
- "foliage": {"alpha": 0.25, "eps": 0.98, "I": 900, "name": "گیاهان"},
25
- "water": {"alpha": 0.06, "eps": 0.98, "I": 4200, "name": "آب"},
26
  }
27
 
28
  material_categories = {
@@ -37,25 +37,25 @@ material_categories = {
37
  }
38
 
39
  replacement_text = {
40
- "facade": {"brick": "آجر روشن یا نمای سرامیکی/تایل روشن با پوشش بازتابی",
41
  "stone": "سنگ روشن یا سنگ با پوشش بازتابی",
42
  "polishedstone": "سنگ مات روشن یا سرامیک نما روشن",
43
- "concrete": "بتن روشن با پوشش بازتابی",
44
  "tile": "کاشی/سرامیک روشن یا متخلخل",
45
  "ceramic": "سرامیک روشن با نمای بازتابی",
46
  "painted": "رنگ بازتابی (cool paint) یا پوشش نانو بازتابی"},
47
- "glazing": {"glass": "شیشه دو جداره با پوشش Low-E",
48
  "mirror": "شیشه مات یا شیشه Low-E با فریم عایق"},
49
  "metallic": {"metal": "آلومینیوم رنگ روشن یا پوشش پودری با بازتاب بالا"},
50
- "coverings": {"plastic": "سنگ سبک یا چوب روکش‌دار روشن",
51
- "paper": "مواد پوششی بازتابی",
52
- "fabric": "پارچه با روکش بازتابی"},
53
- "wood_elements": {"wood": "چوب رنگ روشن یا چوب با روکش بازتابی"},
54
- "vegetation": {"foliage": "حفظ پوشش گیاهی طبیعی"},
55
- "water_bodies": {"water": "حفظ منابع آبی"},
56
  }
57
 
58
- # ============================== (توابع کمکی)
59
  def ET_proxy(T, RH):
60
  es = 0.6108 * math.exp((17.27 * T) / (T + 237.3))
61
  return es * (1 - RH / 100.0)
@@ -72,7 +72,7 @@ def calc_deltaT(material, T_air, RH=40, u=2, S=700):
72
  gamma = S / max(h_c, 1e-6)
73
  return gamma * C_m / 1000.0
74
 
75
- # ============================== (بارگذاری مدل)
76
  model_id = "prithivMLmods/Minc-Materials-23"
77
  processor = AutoImageProcessor.from_pretrained(model_id)
78
  model = AutoModelForImageClassification.from_pretrained(model_id)
@@ -93,7 +93,7 @@ def get_patches(image, size=224, stride=100):
93
  patches.append(patch)
94
  return patches
95
 
96
- # ============================== (تابع اصلی Gradio)
97
  def analyze_image(image, T_air=32.0, RH=40, u=2.0, S=700):
98
  patches = get_patches(image, size=patch_size)
99
  all_predictions = []
@@ -122,89 +122,65 @@ def analyze_image(image, T_air=32.0, RH=40, u=2.0, S=700):
122
  dT = calc_deltaT(label, T_air, RH, u, S)
123
  material_info[label] = {"count": count, "share": share, "deltaT": dT}
124
 
125
- # مقایسه درون‌دسته‌ای و توصیه - بخش اصلاح شده
126
  IMPROVEMENT_THRESHOLD = 0.02
127
  SHARE_IMPORTANCE_THRESHOLD = 0.03
128
  recommendations = []
129
-
130
- # سرتیتر نتایج
131
- recommendations.append("📋 نتایج تحلیل مصالح:\n")
132
-
133
- for label, info in material_info.items():
134
- material_name = material_params[label]["name"]
135
- share_pct = info["share"] * 100
136
- current_dT = info["deltaT"]
137
-
138
- recommendations.append(f"• {material_name}: سهم={share_pct:.1f}% | ΔT={current_dT:+.2f}°C")
139
-
140
- recommendations.append("\n💡 توصیه‌های بهینه‌سازی:\n")
141
-
142
  candidate_delta_cache = {}
 
 
143
  for cat, info in material_categories.items():
 
 
144
  for candidate in info["candidates"]:
145
  if candidate not in candidate_delta_cache:
146
  candidate_delta_cache[candidate] = calc_deltaT(candidate, T_air, RH, u, S)
147
 
148
- for label, info in material_info.items():
149
- material_name = material_params[label]["name"]
150
- current_dT = info["deltaT"]
151
- share = info["share"]
152
-
153
- # پیدا کردن دسته
154
- found_category = None
155
- for cat, cinfo in material_categories.items():
156
- if label in cinfo["members"]:
157
- found_category = cat
158
- break
159
-
160
- if found_category is None:
161
- recommendations.append(f"• {material_name}: در دسته‌های پیش‌تعریف قرار ندارد")
162
  continue
163
-
164
- # پیدا کردن بهترین جایگزین
165
- candidates = material_categories[found_category]["candidates"]
166
- cand_list = [(c, candidate_delta_cache.get(c, calc_deltaT(c, T_air, RH, u, S))) for c in candidates]
167
- cand_list.sort(key=lambda x: x[1])
168
-
169
- best_candidate, best_dT = cand_list[0]
170
- improvement = current_dT - best_dT
171
-
172
- if improvement >= IMPROVEMENT_THRESHOLD and best_candidate != label:
173
- best_candidate_name = material_params[best_candidate]["name"]
174
- importance = "بالا" if share >= SHARE_IMPORTANCE_THRESHOLD else "اختیاری"
175
- suggestion = replacement_text.get(found_category, {}).get(best_candidate, "جایگزین بهینه")
176
-
177
- recommendations.append(
178
- f"• برای {material_name}:\n"
179
- f" پیشنهاد: {best_candidate_name} (ΔT={best_dT:+.2f}°C)\n"
180
- f" → بهبود: {improvement:.2f}°C | اهمیت: {importance}\n"
181
- f" → توصیه: {suggestion}"
182
- )
183
- else:
184
- recommendations.append(f"• {material_name}: از نظر حرارتی بهینه است")
185
 
186
- # خلاصه نتایج
187
  scene_deltaT = sum([info["share"] * info["deltaT"] for info in material_info.values()])
188
-
189
- recommendations.append("\n📊 خلاصه نتایج:")
190
- recommendations.append(f"• ΔT میانگین وزنی: {scene_deltaT:+.2f}°C")
191
- recommendations.append(f"• دمای مؤثر سطح: {T_air + scene_deltaT:.2f}°C")
192
- recommendations.append(f"• تعداد پچ‌های تحلیل شده: {total_patches}")
193
 
194
  return "\n".join(recommendations)
195
 
196
- # ============================== (راه‌اندازی رابط Gradio)
197
- demo = gr.Interface(
198
- fn=analyze,
199
  inputs=[
200
- gr.Image(type="pil",label="📷 تصویر را بارگذاری کنید"),
201
- gr.Number(label="🌡️ دمای هوا (°C)",value=32),
202
- gr.Number(label="💧 رطوبت نسبی (%)",value=40),
203
- gr.Number(label="💨 سرعت باد (m/s)",value=2),
204
- gr.Number(label="☀️ تابش خورشیدی (W/m²)",value=700)
205
  ],
206
- outputs=gr.Textbox(label="نتایج تحلیل")
 
 
207
  )
208
 
209
- if __name__=="__main__":
210
- demo.launch()
 
6
  import torch
7
  import math
8
 
9
+ # ============================== پارامترهای مصالح
10
  material_params = {
11
+ "brick": {"alpha": 0.3, "eps": 0.9, "I": 1600},
12
+ "stone": {"alpha": 0.25, "eps": 0.92, "I": 2000},
13
+ "polishedstone": {"alpha": 0.2, "eps": 0.9, "I": 2100},
14
+ "concrete": {"alpha": 0.35, "eps": 0.9, "I": 1800},
15
+ "metal": {"alpha": 0.5, "eps": 0.2, "I": 4000},
16
+ "glass": {"alpha": 0.1, "eps": 0.85, "I": 1500},
17
+ "wood": {"alpha": 0.35, "eps": 0.9, "I": 800},
18
+ "tile": {"alpha": 0.4, "eps": 0.9, "I": 1200},
19
+ "ceramic": {"alpha": 0.45, "eps": 0.92, "I": 1300},
20
+ "painted": {"alpha": 0.3, "eps": 0.9, "I": 1000},
21
+ "plastic": {"alpha": 0.1, "eps": 0.95, "I": 800},
22
+ "paper": {"alpha": 0.6, "eps": 0.95, "I": 500},
23
+ "mirror": {"alpha": 0.7, "eps": 0.1, "I": 2000},
24
+ "foliage": {"alpha": 0.25, "eps": 0.98, "I": 900},
25
+ "water": {"alpha": 0.06, "eps": 0.98, "I": 4200},
26
  }
27
 
28
  material_categories = {
 
37
  }
38
 
39
  replacement_text = {
40
+ "facade": {"brick": "آجر روشن یا نمای سرامیکی/تایل روشن با پوشش بازتابی (cool coating)",
41
  "stone": "سنگ روشن یا سنگ با پوشش بازتابی",
42
  "polishedstone": "سنگ مات روشن یا سرامیک نما روشن",
43
+ "concrete": "بتن روشن با پوشش بازتابی یا موزاییک نما روشن",
44
  "tile": "کاشی/سرامیک روشن یا متخلخل",
45
  "ceramic": "سرامیک روشن با نمای بازتابی",
46
  "painted": "رنگ بازتابی (cool paint) یا پوشش نانو بازتابی"},
47
+ "glazing": {"glass": "شیشه دو جداره با پوشش Low-E یا شیشه بازتابی کنترل‌شده",
48
  "mirror": "شیشه مات یا شیشه Low-E با فریم عایق"},
49
  "metallic": {"metal": "آلومینیوم رنگ روشن یا پوشش پودری با بازتاب بالا"},
50
+ "coverings": {"plastic": "سنگ سبک یا چوب روکش‌دار روشن (بسته به کاربرد)",
51
+ "paper": "در نما کاربرد معمول ندارد - بررسی بهینه‌سازی طراحی",
52
+ "fabric": "پارچه با روکش بازتابی یا سایه‌انداز طبیعی"},
53
+ "wood_elements": {"wood": "چوب رنگ روشن یا چوب با روکش بازتابی/محافظ"},
54
+ "vegetation": {"foliage": None},
55
+ "water_bodies": {"water": None},
56
  }
57
 
58
+ # ============================== توابع کمکی
59
  def ET_proxy(T, RH):
60
  es = 0.6108 * math.exp((17.27 * T) / (T + 237.3))
61
  return es * (1 - RH / 100.0)
 
72
  gamma = S / max(h_c, 1e-6)
73
  return gamma * C_m / 1000.0
74
 
75
+ # ============================== بارگذاری مدل
76
  model_id = "prithivMLmods/Minc-Materials-23"
77
  processor = AutoImageProcessor.from_pretrained(model_id)
78
  model = AutoModelForImageClassification.from_pretrained(model_id)
 
93
  patches.append(patch)
94
  return patches
95
 
96
+ # ============================== تابع اصلی Gradio
97
  def analyze_image(image, T_air=32.0, RH=40, u=2.0, S=700):
98
  patches = get_patches(image, size=patch_size)
99
  all_predictions = []
 
122
  dT = calc_deltaT(label, T_air, RH, u, S)
123
  material_info[label] = {"count": count, "share": share, "deltaT": dT}
124
 
125
+ # ============================== مقایسه درون‌دسته‌ای (خنک‌ترین عضو)
126
  IMPROVEMENT_THRESHOLD = 0.02
127
  SHARE_IMPORTANCE_THRESHOLD = 0.03
128
  recommendations = []
 
 
 
 
 
 
 
 
 
 
 
 
 
129
  candidate_delta_cache = {}
130
+
131
+ # محاسبه ΔT برای تمام candidate های هر دسته
132
  for cat, info in material_categories.items():
133
+ if len(info["candidates"]) < 2:
134
+ continue
135
  for candidate in info["candidates"]:
136
  if candidate not in candidate_delta_cache:
137
  candidate_delta_cache[candidate] = calc_deltaT(candidate, T_air, RH, u, S)
138
 
139
+ # بررسی هر دسته
140
+ for cat, info in material_categories.items():
141
+ if len(info["candidates"]) < 2:
 
 
 
 
 
 
 
 
 
 
 
142
  continue
143
+ # لیست ΔT هر candidate
144
+ cand_list = [(c, candidate_delta_cache[c]) for c in info["candidates"]]
145
+ cand_list.sort(key=lambda x: x[1]) # کمترین ΔT اول
146
+ best_candidate, best_dT = cand_list[0] # خنک‌ترین
147
+
148
+ for label in info["members"]:
149
+ if label not in material_info:
150
+ continue
151
+ current_dT = material_info[label]["deltaT"]
152
+ improvement = current_dT - best_dT
153
+ share_pct = material_info[label]["share"] * 100
154
+
155
+ if improvement >= IMPROVEMENT_THRESHOLD and label != best_candidate:
156
+ importance = "High" if material_info[label]["share"] >= SHARE_IMPORTANCE_THRESHOLD else "Optional"
157
+ suggestion_text = replacement_text.get(cat, {}).get(best_candidate, f"Consider replacing with {best_candidate}")
158
+ recommendations.append(
159
+ f"{label} ({cat}): ΔT={current_dT:+.2f}°C جایگزین: {best_candidate} (ΔT={best_dT:+.2f}°C) | بهبود: {improvement:+.2f}°C | اهمیت: {importance} | پیشنهاد: {suggestion_text}"
160
+ )
161
+ else:
162
+ recommendations.append(f"{label}: ΔT={current_dT:+.2f}°C → نیازی به جایگزینی ندارد.")
 
 
163
 
164
+ # ΔT میانگین وزنی کل صحنه
165
  scene_deltaT = sum([info["share"] * info["deltaT"] for info in material_info.values()])
166
+ recommendations.append(f"ΔT میانگین وزنی کل صحنه: {scene_deltaT:+.2f}°C")
167
+ recommendations.append(f"دمای مؤثر سطح: {T_air + scene_deltaT:.2f}°C")
 
 
 
168
 
169
  return "\n".join(recommendations)
170
 
171
+ # ============================== راه‌اندازی رابط Gradio
172
+ iface = gr.Interface(
173
+ fn=analyze_image,
174
  inputs=[
175
+ gr.Image(type="pil", label="آپلود تصویر"),
176
+ gr.Number(value=32.0, label="دمای هوا T_air (°C)"),
177
+ gr.Number(value=40, label="رطوبت نسبی RH (%)"),
178
+ gr.Number(value=2.0, label="سرعت باد u (m/s)"),
179
+ gr.Number(value=700, label="تابش خورشیدی S (W/m²)")
180
  ],
181
+ outputs=gr.Textbox(label="خروجی ΔT و توصیه‌ها"),
182
+ title="تحلیل مصالح و ΔT سطحی",
183
+ description="آپلود تصویر ساختمان/محیط → نمایش ΔT مصالح و توصیه جایگزینی منطقی."
184
  )
185
 
186
+ iface.launch()