深度学习ResNet模型提取影响特征

        大家好,我是带我去滑雪!

        影像组学作为近年来医学影像分析领域的重要研究方向,致力于通过从医学图像中高通量提取大量定量特征,以辅助疾病诊断、分型、预后评估及治疗反应预测。这些影像特征涵盖了形状、纹理、灰度统计及波形变换等多个维度,能够在无需侵入性操作的前提下,为临床提供潜在的生物标志物。相比于传统医生的主观评估,影像组学特征更加客观、量化,能捕捉到肉眼难以察觉的图像差异,从而提升疾病识别的敏感性与特异性。然而,随着特征数量和维度的不断增加,如何从海量数据中有效提取具有判别力的高阶特征,成为制约影像组学发展的关键问题。传统的手工特征提取方法依赖于专家经验设计,往往具有局限性,难以适应复杂多变的临床场景。此时,深度学习技术的引入为影像组学的发展带来了新的突破。特别是卷积神经网络(CNN)在图像处理方面的卓越表现,为自动化特征提取提供了有力工具。

         在众多CNN架构中,ResNet(残差网络)因其独特的残差连接机制,有效缓解了网络加深带来的梯度消失问题,能够训练更深层次的模型,从而捕捉更复杂、抽象的影像特征。相比浅层网络或传统方法,ResNet能自动从原始图像中学习出更具区分性的表征,提升分类和预测性能。在影像组学应用中,ResNet不仅可以代替手工特征提取过程,还能与传统特征融合,实现更高层次的特征整合,增强模型的泛化能力。因此,将ResNet应用于影像组学特征提取,不仅符合当前智能医疗发展的趋势,也为精准医学提供了强有力的技术支撑。

       这里使用公开的肺炎X-ray数据集,数据集包含5856张经过验证的胸部X光片图像,且被分为训练集和独立患者的测试集。数据集中所有文件已经被转换为JPEG格式,并且已经被划分为正常、肺炎两个类别。

        ResNet模型提取影响特征代码:

import os
import numpy as np
import pandas as pd
from glob import glob
from PIL import Image
from tqdm import tqdm
from sklearn.decomposition import PCA
from matplotlib import pyplot as pltimport torch
from torchvision.models import resnet50, ResNet50_Weights
from torchvision.models.feature_extraction import get_graph_node_names
from torchvision.models.feature_extraction import create_feature_extractor
from torchvision import transforms# 用于遍历图像
def images_iterator(image_dir):dataset_images = glob(f"{image_dir}/**/*.jpeg", recursive=True)for image_path in dataset_images:file_name = os.path.basename(image_path).split(".")[0]image = Image.open(image_path)# Resnet在预训练使用的参数imagenet_mean = [0.485, 0.456, 0.406]imagenet_std = [0.229, 0.224, 0.225]# 参照Resnet预训练时的图像处理方式处理transform = transforms.Compose([# 转换为 Tensor,自动将像素值归一化到 [0, 1]transforms.ToTensor(),# 调整大小transforms.Resize((224, 224)),# resnet输入要求通道数量为3transforms.Lambda(lambda x: x.repeat(3, 1, 1) if x.size(0) == 1 else x),# 对像素取值归一化transforms.Normalize(mean=imagenet_mean,std=imagenet_std)])input_tensor = transform(image)input_tensor = input_tensor.unsqueeze(0)# dimensions of input_tensor are [1, 3, 224, 224]# 返回文件名和预处理之后的图像yield file_name, input_tensordef pca_plot(csv_path="./test.csv"):# 加载提出的特征df_data = pd.read_csv(csv_path)df_x = df_data.iloc[:, 2:].to_numpy()df_y = df_data.iloc[:, 1].to_numpy()# 通过PCA算法将Resnet提取的2048个特征降为3个pca = PCA(n_components=3)x = pca.fit(df_x).transform(df_x)# 绘制图像的一些参数设置category_names = ["NORMAL", "PNEUMONIA"]ax = plt.figure().add_subplot(projection='3d')colors = ["navy", "turquoise"]lw = 2# 绘制图像for color, target_name in zip(colors, category_names):ax.scatter(x[df_y == target_name, 0],x[df_y == target_name, 1],x[df_y == target_name, 2],color=color, alpha=0.8,lw=lw,label=target_name)plt.title("PCA of Chest X-ray")plt.show()def main():# 加载预训练的resnet50模型resnet50_weight = ResNet50_Weights.DEFAULTprint(resnet50_weight.transforms())resnet50_mdl = resnet50(weights=ResNet50_Weights.DEFAULT).eval()# 输出每一层的名称nodes_name, _ = get_graph_node_names(resnet50_mdl)# 根据输出结果,我们可以知道resnet50在通过全连接层分类之前的网络层名称是flattenprint(nodes_name)return_nodes = {"flatten": "final_feature_map"}# 基于选择的输出和resnet50构建特征提取器feature_extracter = create_feature_extractor(resnet50_mdl, return_nodes=return_nodes)# 设定影像路径chest_xray = os.path.join(os.getcwd(), "chest_xray")train_dataset_dir = os.path.join(chest_xray, "train")test_dataset_dir = os.path.join(chest_xray, "test")# 设定列名column_names = ["patient_id", "category"] + [f"resnet_feature_{i + 1}" for i in range(2048)]with torch.no_grad():df_train = pd.DataFrame()df_test = pd.DataFrame()# 进行训练集印象特征提取for image_name, image_tensor in tqdm(images_iterator(train_dataset_dir)):# dimensions of out is [1, 2048]out = feature_extracter(image_tensor)out_features = out["final_feature_map"]out_features = out_features.cpu().numpy()[0]if "NORMAL" in image_name:category = "NORMAL"else:category = "PNEUMONIA"row_data = [image_name, category] + list(out_features)df_train = pd.concat([df_train, pd.Series(row_data)], ignore_index=True, axis=1)# 保存到csv文件df_train = df_train.Tdf_train.columns = column_namesdf_train.to_csv("train.csv", index=False)# 进行测试集影像特征提取for image_name, image_tensor in tqdm(images_iterator(test_dataset_dir)):# dimensions of out is [1, 2048]out = feature_extracter(image_tensor)out_features = out["final_feature_map"]out_features = out_features.cpu().numpy()[0]if "NORMAL" in image_name:category = "NORMAL"else:category = "PNEUMONIA"row_data = [image_name, category] + list(out_features)df_test = pd.concat([df_test, pd.Series(row_data)], ignore_index=True, axis=1)# 保存到csv文件df_test = df_test.Tdf_test.columns = column_namesdf_test.to_csv("test.csv", index=False)if __name__ == "__main__":main()pca_plot()

       输出结果:

         使用ResNet模型提取的影像特征和传统方法提取的影像特征是一样的,最主要的区别只是深度学习算法提取的特征没有名称。获取ResNet提取的特征之后,就可以使用其它统计分析方法进行下一步分析。下面使用PCA对提取的特征进行降维,并进行可视化:


更多优质内容持续发布中,请移步主页查看。

   点赞+关注,下次不迷路!

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

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

相关文章

DeepSeek 接入 Word 完整教程

一、前期准备 1.1 注册并获取 API 密钥 访问 DeepSeek 平台: 打开浏览器,访问 DeepSeek 官方网站(或您使用的相应平台)。注册并登录您的账户。 创建 API 密钥: 在用户控制面板中,找到“API Keys”或“API…

驱动开发硬核特训 · Day 7:深入掌握 Linux 驱动资源管理机制(Resource Management)

🔍 B站相应的视屏教程: 📌 内核:博文视频 - 总线驱动模型实战全解析 —— 以 PCA9450 PMIC 为例 敬请关注,记得标为原始粉丝。 🚩 在 Linux 驱动开发中,资源管理机制决定了驱动的稳定性与可靠性…

什么是TensorFlow?

TensorFlow 是由 Google Brain 团队开发的开源机器学习框架,被广泛应用于深度学习和人工智能领域。它的基本概念包括: 1. 张量(Tensor):在 TensorFlow 中,数据以张量的形式进行处理。张量是多维数组的泛化…

【ChCore Lab 01】Bomb Lab 拆炸弹实验(ARM汇编逆向工程)

文章目录 1. 前言2. 实验代码版本问题3. 关于使用问题4. 宏观分析5. read_line 函数介绍6. phase_0 函数6.1. read_int 函数6.2. 回到 phase_0 函数继续分析6.3. 验证结果 7. phase_1 函数7.2. 验证结果 8. phase_2 函数8.1. read_8_numbers 函数8.2. 回到 phase_2 函数继续分析…

《Vue Router实战教程》20.路由懒加载

欢迎观看《Vue Router 实战(第4版)》视频课程 路由懒加载 当打包构建应用时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件&am…

docker 多主机容器组网

一、服务器A 1、初始化Swarm集群(管理节点) docker swarm init --advertise-addr 主节点ip 2、获取工作节点​​加入Swarm集群所需的Token 和完整命令 docker swarm join-token worker 3、创建Overlay网络 docker network create -d overlay --subnet…

rancher 解决拉取dashboard-shell镜像失败的问题

问题背景 在 Kubernetes 集群中部署 Rancher 后,点击右上角的 "Shell" 按钮时,Rancher 会动态创建一个 dashboard-shell-xxxxx Pod,用于提供 Web 终端功能。然而,由于默认镜像 rancher/shell:v0.1.21 托管在 Docker Hu…

OpenCV day2

