【解决视网膜长尾数据】关系子集学习、射击法、加权知识蒸馏

长尾分布下的视网膜:关系子集学习、射击法、加权知识蒸馏

    • 核心思想
      • 问题:类别分布的不平衡问题
      • 问题:共现标签
      • 问题:特定区域和特征的类别关联
      • 解法:划分子集解决样本不平衡问题
      • 解法:射击法解决共现标签问题
      • 解法:划分子集解决,特定解剖区域、特征的类别
      • 效果
    • 总结

 


论文:https://arxiv.org/pdf/2104.11057.pdf

 

核心思想

论文讨论 3 个关于医学影像分析的挑战,以及相应的解决方案。

问题:类别分布的不平衡问题

首先,论文提到的第一个问题是数据中类别分布的不平衡

在很多情况下,一些类别的样本非常多,而其他类别的样本则很少。

为了解决这个问题,建议把数据按照一定的先验知识,比如区域或表型信息,分成几个小的类别子集。

这样一来,模型就能专注于学习每个子集的特点,从而更有效地处理数据不平衡的问题。


表中列出了每个数据集中拥有不同数量标签的图像数。

  • 在Lesion-10数据集中,有5929个图像只包含一个病变标签,1569个图像包含两个病变标签,等等。
  • 在Disease-48数据集中,包含两个及以上疾病标签的图像超过了22000张。

 

问题:共现标签

接下来,第二个问题,即共现标签

在医学影像里,一个样本可能同时包含多个疾病的标签,这就使得分析变得复杂。

但共现标签(Co-occurring labels)和多标签(Multi-label)不完全相同。

多标签 指的是每个样本可以同时拥有多个标签。在多标签问题中,每个实例或数据点不是简单地被分配到单一的类别,而是可以关联到多个类别。

例如,在一个医学图像的多标签分类问题中,一个图像可能同时被标注为包含“黄斑变性”和“糖尿病视网膜病变”。

共现标签 是多标签数据集中的一个现象,其中某些标签组合经常一起出现在同一实例中。共现标签意味着数据集中某些标签组合比其他组合更常见。

例如,如果在很多图像中“高血压”和“心脏病”这两个标签经常同时出现,那么它们就是共现标签。

在多标签学习中,共现标签可能会对模型训练产生影响,因为模型可能会学习到这些标签间的依赖关系。

理解共现关系可以帮助改进分类器的性能,使其能够更准确地预测标签的这种组合。

处理共现标签的常见方法包括损失函数的设计,这可以帮助模型区分哪些标签组合是重要的,并学习如何正确地预测它们。

为此,提出了一种加权知识蒸馏的方法。

这个方法通过训练几个不同的“教师”模型,每个模型专注于不同的类别子集,然后再把这些模型的知识结合到一个“学生”模型中。

目的是在处理多标签问题时,让模型能够更好地区分不同的疾病标签。

 

问题:特定区域和特征的类别关联

最后,论文解决了第三个问题,即特定区域和特征的类别关联问题

有些疾病与特定的解剖区域,比如视盘或黄斑,或者特定的病理特征,比如出血,有关。

建议根据这些关联,将疾病分到相关的类别子集中。

这种方法可以让模型更加专注于学习与特定区域或特征相关的疾病,提高分析的准确性。

视网膜疾病数据分布的情况,特别是它呈现出长尾分布的特点。

在长尾分布中,头部的类别(图中的“Head”区域)有大量的图像,而尾部的类别(图中的“Tail”区域)则图像数量急剧减少。

这种分布表明有一小部分疾病类别的样本数量很多,而大多数疾病类别的样本数量较少。

在图中的“Class Distribution”放大区域中,不同颜色的圆点代表不同的类别,并且它们之间的箭头表示标签之间的共现关系。

这意味着某些疾病类别的标签往往同时出现,表明存在某种关联。

例如,一个图像可能同时被标记为具有两种或多种疾病。

在长尾部分,也看到了一些具体的视网膜图像,可能用以说明数据集中那些较少见的类别。

整体来说,这张图旨在展示视网膜疾病在数据集中的不均匀分布,并且指出标签共现是在不同类别之间常见的现象。

 
标签共现导致的分类困难。


