本文代码: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
裁剪过程:
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")
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的区域图像,这是在原图上操作的,所以不需上采样
其中: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')