当前位置: 首页 > news >正文

视频讲解|Python用ResNet残差神经网络在大脑出血CT图像描数据预测应用

全文链接:https://tecdat.cn/?p=43843
原文出处:拓端抖音号@拓端tecdat
分析师:Zikun Zhang

封面

视频讲解Python用ResNet残差神经网络在大脑出血CT图像描数据预测

在临床医疗影像诊断中,大脑出血的快速准确识别直接关系到患者的救治效率——CT影像作为常用检查手段,传统人工阅片不仅依赖医生经验,还可能因影像细节复杂(如出血区域与正常组织灰度接近)导致判断延迟。随着深度学习技术的发展,基于神经网络的影像辅助诊断系统逐渐成为解决这一问题的关键工具,其中ResNet(残差神经网络)凭借独特的残差连接设计,有效解决了深层网络训练中的“梯度消失”(梯度越传越弱,模型学不到新知识)与“网络退化”(层数增加但性能不升反降)问题,在图像识别领域表现突出。

本文内容改编自我们团队此前为医疗行业客户提供的大脑出血CT影像辅助诊断咨询项目——当时客户面临数据量有限(仅200张CT图像)、模型训练不稳定的问题,我们通过ResNet-34模型优化、5折交叉验证、早停机制等方案,帮助客户实现了高准确率的预测效果。

1. 引言

为了让更多学生和行业从业者掌握这一技术,我们将项目核心流程整理为本文,内容涵盖数据集处理、模型构建、训练优化到评估可视化的全流程,所有关键代码均已调整优化,便于复现。完整项目代码和数据文件已分享在交流社群,阅读原文进群和600+行业人士共同交流和成长。
本文技术流程可概括如下:

 

2. 数据集介绍

本次应用所使用的数据为临床实际采集的大脑出血CT图像RGB彩色扫描数据,共200张。每张图像均已完成编号,并与对应的“是否出血”标签整合为CSV表格,便于数据加载与标签匹配——这种数据组织方式符合医疗场景中“影像-诊断结果”一一对应的实际需求,也为后续模型训练提供了清晰的输入输出关系。

上图展示了部分CT图像的外观特征:图像中不同灰度区域对应大脑不同组织,出血区域会呈现特定的密度差异,这些差异正是模型需要学习的关键特征。由于数据量相对有限(200张),后续将通过数据增强手段提升模型的泛化能力。

3. 数据集准备与预处理

3.1 数据集划分

为了充分利用有限数据,同时确保模型评估的客观性,我们采用“随机划分+交叉验证”的策略:

  1. 将200张图像按8:2比例随机划分:80%(160张)作为训练集,20%(40张)作为测试集——测试集的核心作用是筛选最终的最优模型权重,避免用训练数据直接评估导致的“自欺性”结果;
  2. 训练集进一步拆分为5等份,每进行一轮训练时,选取1份作为验证集(用于监测训练效果),其余4份作为实际训练数据,这是后续5折交叉训练的基础。

3.2 数据预处理与加载代码实现

