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

news2025/4/17 3:46:46

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

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

import 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输入要求通道数量为3
            transforms.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_tensor


def 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.DEFAULT
    print(resnet50_weight.transforms())
    resnet50_mdl = resnet50(weights=ResNet50_Weights.DEFAULT).eval()
    # 输出每一层的名称
    nodes_name, _ = get_graph_node_names(resnet50_mdl)
    # 根据输出结果,我们可以知道resnet50在通过全连接层分类之前的网络层名称是flatten
    print(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.T
        df_train.columns = column_names
        df_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.T
        df_test.columns = column_names
        df_test.to_csv("test.csv", index=False)


if __name__ == "__main__":
    main()
    pca_plot()

       输出结果:

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


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

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

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

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

相关文章

【Qt】Qt Creator开发基础:项目创建、界面解析与核心概念入门

🍑个人主页:Jupiter. 🚀 所属专栏:QT 欢迎大家点赞收藏评论😊 目录 Qt Creator 新建项⽬认识 Qt Creator 界⾯项⽬⽂件解析Qt 编程注意事项认识对象模型(对象树)Qt 窗⼝坐标体系 Qt Creator 新…

制造业项目管理如何做才能更高效?制造企业如何选择适配的数字化项目管理系统工具?

一、制造企业项目管理过程中面临的痛点有哪些? 制造企业在项目管理过程中面临的痛点通常涉及跨部门协作、资源调配、数据整合、风险控制等多个维度,且与行业特性(如离散制造vs流程制造)紧密相关。 进度失控多项目资源冲突信息孤…

Python批量处理PDF图片详解(插入、压缩、提取、替换、分页、旋转、删除)

目录 一、概述 二、 使用工具 三、Python 在 PDF 中插入图片 3.1 插入图片到现有PDF 3.2 插入图片到新建PDF 3.3 批量插入多张图片到PDF 四、Python 提取 PDF 图片及其元数据 五、Python 替换 PDF 图片 5.1 使用图片替换图片 5.2 使用文字替换图片 六、Python 实现 …

七种驱动器综合对比——《器件手册--驱动器》

九、驱动器 名称 功能与作用 工作原理 优势 应用 隔离式栅极驱动器 隔离式栅极驱动器用于控制功率晶体管(如MOSFET、IGBT、SiC或GaN等)的开关,其核心功能是将控制信号从低压侧传输到高压侧的功率器件栅极,同时在输入和输出之…

redis系列--1.redis是什么

国际惯例,想了解一个东西,首先就要看看官方提供了什么。redis的官网是https://redis.io 。以下这段话就是redis的简介了: Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache, and message…

CSS 过渡与变形:让交互更丝滑

在网页设计中,动效能让用户交互更自然、流畅,提升使用体验。本文将通过 CSS 的 transition(过渡)和 transform(变形)属性,带你入门基础动效设计,结合案例演示如何实现颜色渐变、元素…

MecAgent Copilot:机械设计师的AI助手,开启“氛围建模”新时代

MecAgent Copilot作为机械设计师的AI助手,正通过多项核心技术推动机械设计进入“氛围建模”新时代。以下从功能特性、技术支撑和应用场景三方面解析其创新价值: 一、核心功能特性 ​​智能草图生成与参数化建模​​ 支持自然语言输入生成设计草图和3D模型,如输入“剖面透视…

【prometheus+Grafana篇】Prometheus与Grafana:深入了解监控架构与数据可视化分析平台

💫《博主主页》:奈斯DB-CSDN博客 🔥《擅长领域》:擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(MongoDB)有了解 💖如果觉得文章对你有所帮…

【后端开发】初识Spring IoC与SpringDI、图书管理系统

文章目录 图书管理系统用户登录需求分析接口定义前端页面代码服务器代码 图书列表展示需求分析接口定义前端页面部分代码服务器代码Controller层service层Dao层modle层 Spring IoC定义传统程序开发解决方案IoC优势 Spring DIIoC &DI使用主要注解 Spring IoC详解bean的存储五…

git在IDEA中使用技巧

git在IDEA中使用技巧 merge和rebase 参考:IDEA小技巧-Git的使用 git回滚、强推、代码找回 参考:https://www.bilibili.com/video/BV1Wa411a7Ek?spm_id_from333.788.videopod.sections&vd_source2f73252e51731cad48853e9c70337d8e cherry pick …

榕壹云无人共享系统:基于SpringBoot+MySQL+UniApp的物联网共享解决方案

无人共享经济下的技术革新 随着无人值守经济模式的快速发展,传统共享设备面临管理成本高、效率低下等问题。榕壹云无人共享系统依托SpringBootMySQLUniApp技术栈,结合物联网与移动互联网技术,为商家提供低成本、高可用的无人化运营解决方案。…

ARCGIS PRO DSK 利用两期地表DEM数据计算工程土方量

利用两期地表DEM数据计算工程土方量需要准许以下数据: 当前地图有3个图层,两个栅格图层和一个矢量图层 两个栅格图层:beforeDem为工程施工前的地表DEM模型 afterDem为工程施工后的地表DEM模型 一个矢量图层&#xf…

考研408参考用书:计算机组成原理(唐朔飞)介绍,附pdf

我用夸克网盘分享了「《计算机组成原理》第2,3版 唐朔飞」, 链接:https://pan.quark.cn/s/6a87d10274a3 1. 书籍定位与适用对象 定位:计算机组成原理是计算机科学与技术、软件工程等专业的核心基础课程,涉及计算机硬件的底层工作原…

国网B接口云镜控制接口流程详解以及检索失败原因(电网B接口)

文章目录 一、B接口协议云镜控制接口介绍B.8.1 接口描述B.8.2 接口流程B.8.3 接口参数B.8.3.1 SIP头字段B.8.3.2 SIP响应码B.8.3.3 XML Schema参数定义 B.8.4 消息示例B.8.4.1 云镜控制请求B.8.4.2 云镜控制请求响应 二、B接口云镜控制失败常见问题(一)网…

vue3使用keep-alive缓存组件与踩坑日记

目录 一.了解一下KeepAlive 二.使用keep-alive标签缓存组件 1.声明Home页面名称 三.在路由出口使用keep-alive标签 四.踩坑点1:可能需要配置路由(第三点完成后有效可忽略) 五.踩坑点2:没有找到正确的路由出口 一.了解一下Kee…

gpt2 本地调用调用及其调用配置说明

gpt2 本地调用调用及其调用配置说明 环境依赖安装,模型下载 在大模型应用开发中,需要学会本地调用模型, 要在本地环境调用gpt2 模型需要将模型下载到本地,这里记录本地调用流程: 在huggingface 模型库中查找到需要使…

【Abstract Thought】【Design Patterns】python实现所有个设计模式【下】

前言 彼岸花开一千年,花开花落不相见。 若问花开叶落故,彼岸缘起缘又灭——《我欲封天》 \;\\\;\\\; 目录 前言简单的设计模式复杂的设计模式13责任链14迭代器15备忘录16状态机17模板方法18访问者19观察者20命令Shell21策略22调解23解释器 简单的设计模…

【物联网】PWM控制蜂鸣器

文章目录 一、PWM介绍1.PWM的频率2.PWM的周期 二、PWM工作原理分析三、I.MX6ull PWM介绍1.时钟信号2.工作原理3.FIFO 四、PWM重点寄存器介绍1.PWM Control Register (PWMx_PWMCR)2.PWM Counter Register (PWMx_PWMCNR)3.PWM Period Register (PWMx_PWMPR)4.PWM Sample Register…

Python----机器学习(基于PyTorch的乳腺癌逻辑回归)

Logistic Regression(逻辑回归)是一种用于处理二分类问题的统计学习方法。它基于线性回归 模型,通过Sigmoid函数将输出映射到[0, 1]范围内,表示概率。逻辑回归常被用于预测某个实 例属于正类别的概率。 一、数据集介绍 在本例中&…

5分钟学会接口自动化测试框架

今天,我们来聊聊接口自动化测试。 接口自动化测试是什么?如何开始?接口自动化测试框架如何搭建? 自动化测试 自动化测试,这几年行业内的热词,也是测试人员进阶的必备技能,更是软件测试未来发…