效果圖
- 資料根據我寫的腳本,預設儲存在主路徑下的image_featuremap\radar_featuremap檔案夾下:
融合特征圖
雷達特征圖
特征輸出模型注冊
- 在主檔案夾下建立data_visualization.py檔案:
#!/usr/bin/env python3
import argparse
import os
import sys
import keras
import keras.preprocessing.image
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
from keras.models import Model
import keras.preprocessing.image
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
import cv2
import progressbar
def main():
FILE_DIRECTORY = os.path.dirname(os.path.abspath(__file__))
parser = argparse.ArgumentParser()
parser.add_argument('--config', type=str, default=os.path.join(FILE_DIRECTORY, "configs/temp.cfg"))
parser.add_argument('--model', type=str, default="./saved_models/convwith10epochs.h5") # convwith10epochs.h5
parser.add_argument('--st', type=float, default=0.3)
parser.add_argument('--render', default=False, action='store_true')
parser.add_argument('--eval_from_detection_pickle', default=False, action='store_true')
parser.add_argument('--gpu', type=str, default='0')
args = parser.parse_args()
cfg = get_config(args.config)
model_name = args.config.split('/')[-1]
model_name = model_name.split('.')[0]
cfg.model_name = model_name
# 傳回backbone,也就是預設的VGG網絡
backbone = architectures.backbone(cfg.network)
# 加載訓練好的模型參數
model = keras.models.load_model(args.model, custom_objects=backbone.custom_objects)
# 定義需要可視化的模型層
radar_layers = [model.get_layer(name).output for name in ['rad_block1_pool', 'rad_block2_pool', 'rad_block3_pool','rad_block4_pool','rad_block5_pool','rad_block6_pool','rad_block7_pool']]
vision_layers = [model.get_layer(name).output for name in ['block1_conv2', 'block2_conv2', 'block3_conv2', 'block4_conv2', 'block5_conv2']]
- 定義特征輸出模型:我定義了新的model,把原來的資料作為輸入,将模型需要可視化的層作為輸出,友善後面可視化
# 定義雷達特征模型
layer_model = Model(inputs=model.input, outputs=radar_layers)
# 圖像特征模型
image_layer_model = Model(inputs = model.input, outputs = vision_layers)
提取資料
- 這裡根據generator這個資料加載器,周遊并提取所有的資料到inputs清單中,友善後面輸入
generators = create_generators(cfg, backbone)
test_generator = generators[2]
inputs = []
# load radar data
for i in progressbar.progressbar(range(test_generator.size())):
input, _ = test_generator.compute_input_output([i])
inputs.append(input)
print(len(inputs), inputs[0].shape)
提取中間特征并批量可視化
- 融合特征層的可視化函數
for i in range(len(inputs)):
img_idx = i
data = inputs[img_idx]
# r為模型傳回的某張圖檔的中間特征圖,r.shape = [bs,h,w,c]
feature_map = image_layer_model.predict(data)
# 特征圖的channel數
source_img = np.mean(np.squeeze(data)[:,:,:3],axis=2)
plt.subplot(3,3,1)
plt.imshow(source_img)
for i in progressbar.progressbar(range(len(feature_map))):
layer_map = np.squeeze(feature_map[i])
plt.subplot(3,3,i+2)
plt.imshow(np.mean(layer_map, axis=2))
plt.title('{}'.format(img_idx))
if not os.path.exists(os.path.join(FILE_DIRECTORY, 'image_featuremap')):
os.mkdir(os.path.join(FILE_DIRECTORY, 'image_featuremap'))
plt.savefig(os.path.join(FILE_DIRECTORY, 'image_featuremap\\{}'.format(img_idx)))
- 雷達特征層的可視化函數
for i in range(len(inputs)):
img_idx = i
data = inputs[img_idx]
# r為模型傳回的某張圖檔的中間特征圖,r.shape = [bs,h,w,c]
feature_map = layer_model.predict(data)
# 特征圖的channel數
source_img = np.mean(np.squeeze(data)[:,:,:3],axis=2)
plt.subplot(3,3,1)
plt.imshow(source_img)
for i in progressbar.progressbar(range(len(feature_map))):
layer_map = np.squeeze(feature_map[i])
plt.subplot(3,3,i+2)
plt.imshow(np.mean(layer_map, axis=2))
plt.title('{}'.format(img_idx))
if not os.path.exists(os.path.join(FILE_DIRECTORY, 'radar_featuremap')):
os.mkdir(os.path.join(FILE_DIRECTORY, 'radar_featuremap'))
plt.savefig(os.path.join(FILE_DIRECTORY, 'radar_featuremap\\{}'.format(img_idx)))
池化與卷積對雷達濾波的影響
- 可以看出,我将雷達的pooling對雷達處理的方式改編為卷積,在特征圖可視化中,卷積(左邊)能夠對圖中的雜點進行濾波,集中在車輛這種前景物體上。