上图,展示数据集中不同类别之间的共现关系。

  • 色块的深浅代表了不同类别共现的频率,深色表示共现较少,亮色表示共现较多。

标签共现(Label Co-occurrence)指的是在多标签数据集中,不同的标签(疾病类别)经常一起出现在同一个样本上。

例如,一个视网膜图像可能同时被标记有“出血”和“渗出物”的标签,这就是两个标签共现的情况。

在医学影像分析和其他多标签分类任务中,标签共现是一个常见现象。

反映了真实世界中的疾病关联,比如某些视网膜疾病可能会同时发生,或者一个疾病可能导致多种病理变化。

识别和理解这些共现关系对于建立准确的预测模型非常重要,因为它可以帮助模型学习不同疾病标签之间的关系,从而改善对每个独立疾病标签的识别能力。

 
作者提出一个框架,针对的是处理长尾分布样本的情况:
框架分为两个阶段:

  • 第一阶段,原始的长尾样本根据关联类别约束被划分成多个子集。

    这些子集按照样本数量的多少分为“Many”(多)、“Medium”(中等)和“Few”(少),或者按照解剖区域分为“Optic Disc”(视盘)、“Macula”(黄斑)和“Others”(其他),或者按照特征分为“Hemorrhages”(出血)、“Exudates”(渗出物)和“Others”(其他)。

    这样的划分帮助模型更好地理解和学习那些不常见的类别。

  • 第二阶段,训练一个统一的“学生”模型,该模型使用所训练的“教师”模型的参数,并应用加权知识蒸馏损失(Weighted Knowledge Distillation Loss)。

    在这里,"教师"模型专注于特定的子集,并将学习到的知识通过知识蒸馏的方式传递给“学生”模型。

    图中展示了不同的“教师”模型,它们各自处理不同的子集,并通过权重和标签的调整来影响“学生”模型的训练。

这张图也展示了损失函数的计算方式,其中包括交叉熵损失( L C E L_{CE} LCE)和知识蒸馏损失( w L K D wL_{KD} wLKD)。

最终的损失(( L ))是这两部分损失的组合,用于优化统一模型的参数。

总的来说,这个框架旨在通过创建多个专注于特定子集的“教师”模型和一个统一的“学生”模型来解决长尾分布问题,同时考虑到疾病标签的共现和类别间的关系。

这种方法旨在提高模型对稀有类别的识别能力,并提高在多标签分类任务中的性能。

 

上图显示了不同医学征象(病变)在视网膜的特定区域中出现频率的热图。

这些热图帮助识别出某些医学征象,更倾向于在视网膜的哪个区域出现。

热图被分为四个部分,每个部分对应不同的视网膜区域:

  • a) 全局基金地区(global fundus areas)
  • b) 黄斑区(macula)
  • c) 视盘区(optic disc)
  • d) 血管区(vessels)

在每个部分中,列出了不同的医学征象,如出血(hemorrhage)、色素沉着(pigmentation)、硬渗出物(hard exudates)、软渗出物(soft exudates)、视网膜上膜(epiretinal membrane)、黄斑裂孔(macular hole)等。

通过这些热图可以观察到,例如出血和色素沉着在全局区域内出现得更为频繁,而特定的征象如黄斑裂孔主要出现在黄斑区。

 

表格提供了基于区域的子集和相应病变/疾病的列表。

例如,

  • 视盘区经常与青光眼(Glaucoma)和视网膜髓样神经纤维(retinal myelinated nerve fiber)等病变相关联;
  • 黄斑区则与视网膜上膜、硬渗出物和黄斑裂孔等相关;
  • 血管区与动脉静脉交叉现象(arteriovenous crossing phenomenon)和血管周围鞘(perivascular sheathing)等相关。

这些数据和可视化有助于研究人员和算法开发者更好地理解特定病变在视网膜上的分布规律,并可以用于提高自动疾病诊断算法的准确性。

 

解法:划分子集解决样本不平衡问题

首先是样本不平衡的问题

举个例子,如果咱们的数据集里有1000张糖尿病视网膜病变的图片,但只有100张青光眼的图片,这就是不平衡。

解决的办法是划分关系子集,比如把所有的视网膜病变图片分成几个小组,每个小组里的疾病类型和图片数量都差不多,这样每种疾病的重要性就能得到平等对待。

