可视化fcn-8s head的输出

news2024/12/27 13:00:56
"""可视化head的输出【可视化的结果是灰度图像"""

image = Image.open(imgPath).convert("RGB")
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
input_image = transform(image).unsqueeze(0)

model = fcn_vgg16(aux=False, num_classes=21, pretrain_backbone=True)
# model.load_state_dict(torch.load("/home/hyq/hyq/projects/fcn/checkpoints/fcn_vgg_model_0.pth"), strict=False)
model.eval()

with torch.no_grad():
    out = model.backbone(input_image)
    layer3_out, layer4_out, layer5_out = out['layer3'],out['layer4'], out['layer5']

    # 经过FCN头部结构
    head_out = model.head(layer5_out)

# 将特征图转换为可视化格式
feature_map = head_out[0].detach().cpu()

# 显示原图
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.title("Original Image")

# 显示特征图
plt.subplot(1, 2, 2)
plt.imshow(feature_map[0], cmap='jet')
# plt.imshow(feature_map[0], cmap='gray')
plt.colorbar()
plt.title("Feature Map After Head")
plt.tight_layout()
plt.show()
plt.savefig('test_out_head.png')

可视化结果:

在这里插入图片描述

#	model_fcn8s模型
from torch import nn
import torchvision
import torch

#vgg块
def vgg_block(in_channels, out_channels, num):
    block = []
    for _ in range(num):
        block.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1, stride=1))
        block.append(nn.ReLU(inplace=True))
        in_channels = out_channels
    block.append(nn.MaxPool2d(kernel_size=2,stride=2))
    return nn.Sequential(*block)
 
class VGG(nn.Module):
 
    def __init__(self, num_classes, struct, in_channel=3):
        super(VGG, self).__init__()
        blk = []
        out_channels = []
        conv_nums = []
        for conv_num, out_channel in struct:
            out_channels.append(out_channel)
            conv_nums.append(conv_num)
        #便于后续取出某层的输出
        self.layer1 = vgg_block(in_channel, out_channels[0], conv_nums[0])
        self.layer2 = vgg_block(out_channels[0], out_channels[1], conv_nums[1])
        self.layer3 = vgg_block(out_channels[1], out_channels[2], conv_nums[2])
        self.layer4 = vgg_block(out_channels[2], out_channels[3], conv_nums[3])
        self.layer5 = vgg_block(out_channels[3], out_channels[4], conv_nums[4])
        # blk=[nn.Flatten(),
        #             nn.Linear(7*7*512,4096),
        #             nn.Dropout(0.5),
        #             nn.ReLU(),
        #             nn.Linear(4096,4096),
        #             nn.Dropout(0.5),
        #             nn.ReLU(),
        #             nn.Linear(4096,num_classes)]
        # self.top = nn.Sequential(*blk)
        self.__init_net()
    def forward(self,x):
        x = self.layer1(x)
        # print(f"backbone_layer1: {type(x.shape)}")
        x = self.layer2(x)
        x = self.layer3(x)
        
        x = self.layer4(x)
        x = self.layer5(x)
        x = self.top(x)
        return x
 
    def __init_net(self):
        for layer in self.modules():
            if type(layer) == nn.Conv2d:
                nn.init.kaiming_normal_(layer.weight,mode='fan_out',nonlinearity='relu')
            elif type(layer) == nn.Linear:
                nn.init.xavier_normal_(layer.weight)
            elif type(layer) == nn.BatchNorm2d:
                nn.init.constant_(layer.weight,1) #均值为0
                nn.init.constant_(layer.bias,0) #方差为1

class FCN_Head(nn.Module):
    # 网络结构中的FC6和FC7
 
    def __init__(self,in_channel,out_channel):
        super(FCN_Head, self).__init__()
        self.fc6 = nn.Sequential(
            nn.Conv2d(in_channel,out_channel,kernel_size=7,stride=1,padding=3),
            nn.BatchNorm2d(out_channel),
            nn.ReLU(),
            nn.Dropout(0.1)
        )
        self.fc7 = nn.Sequential(
            nn.Conv2d(out_channel,out_channel,kernel_size=1),
            nn.BatchNorm2d(out_channel),
            nn.ReLU(),
            nn.Dropout(0.1)
        )
 
    def forward(self,x):
        x = self.fc6(x)
        x = self.fc7(x)
        return x


