最近在学习变化检测,发现不少论文是得到2通道的特征图,利用交叉熵等作为损失函数,这就导致了网络输出结果不少想要得到的差异图,需要经过一定的处理。通过几天时间的琢磨,我终于成功的将结果可视化,现将部分代码进行分享。
一、2通道特征图转化为差异图
#### 数据预处理
A_imgs = Image.open(imgpathA)
B_imgs = Image.open(imgpathB)
# 将图片转为灰度图
A_imgs = A_imgs.convert('L')
B_imgs = B_imgs.convert('L')
# 调整图片大小
# A_imgs = A_imgs.resize((256, 256), Image.BICUBIC)
# B_imgs = B_imgs.resize((256, 256), Image.BICUBIC)
# 将图片转为Tensor
loader = transforms.Compose([transforms.ToTensor()])
tensorA = loader(A_imgs).to(torch.float)
tensorB = loader(B_imgs).to(torch.float)
# CXHXW --> BXCXHXW 添加batchsize层
tensorA = torch.unsqueeze(tensorA, dim=0)
tensorB = torch.unsqueeze(tensorB, dim=0)
# 载入模型权重参数
checkpoint_name_matching =
checkpoint_matching = torch.load(checkpoint_name_matching)['net']
# 加载模型
net = Unet()
net_state = net.state_dict()
net.load_state_dict(checkpoint_matching)
pred = net(tensorA, tensorB)
# pred = F.softmax(pred, dim=1) # 网络最后输出没有添加softmax时使用
print(pred.shape)
# 进行预测,
pred = torch.argmax(pred, 1, keepdim=True)
pred *= 255
print(pred.shape)
# 将预测图片进行保存
img = pred[0].detach().numpy()
img = np.squeeze(img, 0)
img = Image.fromarray(np.uint8(img))
img.save(img_path)
展示一下输入和输出(以下分别为输入的两张不同时刻的图片,label,模型输出的差异图)
二、将2通道图片进行分离,根据每个通道的概率值绘制热力图
代码参考:OpenCV-Python教程:颜色图(applyColorMap)[只需几行代码生成22种风格各异的彩色图]
以下为代码展示
#### 绘制热力图
# 通道分离
pred *= 255
img = pred[0].detach().numpy()
img0 = img[0]
img1 = img[1]
print(img0.shape)
# 保存两个通道的图片
img0 = Image.fromarray(np.uint8(img0))
img0.save('img0.jpg')
img1 = Image.fromarray(np.uint8(img1))
img1.save('img1.jpg')
# 绘制热力图
img_gray = cv2.imread('img1.jpg',cv2.IMREAD_GRAYSCALE)
for i in range(22):
print(i)
dst = cv2.applyColorMap(img_gray*255,i)
cv2.imwrite("map-"+str(i)+".png",dst)