利用弱监督定位的高分辨率乳腺癌筛查图像的可解释分类器

标准筛查乳房 X 光检查由每个乳房的两张高分辨率 X 射线组成,分别从侧面(“中外侧”或 MLO 视图)和上方(“头尾”或 CC 视图)拍摄,总共四张图像。

乳房X光照片的分辨率非常高,而大多数无症状癌症病变很小,稀疏分布在乳房上,并且可能表现为乳房组织模式的细微变化。

 筛查性乳房X光检查与典型的自然图像有着本质上的不同。乳房X线摄影图像中的感兴趣区域(ROI),例如肿块、不对称性和微钙化,通常较小。局部细节(病变形状)和整体结构(总体乳腺纤维腺体组织密度)和模式,对于准确诊断至关重要。

虽然微钙化在良性和恶性中都很常见,但它们在导管分布中的存在(如图的第三个示例所示)是恶性肿瘤的强烈指标。这与典型的自然图像形成鲜明对比,在典型的自然图像中,最显著区域之外的对象提供的信息很少用于预测图像的标签。

乳房X线摄影图像通常比典型的自然图像具有更高的分辨率。乳房X线摄影图像通常比典型的自然图像具有更高的分辨率,由于GPU内存大小有限,深度CNN架构并不适用于乳腺X线摄影图像。

全局感知多实例分类器(GMIC)

GMIC首先在整个图像上应用低容量但内存效率高的全局模块来生成显著性图,从而提供可能的良性、恶性发现的粗略定位。GMIC能够以其原始分辨率处理筛查性乳腺X光检查图像,同时保持GPU内存的可管理性。

通常指的是一种可视化技术,用于展示模型在做出决策时重点关注输入数据的哪些部分。

为了捕捉小 ROI 中包含的微妙图案,GMIC 随后识别图像中信息量最大的区域,并利用高容量的本地模块从这些区域中提取细粒度的视觉细节。最后,采用一个融合模块,聚合来自全局上下文和局部细节的信息,以预测乳房中是否存在良性和恶性病变。

实验方法

给定灰度图像x\in R^{H,W},我们预测图像级标签y=\begin{bmatrix} y^{b}\\ y^{m} \end{bmatrix},其中y^{b},y^{m}\in \{0,1\}表示x中是否存在良性/恶性病变。

全局感知分类框架

一个类似于放射科医生诊断程序的分类框架,首先使用全局网络f_{g}从输入图像x中提取特征图h_{g}h_{g}=f_{g}(x)

类似于放射科医生粗略地扫描整个图像得出结果。

然后,我们应用具有sigmoid非线性的1\times 1卷积层h_{g}转换为两个显著性图A^{b},A^{m}\in R^{h,w}用来表示良性和恶性病变的大致位置。每一个元素A^{c}_{i,j}\in [0,1],其中c\in \{b,m\},可以用来表示空间位置(i,j)对预测良性 / 恶性病变存在的贡献。若A是A^{b},A^{m}的串联,那么我们可以计算A

A=sigmoid(conv_{1\times1}(h_{g}))

由于GPU内存有限,在之前的工作中,输入图像x通常是下采样的结果。然而,对于乳房X光检查图像,下采样会严重扭曲重要的视觉细节,例如病变边缘,并模糊小的微钙化。我们可以通过降低全局网络f_{g}的复杂性来控制内存消耗。f_{g}无法捕捉所有尺度的图像中包含的所有微妙图案,为了弥补这一点,我们可以利用高容量本地网络f_{l}从一组信息区域中提取细粒度的细节。


第二阶段,我们使用A从x中检索K个信息最丰富的补丁:

\{\widetilde{x}_{k}\}=retrieve\_roi(A)

其中retrieve\_roi表示启发式补丁选择过程,该过程可以被视为类似于放射科医生专注于可能对应于病变的区域。然后使用 f_{l} 处理所有选定补丁\{\widetilde{x}_{k}\}包含的细粒度视觉特征\{\widetilde{h}_{k}\},并且由聚合器f_{a}聚合成向量z

\{\widetilde{h}_{k}\}=f_{l}(\widetilde{x}_{k})z=f_{a}(\{\ \widetilde{h}_{k}\})