如果简单地把所有的糖尿病视网膜病变和青光眼图片分成若干组,那么糖尿病的数据依然会很多。

这里的关键在于如何划分这些子集,使得每个子集内部的数据分布更加平衡。

咱们可以这样做:

  1. 按疾病严重程度划分:如果这些糖尿病视网膜病变图片中,有严重的、中等的和轻微的变化,咱们可以将它们按照严重程度分成几个子集。

    这样,即使糖尿病图片多,但每个严重程度的类别内部是平衡的。

    同理,如果青光眼图片中也有不同程度的变化,也可以这样分。

  2. 按解剖区域划分:另一个方法是按照疾病影响的视网膜区域来分组。

    比如,糖尿病视网膜病变可能主要集中在黄斑区,而青光眼影响的是视神经盘周围区域。

    这样分组后,每个区域内部的数据量可能会更接近。

  3. 按病变特征划分:也可以根据病变的特征,如出血、渗出物等,将图片分组。

    这样,不同疾病但有相似特征的图片就会被归为一类,这有助于学习病变特征,而不是单纯关注疾病标签。

目标是让模型能够从每个子集中学到有用的信息,而不是仅仅因为某个疾病的样本多就偏向于它。

  • 轻度子集:300张糖尿病视网膜病变 + 100张青光眼 = 400张图片
  • 中度子集:400张糖尿病视网膜病变 + 100张青光眼 = 500张图片
  • 重度子集:300张糖尿病视网膜病变 + 100张青光眼 = 400张图片

平衡并不是指每个疾病的样本数量完全相同,而是说在每个严重程度的子集中,疾病之间的比例更加接近,使得模型能够对每种严重程度的特征进行学习,而不是由于某一疾病样本数量过多而导致的偏差。

通过这样的划分,每个疾病,无论其在数据集中的总数量如何,都能在至少一个子集中得到充分的代表,从而帮助模型更均衡地学习。

 


解法:射击法解决共现标签问题

第二个问题,多标签分类中标签共现的问题

用射击法划分子集的好处就是,可以将相似数量的病变标签分在一起,避免因为某个标签特别多而影响模型对其他标签的学习。

如果糖尿病视网膜病变的图片有1000张,青光眼的图片有100张,同时有糖尿病和青光眼的图片有50张,我们可能会将它们分为三个子集:

  • “多射击子集”:只包含糖尿病视网膜病变的图片
  • “中射击子集”:只包含青光眼的图片
  • “少射击子集”:同时包含糖尿病和青光眼的图片

为了让模型平等地学习每种疾病,我们可以进一步平衡这些子集。

例如,在“少射击子集”中,因为标签共现的图片数量少,我们可以通过数据增强等技术来增加样本数量,或者调整模型训练时的权重,以确保这部分数据对模型的影响与其他子集相当。

分别在这些子集上训练模型,这样每个模型就可以在没有其他类别干扰的情况下学习特定的标签信息。

最后,我们可以用知识蒸馏等技术,将这些单独训练的模型的知识结合起来,训练一个综合所有子集信息的“学生”模型。

让模型对每种疾病标签都有比较好的识别能力,即使某些疾病的图片数量比其他的少。

这样,模型的识别能力不会偏向于那些标签更多的类别。
 


解法:划分子集解决,特定解剖区域、特征的类别

第三个问题,疾病在特定解剖区域集中出现的问题

不同疾病出现不同区域。

比如,糖尿病视网膜病变可能主要在黄斑区(视网膜中心)出现,而青光眼可能更多影响到视神经盘。

基于区域的子集划分就是根据这种解剖特征来分组,让模型能专注于特定区域的特征。

步骤1:识别和标记区域

  • 我们首先需要对影像数据中的不同区域进行识别和标记。
  • 由眼科医生完成,他们能够识别出黄斑区、视神经盘等解剖结构。

步骤2:创建子集

  • 然后,我们按照这些区域划分数据集。
  • 所有主要显示黄斑区变化的图像构成一个子集,所有主要显示视神经盘变化的图像构成另一个子集。
  • 黄斑区子集:包含所有糖尿病视网膜病变的图像。
  • 视神经盘子集:包含所有青光眼的图像。

步骤3:模型训练

对于每个子集,我们独立训练一个机器学习模型。