数据预处理的核心目标是“缓解过拟合”(因数据量少导致模型只记熟训练数据,不会泛化),主要包括数据增强变换和自定义数据集类加载。以下是关键代码(已修改变量名与注释,便于理解):

 
  1.  
    import os
  2.  
    import pandas as pd
  3.  
    from PIL import Image
  4.  
    import torch
  5.  
    from torch.utils.data import Dataset
  6.  
    from torchvision import transforms
  7.  
    # 加载CT图像数据(RGB格式)
  8.  
    def load_ct_images(image_dir):
  9.  
    """
  10.  
    加载大脑出血CT图像数据(RGB格式)
  11.  
    参数:image_dir - 图像文件存储路径
  12.  
    返回:处理后的RGB格式图像列表
  13.  
    """
  14.  
    image_list = []
  15.  
    for img_name in os.listdir(image_dir):
  16.  
    img_path = os.path.join(image_dir, img_name)
  17.  
    # 读取图像并强制转换为RGB格式(统一输入通道)
  18.  
    img = Image.open(img_path).convert('RGB')
  19.  
    image_list.append(img)
  20.  
    return image_list
  21.  
    # 加载出血标签数据(从CSV文件)
  22.  
    def load_hemorrhage_labels(csv_path):
  23.  
    """
  24.  
    从CSV文件加载大脑出血标签(0=无出血,1=有出血)
  25.  
    参数:csv_path - CSV文件路径(含image_id和hemorrhage_label列)
  26.  
    返回:图像编号与对应标签的字典(便于快速匹配)
  27.  
    """
  28.  
    label_df = pd.read_csv(csv_path)
  29.  
    label_dict = dict(zip(label_df['image_id'], label_df['hemorrhage_label']))
  30.  
    return label_dict
  31.  
    # 创建数据增强变换管道
  32.  
    def create_ct_data_augmentation():
  33.  
    """
  34.  
    创建CT图像训练数据增强变换(仅训练集用,测试集不增强)
  35.  
    返回:训练集变换对象、测试集变换对象
  36.  
    """
  37.  
    # 训练集增强:随机裁剪、翻转、亮度调整(增加数据多样性)
  38.  
    train_transform = transforms.Compose([
  39.  
    transforms.RandomResizedCrop(224), # 随机裁剪为224×224(ResNet输入尺寸)
  40.  
    transforms.RandomHorizontalFlip(p=0.5), # 50%概率水平翻转
  41.  
    transforms.ColorJitter(brightness=0.2), # 亮度随机调整±20%
  42.  
    transforms.ToTensor(), # 转换为张量(模型输入格式)
  43.  
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) # 标准化(用ImageNet均值/标准差)
  44.  
    ])
  45.  
     
  46.  
    # 测试集仅做必要变换(不破坏真实特征)
  47.  
    test_transform = transforms.Compose([
  48.  
    transforms.Resize(224),
  49.  
    transforms.CenterCrop(224),
  50.  
    transforms.ToTensor(),
  51.  
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
  52.  
    ])
  53.  
    return train_transform, test_transform
  54.  
    # 自定义CT出血数据集类(继承Dataset,实现批量加载)
  55.  
    class CTHemorrhageDataset(Dataset):
  56.  
    def __init__(self, image_list, label_dict, transform):
  57.  
    self.image_list = image_list # 图像列表
  58.  
    self.label_dict = label_dict # 标签字典
  59.  
    self.transform = transform # 数据变换对象
  60.  
    def __len__(self):
  61.  
    # 返回数据集总数量(DataLoader需用到)
  62.  
    return len(self.image_list)
  63.  
    def __getitem__(self, idx):
  64.  
    # 按索引获取单张图像与对应标签
  65.  
    img = self.image_list[idx]
  66.  
    # 从图像文件名提取编号(匹配标签)
  67.  
    img_id = img.filename.split('/')[-1].split('.')[0]
  68.  
    label = self.label_dict[int(img_id)]
  69.  
    # 应用数据变换
  70.  
    img_tensor = self.transform(img)
  71.  
    # 返回:[3,224,224]图像张量 + 标量标签张量
  72.  
    return img_tensor, torch.tensor(label, dtype=torch.float32)
 
 

上述代码的核心作用是:将原始CT图像和标签转换为模型可读取的张量格式,同时通过训练集增强“造”出更多样的训练数据,避免模型因数据量少而“学死”。其中CTHemorrhageDataset类实现了“按索引取数据”的功能,后续可通过DataLoader实现批量训练。

4. ResNet-34模型构建与优化

4.1 ResNet核心原理简化

ResNet的关键创新是“残差连接”——简单说,就是在网络的某两层之间加一条“捷径”,让输入信号可以直接传到后面的层。这样一来,反向传播时梯度能顺着“捷径”顺畅传递,不会越传越弱(解决梯度消失);同时,网络只需学习“输入与输出的差异”(残差),不用从头学习完整特征,就算层数多,性能也不会退化(解决网络退化)。

4.2 ResNet-34模型结构