最后,融合网络f_{fusion}(h_{g},z)结合全局结构h_{g}和局部细节z的信息来生成预测\hat{y}。类似于对放射科医生进行建模,综合考虑全局和局部信息以提供完整的诊断。


模型参数化

生成显著性图:为了处理高分辨率图像,同时保持GPU内存消耗可控,将f_{g}参数化为ResNet-22,与规范的ResNet架构相比,ResNet-22只多了一个残差块,每个卷积层中只有四分之一的卷积核,更深的 CNN 具有更大的感受野,可以捕获高分辨率图像中更丰富、更复杂的特征。缩小网络宽度可以减少隐藏单元的总数,从而减少 GPU 内存消耗。

ResNet网络结构详解icon-default.png?t=N7T8https://aistudio.baidu.com/projectdetail/5113406很难定义直接比较显著性图 A 和癌症标签 y 的损失函数,因为 y 不包含定位信息。为了训练f_{g}函数,我们使用聚合函数f_{agg}(A^{c}):R^{h,w}x \mapsto [0,1]将显著性图转换为图像级类别预测。

\hat{y}^{c}_{global}=f_{agg}(A^{c})

通过聚合函数f_{agg},我们可以通过反向传播y\hat{y}_{label}之间分类损失的梯度来训练f_{g}

全局平均池化(GAP)会稀释预测,因为A^{c}的大多数空间位置对应于背景并且只能提供很少的训练信号。另一方面,使用全局最大池化(GMP)时,梯度通过单个空间位置进行反向传播,使得学习过程缓慢且不稳定。因此,将聚合函数定义为:

 H^+表示包含A^c中前t\%值的位置的集合。其中t是超参数。其中GAP相当于t=100,GMP相当于t=1

获取感兴趣区域补丁

设计一种贪婪算法从输入x中检索K个补丁作为ROI,\widetilde{x}_{k}\in R^{h_c,w_c},在所有实验中w_c=h_c=256,在每次迭代中,retrieve\_roi 贪婪地选择矩形边界框,将每个选定的边界框映射到输入图像上的相应位置。同时需要确保提取的ROI块不会彼此显著重叠。

利用补丁中的信息

通过retrieve\_roi,我们可以集中学习一组选定的小但信息丰富的补丁\{\widetilde{x}_k\}。之后我们可以应用具有更宽或更深的本地网络f_l,利用细粒度的视觉特征,从每个补丁\{\widetilde{x}_k\}中提取\widetilde{h}_k\in R^L

由于 ROI 块是使用粗显著图检索的,因此每个块中携带的与分类相关的信息差异很大。

因此我们可以使用门控注意力机制(GA),允许模型有选择地合并来自所有补丁的信息。GA使用sigmoid函数提供可学习的非线性,从而提高模型的灵活性。

计算每个补丁的注意力分数

 \bigodot表示逐元素乘法,w\in R^L,V\in R^{L\times M},U\in R^{L\times M},设置L=512,M=128,此过程计算出的注意力加权表示为:

z=\sum_{k=1}^{K}\alpha _k \widetilde{h}_k

其中注意力分数\alpha _k\in [0,1]表示每个补丁\widetilde{x}_k的相关性。然后将z传递到具有Sigmoid函数的全连接层以生成预测。

\hat{y}_{local}=sigm(w_{local}^T z)

其中w_{local}^T是可学习的参数。

信息融合

为了结合显著图和ROI补丁的信息,我们在特征图h_g上应用全局最大池化并将其与 z 连接,然后将级联表示馈入具有sigmoid激活的全连接层以产生最终预测。

 学习GMIC的参数

为了限制显著图仅突出显示重要区域,我们对A^c进行 L1 正则化以使显著图更加稀疏:

L_{reg}=\sum _{(i,j)}|A^{c}_{i,j}|

该模型可以使用随机梯度下降和损失函数进行端到端训练:

端到端训练(End-to-End Training)是指在学习过程中不进行分模块或分阶段训练,直接优化任务的总体目标

实验和结果

纽约大学乳腺癌筛查数据集包括来自 141,472 名患者的 229,426 项检查(1,001,093 张图像)

数据集分为不相交的训练集 (186,816)、验证集 (28,462) 和测试集 (14,148)。所有图像均裁剪为 2944 × 1920 像素,并归一化至零均值和单位标准差。

在测试阶段,我们同样应用数据增强和 10 次随机增强的平均预测来计算给定图像的预测。验证期间不使用数据增强。