这样,每个模型都可以专注于学习影响特定区域的疾病特征。

  • 黄斑区模型:只学习和识别黄斑区的病变,比如糖尿病视网膜病变的特征。
  • 视神经盘模型:只学习和识别视神经盘的病变,比如青光眼的特征。

步骤4:综合和评估

在独立训练之后,我们评估每个模型的性能,确保它们各自能准确识别相应区域的病变。

包括在一个综合的测试集上测试,该测试集包含了影响不同视网膜区域的多种疾病。

通过这种方法,我们不仅提高了模型对特定区域病变的识别能力,而且还使得模型可以更精准地针对具体疾病进行诊断。
 


第四个问题是,很多疾病有相似的病理特征

就像糖尿病视网膜病变和高血压视网膜病变,都可能有出血(出现血斑)和渗出物(视网膜上的小白点)特征。

基于特征的子集划分就是把这些有共同特征的疾病分在一起,这样模型就可以学习到哪些特征是这几种病共有的。

我们现在要构建一个能够识别这些特征的模型。

但是,如果我们把所有DR和HR的图片都混在一起训练模型,模型可能会学习到哪些特征与特定疾病相关,而不是哪些特征是两种疾病共有的。

步骤1:识别共同特征

首先,我们需要通过图像分析或专家知识来识别出DR和HR图片中共有的病理特征。

在这个例子中,我们已经确定出血和渗出物是两种疾病共有的特征。

步骤2:创建基于特征的子集

接下来,我们根据这些共同特征创建两个子集:

  • 出血子集:包括所有显示出血特征的DR和HR图片。
  • 渗出物子集:包括所有显示渗出物特征的DR和HR图片。

这样做的目的是集中在特定的病理特征上,而不是疾病标签。

步骤3:模型训练

然后,我们分别对这两个子集训练我们的模型:

  • 在出血子集上训练的模型会专注于学习出血这一特征。
  • 在渗出物子集上训练的模型则会专注于学习渗出物这一特征。

步骤4:评估和应用

最后,我们评估每个模型的性能,确保它们能够准确识别出对应的病理特征。

这些模型现在可以应用于新的影像数据,帮助医生识别和区分DR和HR,即使在新的数据中这些特征可能与其他病变特征共现。

通过这种基于特征的子集划分,我们能够更好地让模型学习到不同疾病共有的特征,而不是仅仅依赖于疾病的标签。

这可以显著提高模型在实际临床应用中的泛化能力和准确性。
 


最后,是知识整合的问题

咱们已经有几个模型了,每个模型都学习了一部分疾病的信息,现在需要把这些知识合并起来。

多重加权知识蒸馏就是将每个模型学到的知识,根据它们的重要性给予不同的权重,然后传递给一个新的模型,这样这个新模型就能全面地理解所有类型的疾病了。

 


效果

在这里插入图片描述
在Lesion-10和Disease-48这两个数据集上,对于长尾分类问题的不同方法的性能结果,使用平均精度均值(mAP)作为评价指标。

表格中展示了各种方法在数据集不同部分(头部、中部、尾部)以及整体上的性能表现。

其中包括了基线的ERM模型、各种重采样(RS)和重加权(RW)方法、Focal Loss、OLTR、LDAM和DB Loss等方法,以及作者自己提出的基于射击(shot-based)、基于区域(region-based)和基于特征(feature-based)的方法。

  • 此外,还展示了将作者的方法与其他当时最先进方法结合的结果。

在这个表中可以看到,作者提出的方法在处理长尾分布时,在尾部类别上取得了显著提高,特别是与Focal Loss相结合时,在Lesion-10数据集上的总体mAP提升了1.38%,表明了作者方法在提升模型性能方面的有效性。

在这里插入图片描述
在Disease-48数据集上,这个柱状图展示了在不同类别上的性能提升,在尾部类别上的性能提升更为显著,这与表3中的结果一致。

这个图表进一步证实了作者方法在改善尾部类别的诊断结果方面的有效性。
 


总结

子问题1:长尾分布问题

  • 子解法1:关系子集知识蒸馏

  • 之所以用关系子集知识蒸馏,是因为长尾分布下少数类别的样本太少,导致模型难以学习到这些类别的有效特征。

    使用关系子集知识蒸馏,通过将原始长尾分布的数据划分成多个子集,然后在这些子集上分别训练模型,以便在子集层面上实现更平衡的数据分布。