本次选用ResNet-34(含34层带残差连接的卷积层),其结构可分为5个部分,下图清晰展示了各模块的组成:

  1. 输入层:接收RGB格式的CT图像(3个通道);
  2. 初始卷积+降采样:用大卷积核提取初步特征,同时缩小图像尺寸(减少计算量);
  3. 四个残差阶段:每个阶段由多个“残差块”组成,残差块数量分别为3、4、6、3——每个残差块含2个3×3卷积层+归一化层+ReLU激活函数,核心是通过残差连接传递特征;
  4. 输出层:全局平均池化(将特征图转为向量)+全连接层(分类)。

相关文章

【视频讲解】ResNet深度学习神经网络原理及其在图像分类中的应用|附Python代码

全文链接:https://tecdat.cn/?p=37134


4.3 模型优化:冻结卷积层+自定义分类头

为了降低计算量(避免普通电脑跑不动),同时利用预训练模型的“先验知识”,我们做了两个关键优化:

  1. 冻结ResNet-34的卷积层参数:ResNet-34预训练时已在百万张图像上学习了通用图像特征(如边缘、纹理),这些特征在CT图像上也适用,冻结后不用再训练,直接用现成的;
  2. 替换全连接层为“自定义分类头”:原ResNet-34的全连接层是为1000类分类设计的,我们需要的是“二分类”(出血/不出血),因此重新设计了分类头,同时加入Dropout层防止过拟合。
    以下是模型构建的关键代码(已优化变量名与注释):
 
  1.  
    import torch.nn as nn
  2.  
    from torchvision import models
  3.  
    def build_optimized_resnet34():
  4.  
    """
  5.  
    构建优化后的ResNet-34模型(冻结卷积层+自定义分类头)
  6.  
    返回:ResNet-34优化模型
  7.  
    """
  8.  
    # 加载预训练的ResNet-34模型(含ImageNet预训练参数)
  9.  
    base_model = models.resnet34(pretrained=True)
  10.  
     
  11.  
    # 冻结卷积层参数(仅训练分类头)
  12.  
    for param in base_model.parameters():
  13.  
    param.requires_grad = False # 设为False,反向传播时不更新参数
  14.  
     
  15.  
    # 替换原全连接层为自定义分类头(输出出血概率:0~1)
  16.  
    base_model.fc = nn.Sequential(
  17.  
    nn.Linear(in_features=512, out_features=256), # 512维→256维
  18.  
    nn.ReLU(), # 激活函数(引入非线性)
  19.  
    nn.Dropout(p=0.5), # 随机“关掉”50%神经元(防过拟合)
  20.  
    nn.Linear(in_features=256, out_features=64), # 256维→64维
  21.  
    nn.ReLU(),
  22.  
    nn.Dropout(p=0.5),
  23.  
    nn.Linear(in_features=64, out_features=1), # 64维→1维(单输出)
  24.  
    nn.Sigmoid() # 转为0~1概率(二分类常用)
  25.  
    )
  26.  
     
  27.  
    return base_model
  28.  
    # 初始化模型(测试代码)
  29.  
    model = build_optimized_resnet34()
  30.  
    print("模型构建完成,分类头结构:", model.fc)
 
 

上述代码的核心是“借力”——用预训练的卷积层提取通用特征,只训练自定义的分类头,既减少了计算量(普通GPU也能跑),又保证了特征提取的质量。分类头最后用Sigmoid激活,输出的就是“该CT图像存在出血的概率”(大于0.5判为出血,否则为不出血)。

5. 5折交叉训练实施

为了充分利用训练数据,同时避免模型“偏科”(比如只适合某一部分数据),我们采用“5折交叉训练”——将训练集拆为5份,每份轮流当验证集,其余当训练集,最后取5个模型的平均表现,再选最优的。

5.1 训练关键策略

  1. 训练轮次(epoch):每折训练80个epoch(即把训练数据过80遍);
  2. 早停机制(Early Stopping):设置patience=40——如果连续40个epoch,验证集的表现(如损失)没有变好,就停止训练,避免无效训练和过拟合;
  3. 模型保存:每折训练时,保存验证集表现最好的模型权重(后续用这些权重做测试)。