由于每个乳房都与两个图像(CC 和 MLO 视图)相关联,并且我们的模型为每个图像生成预测,因此我们将乳房级别预测定义为两个图像级别预测的平均值。

分类性能

基线:将所提出的模型与三个基线进行比较。我们首先训练 ResNet-34来预测乳房中是否存在恶性和良性病变。ResNet-34是ResNet架构中容量最高的模型,可以以其原始分辨率处理乳房X光检查。

模型的“容量”通常指的是模型能够学习和表示复杂函数或模式的能力。换句话说,它衡量了模型能够存储和记忆训练数据中的信息以及泛化到新数据的能力。

DMV-CNN (深度多视图-CNN)还可以通过补丁级分类器生成的像素级热图进行增强。然而,训练补丁级分类器需要手工注释的分割标签。Faster R-CNN,利用分割标签来定位与恶性或良性病变相对应的锚框。与依赖分割标签的 DMV-CNN 和 Faster RCNN 不同,GMIC 可以仅使用图像级标签进行训练。

图像级标签是指对图像的内容进行标识和描述的一种方式;

图像级标签是对图像的内容进行标识和描述;

分割标签是指对图像进行像素级别的分割,将图像中的每个像素分配到不同的类别或区域中

超参数调整

为了在模型架构之间进行公平比较,我们通过随机搜索针对 ResNet-34 基线和 GMIC 优化超参数。对于所有模型,我们在对数尺度上搜索学习率\eta \in 10^{[-5.5;-4]},对于最后一个卷积层中具有1\times 1卷积核的GMIC和ResNet-34,在对数尺度上遍历正则化权重10^{[-5.5;-3.5]}

表现结果

人机混合

\hat{y}_{hybrid}=\lambda \hat{y}_{reader}+(1-\lambda )\hat{y}_{GMIC}

人机混合中使用的模型越准确,其预测的权重就越大。

本地化表现

为了评估GMIC的定位性能,我们使用验证集选择具有最高DSC的模型进行恶性肿瘤定位。在推理过程中,我们使用最近邻插值对显著性图进行上采样,以匹配输入图像的分辨率。

DSC是Dice Similarity Coefficient的缩写,用于度量两个集合的相似度,取值范围为[0,1],值越大表示两个集合越相似。它常用在计算闭合区域的相似性

我们可视化从测试集中选择的四个样本的显著性图。显著性图在带注释的病变上高度激活,这表明我们的模型能够在没有像素级监督的情况下检测可疑病变。注意力分数\alpha _k高度集中在与注释病变重叠的ROI块上。

第三个实例中,良性的显著性图识别出三个异常。尽管只有最上面的异常被升级为活检并由放射科医生注释,但放射科医生的报告证实这两个非活检结果具有高良性概率和低恶性概率。

第四个实例中,模型与数据集中的注释之间存在某种程度的分歧。恶性显著图仅突出显示具有节段性粗异质钙化的大恶性病变的一部分。这种行为主要与f_{agg}的设计有关:固定的池化阈值t不可能对所有大小的ROI都是最佳的。

从左到右:用分割标签注释的输入图像(绿色=良性,红色=恶性),ROI补丁的位置(蓝色方块),良性类的显着性图,恶性类的显着性图,以及带有注意力分数的ROI补丁。

虽然人类专家被要求注释整个病变,但 CNN 往往只强调信息最丰富的区域。虽然不存在良性病变,但良性显著性图仍然突出显示与恶性肿瘤显著性图中相似的区域,但概率低于恶性肿瘤显著性图。 事实上,具有这种形态和分布的钙化也可能是由良性病理生理学引起的。

当放射科医生在图像中很难看到病变时,GMIC能够提供有意义的定位。恶性发现的显著性图成功地识别了筛查乳房X光照片上的恶性病变。

消融实验

探索全局模块、局部模块、融合模块、补丁级注意力和所提出的 top t% 池化的有效性。

评估通过利用像素级标签以及将 GMIC 与 DMV-CNN 和 Faster R-CNN 集成可以提高 GMIC 的性能多少。所有消融实验均基于 GMIC-ResNet-18 模型。

全球和本地信息的协同作用