class FCN(nn.Module):
    # FCN-8s
 
    def __init__(self,backbone,head,num_classes,channel_nums):
        super(FCN, self).__init__()
        self.backbone = backbone
        self.head = head
        #调整通道数
        self.layer3_conv = nn.Conv2d(channel_nums[0],num_classes,kernel_size=1)    #256
        self.layer4_conv = nn.Conv2d(channel_nums[1],num_classes,kernel_size=1)    #512
        self.layer5_conv = nn.Conv2d(channel_nums[2],num_classes,kernel_size=1)    #4096
        
        #转置卷积层1
        self.transpose_conv1 =nn.Sequential(
            nn.ConvTranspose2d(num_classes, num_classes, kernel_size=4, stride=2, padding=1),
            nn.BatchNorm2d(num_classes),
            nn.ReLU()
        )
        # 转置卷积层2
        self.transpose_conv2 = nn.Sequential(
            nn.ConvTranspose2d(num_classes, num_classes, kernel_size=4, stride=2, padding=1),
            nn.BatchNorm2d(num_classes),
            nn.ReLU()
        )
        # 转置卷积层3
        self.transpose_conv3 = nn.Sequential(
            nn.ConvTranspose2d(num_classes,num_classes,kernel_size=16,stride=8,padding=4),
            nn.BatchNorm2d(num_classes),
            nn.ReLU()
        )
 
    def forward(self,x):
        #out = OrderedDict {layer4:{},layer5:{},layer3:{}}
        out = self.backbone(x)
        layer5_out, layer4_out, layer3_out = out['layer5'], out['layer4'], out['layer3']
        layer5_out = self.head(layer5_out)
 
        layer5_out = self.layer5_conv(layer5_out)

        layer4_out = self.layer4_conv(layer4_out)

        layer3_out = self.layer3_conv(layer3_out)

 
        x = self.transpose_conv1(layer5_out)
        
        x = self.transpose_conv2(x + layer4_out) # x.shape Size is ([20, 21, 96, 140])
        # print(f"x.shape:{x.shape}")
        x = self.transpose_conv3(x + layer3_out)
        return x
    
def fcn_vgg16(aux, num_classes=21, pretrain_backbone=False):
    # a = ["layer1.0.weight", "layer1.0.bias", "layer1.2.weight", "layer1.2.bias", "layer2.0.weight", "layer2.0.bias", "layer2.2.weight", "layer2.2.bias", "layer3.0.weight", "layer3.0.bias", "layer3.2.weight", "layer3.2.bias", "layer3.4.weight", "layer3.4.bias", "layer4.0.weight", "layer4.0.bias", "layer4.2.weight", "layer4.2.bias", "layer4.4.weight", "layer4.4.bias", "layer5.0.weight", "layer5.0.bias", "layer5.2.weight", "layer5.2.bias", "layer5.4.weight", "layer5.4.bias"]
    # b = ["features.0.weight", "features.0.bias", "features.2.weight", "features.2.bias", "features.5.weight", "features.5.bias", "features.7.weight", "features.7.bias", "features.10.weight", "features.10.bias", "features.12.weight", "features.12.bias", "features.14.weight", "features.14.bias", "features.17.weight", "features.17.bias", "features.19.weight", "features.19.bias", "features.21.weight", "features.21.bias", "features.24.weight", "features.24.bias", "features.26.weight", "features.26.bias", "features.28.weight", "features.28.bias"]
    
    #vgg16结构
    struct = [(2, 64), (2, 128), (3, 256), (3, 512), (3, 512)]
    backbone = VGG(num_classes=num_classes,struct=struct)
    if pretrain_backbone is True:
    #     d = torch.load("/home/hyq/hyq/projects/fcn/vgg16-397923af.pth")
    #     d1 = {}
    #     m = dict(zip(b, a))
    #     for k, v in d.items():
    #         if k not in b:
    #             continue
    #         d1[m[k]] = v
        backbone.load_state_dict(torch.load("/home/hyq/hyq/projects/fcn/vgg16-397923af.pth"), strict=False)
        # backbone.load_state_dict(d1)
 
    return_layers = {'layer3':"layer3",'layer4':'layer4','layer5':"layer5"}
    backbone = torchvision.models._utils.IntermediateLayerGetter(backbone, return_layers)
    # x = torch.randn((1,3,224,224))
    # x = backbone(x)
    head = FCN_Head(in_channel=512,out_channel=8*512)
                                                                              #layer3 layer4 fcn_head输出通道数
    model = FCN(backbone=backbone, head=head, num_classes=num_classes, channel_nums=[256,512,4096])
 
    return model


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/751082.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL进阶(2)——SQL语句类型 增删改查CRUD 事务初步 表关联关系 视图 +索引