5.2 训练流程简化

  1. 初始化5折数据生成器(用KFold划分训练集索引);
  2. 每折重新初始化模型(避免前一折的参数影响);
  3. 用训练集训练模型,每epoch用验证集测表现;
  4. 若验证集表现变好,保存当前模型权重;若连续40个epoch没变好,触发早停;
  5. 5折训练结束后,得到5个“最佳模型权重”。

6. 模型评估与结果可视化

训练完成后,我们从“收敛性”和“准确率”两个维度评估模型,同时用测试集筛选最优模型。

6.1 训练收敛性分析

收敛性指模型是否“学进去了”——如果训练损失和验证损失都稳步下降,且两者差距不大,说明模型在有效学习,没有过拟合。本次训练结果如下:

  • 训练损失:从初始的约0.58平稳降至0.44~0.46;
  • 验证损失:从初始的约0.15降至0.1~0.12;
  • 两者差距逐渐缩小,说明数据增强和早停机制有效抑制了过拟合。

6.2 准确率表现

验证准确率的变化更直观:

  • 从初始的约80%逐步提升至98%~100%;
  • 训练40个epoch后,准确率基本稳定(早停机制生效,避免了多余训练);
  • 最终通过测试集评估(测准确率、敏感性、特异性)发现,第3折和第5折的模型表现最优,综合指标最高。
    下图展示了各折模型的训练损失、验证损失与验证准确率变化趋势:

    从图中可以清晰看到:各折模型的训练曲线都比较平稳,没有出现“训练损失降但验证损失升”的过拟合现象;且40个epoch后准确率基本不变,说明早停机制设置合理,既保证了性能,又节省了训练时间。

7. 方法优缺点与应用场景

7.1 优点

  1. 残差连接解决核心问题:有效解决了深层网络的梯度消失和网络退化,就算增加网络层数,只要残差块能学到有效特征,性能就不会下降;
  2. 训练难度低:残差学习模式让模型只需学“残差”(输入与输出的差异),不用学完整特征,优化起来更简单;
  3. 特征重用效果好:残差连接让不同层的特征能相互传递,底层的细节特征(如CT图像的边缘)和高层的抽象特征(如出血区域轮廓)能充分结合,提升预测精度;
  4. 优化策略实用:冻结卷积层减少了计算量(普通GPU也能跑),自定义分类头适配了二分类需求,早停机制避免了过拟合。

7.2 缺点

  1. 数据量适应性有限:在数据量较大(如上万张图像)的场景下,模型参数量会导致计算压力增加,需依赖更高性能的GPU;
  2. 对小目标敏感:如果CT图像中的出血区域极小(如早期微量出血),模型可能因特征不明显而漏判——需后续结合目标检测算法优化。

7.3 应用场景

除了本文的大脑出血CT影像诊断,该方法还可迁移到多个实际图像识别场景:

  • 工业领域:芯片破损检测(识别芯片表面的微小裂痕)、零件缺陷识别;
  • 安防领域:人脸识别(在复杂背景下精准定位人脸)、异常行为辅助判断;
  • 交通领域:车辆识别(区分不同车型、识别违章车辆)、路况检测(识别路面坑洼)。

8. 总结

本文以“大脑出血CT图像预测”这一实际医疗需求为核心,完整展示了基于ResNet-34的深度学习解决方案:从数据集划分(8:2训练/测试,5折交叉验证)、数据增强预处理(解决数据量少问题),到模型优化(冻结卷积层+自定义分类头,降低计算量)、5折交叉训练(结合早停机制,避免过拟合),再到模型评估与最优选择(基于损失和准确率筛选折3、折5模型),每一步都围绕“实际应用落地”设计。
结果表明,该方案在200张CT图像数据上实现了98%以上的验证准确率,且无明显过拟合,完全能满足临床辅助诊断的需求。同时,该方案的核心思路(残差连接、预训练模型微调、交叉验证)可迁移到多个图像识别场景,具有较强的通用性。
XXX完整项目代码和数据文件已分享在交流社群,阅读原文进群和600+行业人士共同交流和成长——无论是学生学习深度学习实战,还是企业落地影像辅助诊断系统,都可参考本文方案,结合实际需求调整参数(如残差块数量、分类头结构),实现更优效果。