在GMIC的初步版本中,最终预测定义为\frac{1}{2} (\hat{y}_{global}+\hat{y}_{local}),我们需要通过融合模块增强GMIC,该融合模块结合了来自全局特征和局部细节的信号。为了评估融合模块的有效性,我们比较了仅使用全局特征、仅使用局部特征、两个模块的平均预测以及两个模块融合的性能。\hat{y}_{fusion}在分类良性和恶性病变方面获得更高的AUC。融合模块促进了有效的协同作用,超越了对两组参数进行平均预测所产生的集成效应。

为了评估补丁式注意力的有效性,我们将所提出的模型与始终对所有补丁分配相同注意力的变体进行比较。同时,我们可以从输入对象中随机选择补丁。使用具有前3%池化的GMIC-ResNet-18模型作为基础模型,

感兴趣区域建议和补丁式注意力

GMIC应用两种机制来控制提供给本地模块的补丁的质量。

首先,retrieve\_roi算法利用显著图中的定位信息并贪婪地选择输入图像的信息块,然后使用门控注意力网络对这些选定的补丁进行加权。

一种始终为每个补丁分配相同的注意力分数,另一种则在不使用显著性图的情况下随机采样补丁。如果将retrieve_roi算法替换为随机采样,则本地模块的性能会显着下降。这些结果表明,补丁式注意力和retrieve_roi过程对于本地模块做出准确的预测至关重要。

聚合函数

当使用 t = 2 的 top t% 池化时,GMIC-ResNet-18 在识别恶性病例方面实现了最高的 AUC。

GMIC-ResNet-18 还通过 top t% 池化获得了比 GAP 或 GMP 更好的本地化性能。当 t 分别设置为 3% 和 5% 时,可实现定位恶性和良性病变的最高 DSC。当 t 很小时,显着图往往会突出显示一个小区域。当 t 很大时,突出显示的区域会增大。理想情况下,t的选择应反映图像中包含的病变的真实大小,并且不同的图像可以使用不同的t。

ROI感兴趣区域的数量

我们用 GMIC 进行了实验,改变补丁的数量 K。我们训练了五个具有最高 t% 池化 (t = 3%) 的 GMIC-ResNet-18 模型,当 K 较小时,增加 K 可以提高分类性能。 \hat{y}_{local}上的改进比 \hat{y}_{fusion} 上的改进更明显,因为 \hat{y}_{fusion}也利用了全局特征。然而,当 K > 3 时,分类性能饱和。

使用分段标签

评估在训练期间使用像素级标签可以提高 GMIC 的性能多少

我们使用像素级标签来训练补丁级模型,该模型对乳房X光照片的256\times 256像素补丁块进行分类:给定斑块中是否存在恶性和良性发现。之后,我们以滑动窗口的方式将补丁级分类器应用于每个全分辨率图像,以创建两个热图。一个包含每个像素的恶性发现的估计概率,另一个包含估计概率一个良性的发现。我们将输入图像与这两个热图连接起来,使用超参数优化设置来训练 30 个 GMIC-ResNet18 模型。

对于足够大的数据集,仅图像级标签就足以捕获大部分信号,而来自像素级分割标签的附加定位信息仅略微提高了 GMIC 的性能。

GMIC与其他模型集成

\hat{y}_{ensemble}=\lambda_{1}\hat{y}_{GMIC}+\lambda_{2}\hat{y}_{Faster R-CNN}+\lambda_{3}\hat{y}_{DMV-CNN}

其中\lambda _1+\lambda _2+\lambda _3=1,三种类型尽管 AUC 方面的改进很小,但模型是互补的。

相关工作

高分辨率 2D 医学图像分类

与许多 ROI 足够大的自然图像不同,医学图像中的 ROI 通常很小并且稀疏地分布在图像上。在整个图像上不加区别地应用 CNN 可能会在 ROI 之外产生相当大的噪声。此外,输入图像通常会被下采样以适应 GPU 内存。积极地对医学图像进行下采样可能会扭曲重要的细节,从而导致正确的诊断变得困难。

提出了几种方法来选择与分类任务相关的补丁,而不是在所有像素块上应用补丁级模型。

弱监督目标检测

使用图像级标签训练的 CNN 分类器能够在像素级执行语义分割,这通常通过两个步骤来实现。首先,主干 CNN 将输入图像转换为突出显示判别区域的显著性图。然后,全局池化操作将显著性图折叠成标量预测,这使得整个模型进行端到端训练。

