基于U-Net的肝脏分割实战:深度卷积网络在医学影像中的工程全解析

简介:本资源是一套面向计算机类本科生的毕业设计与课程作业级深度学习实践项目,聚焦医学图像分析中的肝脏分割任务,适用于深度学习入门到进阶的学习者掌握模型构建、训练与评估全流程。压缩包共43个文件,含18个核心Python源码(如UNet、ResUNet、KiUNet等模型定义及train.py/test.py主流程)、15个编译缓存pyc文件、4个XML配置与IDE设置文件、3个Markdown说明文档(含README与实验指南),以及Jupyter Notebook交互式演示文件;整体仅50KB,轻量但结构完整,模块划分清晰(models/dataset/utils等目录明确)。已有123人下载学习,提供从数据预处理、损失函数设计(loss.py)、指标计算(metrics.py)到权重初始化与日志记录的全链路代码支撑,配套config.py与详细注释,便于快速复现、调试与二次开发。 拷完代码压缩包,第一件事不是急着点开train.py,而是先把zip解压出来看看里面到底放了什么——这是我一贯的习惯。这次拿到的是一份典型的医学影像分割项目,基于深度卷积网络的肝脏分割.zip,标题写得很直白,毕设/课程作业。

这个项目解决的痛点很明确:肝脏分割是肝脏疾病诊断、术前规划、体积测量等临床任务的前置步骤,过去主要靠医生逐层手动勾画CT图像中的肝脏轮廓,既耗时又受主观经验影响。深度卷积网络能自动在CT影像中逐像素分割出肝脏区域,把人力从繁重的标注工作中解放出来。它适合三类人来研究:正在做医学影像方向毕设的学生、需要交深度学习课程大作业的同学,以及想系统入门语义分割、又不想停留在MNIST/CIFAR这类玩具数据上的开发者。下面我会从解压项目包开始,把环境配置、网络结构、训练流程、答辩讲法一条龙讲清楚。

1. 一份肝脏分割项目代码包,里面应该是这些

1.1 拿到压缩包后的第一个动作:正确解压

解压这个动作看着简单,但“解压失败”四个字能拦截一票新手。我见过太多人在第一步就被卡住了。结合我看到的反馈,zip解压出问题最常见的是两种:一种提示“file is not a zip file”,另一种直接报“invalid zip archive: could not find eocd”。

先别急着下“文件损坏”的结论。“file is not a zip file”这种情况,十有八九是文件后缀被改了——比如某些网盘或通讯工具下载后自动把文件名改成了.bin或.rar,文件本身可能完好无损,你用7-Zip或WinRAR强制打开就能解开。“could not find eocd”则是EOCD(End of Central Directory,中央目录结束标记)找不到,通常是下载过程没完成,文件被截断了,重新下载一遍,并确认传输完成后字节数一致再解压,问题就没了。

1.2 一个规范的医学影像分割项目目录长什么样

解压之后,我习惯按这个顺序来审视项目:先看README,没有README的项目往后会踩很多坑;再看目录结构。一个组织良好的肝脏分割项目,目录上通常长这样:

liver_segmentation/
├── data/
│   ├── raw/                  # 原始CT数据(.nii/.nii.gz)
│   ├── preprocessed/         # 裁剪、重采样、归一化后的数据
│   └── splits/               # train/val/test 划分文件
├── models/
│   ├── unet.py               # 模型定义
│   ├── blocks.py             # 卷积模块、注意力模块
│   └── ...
├── configs/
│   ├── train_config.yaml     # 训练参数配置
├── scripts/
│   ├── preprocess.py
│   ├── train.py
│   ├── predict.py
│   └── evaluate.py
├── requirements.txt
└── README.md

注意data目录下没有raw数据是正常的。开源CT数据集动辄几十GB,代码包一般不会把数据直接塞进压缩包,而是放下载地址或数据准备脚本。拿到代码后第一步是去config或README里找数据路径,把下载好的数据集放到对应位置,再跑预处理脚本。

1.3 医学影像项目和普通CV项目有什么本质区别

医学影像分割项目和普通自然图像分类项目最大的不同在于数据格式。自然图像是jpg/png,OpenCV直接读;医学影像常见的是NIfTI格式(.nii/.nii.gz)和DICOM序列。这决定了数据读取、预处理、标签处理的手段都不一样:DICOM里有窗宽窗位、像素间距、层厚、病人方向等大量元信息,这些在自然图像里完全不存在。代码里出现nibabel、SimpleITK、pydicom这些库是正常的,这是医学影像处理的基本盘。