关于分析师

在此对 Zikun Zhang 对本文所作的贡献表示诚挚感谢,他在东华大学完成了软件工程专业学习,专注数据处理与深度学习应用领域。擅长 Python 编程,在深度学习、图像处理、数据分析方向有扎实能力,曾参与 Lenovo 中小型企业产品的销售量数据分析项目,为本文数据处理逻辑与模型优化思路提供了实践参考。
  

相关文章:

视频讲解|Python用ResNet残差神经网络在大脑出血CT图像描数据预测应用

全文链接:https://tecdat.cn/?p=43843原文出处:拓端抖音号@拓端tecdat分析师:Zikun Zhang视频讲解Python用ResNet残差神经网络在大脑出血CT图像描数据预测在临床医疗影像诊断中,大脑出血的快速准确识别直接关系到患者的救治效率——CT影像作为常用检查手段,传统人工阅片不…...

题解:CF1188A1 Add on a Tree

Solution 我们可以先计算每个节点的度。 若 \(deg_i = 1\),只有一条边,可以变成任意值。 若 \(deg_i = 2\),两条边会同时加上一个任意实数,但如果要求这两条边不相等,就无法做到。 若 \(deg_i \ge 3\),以 \(deg_i = 3\) 为例,可以先把这三条边的边权变为 \(0\),然后就可…...

CSP-S 9.9

赛时: 6:00:发题,一眼不会 BCD 6:03:一眼秒了 A,快速写了一个线段树,然后发现可以用树状数组,最后发现直接记录最大值和次大值就可以了。 6:10:写完了,发现恶心大样例: 1 999999胡:你就说满不满足子任务 2 吧。 好吧完全不拍,直接写 T3。 8:30:想到了一个伪正解:…...

250913 课堂笔记

0 1 CF1147E 2 CF1007C 3 CF750F 4 CF1129E 5 P9601 6 P5208 7 CF1292E 8 CF1924F 9 P13535 10 CF1991I本文来自博客园,作者:cwkapn,转载请注明原文链接:https://www.cnblogs.com/cwkapn/p/19088845...

NKOJ全TJ计划——NP11792

