又开新坑了,随便吧,反正我也不一定会填
可视化
torchshow
分析特征图是我们做图像处理的非常关键的一部分,但是我们所遇到的中间层特征的size[B,C,H,W],大部分不能用简单的
python
import torchshow as ts
ts.show(rgb_map)
ts.show(depth_map)
这些单通道和三通道的特征图可以直接可视化,但是多通道的呢!尤其是中间层到C=128的要如何可视化呢
通道选择
选择第一个通道进行可视化
python
def visualize_single_channel(feature_map, channel_index):
# 选择第一张图像(batch 中的第一个元素)
image = feature_map[0] # 选择batch中的第一张图像
# 可视化单个通道
plt.imshow(image[channel_index].cpu().numpy(), cmap='viridis')
plt.axis('off')
plt.title(f'Channel {channel_index}')
plt.show()
选择前/后num_classes个通道进行可视化
python
def visualize_multiple_channels_pre(feature_map, num_channels=8):
# 选择第一张图像(batch 中的第一个元素)
image = feature_map[0]
# 可视化多个通道(并排显示)
fig, axs = plt.subplots(1, num_channels, figsize=(20, 5))
for i in range(num_channels):
axs[i].imshow(image[i].cpu().numpy(), cmap='viridis')
axs[i].axis('off')
axs[i].set_title(f'Channel {i}')
plt.show()
def visualize_multiple_channels_back(feature_map, num_channels=8):
# 选择第一张图像(batch 中的第一个元素)
image = feature_map[0]
_,C,_,_ = feature_map.shape
# 可视化多个通道(并排显示)
fig, axs = plt.subplots(1, num_channels, figsize=(20, 5))
for i in range(C-1 ,C-num_channels-1,-1):
axs[i].imshow(image[i].cpu().numpy(), cmap='viridis')
axs[i].axis('off')
axs[i].set_title(f'Channel {i}')
plt.show()
选择前/后num_classes个通道进行PCA到三通道进行可视化
python
def pca_visualization_pre(feature_map, num_channels=8):
# 选择第一张图像(batch 中的第一个元素)
image = feature_map[0].cpu().numpy() # 转换为numpy数组
# 选择前num_channels个通道进行PCA降维
selected_channels = image[:num_channels] # 取前num_channels个通道
selected_channels = selected_channels.reshape(num_channels, -1).T # 重塑为 [H*W, C] 形状
# 使用PCA将多个通道降维为3个主成分
pca = PCA(n_components=3)
pca_result = pca.fit_transform(selected_channels)
# 将PCA结果重构成图像
pca_result = pca_result.reshape(feature_map.shape[2], feature_map.shape[3], 3) # 重构为 HxWx3
plt.imshow(pca_result)
plt.axis('off')
plt.title('PCA Visualization of Activation Map')
plt.show()
def pca_visualization_back(feature_map, num_channels=8):
# 选择第一张图像(batch 中的第一个元素)
image = feature_map[0].cpu().numpy() # 转换为numpy数组
# 选择前num_channels个通道进行PCA降维
selected_channels = image[:-num_channels] # 取前num_channels个通道
selected_channels = selected_channels.reshape(num_channels, -1).T # 重塑为 [H*W, C] 形状
# 使用PCA将多个通道降维为3个主成分
pca = PCA(n_components=3)
pca_result = pca.fit_transform(selected_channels)
# 将PCA结果重构成图像
pca_result = pca_result.reshape(feature_map.shape[2], feature_map.shape[3], 3) # 重构为 HxWx3
plt.imshow(pca_result)
plt.axis('off')
plt.title('PCA Visualization of Activation Map')
plt.show()
理论
浅层的特征图一般前几个通道,可以反应图像的基本局部信息,观察边缘,纹理等局部特征
中层的特征图也是取前几个通道,更在意结构,形状等特征
-
观察前几层的 特征图,你通常会看到边缘、线条和小的局部模式。
-
可视化这些特征图时,留意图像中 响应强烈的区域,通常这些区域对应输入图像中的边缘、角落和其他显著的局部特征。
深层的特征图就会开始在意高级语义特征了,一般取后几个通道进行可视化
随着网络深入,特征图会逐渐变得更加 抽象,并开始捕捉图像中的高级语义特征(例如物体、部分结构等)。
- 物体识别: 在深层特征图中,网络会开始检测和组合更多的信息,以识别物体的形状、颜色等特征。
- 图像部分: 网络还可能识别图像的不同部分(例如,识别人脸的眼睛、鼻子,或者猫的耳朵等)。
激活图
激活图一般是relu等非线性激活函数的输出图,可以得到网络对某些图像区域的反应强度,简单可视化的话方法和上面是一样的,类似grad-cam因为我不是很需要所以我不会这里也不会展开介绍
就这样吧