reyhane1222 commited on
Commit
5be1df3
·
verified ·
1 Parent(s): 6586857

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +66 -83
app.py CHANGED
@@ -3,26 +3,21 @@ import gradio as gr
3
  from collections import Counter
4
  from transformers import AutoImageProcessor, AutoModelForImageClassification
5
  from PIL import Image
6
- import torch, math
7
 
8
  # ==============================
9
- # 📦 بارگذاری مدل
10
  # ==============================
11
- @torch.no_grad()
12
- def load_model():
13
- model_id = "prithivMLmods/Minc-Materials-23"
14
- processor = AutoImageProcessor.from_pretrained(model_id)
15
- model = AutoModelForImageClassification.from_pretrained(model_id)
16
- return processor, model
17
-
18
- processor, model = load_model()
19
 
20
  # ==============================
21
- # پارامترهای مصالح
22
  # ==============================
23
  material_params = {
24
- "brick":{"alpha":0.3,"eps":0.9,"I":1600},
25
- "stone":{"alpha":0.25,"eps":0.92,"I":2000},
26
  "polishedstone":{"alpha":0.2,"eps":0.9,"I":2100},
27
  "concrete":{"alpha":0.35,"eps":0.9,"I":1800},
28
  "metal":{"alpha":0.5,"eps":0.2,"I":4000},
@@ -36,7 +31,19 @@ material_params = {
36
  "mirror":{"alpha":0.7,"eps":0.1,"I":2000},
37
  "foliage":{"alpha":0.25,"eps":0.98,"I":900},
38
  "water":{"alpha":0.06,"eps":0.98,"I":4200},
39
- "sky":{"alpha":1.0,"eps":1.0,"I":0},
 
 
 
 
 
 
 
 
 
 
 
 
40
  }
41
 
42
  material_categories = {
@@ -47,104 +54,83 @@ material_categories = {
47
  "wood_elements":["wood"],
48
  "vegetation":["foliage"],
49
  "water_bodies":["water"],
50
- "background":["sky"]
51
- }
52
-
53
- replacement_text = {
54
- "facade": {"brick":"آجر روشن یا نمای سرامیکی روشن","stone":"سنگ روشن","tile":"کاشی/سرامیک روشن","ceramic":"سرامیک روشن","painted":"رنگ بازتابی"},
55
- "glazing":{"glass":"شیشه دوجداره Low-E","mirror":"شیشه مات یا بازتاب متعادل"},
56
- "metallic":{"metal":"آلومینیوم رنگ روشن"},
57
- "coverings":{"plastic":"چوب روشن یا سنگ سبک","paper":"مواد پوششی بازتابی","fabric":"پارچه بازتابی"},
58
- "wood_elements":{"wood":"چوب روشن با پوشش بازتابی"},
59
- "vegetation":{"foliage":None},
60
- "water_bodies":{"water":None},
61
- "background":{"sky":None}
62
  }
63
 
64
  # ==============================
65
- # محاسبات ΔT
66
  # ==============================
67
  def ET_proxy(T,RH):
68
- es=0.6108*math.exp((17.27*T)/(T+237.3))
69
  return es*(1-RH/100)
70
 
71
  def calc_deltaT(material,T_air,RH,u,S):
72
  if material not in material_params: return 0.0
73
- p=material_params[material]
74
- alpha,eps,I=p["alpha"],p["eps"],p["I"]
75
- A,B,C,D=1.0,0.4,0.8,0.015
76
- h_c=5.8+4.1*u
77
  if material=="foliage":
78
- C_m=A*(1-alpha)-D*ET_proxy(T_air,RH)
79
  else:
80
- C_m=A*(1-alpha)+B*(1-eps)+(C/math.sqrt(max(I,1)))
81
- gamma=S/max(h_c,1e-6)
82
  return gamma*C_m/1000.0
83
-
84
- # ==============================
85
- # تقسیم تصویر به پچ‌ها
86
- # ==============================
87
- def get_patches(image,size=400,stride=350):
88
- patches=[]
89
- w,h=image.size
90
- for i in range(0,w,stride):
91
- for j in range(0,h,stride):
92
- box=(i,j,min(i+size,w),min(j+size,h))
93
- patch=image.crop(box)
94
- if patch.size[0]<size//2 or patch.size[1]<size//2: continue
95
- patches.append(patch)
 
 
 
 
 
 
 
96
  return patches
97
-
98
  # ==============================
99
- # تابع اصلی آنالیز
100
  # ==============================
101
  def analyze(img,T_air,RH=40,u=2,S=700):
102
  img=img.convert("RGB")
103
- # Resize هوشمند
104
- max_size=1024
105
- if max(img.size)>max_size:
106
- img.thumbnail((max_size,max_size))
107
-
108
  patches=get_patches(img)
109
- if len(patches)==0:
110
- return "⛔ تصویر نامعتبر است یا کوچک است."
111
-
112
  all_predictions=[]
113
  for patch in patches:
114
  inputs=processor(images=patch,return_tensors="pt")
115
  with torch.no_grad():
116
  outputs=model(**inputs)
117
  probs=torch.nn.functional.softmax(outputs.logits,dim=-1)
118
- confidence,pred=torch.max(probs,dim=-1)
119
- if confidence.item()<0.6: continue
120
- label=model.config.id2label[pred.item()]
121
  all_predictions.append(label)
122
-
123
- if not all_predictions:
124
- return "⛔ هیچ مصالح معتبری شناسایی نشد."
125
-
126
  counter=Counter(all_predictions)
127
- total=len(all_predictions)
128
  materials_found={m for m,c in counter.items() if c>=3 and m in material_params}
129
-
130
- if not materials_found:
131
- return "⛔ هیچ مصالح معتبری شناسایی نشد."
132
-
133
  results=[]
134
  for m in materials_found:
135
- share=counter[m]/total
136
  dT=calc_deltaT(m,T_air,RH,u,S)
137
- category=next((cat for cat,members in material_categories.items() if m in members),None)
138
- suggestion=replacement_text.get(category,{}).get(m,"نیازی به جایگزینی ندارد")
139
- results.append(f"{m} | سهم={share*100:.1f}% | ΔT={dT:+.3f}°C | پیشنهاد: {suggestion}")
140
-
141
- scene_deltaT=sum((counter[m]/total)*calc_deltaT(m,T_air,RH,u,S) for m in materials_found)
142
  summary=f"📌 ΔT میانگین وزنی: {scene_deltaT:+.2f} °C\n📌 دمای مؤثر سطح: {T_air+scene_deltaT:.2f} °C"
143
-
144
  return "\n".join(results+["",summary])
145
 
146
  # ==============================
147
- # رابط Gradio
148
  # ==============================
149
  demo = gr.Interface(
150
  fn=analyze,
@@ -155,11 +141,8 @@ demo = gr.Interface(
155
  gr.Number(label="💨 سرعت باد (m/s)",value=2),
156
  gr.Number(label="☀️ تابش خورشیدی (W/m²)",value=700)
157
  ],
158
- outputs=gr.Textbox(label="نتایج تحلیل"),
159
- title="🏗️ تحلیل مصالح و توصیه اقلیمی",
160
- description="این اپلیکیشن مصالح را از تصویر شناسایی کرده و ΔT سطح و پیشنهادهای جایگزینی را نمایش می‌دهد.",
161
- allow_flagging="never"
162
  )
163
 
164
  if __name__=="__main__":
165
- demo.launch(share=True)
 
3
  from collections import Counter
4
  from transformers import AutoImageProcessor, AutoModelForImageClassification
5
  from PIL import Image
6
+ import torch, math, pandas as pd
7
 
8
  # ==============================
9
+ # 📦 بارگذاری مدل (یکبار کش میشه)
10
  # ==============================
11
+ model_id = "prithivMLmods/Minc-Materials-23"
12
+ processor = AutoImageProcessor.from_pretrained(model_id)
13
+ model = AutoModelForImageClassification.from_pretrained(model_id)
 
 
 
 
 
14
 
15
  # ==============================
16
+ # 📊 پارامترهای مصالح
17
  # ==============================
18
  material_params = {
19
+ "brick": {"alpha":0.3,"eps":0.9,"I":1600},
20
+ "stone": {"alpha":0.25,"eps":0.92,"I":2000},
21
  "polishedstone":{"alpha":0.2,"eps":0.9,"I":2100},
22
  "concrete":{"alpha":0.35,"eps":0.9,"I":1800},
23
  "metal":{"alpha":0.5,"eps":0.2,"I":4000},
 
31
  "mirror":{"alpha":0.7,"eps":0.1,"I":2000},
32
  "foliage":{"alpha":0.25,"eps":0.98,"I":900},
33
  "water":{"alpha":0.06,"eps":0.98,"I":4200},
34
+
35
+ }
36
+
37
+ # دسته‌ها و جایگزین‌ها (خلاصه)
38
+ replacement_text = {
39
+ "facade": {"brick":"آجر روشن یا نمای سرامیکی روشن","stone":"سنگ روشن یا نمای گچی بازتابی"},
40
+ "glazing": {"glass":"شیشه دوجداره Low-E","mirror":"شیشه مات یا بازتاب متعادل"},
41
+ "metallic": {"metal":"آلومینیوم رنگ روشن"},
42
+ "coverings": {"plastic":"چوب روشن یا سنگ سبک"},
43
+ "wood_elements": {"wood":"چوب روشن با پوشش بازتابی"},
44
+ "vegetation": {"foliage":None},
45
+ "water_bodies": {"water":None},
46
+
47
  }
48
 
49
  material_categories = {
 
54
  "wood_elements":["wood"],
55
  "vegetation":["foliage"],
56
  "water_bodies":["water"],
57
+
 
 
 
 
 
 
 
 
 
 
 
58
  }
59
 
60
  # ==============================
61
+ # محاسبات
62
  # ==============================
63
  def ET_proxy(T,RH):
64
+ es = 0.6108*math.exp((17.27*T)/(T+237.3))
65
  return es*(1-RH/100)
66
 
67
  def calc_deltaT(material,T_air,RH,u,S):
68
  if material not in material_params: return 0.0
69
+ p = material_params[material]
70
+ alpha,eps,I = p["alpha"],p["eps"],p["I"]
71
+ A,B,C,D = 1.0,0.4,0.8,0.015
72
+ h_c = 5.8+4.1*u
73
  if material=="foliage":
74
+ C_m = A*(1-alpha)-D*ET_proxy(T_air,RH)
75
  else:
76
+ C_m = A*(1-alpha)+B*(1-eps)+(C/math.sqrt(max(I,1)))
77
+ gamma = S/max(h_c,1e-6)
78
  return gamma*C_m/1000.0
79
+ # بهبود تابع برش تصویر - افزایش همپوشانی برای پوشش بهتر
80
+ def get_patches(image, size=224, stride=100): # کاهش stride از 200 به 100
81
+ patches = []
82
+ w, h = image.size
83
+
84
+ # افزودن مقیاس‌های مختلف
85
+ for scale in [1.0, 0.75, 0.5]:
86
+ scaled_w, scaled_h = int(w * scale), int(h * scale)
87
+ if min(scaled_w, scaled_h) < size:
88
+ continue
89
+
90
+ scaled_img = image.resize((scaled_w, scaled_h), Image.Resampling.LANCZOS)
91
+
92
+ for i in range(0, scaled_w, stride):
93
+ for j in range(0, scaled_h, stride):
94
+ box = (i, j, min(i+size, scaled_w), min(j+size, scaled_h))
95
+ patch = scaled_img.crop(box)
96
+ if patch.size[0] >= size and patch.size[1] >= size:
97
+ patches.append(patch)
98
+
99
  return patches
 
100
  # ==============================
101
+ # تابع اصلی
102
  # ==============================
103
  def analyze(img,T_air,RH=40,u=2,S=700):
104
  img=img.convert("RGB")
 
 
 
 
 
105
  patches=get_patches(img)
106
+
 
 
107
  all_predictions=[]
108
  for patch in patches:
109
  inputs=processor(images=patch,return_tensors="pt")
110
  with torch.no_grad():
111
  outputs=model(**inputs)
112
  probs=torch.nn.functional.softmax(outputs.logits,dim=-1)
113
+ label=model.config.id2label[torch.argmax(probs[0]).item()]
 
 
114
  all_predictions.append(label)
115
+
 
 
 
116
  counter=Counter(all_predictions)
117
+ total_patches=len(patches)
118
  materials_found={m for m,c in counter.items() if c>=3 and m in material_params}
119
+
 
 
 
120
  results=[]
121
  for m in materials_found:
122
+ share=counter[m]/total_patches
123
  dT=calc_deltaT(m,T_air,RH,u,S)
124
+ results.append(f"{m} | سهم={share*100:.1f}% | ΔT={dT:+.3f}°C")
125
+
126
+ if not results: return "⛔ هیچ مصالح معتبری شناسایی نشد."
127
+
128
+ scene_deltaT=sum((counter[m]/total_patches)*calc_deltaT(m,T_air,RH,u,S) for m in materials_found)
129
  summary=f"📌 ΔT میانگین وزنی: {scene_deltaT:+.2f} °C\n📌 دمای مؤثر سطح: {T_air+scene_deltaT:.2f} °C"
 
130
  return "\n".join(results+["",summary])
131
 
132
  # ==============================
133
+ # رابط کاربری Gradio
134
  # ==============================
135
  demo = gr.Interface(
136
  fn=analyze,
 
141
  gr.Number(label="💨 سرعت باد (m/s)",value=2),
142
  gr.Number(label="☀️ تابش خورشیدی (W/m²)",value=700)
143
  ],
144
+ outputs=gr.Textbox(label="نتایج تحلیل")
 
 
 
145
  )
146
 
147
  if __name__=="__main__":
148
+ demo.launch()