收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
文章目录
算法思路
Grad-CAM根据输出向量,进行backward,求取特征图的梯度,得到每个特征图上每个像素点对应的梯度,也就是特征图对应的梯度图,然后再对每个梯度图求平均,这个平均值就对应于每个特征图的权重,然后再将权重与特征图进行加权求和,最后经过relu激活函数就可以得到最终的类激活图
实现过程
先准备图片、标签以及模型
类别标签下载方法:
先安装axel:
sudo apt-get install axel
执行下载命令
axel -n 5 https://s3.amazonaws.com/outcome-blog/imagenet/labels.json
labels.json如果下不了就从网盘下:
链接:https://pan.baidu.com/s/1JAfwLtVEp1-ourEdd4VLhg
提取码:1234
图片下载:
axel -n 5 http://media.mlive.com/news_impact/photo/9933031-large.jpg
模型下载:
senet1_1:axel -n 5 https://download.pytorch.org/models/squeezenet1_1-f364aa15.pth
resnet18:axel -n 5 https://download.pytorch.org/models/resnet18-5c106cde.pth
1.导入各种包
import cv2
import os
import numpy as np
import torch
import torchvision.transforms as transforms
from torchvision import models
import json
2.定义一些函数
图片预处理函数
# 图片预处理
def img\_preprocess(img_in):
img = img_in.copy()
img = img[:, :, ::-1] # 1
img = np.ascontiguousarray(img) # 2
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize([0.4948052, 0.48568845, 0.44682974], [0.24580306, 0.24236229, 0.2603115])
])
img = transform(img)
img = img.unsqueeze(0) # 3
return img
1.之后读取图片会使用opencv读取,读取的颜色通道为BGR,为了适应模型,需要将颜色通道转回为RGB。
2.由于更改通道后,数组变为不连续,所以需要使用np.ascontiguousarray
将img转为连续数组,否则无法转为tensor。
3.增加第一维的batch通道,使得图片能够输入网络
定义获取梯度和特征图的函数
# 定义获取梯度的函数
def backward\_hook(module, grad_in, grad_out):
grad_block.append(grad_out[0].detach())
# 定义获取特征图的函数
def farward\_hook(module, input, output):
fmap_block.append(output)
定义计算grad-cam并显示的函数
# 计算grad-cam并可视化
def cam\_show\_img(img, feature_map, grads, out_dir):
H, W, _ = img.shape
cam = np.zeros(feature_map.shape[1:], dtype=np.float32) # 4
grads = grads.reshape([grads.shape[0],-1]) # 5
weights = np.mean(grads, axis=1) # 6
for i, w in enumerate(weights):
cam += w \* feature_map[i, :, :] # 7
cam = np.maximum(cam, 0)
cam = cam / cam.max()
cam = cv2.resize(cam, (W, H))
heatmap = cv2.applyColorMap(np.uint8(255 \* cam), cv2.COLORMAP_JET)
cam_img = 0.3 \* heatmap + 0.7 \* img
path_cam_img = os.path.join(out_dir, "cam.jpg")
cv2.imwrite(path_cam_img, cam_img)
4.feature_map.shape[1:] 表示取第一维度及之后的其余维度的尺寸,如 [512, 14, 14] --> (14, 14)
5-6.计算每个通道的权重均值
7.将梯度权重与特征图相乘再累加
3.运行函数
收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
**
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人
都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!