我见过不少同学拿着代码包直接卡在读数据上——README明明写了数据路径还报FileNotFoundError。这种问题十有八九是路径分隔符或相对路径的问题。在Linux服务器上路径是/data/lits/ct,在Windows上是D:\data\lits\ct。代码在Windows上开发、在Linux上跑,路径不统一是最容易翻车的点。建议拿到代码第一时间全局搜索数据路径相关的字符串,把所有写死的路径统一改成你机器上的真实路径。

还有一个容易被忽略但极其重要的点:数据集划分文件。有些代码包的划分文件是随项目打包的,有些是运行时随机划分。如果后面要复现论文指标,尽量保留原始划分文件,不要自己重新随机划分,否则不同划分下模型性能会有明显波动,你会误以为是代码bug。

2. 环境搭建里最容易被卡住的几个坑

2.1 依赖清单和版本匹配

跑通医学影像分割项目,环境配置是第二个大坑区。这个项目最常用的组合是Python + PyTorch + MONAI(或独立的SimpleITK/nibabel)。典型依赖清单如下:

依赖包 用途 建议版本
python 解释器 3.8 ~ 3.10
torch 深度学习框架 1.13 ~ 2.x
monai 医学影像专用工具库 1.x(与torch版本配套)
nibabel 读写NIfTI格式数据 5.x
SimpleITK 医学图像处理、重采样 2.x
numpy 数组运算 1.24左右(注意与torch兼容)
scikit-image 图像处理、后处理 0.21左右
tqdm 进度条 任意

2.2 torch和CUDA版本不匹配:最隐蔽的坑

环境搭建第一个大坑是torch和CUDA版本不匹配。很多同学喜欢直接 pip install torch ,这装的是CPU版(或与GPU不匹配的版本),跑训练时显卡占用率始终是0%,训练慢得离谱。正确做法是先去PyTorch官网选择对应CUDA版本的安装命令。比如CUDA 11.8对应的安装命令通常是:

pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118

有同学在Ubuntu 22.04/24.04上装深度学习环境,驱动装完了, nvidia-smi 能正常显示,但torch一跑 torch.cuda.is_available() 返回False。原因在于PyTorch通常自带CUDA runtime,不一定需要系统装完整CUDA toolkit。判断标准很简单: nvidia-smi 有输出,torch版本选对, torch.cuda.is_available() 就会是True。如果True都出不来,先检查torch的安装渠道,而不是重装系统驱动。

2.3 MONAI版本锁和其他编译问题

第二个大坑是MONAI和torch的版本锁。MONAI版本迭代快, pip install monai 默认装最新版,可能要求torch版本跟你环境不一致。安装前看下当前MONAI版本对应的torch要求,或者直接用代码包里requirements.txt锁定的版本。有些代码包按老版本MONAI API写的,版本不对会出现“got an unexpected keyword argument”这类报错。遇到这种情况,搜报错信息里的API名,看版本变更记录,必要时回退到作者指定的MONAI版本。