Matplotlib相关知识 Matplotlib相关操作: import numpy as np from matplotlib import pyplot as pltx np.linspace(0, 2 * np.pi, 100) y1 np.sin(x) y2 np.cos(x)# 使用红色虚线,圆点标记,线宽1.5,标记大小为6绘制sin plt.p…

【网络安全】通过 JS 寻找接口实现权限突破

未经许可,不得转载。 本文所述所有风险点均已修复。 文章目录 引言正文引言 以下些漏洞已被起亚方面修复;起亚方面确认,这些漏洞从未被恶意利用过。 2024年6月11日,我们发现起亚汽车存在一系列严重安全漏洞,攻击者仅凭车牌号即可远程控制车辆的核心功能。该攻击不需要接触…

LabVIEW 发电机励磁系统监测与诊断

在现代工业体系中,发电机作为关键的电能转换设备,其稳定运行对于电力供应的可靠性起着决定性作用。而励磁系统作为发电机的核心控制部分,直接影响着发电机的性能和电力系统的稳定性。一旦励磁系统出现故障,可能引发发电机电压波动…

MacOS红队常用攻击命令

MacOS红队常用攻击命令 1.自动化武器2.系统信息3.服务 & 内核信息4.快捷命令5.网络相关6.brew相关 / 软件包相关7.高权限命令8.创建一个管理员权限的后门用户 1.自动化武器 1、linPEAS LinPEAS 是一个脚本,用于在 Linux/Unix/MacOS 主机上搜索提权路径 2、me…

【数据结构_8】栈和队列

一、反向输出链表元素 Ⅰ使用递归进行反向输出 package stack; public class Test2 {static class Node{public String val;public Node next;//构造方法public Node(String val) {this.val val;this.next null;}}//利用递归来反向输出链表public static void reverse(Nod…

Java 正则表达式综合实战:URL 匹配与源码解析

在 Web 应用开发中,我们经常需要对 URL 进行格式验证。今天我们结合 Java 的 Pattern 和 Matcher 类,深入理解正则表达式在实际应用中的强大功能,并剖析一段实际的 Java 示例源码。 package com.RegExpInfo;import java.util.regex.Matcher; …

虾分发平台平台优势

平台优势 高效与成本优化 一键分发与自动化工具减少人工操作,加速测试周期;免费分发流量和透明价格套餐降低中小团队开支。 安全与合规 自研CDN与封装技术平衡性能与安全性,适配复杂分发场景;全球CDN网络加速保障极速下载。 服务…

c语言学习16——内存函数

内存函数 一、memcpy使用和模拟实现1.1参数1.2 使用1.3 模拟实现 二、memmove使用和模拟实现2.1 参数2.2 使用2.3 模拟实现 三、memset使用3.1 参数3.2 使用 四、memcmp使用4.1 参数4.2 使用 一、memcpy使用和模拟实现 1.1参数 因为内存中不知道存的是什么类型的地址&#xff…

TLA:用于接触-丰富操作的触觉-语言-动作模型

25年3月来自三星中国研发中心、中科院自动化所和北京智源的论文“TLA: Tactile-Language-Action Model for Contact-Rich Manipulation”。 视觉-语言模型已取得显著进展。然而,在语言条件下进行机器人操作以应对接触-密集型任务方面,仍未得到充分探索&…

【JavaEE】SpringBoot 统一功能处理

目录 一、拦截器1.1 使用1.1 定义拦截器1.2 注册配置拦截器 1.2 拦截器详解1.2.1 拦截路径1.2.2 拦截器执⾏流程 1.3 适配器模式 二、统一数据返回格式2.1 简单用法2.2 问题及解决 三、统一异常处理 一、拦截器 拦截器:拦截器是Spring框架提供的核⼼功能之⼀&#…

【前端实战】使用 BroadcastChannel API 实现跨标签页通信

一、引言 在现代 Web 应用开发中,我们常常会遇到需要在不同浏览器标签页之间进行通信的需求。例如,在一个电商应用中,用户在一个标签页中添加商品到购物车,希望在其他标签页中也能实时显示购物车的更新信息。传统的实现方式可能会…

微信小程序 - [渲染层错误] Uncaught TypeError: Cannot read property ‘D‘ of undefined

问题:[渲染层错误] Uncaught TypeError: Cannot read property D of undefined 解决: 该错误可能还是小程序的渲染模式有关系,查看app.json中是否有如下配置,删除即可,或者降低小程序调试基础库版本。

【MySQL高级】事务,存储引擎,索引(一)

Mysql高级 DQL查询语句 反引号 模糊查询避免%出现在开头,会造成索引失效 order by排序先后 表名列名都需要用${},他们不能带’’ 去重统计数量 null的运算 分组函数会自动忽略null,不用对null进行处理 截取子串substr(字段,下标…