子问题2:标签共现问题

  • 子解法2:本地共现标签的关系子集学习

  • 之所以用本地共现标签的关系子集学习,是因为不同类别之间的标签经常共现,这可能会导致模型混淆这些类别。

    实施本地共现标签的关系子集学习,识别并针对具有共现标签的类别进行专门的训练,从而减少模型混淆这些类别的可能性。

子问题3:特定区域和特征的类别关联

  • 子解法3:基于区域的子集划分(Region-based Subsets)和基于特征的子集划分(Feature-based Subsets)
  • 之所以用子集划分,是因为通过这样的子集划分,每个子集中的数据分布可以更加均衡,从而提高模型对所有类别,特别是那些样本量较少的尾部类别的识别准确率。

子问题4:模型性能平衡问题

  • 子解法4:加权知识蒸馏损失

  • 之所以用加权知识蒸馏损失,是因为需要在保持模型在常见类别上性能的同时,增强模型在少数类别上的识别能力。

    采用加权知识蒸馏损失,调整知识蒸馏中不同类别的权重,以优化模型在所有类别上的整体性能,尤其是在少数类别上。

这篇论文提出了一种新的长尾视网膜疾病识别方法,它结合了关系子集学习和加权知识蒸馏,以提高模型在多标签和长尾分布情况下的性能。

通过这种方式,作者能够显著提升模型对少数类别的诊断能力,从而更全面地解决了长尾分布问题。

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

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

相关文章

【缓存周总结】Redis缓存的使用以及数据安全的处理

前言 Redis非关系型数据库已经是很常见的工具了,项目中用到的也很多,这篇文章系统的分析下使用过程中可能会遇到的问题 一、缓存 缓存是数据交换的缓冲区,是存贮数据的临时地方,一般读写性能较高。 我们项目中引用的Redis目的就是…

Unity - 调节camera物理相机参数(HDRP)

在 “Hierarchy” 右键 -> Volume -> Global Volume new 一个 profile, 设置Mode为Pysical Camera 再点击camera组件,这时候设置 ISO、Shutter Speed、Aperture等参数值还会有效。

深入了解如何对IPA包进行有效的混淆处理

1、安装混淆工具 首先电脑上要安装ipagurad工具,官网链接:IpaGuard官网--IOS 应用程序ipa文件混淆加密保护工具 2、生成混淆文件 由于混淆需要首先 打开要处理的IPA文件 第一项,填写我们需要重签名的 ipa 路径(当前导入的路径跟导…

跟着pink老师前端入门教程-day16

二十七、CSS3进阶 1、CSS3 2D转换 转换(transform)是CSS3中具有颠覆性的特征之一,可以实现元素的位移、旋转、缩放等效果 转换(transform)可以简单理解为变形 移动:translate;旋转&#xff…

【LVGL源码移植】

LVGL源码移植 ■ LVGL源码移植一:下载LVGL源码二:修改LVGL文件夹1: 将这5个文件,复制到一个新的文件夹2: 简化文件,减少内存消耗(去除不必要的文件)3: 为了规范化,我们将下列文件进行重命名 三&…

nodejs+vue+ElementUi宠物领养救助网站0w6wc

宠物领养救助平台采用B/S架构,数据库是MySQL。网站的搭建与开发采用了先进的nodejs进行编写,使用了vue框架。该系统从两个对象:由管理员和用户来对系统进行设计构建。主要功能包括:个人信息修改,对用户、宠物类别、宠物…

七、并发工具(上)

一、自定义线程池 1)背景: 在 QPS 量比较高的情况下,我们不可能说所有的访问都创建一个线程执行,这会导致内存占用过高,甚至有可能出现 out of memory另外也要考虑 cpu 核数,如果请求超过了cpu核数&#…

【多个SpringBoot模块项目如何变成聚合项目】

【前言】 项目虽然是Eureka、OpenFeign 进行服务注册和服务调用,但是每个模块都是一个单独的SpringBoot,启动每个模块都需要单独启动一个idea,觉得这个过于繁琐,现在想把项目变成一个聚合项目,只需要启动一个idea即可。 【过程】…