Linux下解压zip后,脚本依赖的Python解释器路径写死(比如 #!/home/xxx/anaconda3/bin/python )也会导致在自己机器上跑报错。把.py文件头改成 #!/usr/bin/env python3 ,或者用 python xxx.py 方式调用即可。

2.4 显存预算:先做选择题再做训练

第三个坑是显存不足。肝脏CT是三维数据,一个体数据可能是512×512×几百层。直接整卷读进去训练,随便一跑就是out of memory。环境准备阶段就要明确:你用2D切片还是3D patch训练,显存大小决定了patch size的上限。6GB显存做3D训练很吃力,建议用2D切片或2.5D方案;12GB以上才能尝试3D patch训练。别贪,先跑通再说。

3. 深度卷积网络做肝脏分割的核心逻辑拆解

3.1 问题定义:这是一个密集预测任务

肝脏分割本质上是一个密集预测任务。输入是一张或一组CT切片,输出是和输入同尺寸的概率图,每个像素/体素的值表示该位置属于肝脏的概率。深度卷积网络的角色是:自动学习从图像像素到空间语义的映射,也就是能识别“什么样的纹理和轮廓特征组合代表肝脏边缘”、“什么样的灰度分布组合代表肝实质”。

当初做这个项目时,我最深的理解是:肝脏分割的难点不在网络有多复杂,而在目标本身的特殊性。肝脏与周围组织(肌肉、脾脏、肾脏)的CT值范围接近,边界比较模糊;肝脏形状个体差异大;肝脏在整幅CT图像中占比小,正负样本严重不平衡;再加上CT数据本身是三维的,计算量比普通2D图像大一个量级。理解了这几个难点,再看网络设计就会明白每一步都是有原因的。

3.2 卷积、池化和上采样到底在干什么

卷积层的作用是特征提取。用一组可学习的卷积核在图像上滑动,每个卷积核响应一种局部特征模式——浅层卷积核响应边缘、纹理,深层卷积核响应器官轮廓、结构组合。和全连接网络相比,卷积网络的核心优势是局部连接和参数共享。一张512×512的CT切片直接展成向量塞进全连接层,第一层参数量就爆炸了;而卷积核参数量与图像尺寸无关,只取决于卷积核大小和通道数。

池化层是降采样操作,作用是逐步缩小特征图空间尺寸、扩大感受野,同时保留最主要的响应信息。最大池化在2×2窗口内取最大值,这让网络在下采样的同时具备了一定局部平移不变性——目标稍微移动几个像素,池化后的特征仍然稳定。实际工程里步长为2的卷积和池化可以互换使用,但池化的不可学习特性在某些场景反而有正则化效果。肝脏分割项目里,U-Net的经典实现用的是最大池化,很多改进版本则换成了步长为2的卷积层,两种都能跑,后者在特征信息保留上更细腻。

3.3 U-Net为什么是医学影像分割的默认基线

语义分割领域有一个绕不开的基线网络:U-Net。2015年提出的U-Net直到今天依然是医学影像分割默认的架构起点。结构上它像一个U字母,由三部分构成:

  • Encoder(编码器/下采样路径):反复执行卷积+ReLU+池化,特征图尺寸逐层减半,通道数逐层翻倍。负责从CT图像中提取从低级到高级的语义特征。
  • Bottleneck(瓶颈层):特征图尺寸最小、通道数最高的中间层,保存整个输入图像最抽象的表达。
  • Decoder(解码器/上采样路径):通过上采样或转置卷积逐步恢复特征图尺寸,同时把空间细节逐步加回来。
  • Skip Connection(跳跃连接):把Encoder第n层的特征图直接拼接到Decoder对应层上。这是U-Net的精髓——没有跳跃连接,下采样会丢失大量空间细节,上采样恢复的语义信息定位不准。有了跳跃连接,网络才能同时保留低层的细节纹理和高层的语义判断。实测做过对比实验的话,去掉跳跃连接Dice一般会掉3到8个百分点。

为什么医学图像分割普遍用U-Net而不是直接用VGG或ResNet套FCN?核心原因是医学图像样本量小、目标结构复杂、对边界精度要求高,而U-Net的对称结构设计让底层特征直接流动到高层,梯度也能更有效地从loss回传到浅层,相当于给网络提供了一条高速公路——少量数据就能训练出不错的效果。

3.4 损失函数的选择:Dice Loss还是BCE Loss

损失函数的选择是肝脏分割项目里非常重要的部分。

常见方案是Dice Loss。Dice系数本身是分割任务最常用的评价指标,定义为:2 × |预测∩真实| / (|预测| + |真实|)。把1 - Dice当作损失,等于直接优化要的指标。Dice Loss对类别不平衡不敏感,即使肝脏区域只占CT图像的一小部分,梯度依然能较好传播。

但只有Dice Loss也有问题:训练初期预测完全不准时,Dice Loss梯度可能不稳定。实务中更稳妥的做法是Dice Loss与Binary Cross Entropy(BCE)联合,常见形式是 loss = 0.5 * dice_loss + 0.5 * bce_loss ,或直接用MONAI的 DiceCELoss 。我自己的经验是联合损失收敛更平滑,最终Dice指标会略高于单独使用Dice Loss。跑两三次对比实验你就会有体感。

评估指标方面,除了Dice和IoU(交集/并集),医学影像分割还会用Hausdorff距离(HD95)衡量边界误差。Dice只关心重叠程度,不关心边界偏差——两个分割结果Dice相同,但一个边界贴得紧、一个边缘歪出去几毫米,临床意义完全不同。毕设里只报Dice不报HD95,评委一旦问起边界精度你会比较被动。

4. 从数据预处理到完整训练,跑通整个流程

4.1 数据准备:公开数据集和划分策略

最常用的公开数据集是LiTS 2017(Liver Tumor Segmentation Challenge),包含131例腹部CT增强扫描,每例都有肝脏和肝肿瘤标注。更大的数据集有3D-IRCADb,包含20例CT,标注更精细但量小。如果课程作业只要求肝脏分割,LiTS就足够,subset选50例上下,训练速度可控。

数据划分建议按7:2:1或6:2:2分成训练/验证/测试。数据集本身有官方划分就优先用官方划分;自己划分记得设置随机种子,保证后续对比实验公平。

4.2 预处理:医学影像和自然图像的本质差异

预处理做得好不好,直接决定训练效果的上限。医学影像预处理和自然图像有本质区别:灰度值是物理量,不是0-255的显示值。CT图像的单位是HU(Hounsfield Unit),反映组织密度,空气约-1000HU,水约0HU,肝脏实质大约在40-60HU。

常规预处理流程:

  1. 重采样:不同CT设备的像素间距不一样(常见0.5mm~1mm,层厚1mm~5mm)。不统一模型在不同设备上性能会明显下降。建议把体素间距统一到1.5mm×1.5mm×3mm附近,或和训练环境匹配的某个固定值。
  2. 窗宽窗位裁剪:肝脏在CT上的显示窗口一般取窗位40HU、窗宽200HU,对应灰度范围约-60HU~140HU。把范围外值截断后再归一化到0-1,网络收敛会快很多。
  3. 裁剪/分块:全图512×512×N直接送进网络不现实。可以先按肝脏在CT中的大致位置切出ROI区域,或使用随机patch采样。不做裁剪只做slice级训练,按层拆开也是常规做法。
  4. 数据增强:随机翻转、随机旋转(10度以内)、随机缩放(0.9~1.1)、弹性形变。增强时注意标签要和图像同步变换,MONAI的 monai.transforms 里很多增强函数是专门为此设计的。

代码示意(简化版):

import monai.transforms as mt

train_transforms = mt.Compose([
    mt.LoadImaged(keys=["image", "label"]),
    mt.Spacingd(keys=["image", "label"], pixdim=(1.5, 1.5, 3.0), mode=("bilinear", "nearest")),
    mt.CropForegroundd(keys=["image", "label"], source_key="image"),
    mt.ScaleIntensityRanged(keys=["image"], a_min=-60, a_max=140, b_min=0.0, b_max=1.0),
    mt.RandFlipd(keys=["image", "label"], spatial_axis=0, prob=0.5),
    mt.RandRotate90d(keys=["image", "label"], prob=0.5),
    mt.SqueezeDimd(keys=["image", "label"]),
])

注意标注区域用最近邻插值(nearest),图像用双线性插值——label插值用bilinear会产生非整数标签,这是分割任务里隐蔽的bug。检查你的数据增强代码里mode参数是不是分别设置的。

4.3 模型配置与训练:第一次跑通就按这套参数

模型选型方面,第一次跑通建议直接用U-Net,不魔改。输入patch大小建议从128×128×64开始,这个尺寸在感受野和数据量间比较平衡。batch size根据显存调整,目标是把显存占用推到接近上限但不溢出。优化器用Adam,初始学习率1e-4,搭配ReduceLROnPlateau监控验证集Dice。如果发现loss震荡不收敛,把学习率降到3e-5。

epoch数没必要拍脑袋定,配早停更实际——patience设10~15个epoch,验证集指标连续不涨就停。医学影像数据集小训练快,早停能省下大量时间。

训练核心代码(一个epoch的循环):

model.train()
for step, batch in enumerate(train_loader):
    images = batch["image"].cuda()
    labels = batch["label"].cuda()

    logits = model(images)
    loss = dice_loss(logits, labels) + bce_loss(logits, labels)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

显存不够时优先两个手段:一是MONAI的 CacheDataset 或 persistent_dataset 缓存预处理结果,省掉训练时重复预处理带来的内存和CPU开销;二是减小patch size或batch size。还不行再考虑梯度累积——本质上是多个小batch梯度累加后再更新一次参数,相当于人为放大batch size。

4.4 推理与后处理:肝脏要留最大连通域

训练完成后,用验证集选出的最优模型权重做推理。推理阶段常见问题是输出概率图里有细小的假阳性区域。肝脏在解剖上是基本连续的单一器官,所以标准后处理策略是:

  1. 保留连通域中最大的一个区域(按体素数量取最大连通域)。
  2. 用形态学闭运算填补内部小孔洞。
  3. 计算与真实标签的Dice、IoU、HD95指标。

“只保留最大连通域”听起来粗暴,但对肝脏分割非常有效。很多初学者的分割图在边缘处有一小串杂散斑点,Dice只被拉低一两个点,但肉眼看起来很不专业,加这一步后图像质量明显提升。

训练时重点盯两个东西:训练loss曲线和验证集指标曲线。验证Dice持续上升后进入平台期,说明模型学到了主要特征;训练loss下降但验证loss反弹,就是过拟合了,这时加数据增强、加权重衰减,或缩小网络规模。

5. 毕设答辩和课程报告里,怎么把项目讲出深度

5.1 完整的实验设计:基线之外还要有对比和消融

代码跑通、指标也不错,这是起步。真正让项目成为加分项的,是你对它的理解和扩展。

一个完整的实验设计应该覆盖:基线模型 → 改进/对比模型 → 消融实验 → 可视化分析。不要只跑U-Net拿到一个Dice就完事,那样答辩时你只有干巴巴一个数字,评委问一句“你尝试过哪些方案?为什么用这个方案?”你就卡壳了。

具体可以做的方向,以“深度卷积网络”为核心展开:

  • 网络结构改进:在U-Net编码器部分加入注意力模块(SE、CBAM、坐标注意力),或把backbone换成ResNet34/ResNet50预训练权重,或引入transformer作为编码器(如UNETR、Swin UNETR)。每改一个结构都做一组对比实验,记录Dice和HD95变化。
  • 多尺度特征融合:针对器官大小差异、边界模糊问题,引入特征金字塔或ASPP(空洞卷积金字塔池化)。这里可以解释空洞卷积的原理:通过设置膨胀率扩大感受野而不增加参数量。
  • 训练策略升级:混合精度训练(AMP)加速、学习率warmup、EMA(指数移动平均)、复合损失函数,这些都容易复现且效果直观。

消融实验是答辩中最加分的实验类型。例如:

模型结构 是否使用跳跃连接 验证Dice 说明
U-Net完整结构 是 0.912 基线
去掉跳跃连接 否 0.873 下降约4个点

这个表格直接说明“跳跃连接有效”。同样可以消融“后处理是否保留最大连通域”对最终指标的影响,这也是很能体现工程实力的点。

5.2 答辩连环问:这些坑提前准备好

代码从课程作业变成“你能讲清楚每个模块”的项目,需要从头到尾走一遍函数调用链。答辩和面试中常见的连环问题是:

  • “你的模型输入是什么尺寸?为什么是这个尺寸?”
  • “你的损失函数是怎么算的?Dice Loss和BCE Loss各自的优缺点?”
  • “数据增强对结果有多大影响?有没有做过对照?”
  • “3D和2D输入之间你选择了哪个?为什么?”
  • “如果没有标注数据,你会怎么设计方案?”

这些问题任何一个都需要你亲手跑过实验、看过输出才能回答得流畅。训练时顺手把每轮实验的console输出全部保存下来,整理成实验记录表,答辩材料直接基于它来写,比临场回忆靠谱得多。

再分享一个我自己的经验:做一次“引入一个明显错误”的对照实验,记录它对指标的影响。比如过小的patch size、不做归一化、不用数据增强——把这些负结果记录下来,答辩时非常有说服力,因为它证明了不是所有环节都能砍。这些“负结果”实验反而是资深评委最爱的细节。

5.3 代码组织的规范:让评委30秒定位修改点

关于代码组织,作业和毕设里代码要写成什么样才算“像样”,我的建议是:每个py文件开头写清用途,函数有docstring,config集中在配置文件里,训练、评估、预测三个入口分开。这在答辩时不会直接加分,但评委临时让你改个参数看效果,你的目录结构能在30秒内定位到修改位置,效果立竿见影。

我见过太多同学在答辩现场手忙脚乱地翻代码找参数在哪个文件,这种细节往往决定了评委对“这个学生是否真正理解并独立完成了项目”的判断。

做医学影像分割这类项目,最忌讳的是把它当成普通图像分类来理解。CT数据的三维结构、体素间距、HU值物理意义、重采样对结果的影响,这些才是项目里真正的门槛。你在做这个毕设的过程中,如果能对U-Net的每一个结构设计说出理由,能自己复现一次数据预处理的完整流程,敢跟评委讨论Dice和HD95的评价差异——那这个项目交付的价值就远不止一个“基于深度卷积网络的肝脏分割.zip”了。

最后给你一个实操技巧:跑通基线后,第一时间建立实验记录文档,把每次调整的版本号、超参数、验证指标、显存占用全部记下来。我因为早期懒得记录,后来复现自己改过的模型时靠Git和搜聊天记录才把版本找齐,这一步早做可以省出一周时间。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

超越CBAM与SE:CPCA如何通过通道先验与多尺度卷积重塑医学图像分割注意力 本文深入探讨了CPCA(Channel Prior Convolutional Attention)在医学图像分割中的创新应用,通过结合通道先验与多尺度卷积,有效解决了传统注意力机制如SE和CBAM的局限性。CPCA在保持计算效率的同时显著提升分割精度,特别适用于低对比度的MRI和CT图像处理,为医学影像分析提供了新的解决方案。 阅读详情

相关推荐

MySQL sleep线程过多如何解决?

什么是sleep线程?     sleep线程长时间保持可客户端与服务端的连接状态 导致sleep过多的原因:     使用太多持久连接(高并发系统中 不适合使用持久连接)     程序中 没有及时关闭MySQL连接     数据库优化不完善 导致执行sql语句过慢 解决方法:        vim /etc/my.cnf 配置文件里进行配置 下次需从启服务器的时候直接生效    ...

lmseo5hy的博客 3686

记一次解决mysql进程数居高不下的问题

利用show full processlist查看所有进程列表,发现有茫茫多sleep的进程 利用命令show status like '%thread%'; 查看进行的状态,出现类似以下数据,Threads_connected 的值比较大 Delayed_insert_threads  0      Slow_launch_threads     0      Threads_ca

残月9217 4614

基于深度卷积网络的肝脏分割实战指南:从数据准备到模型部署

在医学影像分析领域,语义分割是一项核心任务,其目标是对图像中的每个像素进行分类,以精确区分目标器官与背景。基于深度卷积网络的图像分割技术,因其强大的特征提取能力,在处理肝脏CT影像等复杂医学数据时表现出显著优势。以U-Net为代表的分割模型,通过编码器-解码器结构结合跳连融合,实现了高精度的像素级预测,有效解决了肝脏边界模糊和个体差异大等难题。该技术广泛应用于肝脏体积测量、术前规划及肿瘤辅助诊断等临床场景。然而,实际项目落地仍面临医学影像格式处理、类别不平衡训练、显存优化及三维重建等多重挑战。本文围绕基于深

weixin_33708633的博客 251

MySQL的Sleep进程占用大量连接解决方法

MySQL的Sleep进程占用大量连接解决方法 链接:http://hi.baidu.com/ratmin/item/eaab88ca9addd425a1b50a74 ========================================== 第一部分为产生大量sleep进程的原理及对应解决方法 第二部分为设置wait_timeout值,有效减少sleep进程 ======

贞正 1万+

通信行业基于MongoDB的安全合规与性能优化:5G时序数据处理、可查询加密及窗口函数应用

内容概要:本文围绕MongoDB在通信行业的深度应用,系统讲解了可查询加密、时间序列集合、窗口函数与性能诊断四大核心技术。通过详实的代码案例,展示了如何利用可查询加密实现敏感数据合规存储与查询,使用时序集合高效处理5G网络KPI等高频写入场景,借助窗口函数进行经营指标的趋势分析,并结合explain()与查询分析器完成性能调优。文章还涵盖分片一致性检查、索引优化等运维实践,全面覆盖通信系统对安全、性能与扩展性的严苛要求。; 适合人群:具备一定数据库基础,从事通信行业研发、架构或运维工作1-3年的技术人员,尤其是参与5G网络监控、客户数据管理或大数据平台建设的相关人员。; 使用场景及目标:① 实现用户手机号、身份证等敏感信息的加密存储与等值查询,满足安全合规要求;② 构建高吞吐、低延迟的5G基站KPI时序数据存储与分析系统;③ 在数据库层直接完成滑动平均、累计求和等经营分析,减少应用层计算负担;④ 诊断慢查询、验证索引有效性,保障系统高性能运行。; 阅读建议:此资源强调理论与实战结合,建议读者在本地或测试环境部署MongoDB 7.0+版本,动手复现文中代码,重点关注schemaMap配置、时序集合参数选择与窗口函数语法细节,并结合explain执行计划理解底层优化机制,从而真正掌握通信级数据架构的设计精髓。

产业园区运营负责人如何在平台建设中科学配置创新资源,提升园区内技术对接效率?.docx

产业园区运营负责人如何在平台建设中科学配置创新资源,提升园区内技术对接效率?

mysql 线程等待时间,解决sleep进程过多的办法

如果你没有修改过MySQL的配置,缺省情况下,wait_timeout的初始值是28800。 wait_timeout过大有弊端,其体现就是MySQL里大量的SLEEP进程无法及时释放,拖累系统性能,不过也不能把这个指设置的过小,否则你可能会遭遇到“MySQLhas goneaway”之类的问题,通常来说,我觉得把wait_timeout设置为10是个不错的选择,但某些情况下可能也会出问

1万+

国央企创新负责人如何借助平台实现技术成果的高价值转化与资源精准配置?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

mysql sleep连接过多的完美解决办法

睡眠连接过多,会对mysql服务器造成什么影响?   严重消耗mysql服务器资源(主要是cpu, 内存),并可能导致mysql崩溃。   造成睡眠连接过多的原因?   1. 使用了太多持久连接(个人觉得,在高并发系统中,不适合使用持久连接) 2. 程序中,没有及时关闭mysql连接 3. 数据库查询不够优化,过度耗时。   那么,如果要从根本上解决sleep连接过多,就得从以...

老张的自言自语 2792

图形化界面无限转圈?CentOS 7的SELinux避坑指南(附命令行修复实录)

本文详细解析了CentOS 7图形界面启动时无限转圈或卡在'starting switch root'的故障原因,主要与SELinux安全策略冲突有关。提供了三种修复方案:临时禁用SELinux、重装策略包和精细调整策略,并分享了长期维护建议,帮助用户平衡系统安全性与可用性。

potato的博客 790

SAP FICO实操:如何修改已发生业务数据的成本中心公司代码(附RKACOR06程序运行指南)

本文详细解析了SAP FICO系统中使用RKACOR06程序修改已发生业务数据的成本中心和公司代码的实操方法。通过实战案例分享,提供从前期准备到后期验证的全流程指南,帮助企业应对组织架构重组或财务核算体系调整时的数据迁移挑战,特别适用于跨公司代码的成本中心划转场景。

weixin_27303545的博客 183

c3p0 高并发mysql 连接sleep情况

撸了今年阿里、头条和美团的面试,我有一个重要发现.......>>> ...

vincent_duan的专栏 347

手把手教你用Simulink给C2000配置SCI串口发送数据(附模型与避坑点)

本文详细介绍了如何使用Simulink为C2000系列微控制器配置SCI串口发送数据,包括硬件资源分配、模型搭建、参数设置及调试技巧。通过代码生成和串口通信实践,帮助开发者高效实现嵌入式系统开发,避免常见通信问题。

weixin_30831529的博客 289

MK-UNet:轻量化多核卷积在医学图像分割中的应用

深度可分离卷积通过分离空间和通道维度计算,显著降低了传统卷积的计算复杂度,是轻量化神经网络设计的核心技术之一。其核心原理是将标准卷积分解为逐通道卷积和1×1点卷积两个步骤,既能保持特征提取能力,又能减少参数量。在医学图像分割领域,这种技术特别适合处理CT、MRI等三维高分辨率数据,可有效平衡计算效率和分割精度。针对传统方法难以应对多尺度病灶的问题,多核深度可分离卷积通过并行集成不同尺寸的卷积核,实现了血管、器官等跨尺度目标的精准分割。MK-UNet正是基于这一创新,通过模块化设计在肝脏CT分割等任务中取得了

weixin_30595035的博客 311

ZLMediaKit在Windows下启用WebRtc编译(64位)

准备软件 cmake-gui vs2017 已经编译好的windows版本openssl(下载地址) 当然,你完全可以自己按照openssl的官网教程自己编译windows版本的openssl libsrtp编译安装 首先,需要将下载好的openssl解压并添加到环境变量。如下图,将下图路径添加到环境变量 其次,下载libsrtp(下载地址) 下载后解压并新建build文件夹,如下图: 在合适位置新建文件夹放置install后的srtp文件,如"D:\develop20..

byna11sina11的博客 1万+

ENSP内使用wireshark进行抓包,并且解析icmp报文

前四位:54 89 98 e8 20 38 为ip报文包的mac地址也就是物理地址。一开始进行抓包是没有icmp报文的,需要我们在ensp中使用pc1请求联通pc9。协议编号后分别为:ip版本、ip首部报文长度、服务类型、ip报文总长度。最后为校验和 、源ip地址、目的ip、从08 00开始为真正的数据。我们需要实验的端口为:0/0/4,也就是抓包第三个交换机内的报文。其中显示的icmp报文就是我们需要解析的ip报文。源mac地址后跟着的就是协议编号: 08 00。根据ip报文包的结构我们进行解析。

2301_81713278的博客 2129

AI辅助开发新体验,用自然语言对话快马平台定制专属卷积神经网络模型

另外,由于数据量有限,希望初始的通道数可以小一些,比如从32开始。比如,在生成SE注意力模块的代码时,它会附带说明:“此处插入Squeeze-and-Excitation模块,首先通过全局平均池化获取通道级别的全局信息(Squeeze),然后通过两个全连接层学习各通道的重要性权重(Excitation),最后将权重乘回原特征图。对于像我这样经常需要快速原型验证的开发者来说,这种从“描述需求”到“生成代码”再到“部署演示”的流畅体验,确实把很多重复性的准备工作简化了,能更直接地聚焦在模型设计和算法本身。

AmberLeopard26的博客 27

Python实战:动态爬取国家地表水水质实时监测数据(附最新代码解析)

本文详细介绍了使用Python动态爬取国家地表水水质实时监测数据的实战方法。针对动态网站数据加载特点,重点解析了如何利用Selenium模拟浏览器操作、结合BeautifulSoup解析数据,并提供了最新的代码实现与常见问题解决方案,帮助开发者高效获取环境监测数据。

app77的博客 270

告别固定感受野:手把手教你用D-Net的动态大内核搞定医学图像分割(附PyTorch代码)

本文详细介绍了D-Net在医学图像分割中的应用,通过动态大内核(DLK)和动态特征融合(DFF)两大创新模块,解决了传统U-Net和Transformer在医学图像分割中的局限性。文章提供了PyTorch代码实现和实战技巧,帮助开发者快速掌握这一先进技术,提升医学图像分割的精度和效率。

weixin_33701251的博客 288

抖音用户评论和ID的采集方法

随着5G时代的普及,各大运营商的套餐纷纷推出,使得流量成本进一步降低。同时5G线路高宽带、低延迟的技术特性和手机普及,让视频用户访问量快速增加。 由于大量的视频工具和拍摄APP的提供,让短视频的拍摄、制作包括发行都变得更加简单便捷,越来越多的普通人可以投入视频创作,创造了更丰富的互联网内容,视频作者从视频推广中能获取粉丝和推广收益。 目前抖音就是目前最重要的短视频平台之一,要及时获取上面的用户评论和ID,需要结合爬虫代理实现采集方案,下面的代码就能快速采集相关信息: package htmlunit; i

ssbt_2020的博客 6782

YOLOv8改进 | 卷积模块 | 用DWConv卷积替换Conv【轻量化网络】

YOLOv8改进,yolov8,yolov8创新,yolov8涨点

kay_545 7142

卷积神经网络(CNN)核心原理、经典架构与实战应用全解析

卷积神经网络(CNN)是深度学习的核心模型之一,其设计灵感源于生物视觉系统。CNN的核心原理在于通过局部连接和权值共享,高效地从网格数据(如图像)中自动学习层次化特征。这种设计不仅大幅减少了参数量,还赋予了模型平移不变性,使其能够从原始像素中逐层抽象出边缘、纹理乃至高级语义信息。在技术价值上,CNN彻底改变了依赖手工特征工程的传统模式,实现了端到端的特征学习与决策,极大地推动了计算机视觉及相关领域的发展。其应用场景极为广泛,从基础的图像分类、目标检测,到复杂的语义分割(如医学影像分析),乃至拓展至图卷积网络

weixin_34377919的博客 360

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

高并发下,解决Mysql 多sleep进程

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33958585的博客 318

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

关掉mysql中sleep程序

linux ,首先登陆mysql:mysql -u root -p set global wait_timeout=100; 关掉等待时间超过100s的程序 重启mysql

a-懒人的专栏 2606

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

关于php应该在何时调用mysql_close()以及pconnect方式和传统方式有何种区别

以前我一直认为,当php的页面执行结束时,会自动释放掉一切。相信很多人都跟我想的一样。但事实证明并不是这样。比如session就不会随着页面执行完毕而释放。 php的垃圾回收机制,其实只针对于php本身。对于mysql,php没权利去自动去释放它的东西。如果你在页面执行完毕前不调用mysql_close(),那么mysql那边是不会关闭这个连接的。如果你是用的是pconnect方式,即使你

1769

MySQL Sleep连接过多问题解决方法

有时候你在mysql中运行SHOW PROCESSLIST;后会发现数据库中有很多这样的进程: 那么造成sleep的原因,有三个,下面是mysql手册给出的解释: 1.客户端程序在退出之前没有调用mysql_close().[写程序的疏忽,或者数据库的db类库没有自动关闭每次的连接。。。] 2.客户端sleep的时间在wait_timeout或interactive_time

PHP程序员 - muzihao2014 3252
上一篇: LaTeX入门指南:从零到精通,高效排版学术文档与数学公式
下一篇: 基于检索增强与迭代精炼的自动化定理证明数据集生成方案
weixin_33857230
博客等级 码龄11年 7738粉丝 1198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值