题目内容 33DAI 最近喜欢玩《骑马与砍杀 2》,他正领导着一支\(n\)人的小队(保证\(n\)是偶数),小队成员编号\(1\backsim n\)。他们中编号为 \(i\)的成员(\(1\le i\le \frac{n}{2}\) )与编号为\(i+\frac{n}{2}\)的成员互为朋友关系。 为了掩护主力撤退,他决定选择其中\(k\…...

求加小红书

一定回关 因为现在小白实力较小,没那么多粉丝,希望可以成为一名大主播,希望大家支持,谢谢!这个家伙很懒,什么也没有留下 🐾...

Ubuntu 修改 Git 的编辑器为 Vim

使用命令行 git config --global core.editor vim 可以为所有仓库全局指定 Git 的编辑器为 Vim。 修改之前:修改之后:...

完整教程:Photo Lab PRO 图片编辑器 功能解锁版

完整教程:Photo Lab PRO 图片编辑器 功能解锁版pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace …...

编辑功能查询问题解决

问题点: 报错:“System.InvalidCastException”类型的异常在 System.Data.dll 中发生,但未在用户代码中进行处理 其他信息: 指定的转换无效。解决方法: 修改前的代码示例public AccessoryInfo GetInfo(Int32 accessoryId){AccessoryInfo entity = null;SqlParameter[] parm…...

Ubuntu 18.04 虚拟机 VScode无法正常输入中文解决办法

小问题,咱们速战速决问题描述或者其实就是安装的Ubuntu版本太旧了,依赖包的版本不支持VScode安装。如果不想升级Ubuntu,那找一个旧版本VScode安装包就行。这里是旧版本VScode,旧版本合集 推荐在Ubuntu的浏览器中打开并下载,如图点击.deb当然,也可以用Windows系统下载,能…...

manacher算法

模板题:洛谷p3805 code: #include<iostream> #include<algorithm> using namespace std; const int N=2.2e7+10; string t,s; int m,n; int d[N]; int main(){cin>>t;m=t.size();s+= ;for(auto ch: t){s+=#;s+=ch;}s+="##";n=s.size()-2;d[1]=1;i…...

[能源化工] 面向锂电池RUL预测的开源项目全景速览

锂离子电池是新能源汽车、储能系统及便携式电子设备的核心能源部件,其剩余使用寿命(Remaining Useful Life,RUL)的准确预测直接关系到设备运行安全、维护成本优化和能源效率提升。RUL预测算法能够提前量化电池剩余可用时间,是保障新能源汽车与储能系统安全稳定运行、降低突…...

源码app陪玩,React技巧之发出http请求 - 云豹科技

源码app陪玩,React技巧之发出http请求总览在React中,通过点击事件发出http请求:1、在元素上设置onClick属性。2、每当元素被点击时,发出http请求。3、更新state变量,并重新渲染数据。如果你使用axios,请向下滚动到下一个代码片段。import {useState} from react;const Ap…...

qoj1847 Elephants

题意 有一个长度为 \(n\) 的 \(01\) 数组 \(a\)。 给出 \(q\) 组限制条件,第 \(i\) 组给出大小为 \(k_i\) 的集合 \(C_i=\{x_{i,1},x_{i,2},\cdots,x_{i,k_i}\}\)。若 \(cnt_0\) 为 \(\{x|x\in C_i,a_x=0\}\) 的集合大小,\(cnt_1\) 为 \(\{x|x\in C_i,a_x=1\}\) 的集合大小,…...

p4085

洛谷p4085 题目链接 首先想怎么计算一个区间的风味和辣度;风味是区间内的风味总和,可以用前缀和处理;辣度是区间最大值,可以用ST表处理; 处理完ST表和前缀和之后考虑怎么求答案,可以考虑二分查找前缀和满足风味要求的最小值,然后列举后面的所有情况求最小; 代码: #inc…...

Excel甘特图 - 教程

Excel甘特图 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-size: 14px…...

基于ArcGIS的通用界址点导入导出工具设计与实现

# 基于ArcGIS的通用界址点导入导出工具设计与实现最近在开发一个兼容 **ArcGIS Desktop** 和 **ArcGIS Pro** 的通用界址点数据导入导出工具。在实际项目中,界址点虽然有国家标准规范,但各地的实际应用需求差异较大,导致格式五花八门:- 有的地方要求包含 **9个属性字段**;…...

python 函数作用域

对于 python 中的全局变量,在函数体内只能访问,不可修改。若想修改则需要用 global 关键字声明。 eg:c = 1 def f():print(c)f() # 可执行c = 1 def g():global c # 在函数体内修改全局变量,需要声明c += 1print(c)g()定义在函数体内的函数,称为“闭包”。与全局变量原理一…...

基于Python+Vue开发的鲜花商城管理系统源码+运行

项目简介该项目是基于Python+Vue开发的鲜花商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的鲜花商城管理系统项目,大学生可以在实践中学习和…...

Idea win 快捷键大全

转载自:https://www.cnblogs.com/chuangzhijian/p/8477220.html Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Shift+Click,可以关闭文件Ctrl+[ OR ],可以跑到大括号的开头与结尾Ctrl+F12,可以显示…...

文献阅读 | AutoCodeBench

AutoCodeBench:大型语言模型是自动代码基准生成器 - AI论文精选 解决大模型标注困难的问题,可自动生成高难度多语言代码生成数据集TRANSLATE with xEnglishArabic Hebrew PolishBulgarian Hindi PortugueseCatalan Hmong Daw RomanianChinese Simplified Hungarian RussianC…...

【ARM Cache 及 MMU 系列文章 6.5 -- 如何进行 Cache miss 统计?】

ARM Cache Miss 统计 在ARMv8/v9架构中,缓存未命中(Cache Miss)的统计对于性能调优和系统分析至关重要。缓存未命中意味着处理器尝试从缓存中读取数据时没有找到,因此不得不从更低速的存储(如L2缓存或主内存)中加载数据,这会导致延迟增加和性能下降。理解和分析缓存未命…...

VSCode+neovim工作环境快速构建

环境系统:Windows 代码编辑器:VSCode 插件:vscode-neovim、clangd目的 为了减少右手趴鼠标上的时间,所以根据以下目标给出一份最简洁的配置方案:窗口跳转:<C-w>+ h j k l 标签页跳转:H L 终端打开\关闭: <C-`> 相对行号 引用跳转(Go to Define): gd 模式切…...

25.9.12随笔联考总结

考试 通读题面,感觉只能顺序开题。T1 做了 40 多分钟,感觉这个题比之前的要难一点;T2 很快找到一些性质,但是最后一个东西似乎不太能做,于是就花了好一会去想,但是还是没想出来。最后只写了暴力。T3 看着就很不可做,想了一会没找到啥性质。T4 是串串计数题,因为计数做少…...

macos

调节鼠标熟读 defaults write -g com.apple.mouse.scaling 6...

0912模拟赛总结

这次比赛T1没有注意 DP 初始化少了 30 分,T4把 \(m\) 写成 \(n\) RE 了,少了85分,所以一定要自己造极限数据,同时要把题目里面的变量改成自己的习惯。后面在对拍的时候一直在改T1,忽略了 -inf 和 0 是有区别的,后者可以转移出不存在的状态。这几次考试都反映出大样例是很…...

Java基础程序设计

Java基础程序设计Day02 关键字和保留字的含义: 关键字被Java语言赋予了特殊含义,用做专门用途的字符串(单词)(关键字特点字母都为小写),保留字不能被用作标识符来使用goto、const,保留字不能作为标识符来命名。 标识符:凡是需要起名字的地方都叫标识符 定义标准:标识符的命名规…...

CF482C Game with Strings

比较具有启发意义的题目。 首先看到 \(m \le 20\),我们第一个想到的就是状压 DP,设 \(f_i\) 为选取位置集合为 \(i\) 时期望多少步确定,显然转移是简单的,比较困难的地方在当 \(i\) 唯一确定一个串(这个串需要你枚举出来)时,\(f_i = 0\),而这一步需要 \(O(nm2^m)\) 的复…...

相机标定

为保证单目相机在全站仪融合定位中的精度,需要进行相机标定以获得准确的内参和畸变参数。 内参矩阵 (K):描述了相机自身的几何属性,与相机的位置和姿态无关。f_x, f_y: 以像素为单位的焦距,与物理焦距和图像传感器密度有关。c_x, c_y: 主点坐标,通常是图像的中心(或附近)…...

深度学习隐私测试框架PrivacyRaven全面解析

PrivacyRaven是专为深度学习系统设计的隐私攻击测试套件,支持模型提取、成员推理和模型反演三大攻击类型,通过模块化设计实现高效隐私测试,帮助研究人员评估系统安全性。PrivacyRaven Has Left the Nest - The Trail of Bits Blog Suha S. Hussain, Georgia Tech October 08…...

华硕灵耀双屏不定时死机,开机蓝屏 其一解决方法

关闭intel RST,关闭VMD,...

完整教程:Java 抽象(abstract)关键字

完整教程:Java 抽象(abstract)关键字pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !importa…...

自建rustdesk服务器,不填写中继地址无法连接的解决

研究相当长时间,官方文档在配置服务器步骤时省略了关键一步,导致当你用定义文件名方式给客户直接使用客户端时,无法连接中继的问题,不在于客户端,而在于服务端过程省略,直接设置hbbs 服务的启动参数,添加-r <中继地址> -k_ 即可默认为 -r 0.0.0.0 服务端不能推导I…...

Typescript中Type 类型的实现原理

TypeScript 中的 "类型"(Type)是对值的结构和行为的抽象描述。它不直接参与运行时,而是在编译阶段用于约束值的形态,确保代码符合预期的契约。1.核心作用:定义 "允许的值" 的范围和操作规则2.与 JavaScript 的关系:TS 的类型系统是对 JS 值的补充描述…...

数据结构与算法-30.图-拓扑排序

一、拓扑排序定义 二、检测有向图中的环API设计实现过程 以上仅供参考,如有疑问,留言联系...

1.进制转化

...

CF1796E Colored Subgraphs

是一个读懂题意就能做出来的题。 题目意思就是要你进行某种树上剖分,求最短链可能的最大长度。 显然,有一个很容易的 DP 是设 \(f_i\) 为以 \(i\) 结尾的最短链长度,显然,它会从儿子中的最短链转移而来。 那么,在换根的过程中,我们需要记录一个全局最小值和全局次小值,可…...

MySQL 日期时间类型:从入门到精通的核心指南 - 指南

MySQL 日期时间类型:从入门到精通的核心指南 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monosp…...

Map对象在JavaScript循环中的使用

在JavaScript中,Map对象是一种新的键值对集合数据结构,与传统的Object有着本质的差异。一个Map的键可以是任意值,包括函数、对象或任何原始值。Map对象与传统的Object相比,有以下几个显著的优点:键的范围不限于字符串和Symbol。 Map对象的键值对是有序的,即键值对的插入顺…...

戒己谨言

言一 高投入,低期待 —— 2025.9.13 言二 学习是以知识武装自己 —— 2025.9.13...

2025.9.13——1黄

普及/提高- B3873 [GESP202309 六级] 小杨买饮料 简单的背包dp,注意边界情况处理。...

安全加固:启动PostgreSQL 14服务器SSL加密的方法指南在CentOS 7环境中

在CentOS 7操作系统中配置PostgreSQL 14以启用SSL加密,需要进行以下步骤: 1. 安装PostgreSQL 14: 首先确保安装了PostgreSQL 14,可以通过以下命令安装: sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest…...

更美观的网页布局

更美观的网页布局<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=d…...

更灵活易用、延迟超低、更多情感语音支持!地表最强 Voice Agent 开源框架再进化!丨TEN Framework 更新

Hi !RTE 开发者社区的新老朋友们大家好,恰逢 TEN Framework 开源一周年之际,TEN 带着超厉害的 0.1.0 版 来了!TEN Framework 本次带来了多项功能更新和开发者体验提升,相信 TEN 将成为开发者构建下一代 Voice Agent 的开发利器!本次更新增加了简化的 main 概念,让开发者…...

详细介绍:【干货收藏】Transformer架构深度拆解:大模型入门核心指南

详细介绍:【干货收藏】Transformer架构深度拆解:大模型入门核心指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier N…...

实用指南:Terraform 从入门到实战:历史、原理、功能与阿里云/Azure 上手指南

实用指南:Terraform 从入门到实战:历史、原理、功能与阿里云/Azure 上手指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "C…...

Electron38-Wechat电脑端聊天|vite7+electron38仿微信桌面端聊天系统

最新研发Electron38+Vite7+Pinia3客户端仿微信聊天系统ElectronWinChat。 electron38-vue3-wechat基于vite7.1+electron38+pinia3+element-plus跨平台仿微信/QQ电脑端聊天Exe程序。封装electron多窗口管理、自定义系统导航栏。实现聊天、通讯录、收藏、朋友圈/短视频、我的等模…...

PsExec

PsExec keywords: PsTools PsExec 是一个可以远程连接其他Windows执行命令的工具,在SysinternalsSuite套件中。 下载链接: https://learn.microsoft.com/en-us/sysinternals/downloads/psexec 配置高级安全 Windows Defender 防火墙 -> 入站规则 -> 文件和打印机共享(S…...

详细介绍:开源AI智能客服与AI智能名片在S2B2C商城小程序客服管理中的应用与影响

详细介绍:开源AI智能客服与AI智能名片在S2B2C商城小程序客服管理中的应用与影响pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…...

深入解析:每日一算:电话号码的字母组合

深入解析:每日一算:电话号码的字母组合pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !import…...