09. 异常处理

目录 1、前言 2、常见的异常 3、异常处理try...except...finally 4、异常信息解读 5、raise 6、自定义异常 7、小结 1、前言 在编程中,异常(Exception)是程序在运行期间检测到的错误或异常状况。当程序执行过程中发生了一些无法继续执…

vue前端html导出pdf

package.json中添加依赖 调用方: import htmlToPdf from ../../../utils/file/htmlToPdf.js// 下载方法,pdfDownloadDpi为onClickDownLoad() {htmlToPdf.getPdf(标题1, jsfgyzcpgxmShow, this.pdfDownloadDpi)}htmlToPdf.js // 页面导出为pdf格式 imp…

Backtrader 文档学习- Broker - Cheat-On-Open

Backtrader 文档学习- Broker - Cheat-On-Open 1.概述 V1.9.44.116增加了Cheat On Open的支持。对于全押的人来说,这似乎是一个必需的功能,用bar的收盘价后进行计算,希望与开盘价相匹配。 当开盘价差距(上涨或下跌,取…

杂题——试题-算法训练-P0602

分析: 把要重排序的数字转成数组对数组进行排序,从小到大排序数组转成字符串,字符串转成数字,得到最小数再把最小数的字符串反转,得到最大数注意: 在java语言中,如果使用Arrays.toString(digits…

DevOps系列文章之 Git命令:过滤日志

使用git log命令查找特定提交历史的高级技巧。其中的一些技巧配合格式化日志命令使用有奇效。 按照数量过滤 使用git log命令时最基本的过滤方式就是按照可以显示的日志条数进行过滤。如果你只对最近几次提交感兴趣,这会节省在页面上查看所有提交的麻烦。 git lo…

成熟的汽车制造供应商协同平台 要具备哪些功能特性?

汽车行业是一个产业链长且“重”的行业,整个业务流程包括了研发、设计、采购、库存、生产、销售、售后等一系列环节,在每一个环节都涉及到很多信息交换的需求。对内要保证研发、采购、营销等业务环节信息流通高效安全,对外要与上、下游合作伙…

springboot-前后端分离——第一篇

本篇主要对前后端分离的一些基础知识进行总结,主要对HTTP请求协议、HTTP响应格式、Http协议解析等进行总结。重点在于简单了解前端如何向服务端发送请求,服务端如何接收请求并返回响应结果。 一、简单案例: 首先创建一个springboot项目&…

使用pygame建立一个简单的使用键盘方向键移动的方块小游戏

import pygame import sys# 初始化pygame pygame.init()# 设置窗口大小 screen_size (640, 480) # 创建窗口 screen pygame.display.set_mode(screen_size) # 设置窗口标题 pygame.display.set_caption("使用键盘方向键移动的方块的简单小游戏")# 设置颜色 bg_colo…

帅气的性能监控平台Grafana(Windows下使用Grafana监控系统指标与GPU指标)

帅气的性能监控平台Grafana(Windows下使用Grafana监控系统指标与GPU指标) 前情提要 系统环境准备 windows_exporter下载 nvidia_gpu_exporter下载 prometheus下载 Grafana下载 安装指导 windows_exporter安装与nvidia_gpu_exporter安装 promethe…

ApacheNginx配置ssl证书

一、Apache配置ssl Linux版本:CentOS Linux release 7.9.2009 (Core) Apache版本:Apache/2.4.6 (CentOS) 1、安装Apache(使用默认yum源) [root10-35-1-25 ~]# yum -y install httpd2、查Apache版本&启动Apache [root10-35-…

深度解读NVMe计算存储协议-2

近日,NVME协议组织为了解决这些性能问题并为供应商提供标准化机制,在其架构中集成优化的计算功能,开发了NVM Express (NVMe) 计算存储特性。 计算存储的核心特性包括两个命令集:计算程序集和子系统本地内存。 其中,计算…

postgresql|数据库|pg_repack插件的部署和使用

一, 表和索引的膨胀现象 Postgres SQL 实现的MVCC的机制不同于 oracle , mysql innodb 的 undo tablespace 的机制。 表上所用的更新和删除等操作的行为,都不会实际的删除或修改,而是标记为死元祖 (dead rows or dead…
最新文章