弱监督目标检测(WOSD)消除了模型对分割标签的依赖,为了进行图像级预测,大多数现有模型仅利用显着图中的全局信息,而这通常会忽略细粒度的细节。

总结

医学图像在很多方面与典型的自然图像不同,例如更高的分辨率和更小的投资回报率。此外,全局结构和局部细节在医学图像的分类中都起着至关重要的作用。

一种新颖的框架 GMIC,用于对高分辨率筛查乳房 X 光照片进行分类。 GMIC 首先在整个图像上应用低容量但内存高效的全局模块来提取全局上下文并生成显著性图,以提供可能的良性/恶性发现的粗略定位。然后,它识别图像中信息最丰富的区域,并利用具有更高容量的本地模块从所选区域中提取细粒度的视觉细节。最后,它采用一个融合模块,聚合来自全局上下文和局部细节的信息以产生最终的预测。

GMIC 能够以节省内存的方式处理输入图像,从而能够以其原始分辨率处理医学图像,同时仍然使用高容量神经网络来获取精细的视觉细节。尽管仅使用图像级标签进行训练,GMIC 仍能够生成提供额外可解释性的像素级显著性图。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WebGL异步绘制多点

异步绘制线段 1.先画一个点 2.一秒钟后&#xff0c;在左下角画一个点 3.两秒钟后&#xff0c;我再画一条线段 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"…

[2024年4月最新]Python安装教程

一、Python下载 1、进入Python官网 官网地址&#xff1a;https://www.python.org 2、点击【Downloads】展开后点击【Windows】跳转到下载python版本页面&#xff0c;选择"Stable Releases"稳定版本&#xff0c;我下载的是Python 3.10.10版本&#xff0c;所以找到【…

IDEA中无法保存设置 Cannot Save Settings

确定原因: 在IDEA中父工程不应该存在有子工程的相关东西 首先,这是我的DCYJ项目(观察右侧的Content Root) 其次,这是我的EAPOFode项目(观察右侧的Content Root爆红处) 最后我将DCYJ项目右侧的Content Root全部删掉

共享单车到底是什么通信原理

我们经常骑的共享单车到底是什么通信原理&#xff0c;有人了解过吗&#xff1f; 一、智能车锁 共享单车最核心的硬件是智能车锁&#xff0c;主要用于实现控制和定位功能。 车锁内集成了嵌入式芯片&#xff08;通信模块&#xff09;&#xff0c;GPS模块和物联网SIM卡。 智能锁制…

DP例题详解(二)最短编辑距离和编辑距离

902. 最短编辑距离 - AcWing题库 #include<bits/stdc.h>using namespace std;const int N1010;int n,m; char a[N],b[N]; int f[N][N];int main() {cin>>n>>a1;cin>>m>>b1;for(int i0;i<m;i)f[0][i]i;for(int i0;i<n;i)f[i][0]i;//先初始化…

用户状态保持机制-Session

0、业务需求 会话&#xff1a;web应用中的会话是指一个客户端浏览器和服务器之间连续发生的一系列请求和响应的过程。 会话状态&#xff1a;web应用中的会话状态是指web服务器与浏览器在会话过程中产生的状态信息&#xff0c;借助会话状态&#xff0c;服务器能够把属于同一会话…

线性表概念及实现1

文章目录 前言一、线性表1.定义2.特点3.一般线性表的抽象数据类型定义 二、线性表的顺序存储&#xff08;顺序表&#xff09;1.基本概念2.数组实现顺序表3.顺序表中基本操作的具体实现 总结 前言 T_T此专栏用于记录数据结构及算法的&#xff08;痛苦&#xff09;学习历程&#…

纯小白蓝桥杯备赛笔记--DAY14(计算几何)

文章目录 计算几何基础平面几何距离圆的周长和面积圆与圆之间的关系&#xff1a;海伦公式计算三角形面积点到直线的距离 点积和叉积例题&#xff1a; 点和线的关系点的表示形式和代码判断点在直线的那边点到线的垂足点到线的距离例题-1242例题-1240升级--点到线段的距离--1285 …

指定世界TOP名校|医学研究学者公派美国麻省理工学院做博士后