目录 引出SQL语句类型1.DML数据操纵语言(重点)2.DQL数据查询语言(重点)3.DDL(Data Definition Language了解)4.DCL(Data Control Language了解)5.TCL 事务控制语言 运算符和其他函数1.运算符2.其它函数增删改查CRUD 视图索引事务1…

springboot留守儿童爱心网站

本系统主要是设计出留守儿童爱心网站,基于B/S构架,后台数据库采用了Mysql,可以使数据的查询和存储变得更加有效,可以确保留守儿童爱心管理的工作能够正常、高效的进行,从而提高工作的效率。总体的研究内容如下&#xf…

迅捷录屏软件使用中的注意事项

取消勾选时就不会出现右侧的悬浮框滑动的窗口了。 取消鼠标高亮后,录制的视频就不会出现一个空心的小圆圈。

Python+docx实现python对word文档的编辑

前言: 该模块可以通过python代码来对word文档进行大批量的编辑。docx它提供了一组功能丰富的函数和方法,用于创建、修改和读取Word文档。下面是docx模块中一些常用的函数和方法的介绍: 安装:pip install docx 一、准备一个word文档…

计算机毕设 大数据房价数据分析及可视化 - python 房价分析

文章目录 1 课题背景2 数据爬取2.1 爬虫简介2.2 房价爬取 3 数据可视化分析3.1 ECharts3.2 相关可视化图表 4 最后 1 课题背景 房地产是促进我国经济持续增长的基础性、主导性产业。如何了解一个城市的房价的区域分布,或者不同的城市房价的区域差异。如何获取一个城…

声音生成项目(6)——在矢量量化变分编码器上使用自回归模型PixelCNN模型生成新的样本

文章目录 介绍PixelCNN论文简读模型介绍自回归模型PixelCNN模型结构 基础知识回顾参考连接 代码实现PixelConvLayer具体运行过程卷积模块整体网络结构 模型执行效果 Colab代码本子介绍Introduction介绍获取数据创建模型需要两个类 介绍 在上一篇就是介绍了矢量量化变分模型的具…

Stable Diffusion生成图片参数查看与抹除

前几天分享了几张Stable Diffusion生成的艺术二维码,有同学反映不知道怎么查看图片的参数信息,还有的同学问怎么保护自己的图片生成参数不会泄露,这篇文章就来专门分享如何查看和抹除图片的参数。 查看图片的生成参数 1、打开Stable Diffus…

LDAP Tool Box Self Service Password

手册地址:https://self-service-password.readthedocs.io/en/latest/安装要求: Apache or another web server php (>7.4) php-curl (haveibeenpwned api) php-filter php-gd (captcha) php-ldap php-mbstring (reset mail) php-openssl (token cryp…

管理类联考——数学——记忆篇——二、代数——5.不等式

