热度图掩膜裁剪-python

本文代码:pytorch-Grad-CAM-热度图制作掩膜-对原图进行剪裁-Python文档类资源-CSDN下载

(使用kaggle直接导入使用,或者使用jupyter等工具打开)

CAM和Grad-CAM是神经网络可视化的一种方法,使用该方法可以可视化神经网络任意一层的输出特征图。相关论文可以参考:

CAM:Learning Deep Features for Discriminative Localization

Grad-CAM:Why did you say that? Visual Explanations from Deep Networks via Gradient-based Localization

Grad-CAM++:Generalized Gradient-based Visual Explanations for Deep, Convolutional Networks

1.利用热度图对原图进行裁剪

裁剪过程:

热度图掩膜裁剪-python_第1张图片 热度图掩膜裁剪-python_第2张图片 热度图掩膜裁剪-python_第3张图片 热度图掩膜裁剪-python_第4张图片
mask 叠加 上采样 结果图

 

  •  首先获取热度图像的二值化图
img = PIL.Image.open('./heatmap.png')
 
# 模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。
Img = img.convert('L')
Img.save("test1.jpg")
 
# 自定义灰度界限,大于这个值为黑色,小于这个值为白色
threshold = 190
 
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)

photo = Img.point(table, '1')
photo.save("test2.jpg")
热度图掩膜裁剪-python_第5张图片 photo
  • 找出最小外接矩形( opencv的轮廓操作)
mask_path='./test2.jpg'
image = cv2.imread(mask_path)
thresh = cv2.Canny(image, 128, 256)

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
img = np.copy(image)

for cnt in contours:
    x, y, w, h = cv2.boundingRect(cnt)
    # 绘制矩形
    cv2.rectangle(img,  (x, y+h), (x+w, y), (0, 255, 255))
    # 将最小内接矩形填充为白色
white = [255, 255, 255]
for col in range(x, x+w):
    for row in range(y, y+h):
        image[row, col] = white
        
# x,y,w,h是掩膜的位置信息
#1.直接从原图中截取图像,需要resize上采样为原图大小
#2.获取掩膜,得到掩膜值为1的区域图像,这是在原图上操作的,所以不需上采样
 
热度图掩膜裁剪-python_第6张图片 image

 其中:cv2.findContours是找出二值化图像边框的函数

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

接下来使用掩膜与原图合并,得到下图

rectangle_mask_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) 
# img_resize是输入图像resize后的图像
out = cv2.bitwise_and(img_resize,img_resize,mask=rectangle_mask_gray) # 根据mask切割
plt.imshow(out)
plt.savefig('./out_mask_cover.png')

热度图掩膜裁剪-python_第7张图片

 

你可能感兴趣的:(python,深度学习,pytorch)