模型推理时图片卷积可视化

这是无意看到这个博主写的,是把模型在推理的时候,把图片经过的卷积层进行可视化,蛮好的,以下代码都是从博主拷贝过来,为了方便自己看,就拷贝贴了,防止博主删除,如果博主觉的侵权,还请告知,我删除。


import cv2
import torch
import numpy as np
import torchvision
import torch.nn as nn
from PIL import Image
import torch.nn.functional as F
from torchvision import transforms
from models.experimental import attempt_load

fmap_dict = dict()
count = 0

weights = r'D:\github\YoloV5\yolov5s.pt'
model = attempt_load(weights, map_location='cpu')  # load FP32 model

def forward_hook(module, input, output):
    global count
    key_name = 'layer_' + str(count)
    count += 1
    fmap_dict[key_name].append(output)

    # modules_for_plot = (torch.nn.ReLU, torch.nn.Conv2d,
    #                     torch.nn.MaxPool2d, torch.nn.AdaptiveAvgPool2d)
modules_for_plot = (torch.nn.Conv2d)
n = 0
for name, sub_module in model.named_modules():  # named_modules()返回网络的子网络层及其名称
    if isinstance(sub_module, modules_for_plot):
        key_name = 'layer_' + str(n)
        n += 1
        fmap_dict.setdefault(key_name, list())
        sub_module.register_forward_hook(forward_hook)

def readimg():
    path_img = r"D:\data\coco128\images\train2017\000000000165.jpg"  # your path to image

    imgz = 640

    img = cv2.imread(path_img)
    img = cv2.resize(img, (imgz, imgz))
    cv2.imshow('src', img)
    cv2.waitKey(1)

    img_transforms = transforms.Compose([
        transforms.Resize((imgz, imgz)),
        transforms.ToTensor()])

    img_pil = Image.open(path_img).convert('RGB')
    if img_transforms is not None:
        img_tensor = img_transforms(img_pil) * 255.0
        img_tensor.unsqueeze_(0)  # chw --> bchw
    return img_tensor

if __name__ == '__main__':
    img_tensor = readimg()
    output = model(img_tensor)
    for layer_name, fmap_list in fmap_dict.items():
        fmap = fmap_list[0]
        print(layer_name, fmap.shape)
        if fmap.shape[0] < fmap.shape[1]:
            fmap.transpose_(0, 1)

        print(fmap.shape[0])
        # if fmap.shape[0] == 128:
        print(f'enter')
        fmap = fmap.sigmoid()
        fmap = F.interpolate(fmap, size=[224, 224], mode="bilinear")
        fmap_grid = torchvision.utils.make_grid(fmap, normalize=True, scale_each=True, nrow=6, pad_value=255)
        fmap_grid = fmap_grid.permute(1, 2, 0)

        cv2.imshow(('vis%d' % 0), np.array(fmap_grid.numpy() * 255, dtype=np.uint8))
        cv2.waitKey(3000)

原创:pytorch 特征可视化 - 知乎

其中 Pytorch获取中间层信息-hook函数_winycg的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一段用 PyTorch 实现四元数卷的代码示例: ``` import torch import torch.nn as nn import torch.nn.functional as F class QuaternionConv2d(nn.Module): def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, bias=True): super(QuaternionConv2d, self).__init__() self.in_channels = in_channels self.out_channels = out_channels self.kernel_size = kernel_size self.stride = stride self.padding = padding self.bias = bias # 四元数卷的权值是复数,因此需要 4 倍输入通道数 self.weight = nn.Parameter(torch.Tensor(out_channels, in_channels * 4, kernel_size, kernel_size)) if bias: self.bias = nn.Parameter(torch.Tensor(out_channels)) else: self.register_parameter('bias', None) self.reset_parameters() def reset_parameters(self): nn.init.kaiming_uniform_(self.weight, a=math.sqrt(5)) if self.bias is not None: fan_in, _ = nn.init._calculate_fan_in_and_fan_out(self.weight) bound = 1 / math.sqrt(fan_in) nn.init.uniform_(self.bias, -bound, bound) def forward(self, input): # 将四元数展开为 4 个通道 input = input.reshape(input.size(0), self.in_channels, 4, input.size(2), input.size(3)) real, imag = input[:, :, 0], input[:, :, 1:] real, imag = real.permute(0, 2, 1, 3, 4), imag.permute(0, 2, 1, 3, 4) # 实数部分与虚数部分分别卷 real_out = F.conv2d(real, self.weight[:, :self.in_channels, :, :], stride=self.stride, padding=self.padding) imag_out = F.conv2d(imag, self.weight[:, self.in_channels:, :, :], stride=self.stride, padding=self.padding) # 将实数部分与虚数部分合并为四元数 out = torch.stack([real_out, imag_out[

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值