文章目录 不等式均值不等式均值不等式定义一般情况下扩展 推导加深记忆 有公式就要用绝对值不等式一元二次不等式 不等式 不等式在初中、高中甚至竞赛中都是比较相对综合、有难度的一块内容,经常会与方程、函数等其它知识点一起考察,一般的题型有&#…

查看Elasticsearch集群状态

Elastic查询 使用elastic自带的开发工具查询 查询集群健康状态 #查询集群健康状态 GET /_cluster/health集群名字使我们创建容器的时候设置的参数,状态绿色 查询节点状态 #查询节点状态 GET /_cat/nodes?v我们是使用docker容器创建的,这里显示的ip是容器内部ip 查询索…

前端做excel的录入解析,将excel的数据传给后端,显示在页面上。

具体的流程如图所示: 1.点击excel录入按钮 2.打开弹框 3.点击上传按钮,会自动打开计算机本地文件,选择想上传的文件,点击打开 4.会将excel的数据解析成一个表格,可以在表格中做删除操作,点击确定 5.将exc…

DeFi新篇章 | Sui上原生订单簿DeepBook正式上线

随着原生去中心化中央限价订单簿( Central Limit Order Book,CLOB)DeepBook的推出,Sui上的DeFi开启了新篇章。DeepBook由一群Sui贡献者共同构建,为新一代DeFi应用提供了一个稳定的流动性层。 通过DeepBook&#xff0c…

Oracle select语法

SQL 语言介绍 SQL(Structured Query Language)为数据库的语言,在 1974 年由Boyce【博伊斯】和Chamberlin【钱伯林】提 出的一种介于关系代数与关系演算之间的结构化查询语言,是一个通用的、功能极强的关系型数据库语言。包含三部分 DDL(Data Definitio…

Spring Boot配置文件与日志

目录 配置文件配置文件格式.propertiesyml 读取配置文件内容根据不同环境配置不同属性 日志自定义日志的打印更简单的日志打印日志级别日志级别的设置 日志的持久化 配置文件 Spring Boot项目的重要数据都是在配置文件中设置的。配置文件可以包含各种属性和值,用于…

LeetCode_面试题 01.01. 判定字符是否唯一

题目描述 面试题 01.01. 判定字符是否唯一https://leetcode.cn/problems/is-unique-lcci/ 实现一个算法,确定一个字符串 s 的所有字符是否全都不同。 示例 1: 输入: s "leetcode" 输出: false 示例 2: 输入: s "abc"…

中国黄金品牌怎么代理

想选择一个项目创业其实不难,中国黄金这个品牌相信大家都已经相当的熟悉,它成立于1979年,是业界中的佼佼者,一直致力于为消费者提供黄金、白银、珠宝等的产品,无论是产品质量还是服务,都在行业中处于领先地…

数据备份、还原、视图、索引 操作练习

目录 备份与还原: 题目要求: 索引和视图 题目要求: 备份与还原: 在数据库booksDB中创建表books、authorbook、authorbook: 题目要求: 1、mysqldump -uroot -pRyh201314% booksDB > /backup/db/boo…

jsonschema networknt json-schema-validator 高级能力json 数字很大时, 变成什么类型

入参校验产品化 schema_个人渣记录仅为自己搜索用的博客-CSDN博客 自动变成了bigInteger类型. 哪怕你的jsonSchema 配置的是integer , 不冲突.

Redis深入——管道、发布订阅、主从复制、哨兵监控和集群

前言 在前面的学习中,我们已经了解了Redis的基本语法以及Redis持久化和事务的概念。而在这篇文章中我们继续来梳理管道、发布订阅、主从复制、哨兵监控和集群的知识,理解Redis主从复制到集群分片的演进过程,希望对正在学习的小伙伴有一定的帮…

1039家校通SQL注入获取管理员权限

我们承认伟人在历史过程中的贡献。可人类生活的大厦从本质上说,是由无数普通人的血汗乃至生命所建造的。伟人们常常企图用纪念碑或纪念堂来使自己永世流芳。真正万古长青的却是普通人的无人纪念碑——生生不息的人类生活自身。是的,生活之树常青。 漏洞…