目的
在论文可视化结果时,简介明了的展示我们自己模型的分割结果与gt的区别是十分重要的,因此这里记录一下自己的可视化方式。
踩坑:
因为大多数操作都是基于cv2进行的,因此你需要保持输入图像的h,w,c的顺序,RGB的顺序等。
建议:
没办法贴全自己的所有代码,因此以下代码建议各位借助Chat-GTP学透了再使用,不可盲目使用。
代码
示例代码:
'''
Descripttion:
Author: Philo
Date: 2024-05-16 09:34:23
LastEditors: Philo
LastEditTime: 2024-05-16 09:34:23
'''import cv2
import numpy as np# 分割网络的模块,因此label和pred的通道数都是1,img通道数是3
# 传入的img维度为(3, h, w), label(1, h, w), pred(1, h, w)
def Fusion(img, label, pred):# pixel_mean = [123.675, 116.28, 103.53] # 根据数据预处理进行选择性使用# pixel_std = [58.395, 57.12, 57.375]# print("数据检查", img.shape, label.shape, pred.shape, np.unique(label), np.unique(pred))if len(np.unique(label)) > 2: # 因为findContours函数接受的必须是二值图,因此将label进行二值化label_np = np.asarray(label).copy()label_np[label_np <= 0.5] = 0label_np[label_np > 0.5] = 1label = label_nplabel = label.astype(np.uint8)[0] # 整数型 (h, w)格式pred = pred[0] # (h, w)格式kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) # 创建了一个结构元素(kernel),结构元素是用于形态学操作(如膨胀、腐蚀等)的一个模板label = cv2.erode(label, kernel) # 该行代码对图像进行腐蚀操作。腐蚀是一种形态学操作,用于减小图像中的白色区域(前景),通常用于去除图像中的噪声或者分离物体contours, _ = cv2.findContours(label, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 找到边界img = np.transpose(img, (1, 2, 0)).copy() # 因为都是cv2中操作,需要保证图像的格式是(h,w,c)# img = (img * pixel_std) + pixel_meanimg = img.astype(np.uint8).copy()# print(type(img), img.shape)img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) # 转化成BGR格式for cnt in contours:cv2.drawContours(img, [cnt], 0, (0, 0, 255), 1) # 画边界框if len(np.unique(pred)) > 2:pred_np = np.asarray(pred).copy()pred_np[pred_np <= 0.5] = 0pred_np[pred_np > 0] = 1pred = pred_npoverlay = np.zeros_like(img) # 生成一个和原始img一样大小的numpyoverlay[pred != 0] = [0, 255, 255] # BGR颜色通道设置为淡黄色# 将淡黄色的色块叠加在原始图像上img = cv2.addWeighted(img, 1, overlay, 0.3, 0)return img
结果:
把框忽略了就是这个代码的输出哦