Tudohuang commited on
Commit
9ba3f40
1 Parent(s): 6fe3e70

Rename app.py to appxxxx.py

Browse files
Files changed (1) hide show
  1. app.py → appxxxx.py +39 -25
app.py → appxxxx.py RENAMED
@@ -149,50 +149,64 @@ demo.launch()
149
 
150
 
151
 
152
- def generate_heatmap(last_conv_output, pred_class):
 
 
153
  """
154
- 生成局部化的热力图。
155
  """
156
-
157
- class_conv_output = last_conv_output[0, pred_class]
158
-
159
-
160
- heatmap = torch.mean(class_conv_output, dim=0)
161
-
162
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
  heatmap = np.maximum(heatmap.detach().cpu().numpy(), 0)
164
  heatmap /= np.max(heatmap)
165
-
166
-
167
- heatmap[heatmap < 0.5] = 0 # 只保留高信心区域
168
-
169
  return heatmap
170
 
171
 
172
- def overlay_heatmap(image, heatmap, intensity=0.5, colormap=cv2.COLORMAP_JET):
 
173
  """
174
- 调整热力图叠加到原始图像上的逻辑。
175
  """
176
- # 调整热力图大小
177
  heatmap = cv2.resize(heatmap, (image.shape[1], image.shape[0]))
178
  heatmap = np.uint8(255 * heatmap)
 
179
 
180
- # 应用颜色映射
181
- heatmap = cv2.applyColorMap(heatmap, colormap)
182
-
183
- # 创建一个只有热力图区域的蒙版
184
- mask = heatmap > 0
185
-
186
- # 创建叠加图像
187
  superimposed_img = image.copy()
188
  superimposed_img[mask] = superimposed_img[mask] * (1 - intensity) + heatmap[mask] * intensity
189
 
190
  superimposed_img = np.clip(superimposed_img, 0, 255).astype(np.uint8)
191
- superimposed_img = Image.fromarray(superimposed_img)
192
-
193
  return superimposed_img
194
 
195
 
 
196
  def predict(image):
197
  """
198
  預測並生成熱力圖。
 
149
 
150
 
151
 
152
+ import torch.nn.functional as F
153
+
154
+ def generate_heatmap(model, last_conv_layer, input_tensor, pred_class):
155
  """
156
+ 使用 Grad-CAM 生成更精确的热力图。
157
  """
158
+ # 获取最后卷积层的特征图和模型输出
159
+ model.eval()
160
+ features = []
161
+ def hook_function(module, input, output):
162
+ features.append(output)
163
+
164
+ hook = last_conv_layer.register_forward_hook(hook_function)
165
+ model_output = model(input_tensor)
166
+ hook.remove()
167
+
168
+ # 获取预测类别的得分
169
+ class_score = model_output[:, pred_class]
170
+
171
+ # 计算梯度
172
+ model.zero_grad()
173
+ class_score.backward(retain_graph=True)
174
+
175
+ # 获取梯度和特征图
176
+ gradients = features[0].grad # 获取最后卷积层的梯度
177
+ pooled_gradients = torch.mean(gradients, dim=[0, 2, 3]) # 全局平均池化
178
+
179
+ # 获取特征图,并应用梯度加权
180
+ features = features[0]
181
+ for i in range(features.shape[1]):
182
+ features[:, i, :, :] *= pooled_gradients[i]
183
+
184
+ # 创建热力图
185
+ heatmap = torch.mean(features, dim=1).squeeze()
186
  heatmap = np.maximum(heatmap.detach().cpu().numpy(), 0)
187
  heatmap /= np.max(heatmap)
 
 
 
 
188
  return heatmap
189
 
190
 
191
+
192
+ def overlay_heatmap(image, heatmap, intensity=0.5, threshold=0.5):
193
  """
194
+ 优化热力图叠加逻辑。
195
  """
 
196
  heatmap = cv2.resize(heatmap, (image.shape[1], image.shape[0]))
197
  heatmap = np.uint8(255 * heatmap)
198
+ heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)
199
 
200
+ # 只在高信心区域应用热力图
201
+ mask = heatmap > np.max(heatmap) * threshold
 
 
 
 
 
202
  superimposed_img = image.copy()
203
  superimposed_img[mask] = superimposed_img[mask] * (1 - intensity) + heatmap[mask] * intensity
204
 
205
  superimposed_img = np.clip(superimposed_img, 0, 255).astype(np.uint8)
 
 
206
  return superimposed_img
207
 
208
 
209
+
210
  def predict(image):
211
  """
212
  預測並生成熱力圖。