W医生公派博士后条件为&#xff1a;世界TOP100的知名高校&#xff0c;研究方向相符且前沿。最终我们用世界顶级高校-美国麻省理工学院&#xff08;MIT&#xff09;的博士后邀请函助其获得单位资助&#xff0c;顺利通过签证并出国。 W医生背景&#xff1a; 申请类型&#xff1a…

LC 501.二叉搜索树中的众数

501.二叉搜索树中的众数 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返回。 假定 …

全国贫困县DID数据(2008-2022年)

数据来源&#xff1a;国W院扶贫开发领导小组办公室 时间跨度&#xff1a;2008-2022年 数据范围&#xff1a;各县域 数据指标 年份 县域名称 所属地市 所属省份 县域代码 是否贫困县(是为1&#xff0c;否为0) 参考文献&#xff1a; [1]马雯嘉,吴茂祯.从全面脱贫到乡村振兴…

VQ-BeT: Behavior Generation with Latent Actions 代码复现(Mujoco 安装)

代码地址&#xff1a;https://github.com/jayLEE0301/vq_bet_official.git 创建环境 conda create -n vq-bet python3.9 conda activate vq-bet拉取库 git clone https://github.com/jayLEE0301/vq_bet_official.git export PROJ_ROOT$(pwd)安装pytorch conda install pyto…

AI论文速读 | 线性时间序列预测模型分析

论文标题&#xff1a;An Analysis of Linear Time Series Forecasting Models 作者&#xff1a; William Toner&#xff0c; Luke Darlow 机构&#xff1a;爱丁堡大学&#xff08;Edinburgh&#xff09;&#xff0c;华为研究中心&#xff08;爱丁堡&#xff09; 论文链接&am…

开源项目若依放大招了?

前言 鉴于之前写了篇插件式相关的文章&#xff0c;阅读量比起其它文章可不要好太多&#xff0c;所以我决定继续这个主题&#xff01; 以前我们公司用的就是Ruoyi&#xff0c;代码比较简单易懂。但是有些功能确实用不上&#xff0c;比如部门和岗位&#xff0c;每次新项目我拉了…

Docker安装及开启远程访问

这几天有人问我docker是怎么开启远程服务的&#xff1f; 正好之前我做过这件事情&#xff0c;并且写了相关的笔记&#xff0c;现在整理为一篇博客发出来。 安装Docker 首先更新一下自己的yum版本 yum update安装一下所需要的软件包 yum-config-manager --add-repo http://…

Java复习第十七天学习笔记(转发、重定向,GET,POST),附有道云笔记链接

【有道云笔记】十七 4.3 转发、重定向、Get、POST、乱码 https://note.youdao.com/s/GD5TRksQ 一、转发 转发&#xff1a;一般查询了数据之后&#xff0c;转发到一个jsp页面进行展示 req.setAttribute("list", list); req.getRequestDispatcher("student_lis…

套接字通信模型

本文内容主要参考《Android图形显示系统》 套接字也就是socket&#xff0c;一般用于网络中两个主机之间应用进程进行通信&#xff0c;在同一个主机也可以使用套接字完成进程之间的通信。 在图形显示系统中&#xff0c;用到套接字进行通信的地方主要有VSync信号的分发以及输入事…

Linux:动态库加载、编址

目录 一、库的概念 二、动静态库的加载 2.1绝对编址与相对编址 2.1一般程序的加载 三、动态库的加载 一、库的概念 库默认就是一个磁盘级文件&#xff0c;所以在执行代码时&#xff0c;库和可执行程序都会被加载到内存中&#xff0c;从原理上&#xff0c;库函数的调用依旧…

软件测试:遇到bug怎么分析,这篇文章值得一看

为什么定位问题如此重要&#xff1f; 可以明确一个问题是不是真的“bug” 很多时候&#xff0c;我们找到了问题的原因&#xff0c;结果发现这根本不是bug。原因明确&#xff0c;误报就会降低多个系统交互&#xff0c;可以明确指出是哪个系统的缺陷&#xff0c;防止“踢皮球”&…

C--函数指针与回调函数

文章目录 定义函数指针qsort中的回调函数自实现排序的回调函数 定义 回调函数&#xff0c;当一个函数执行时&#xff0c;中途调用其他定义好的函数来帮助实现功能&#xff0c;再继续执行这个函数 函数指针 类型为函数的指针&#xff0c;如下 void func() { } int main() {…