【文献阅读】EndoNet A Deep Architecture for Recognition Tasks on Laparoscopic Videos
关于数据集的整理
Cholec80 胆囊切除手术视频数据集介绍
https://zhuanlan.zhihu.com/p/700024359
数据集信息
Cholec80 数据集
是一个针对内窥镜引导
下的胆囊切除手术视频流程识别数据集。数据集提供了每段视频中总共7种手术动作及总共7种手术工具的标注,标注精确到每帧,且都由专业的外科手术医生标注。数据集包含总共80段视频共计370168张图像的视频数据,每隔25帧采样一张图像。数据集按照1:1的比例划分为训练集和测试集。
胆囊切除手术是一种常见的外科手术,旨在移除疾病或感染的胆囊。尽管这是一种广泛进行的手术,其复杂性和对精确手术操作的需求强调了利用先进技术来提高手术结果的重要性。Cholec80 数据集提供了较为细粒度的、类别丰富的标注信息,涵盖胆囊切除手术中常见的动作类型与器械类型,为开发计算机辅助的内窥镜胆囊切除术导航系统
提供支持。更进一步地,该数据集也为开发相关的能准确模拟外科医生操作的手术机器人提供支持。
数据集元信息
维度 | 模态 | 任务类型 | 解剖结构 | 解剖区域 | 类别数 | 数据量 | 文件格式 |
---|---|---|---|---|---|---|---|
2D | 内窥镜 | 识别、分类 | 胆囊 | 腹腔 | 14 | 370168 | .png |
图像尺寸统计
size | |
---|---|
各维度最小值 | 480x854 |
各维度中值 | 480x854 |
各维度最大值 | 480x854 |
标签信息统计
图1截取自论文中的测试集中的器械类型分布及手术动作类型分布,由于训练集与测试集在划分时保证了各类别间的比例,因此测试集的分布可以反映整个数据集的分布。图1中Evaluation对应的分布即数据集的分布。其中P1~P7对应的动作名如图2.
图1,数据集手术动作及器械分布
手术动作ID对应的名字
可视化
手术器械类型可视化
手术动作可视化(选取自CholecT45数据集,因为它是Cholec80数据集的子集)
文件结构
TF-Cholec80
├── frames
│ ├── video01
│ │ ├── video01_000001.png
│ │ ├── video01_000002.png
│ │ ├── video01_000003.png
│ │ ├── video01_000004.png
│ │ ├── video01_000005.png
│ │ └── ...
│ ├── video02
│ │ ├── video02_000001.png
│ │ ├── video02_000002.png
│ │ ├── video02_000003.png
│ │ ├── video02_000004.png
│ │ ├── video02_000005.png
│ │ └── ...
│ ├── video03
│ │ ├── video03_000001.png
│ │ ├── video03_000002.png
│ │ ├── video03_000003.png
│ │ ├── video03_000004.png
│ │ ├── video03_000005.png
│ │ └── ...
│ ├── video04
│ │ ├── video04_000001.png
│ │ ├── video04_000002.png
│ │ ├── video04_000003.png
│ │ ├── video04_000004.png
│ │ ├── video04_000005.png
│ │ └── ...
│ ├── video05
│ │ ├── video05_000001.png
│ │ ├── video05_000002.png
│ │ ├── video05_000003.png
│ │ ├── video05_000004.png
│ │ ├── video05_000005.png
│ │ └── ...
│ └── ...
├── phase_annotations
│ ├── video01-phase.txt
│ ├── video02-phase.txt
│ ├── video03-phase.txt
│ ├── video04-phase.txt
│ ├── video05-phase.txt
│ └── ...
└── tool_annotations├── video01-tool.txt├── video02-tool.txt├── video03-tool.txt├── video04-tool.txt├── video05-tool.txt└── ...
来源信息
官方网站 | https://github.com/CAMMA-public/TF-Cholec80 |
---|---|
下载链接 | https://github.com/CAMMA-public/TF-Cholec80 |
文章地址 | https://ieeexplore.ieee.org/document/7519080 |
公开日期 | 2016.02 |
引用
@article{endonet,
author = {Andru Twinanda, Sherif Shehata, Didier Mutter, Jacques Marescaux, Michel De Mathelin, Nicolas Padoy},
year = {2016},
month = {02},
title = {EndoNet
@article{endonet,
author = {Andru Twinanda, Sherif Shehata, Didier Mutter, Jacques Marescaux, Michel De Mathelin, Nicolas Padoy},
year = {2016},
month = {02},
title = {EndoNet: A Deep Architecture for Recognition Tasks on Laparoscopic Videos},
volume = {36},
journal = {IEEE Transactions on Medical Imaging},
doi = {10.1109/TMI.2016.2593957}
}@inproceedings{yu2019surgicalphase,
title = {Learning from a tiny dataset of manual annotations: a teacher/student approach for surgical phase recognition},
author = {Tong Yu, Didier Mutter, Jacques Marescaux, Nicolas Padoy},
booktitle = {International Conference on Information Processing in Computer-Assisted Interventions},
year = {2019}
}
【A Deep Architecture for Recognition Tasks on Laparoscopic Videos】
摘要
手术流程识别在医学领域有诸多潜在应用,如手术视频数据库的自动索引以及实时手术室排班的优化等。因此,手术阶段识别已在多种手术场景下展开研究,包括白内障手术、神经外科手术和腹腔镜手术。在相关文献中,执行该任务通常使用两种类型的特征:视觉特征和工具使用信号。然而,所使用的视觉特征大多是手工制作的。此外,工具使用信号通常通过手动标注过程或使用额外设备收集。在本文中,我们提出了一种用于阶段识别的新方法,该方法利用卷积神经网络(CNN)从胆囊切除术视频中自动学习特征,并且仅依赖视觉信息。在先前的研究中,已经表明工具使用信号在执行阶段识别任务时能提供有价值的信息。因此,我们提出了一种名为EndoNet的新型CNN架构,旨在以多任务方式执行阶段识别和工具存在检测任务。据我们所知,这是首次提出使用CNN对腹腔镜视频进行多种识别任务的工作。与其他方法的实验对比表明,EndoNet在这两个任务上均取得了最先进的成果。
关键词
腹腔镜视频;胆囊切除术;卷积神经网络;工具存在检测;阶段识别
一、引言
在计算机辅助干预(CAI)领域,手术流程的识别是一个重要课题,因为它为现代手术室(OR)的众多需求提供了解决方案[1]。例如,这种识别是开发情境感知系统的关键组成部分,该系统可以监测手术过程、优化手术室和人员排班,并为临床工作人员提供自动辅助。通过对手术流程进行分段,还能够实现手术视频数据库的自动索引,而目前这是一个耗时的手动过程。索引数据库便于视频浏览时的轻松导航,这对于培训目的和术后回顾尤为重要。从长远来看,通过对视频内容进行更细致的分析,这种情境感知系统还可以用于提醒临床医生可能即将发生的并发症。
在文献中,已经使用了各种类型的特征来执行阶段识别任务。例如,在[2,3]中,二进制工具使用信号被用于对胆囊切除术进行阶段识别。在最近的研究[4,5]中,手术三元组(由使用的工具、解剖结构和手术动作组成)被用于表示手术中每个时间步的帧。然而,这些特征通常是通过手动标注过程获得的,在测试时几乎无法执行。尽管已经做出了努力[6],但能否以自动方式可靠地获取此类信息仍是一个悬而未决的问题。
另一种通常用于执行阶段识别任务的特征类型是视觉特征,例如像素值和强度梯度[7]、时空特征[8]以及特征组合(颜色、纹理和形状)[9]。然而,这些特征是手工制作的,即它们是根据经验设计的,用于从图像中捕获特定信息,这导致在特征提取过程中可能丢失其他重要特征。
在本文中,我们提出了一种新的阶段识别方法,克服了上述局限性。首先,我们提议从手术(特别是胆囊切除术)视频中学习内在视觉特征来执行阶段识别,而不是使用手工制作的特征。我们专注于视觉特征,因为视频通常是手术室中唯一容易获得的信息来源。具体而言,我们提议使用卷积神经网络(CNN)来学习特征,因为近年来CNN在各种图像识别任务中显著提高了结果,如图像分类[10]和目标检测[11]。此外,自动从腹腔镜视频中学习特征具有优势,因为腹腔镜视频存在固有的视觉挑战,使得设计合适的特征变得困难。例如,腹腔镜手术中的摄像头不是静态的,会导致运动模糊,并且手术过程中观察到的场景变化很大。镜头也经常被血液污染,这可能会模糊或完全遮挡腹腔镜摄像头捕获的场景。
其次,基于我们和其他人使用工具使用信号进行阶段识别的有前景的结果[3,12],我们假设工具信息可以进一步用于为阶段识别任务生成更具判别力的特征。这在[7]中也得到了证明,其中通过典型相关分析(CCA)使用工具使用信号来降低手工制作的视觉特征的维度,以获得更具语义意义和判别力的特征。为了纳入工具信息,我们提议在特征学习过程中实施多任务框架。
由此产生的CNN架构,我们称之为EndoNet,旨在联合执行阶段识别和工具存在检测任务。后者是自动确定图像中存在的所有类型工具的任务。除了帮助EndoNet学习更具判别力的特征外,工具存在检测任务本身也很有意义,例如可以通过标记视频中的工具存在来自动索引手术视频数据库。结合其他信号,它还可以通过检测在特定阶段不应出现的工具来识别潜在的即将发生的并发症。需要注意的是,此任务不需要工具定位,因此它与通常的工具检测任务不同[13]。此外,工具存在仅由腹腔镜视频的视觉信息确定。因此,它不会产生与[3]中使用的相同的工具信息,因为[3]中的工具信息并不总是可以仅从腹腔镜视频中获得。例如,[3]中使用的套管针的存在在腹腔镜视频中并不总是明显的。自动检测此类工具的存在需要另一个信息源,例如外部视频。
训练CNN架构需要强大的并行计算能力和大量的标记数据。在医学领域,由于监管限制和手动标注的成本,标记数据尤其难以获取。Girshick等人[11]最近表明,在标记数据稀缺的情况下,可以使用迁移学习来训练网络。受[11]的启发,我们进行迁移学习来训练提出的EndoNet架构。
为了验证我们的方法,我们构建了一个大型的胆囊切除术视频数据集,其中包含在斯特拉斯堡大学医院录制的80个视频。此外,为了证明我们提出的(即EndoNet)特征具有泛化性,我们在EndoVis 2015挑战数据集上进行了额外的实验,该数据集包含在慕尼黑伊萨尔河右岸医院录制的7个胆囊切除术视频[12]。通过比较,我们还表明EndoNet优于其他最先进的方法。此外,我们还证明了以多任务方式训练网络比单任务方式训练得到的网络性能更好。
总之,本文的贡献有五个方面:(1)首次将CNN用于提取腹腔镜视频识别任务的视觉特征;(2)设计了一种CNN架构,可联合执行阶段识别和工具存在检测任务;(3)对我们的方法与其他方法进行了广泛的比较;(4)仅使用视觉特征在胆囊切除术视频的两个任务上均展示了最先进的结果;(5)证明了使用EndoNet解决几个实际CAI应用的可行性。
二、相关工作
(一)工具存在检测
计算机辅助干预领域中解决自动工具存在检测问题的文献仍然有限。这些方法通常侧重于其他任务,如工具检测[13,14]、工具位姿估计[15]和工具跟踪[16,17]。此外,大多数方法仅在短序列上进行测试,而我们在完整的手术过程中执行该任务。
在最近的研究[18,19]中,提出了使用射频识别(RFID)标记的手术工具进行工具检测和跟踪。这种主动跟踪系统可以用于解决工具存在检测问题,但该系统集成到手术室中较为复杂。因此,研究手术室中已有的其他特征,如视频中的视觉线索,是很有意义的。
例如,在[20]中,Speidel等人提出了一种自动识别腹腔镜图像中出现的工具类型的方法。然而,该方法包含许多步骤,如工具分割和轮廓处理。此外,它还需要工具的三维模型来进行工具分类。在最近的一项工作[9]中,Lalys等人提出使用基于Viola-Jones目标检测框架的方法来自动检测白内障手术中的工具,如手术刀和人工晶状体器械。
然而,腹腔镜视频中的工具存在检测问题带来了白内障手术中不存在的其他挑战,例如白内障手术中摄像头是静态的,且工具没有关节。在本文中,我们提出了一种更直接的方法,仅使用视觉特征而无需定位步骤来执行工具存在检测任务。
(二)阶段识别
阶段识别任务已在多种类型的手术中进行了研究,包括白内障手术[9,21]、神经外科手术[5]和腹腔镜手术[4,7,22]。也探索了多种类型的特征来执行该任务,如工具使用信号[3,5]、手术动作三元组[4,23]和视觉特征[7,24]。由于我们提议仅依赖视觉特征来执行该任务,因此我们将文献讨论集中在使用视觉特征的方法上。
在[25]中,Padoy等人提出了一种基于隐马尔可夫模型(HMM)的在线阶段识别方法,该方法结合了工具使用信号和腹腔镜图像中的两个视觉线索。第一个和第二个线索分别表示摄像头是否在患者体内以及视野中是否有夹子。然而,为了识别阶段,该方法需要工具信号,而在手术室中并不总是能立即获得这些信号。
相反,Blum等人[7]提议使用工具使用信号通过CCA对视觉特征进行降维。一旦获得投影函数,在估计手术阶段时就不再需要工具信息。在测试时,视觉特征被映射到公共空间,然后用于确定阶段。该方法表现良好,准确率达到76%。然而,它仅在包含10个视频的数据集上进行了测试。此外,该方法可能受到所使用的手工制作特征的限制:水平和垂直梯度幅度、直方图以及下采样图像的像素值。
在最近的一项工作[9]中,Lalys等人提出了一个框架,使用视觉信息(形状、颜色、纹理和混合信息)的组合来识别白内障手术中的高级手术任务。这些特征还包含从显微视频中自动提取的工具存在信息,如在II-A小节中所述。通过在这些特征之上使用HMM,该方法的准确率达到91%。然而,该方法是在白内障手术上进行评估的,与胆囊切除术有很大不同。
胆囊切除术通常比白内障手术时间更长。此外,胆囊切除术视频存在白内障手术中不存在的视觉挑战,如快速的摄像头运动、雾的存在以及更多有关节的工具。在[26]中,Lea等人在运动学和图像特征之上使用跳跃链条件随机字段来分割和识别精细的手术活动,如针刺入和打结。然而,该方法在包含短序列(约两分钟)的数据集上进行测试。此外,上述方法中使用的视觉特征是手工制作的。
在[27]中,Klank等人提议从胆囊切除术视频中自动学习视觉特征以执行阶段识别任务。该方法基于遗传编程,使用预定义的操作符对特征进行变异和交叉。因此,该方法受到预定义操作符集的限制。此外,在某些情况下,学习到的特征未能比手工制作的特征提供更好的识别结果。
(三)卷积神经网络
在计算机视觉领域,卷积神经网络(CNNs)目前是执行各种任务最成功的特征学习方法之一。例如,Krizhevsky等人[10]通过提议使用一种称为AlexNet的CNN架构解决了大规模ImageNet数据库[28]上的图像分类问题。
他们表明,与最先进的手工制作特征(例如基于SIFT的Fisher向量[29])相比,CNN学习到的特征显著提高了分类结果。此外,在[30]中已经表明,在[10]中训练的网络非常强大,可以作为一个黑盒特征提取器(无需任何修改)成功执行多个任务,包括场景分类和域适应。
CNN训练困难,因为它们通常包含大量未知参数。例如,AlexNet架构包含超过6000万个参数。拥有强大的计算能力和大量的注释数据对于训练网络至关重要。
最近,Girshick等人[11]表明,通过执行迁移学习,即使在标记数据稀缺的情况下也可以学习一个新的网络。他们提议采用预训练的CNN模型作为初始化,并对模型进行微调以获得一个新的网络。结果表明,尽管在为图像分类训练的网络上进行了微调,但微调后的网络在目标识别任务中仍取得了最先进的性能。
三、方法
我们提出的方法的完整流程如图1所示。第一步是通过微调过程训练EndoNet架构。网络训练完成后,它将用于工具存在检测和阶段识别任务。对于前者,网络给出的置信度直接用于执行任务。对于后者,网络用于从图像中提取视觉特征。然后,这些特征被传递给支持向量机(SVM)和分层HMM,以获得最终估计的阶段。
图1 所提方法的完整流程
(一)EndoNet架构
EndoNet架构是基于两个假设设计的,这两个假设将在第五节的实验中得到验证:
- 如果网络以多任务方式进行微调,即如果网络不仅针对阶段识别进行优化,还针对工具存在检测进行优化,则可以从数据集中学习到更具判别力的阶段识别任务特征;
- 由于在先前的工作[3,5,9]中,工具信号已成功用于执行阶段识别,因此在最终特征中包含自动生成的工具检测信号可以提高识别效果。
提议的EndoNet架构如图2所示。该架构是AlexNet架构[10]的扩展,由一个输入层(绿色)、五个卷积层(红色,conv1-conv5)和两个全连接层(橙色,fc6-fc7)组成。层fc7的输出连接到一个全连接层fc_tool,该层执行工具存在检测。由于用于训练网络的数据集中定义了七种工具,因此层fc_tool包含7个节点,每个节点表示图像中存在某种工具的置信度。此置信度稍后在层fc8中与层fc7的输出连接,以构建用于阶段识别的最终特征。最终,层fc8的输出连接到包含7个节点的层fc_phase,每个节点表示图像属于相应阶段的置信度。手术工具类型和手术阶段在第四节A小节中描述。
图2 EndoNet架构(彩色效果最佳)。绿松石矩形中显示的层与AlexNet架构中的层相同。
(二)微调
网络使用随机梯度下降进行训练,并为任务定义了两个损失函数。工具存在检测任务被表述为\(N_{t}\)个二元分类任务,其中\(N_{t}=7\)是工具的数量。对于每个二元分类任务,使用交叉熵函数计算损失。因此,对于批次中的\(N_{i}\)张图像,所有工具的工具存在检测任务的完整损失函数定义为:
\[\begin{aligned} \mathcal{L}_{\mathcal{T}}=\frac{-1}{N_{i}} \sum_{t=1}^{N_{t}} \sum_{i=1}^{N_{i}}[ k_{t}^{i} log \left(\sigma\left(v_{t}^{i}\right)\right) +\left(1-k_{t}^{i}\right) log \left(1-\sigma\left(v_{t}^{i}\right)\right)], \quad(1) \end{aligned}\]
其中\(i \in{1, \ldots, N_{i}}\)和\(t \in{1, \ldots, N_{t}}\)分别是图像和工具的索引,\(k_{t}^{i} \in{0,1}\)和\(v_{t}^{i}\)分别是工具存在的真实值和层fc_tool对应于工具\(t\)和图像\(i\)的输出,\(\sigma(\cdot) \in(0,1)\)是sigmoid函数。
阶段识别被视为一个多类分类任务。使用softmax多项逻辑函数(它是交叉熵函数的扩展)来计算损失。该函数的公式为:
\[\mathcal{L}_{\mathcal{P}}=\frac{-1}{N_{i}} \sum_{i=1}^{N_{i}} \sum_{p=1}^{N_{p}} l_{p}^{i} log \left(\varphi\left(w_{p}^{i}\right)\right),\]
其中\(p \in{1, \ldots, N_{p}}\)是阶段索引,\(N_{p}=7\)是阶段的数量,\(l_{p}^{i} \in{0,1}\)和\(w_{p}^{i}\)分别是阶段的真实值和层fc_phase对应于阶段\(p\)和图像\(i\)的输出,\(\varphi(\cdot) \in[0,1]\)是softmax函数。
最终的损失函数是两个损失的总和:\(L=a \cdot L_{T}+b \cdot L_{P}\) ,其中\(a\)和\(b\)是权重系数。在这项工作中,我们将\(a = b = 1\),因为初步实验表明改变这些参数并没有带来性能提升。需要注意的是,将\(a = 0\)或\(b = 0\)分别相当于设计一个仅针对阶段识别任务或工具存在检测任务进行优化的CNN。
(三)SVM和分层HMM
层\(fc8\)的输出被视为图像特征。这些特征用于使用一对一多类SVM计算阶段估计的置信度值\(v_{p} \in \mathbb{R}^{7}\)。由于置信度\(v_{p}\)是在不考虑任何时间信息的情况下获得的,因此有必要强制实施手术流程的时间约束。
在这里,我们使用HMM的扩展,即两级分层HMM(HHMM)[31]。顶层包含对阶段间依赖关系进行建模的节点,而底层节点对阶段内依赖关系进行建模。我们采用[31]中提出的学习过程来训练HHMM。这里,观察值由SVM的置信度\(v_{p}\)给出。
对于离线识别,使用维特比算法[32]找到通过HHMM状态的最可能路径。对于在线识别,使用前向算法计算阶段预测。
可以观察到EndoNet已经通过层fc_phase的输出提供了置信度值,因此将EndoNet的特征传递给SVM以获得置信度值$v_p$并非必不可少。
此外,在初步实验中,我们观察到在应用HHMM之前和之后,$v_p$和fc_phase在识别阶段的性能仅有细微差异。
然而,这一额外步骤对于与其他传递给SVM以获得置信度的特征进行公平比较是必要的。另外,使用层fc_phase的输出作为阶段估计置信度仅适用于与微调数据集中阶段定义相同的数据集。因此,为了评估网络对可能具有不同阶段定义的其他数据集的泛化能力,这一步骤也是必需的。
四、实验设置
(一)数据集
我们构建了一个名为Cholec80的大型数据集[2],其中包含13位外科医生在斯特拉斯堡大学医院进行的80例胆囊切除术的视频。视频以25帧/秒的速度拍摄。为了加快处理速度并减少冗余,我们通过每25帧选取第一帧的方式将视频下采样到1帧/秒。
在初步研究中,我们也对下采样到5帧/秒的序列进行了实验,但未获得任何性能提升。整个数据集都标注了阶段和工具存在信息。阶段由我们合作医院的一位资深外科医生定义。由于工具在图像中有时很难被看到,因此难以通过视觉识别,我们规定如果工具尖端至少有一半可见,则认为该工具在图像中存在。工具和阶段列表分别见图3和表I-a。
图3 Cholec80数据集中使用的七种手术工具列表
Cholec80数据集被分成两个大小相等的子集(即各40个视频)。
第一个子集(即微调子集)包含约86,000张带注释的图像。从这个子集中,有10个视频还对工具的边界框进行了完整标注。这些用于训练可变形部件模型(DPM)[33]。
由于抓钳和钩子比其他工具出现得更频繁,从三个视频的注释中,它们的边界框数量就达到了足够的数量。第二个子集(即评估子集)用于测试工具存在检测和阶段识别方法。
数据集被平均分割,以便为微调过程和评估过程提供足够的数据。完整数据集的统计信息见图4。
Cholec80数据集中工具存在检测和阶段识别任务的注释分布
图4 Cholec80数据集中(a)工具存在检测和(b)阶段识别任务的注释分布
第二个数据集是为2015年MICCAI的EndoVis工作流挑战赛发布的公共数据集。该数据集包含在伊萨尔河右岸医院收集的7个胆囊切除术视频[12],这些视频以25帧/秒的速度拍摄,并下采样到1帧/秒进行处理。
尽管由于参与人数不足,该挑战赛被取消且未公布结果,但这些数据对于展示我们方法的泛化性仍然非常有用。
因此,我们也在这个数据集上提供了阶段识别的结果和比较(见第四节C小节)。我们仅在这个数据集上进行阶段检测,因为其中工具的类型和视觉外观与EndoNet设计检测的工具不同。EndoVis数据集中的阶段列表见表I-b。
可以看出,EndoVis中的P3阶段比Cholec80中的更长。这是因为在Cholec80中,P3阶段通常在Calot三角清晰暴露时开始。然而,在EndoVis中并非如此。结果,P3阶段包含了额外的解剖步骤,导致EndoVis中的P3阶段更长。
EndoVis中的一些阶段定义与Cholec80中的不同。例如,EndoVis数据集中定义了放置套管针阶段,尽管应该注意到这个阶段在腹腔镜视频中并不总是可见的。
需要额外的信息来源(例如外部视频)来正确标注这个阶段,而这些信息在数据集中是不可用的。另一个区别在于准备阶段的定义。
在EndoVis数据集中,准备阶段包括Calot三角解剖阶段(因此在表I-b中的ID为P12)。其他阶段的定义与Cholec80中的类似。EndoVis中阶段的分布见图5。
图5 EndoVis数据集中的阶段分布
(二)微调、SVM和HHMM参数
EndoNet通过微调在ImageNet数据集[28]上预训练的公开可用的AlexNet网络[10]进行训练。AlexNet中未定义的层(即fc_tool和fc_phase)被随机初始化。
网络进行50,000次迭代的微调,每个批次包含$N_i = 50$张图像。除了fc_tool和fc_phase层(由于其随机初始化,学习率设置为$10^{-2}$),所有层的学习率初始化为$10^{-3}$。
每20,000次迭代,所有层的学习率降低为原来的$\frac{1}{10}$。微调过程使用Caffe框架[34]进行。微调过程中损失函数$c$的演变见图6。该图显示了损失的收敛,表明网络已成功优化,以学习用于阶段识别和工具存在检测任务的最优特征。
图6 EndoNet微调过程中损失函数的演变
网络使用NVIDIA GeForce Titan X显卡进行训练。训练过程每100次迭代大约需要80秒,即每个网络大约需要11小时。特征提取过程每张图像大约需要0.2秒。SVM训练的计算时间取决于特征的大小,范围从0.1到90秒,而使用我们的MATLAB实现,HHMM训练大约需要15秒。
为了进行阶段识别,除了手工制作的特征(预先通过直方图相交核处理),所有特征都被传递给一对一的线性SVM。在初步实验中,我们尝试对其他特征使用非线性核,但未获得任何性能提升。
对于HHMM,我们将顶层状态的数量设置为7(等于$N_P$),而底层状态的数量由数据驱动(如[31]中所述)。为了对SVM的输出进行建模,除了二元工具信号(使用一个高斯模型),我们对每个特征使用五个高斯混合模型。协方差类型为对角。图7展示了用于识别Cholec80中阶段的HHMM的图形表示。
图7 Cholec80中定义的手术阶段的两级HHMM图形表示。蓝色显示的顶层状态代表数据集中定义的阶段。顶层状态的转换显示了数据集中定义的所有可能的阶段转换。绿色显示的是底层状态。
(三)基线
对于工具存在检测,我们将EndoNet给出的结果(即层fc_tool的输出)与另外两种方法进行比较。第一种方法是DPM[33],因为它是一种广泛使用的在线目标检测方法。在实验中,我们使用默认参数,每个工具使用三个组件进行建模,并使用HOG特征表示图像。
第二种方法是一个以单任务方式训练的网络,仅执行工具存在检测任务(ToolNet)。ToolNet使用与第四节B小节中提到的相同参数进行微调。我们将ToolNet的结果与EndoNet的结果进行比较,以表明以多任务方式进行微调过程比单任务方式能得到更好的网络。该网络的架构见图8-a。
图8 用于(a)工具存在检测和(b)阶段识别任务的单任务CNN架构。AlexNet架构与EndoNet中使用的相同(见图2)。单任务网络也通过迁移学习进行训练。
对于阶段识别,我们比较使用以下特征作为输入的阶段识别结果:
- - 从手动注释生成的二元工具信息;这是一个表示图像中工具存在的向量,即对于Cholec80和EndoVis数据集,分别为$v_t \in \{0,1\}^7$和$v_t \in \{0,1\}^{10}$;
- - 手工制作的视觉特征:SIFT词袋、HOG、RGB和HSV直方图;选择这些特征是因为它们在腹腔镜视频的分类[35]中取得了成功;
- - 上述手工制作的视觉特征 + CCA,类似于[7]中建议的方法;
- - 在ImageNet数据集上训练的AlexNet的层fc7的输出(即微调过程的初始化);这是一个有趣的比较特征,因为已经表明这个网络可以用于各种计算机视觉任务[30];
- - 以单任务方式微调以执行阶段识别的网络的层fc7的输出,见图8-b(PhaseNet);PhaseNet也使用第四节B小节中提到的参数进行微调;
- - 我们提出的特征,即EndoNet的层fc8的输出。
我们还在Cholec80数据集的阶段识别中纳入了名为EndoNet-GTbin的特征。这些特征由EndoNet的层fc7的输出与从地面真实注释中获得的二元工具信息连接而成。这项评估使我们能够研究EndoNet自动提取的工具信息(包含在我们提出的特征中)对于阶段识别任务是否足够。
(四)评估
如前所述,工具存在检测和阶段识别是两个不同的分类任务。前者是二元分类任务,而后者是多类分类任务。因此,使用不同的评估指标。工具存在检测的性能通过平均精度(AP)指标来衡量。它通过计算精度-召回曲线下的面积获得。
对于阶段识别,使用了几个评估指标,即精度、召回率和准确率,如[3]中所定义。精度和召回率展示了每个阶段识别结果的质量。它们分别计算正确检测的数量除以完整检测的长度和地面真实的长度。相比之下,准确率表示整个手术中正确检测的百分比。
由于一些阶段较短,除了整体准确率外,观察每个阶段的精度和召回率也很有意义。然后将所有这些指标在手术中进行平均。
对于工具存在检测,学习到的模型(即DPM、ToolNet和EndoNet)可以直接用于执行任务,无需任何额外的训练步骤。
相比之下,阶段识别任务在网络训练后需要额外的步骤来训练SVM和HHMM。由于这个原因,工具存在检测任务直接在Cholec80的评估子集上执行;而对于阶段识别,我们在Cholec80的评估子集上进行4折交叉验证,并在EndoVis数据集上进行完整的交叉验证。
阶段识别的这个额外训练步骤包含随机初始化,这可能导致每次实验运行的结果不同。因此,对于每个验证折,我们进行五次实验运行,并对所有实验运行的评估指标取平均值(见表III、表IV和表V)。
为了展示所提出特征带来的改进,我们计算应用HHMM前后阶段识别的评估指标。为了更深入地分析结果,我们还在第六节中展示了EndoNet在两个医学应用中的性能。
五、实验结果
(一)Cholec80数据集
1. 工具存在检测:工具存在检测任务的结果见表II。
所有工具的平均精密度(AP),记录在构成CHOLEC 80评价数据集的40个视频中。每种刀具的最佳AP均以粗体显示
可以看出,网络的结果明显优于DPM。这可能是因为用于微调网络的图像数量高于用于DPM训练的边界框数量,但这可能只是造成这种巨大差异的部分原因。
为了进行更公平的比较,我们将DPM的性能与仅使用用于训练DPM的10个视频训练的ToolNet和EndoNet模型进行比较(另见图11-a,了解微调子集大小的影响)。
正如预期的那样,与在完整微调子集上训练的网络相比,这些网络的性能较低。然而,ToolNet和EndoNet的平均AP仍然优于DPM,分别为65.9和62.0。请注意,网络仅使用二元注释(存在与不存在)进行训练,而DPM使用包含特定定位信息的边界框。此外,网络包含比DPM多得多的未知参数需要优化。尽管如此,在相同数量的训练数据下,网络在执行任务方面比DPM更好。
从表II中可以看出,EndoNet在这项任务上给出了最好的结果。这表明以多任务方式训练网络不会影响EndoNet检测工具存在的性能。对于所有方法,剪刀检测的性能都有所下降。这可能是因为这种工具的训练数据量最少(见图4-a),因为它在手术中仅短暂出现。
此外,它可能会与抓钳混淆,因为它们在视觉上有很多相似之处。在Cholec80评估子集中的七个工具和40个完整手术中,EndoNet在工具存在检测方面获得了81%的平均AP。这个网络的成功表明,二元注释足以训练一个用于此任务的模型。
这特别有趣,因为标记工具存在的二元信息比提供边界框要容易得多。它还表明,网络可以成功检测工具存在,而无需任何明确的定位预处理步骤(如分割和ROI选择)。
2. 阶段识别:表III-a展示了在Cholec80上应用HHMM之前的阶段识别结果。这些是将图像特征传递给SVM后的结果。
结果表明,CNNs是提取视觉特征的强大工具:尽管AlexNet是在完全不相关的数据集上进行训练的,但它的特征优于手工制作的视觉特征(无论是否使用CCA)和二元工具注释。
此外,微调步骤显著提高了结果:与AlexNet特征相比,PhaseNet特征在所有指标上都有所改进。除了作为副产品产生工具存在检测结果外,EndoNet中应用的多任务框架进一步改进了用于阶段识别任务的特征。
有趣的是,使用EndoNet-GTbin特征的阶段识别结果仅比使用EndoNet特征的结果略好,准确率提高了约0.1%。换句话说,从地面真实数据生成的工具信息并没有比EndoNet特征带来更多信息,仅由EndoNet提取的视觉特征就足以进行阶段识别任务。
表IV-a展示了应用HHMM后的阶段识别结果。由于离线阶段识别的性质,算法可以看到完整的视频,因此离线结果比在线结果更好。然而,当我们比较特征性能时,离线和在线模式下的趋势是一致的。通过比较表III-a和表IV-a的结果,我们可以看到HHMM带来的改进,这在所有特征上都是一致的。
在图9中,我们展示了混淆矩阵,以可视化EndoNet特征在区分不同阶段方面的表现。混淆矩阵是使用一次(随机选择的)实验运行的结果生成的,包括应用HHMM之前和之后(离线模式)。
可以看出,在应用时间模型之前,SVM会误分类一些图像。这是可以预期的,因为SVM仅依赖于每帧的视觉特征,而大多数腹腔镜图像看起来彼此相似。一旦纳入时间模型,识别结果会显著改善。可以看到,阶段通常会与相邻阶段混淆。
然而,除了最后几个阶段,误分类率显著降低,这是由于这些阶段之间的非顺序转换(见图7)。需要注意的是,由于我们仅执行工具存在检测,因此无法生成工具存在检测的混淆矩阵。与工具定位方法不同,我们的方法无法确定某个工具是否与另一个工具混淆。
图9 Cholec80上阶段识别的混淆矩阵:(a)应用HHMM之前和(b)应用HHMM之后(离线模式)。
在图10中,我们在生成图9的同一实验运行中获得的前5个和后5个识别结果上,从时间上可视化混淆情况。在离线模式下,可以看到前5个结果非常好,准确率超过98%。
此外,离线模式下后5个结果与地面真实情况相当。后5个结果准确率下降是由于P5和P6之间可能发生的跳跃,如图10-c中交替的蓝色和红色所示。这些跳跃也是由于这些阶段之间的非顺序转换(见图7)。
图10 Cholec80评估子集上阶段识别结果与地面真实情况的彩色带状图对比。带状图的水平轴表示手术中的时间进程。顶部带状图是估计的阶段,底部带状图是地面真实情况。(a)离线前5个。(b)在线前5个。(c)离线后5个。(d)在线后5个。
在在线模式下,可以观察到阶段估计中更频繁的跳跃。这是由于在线模式下的识别性质,未来的数据不可用,因此模型在进行估计后可以自我纠正。尽管存在这些跳跃,在线前5个结果仍然非常接近地面真实情况,准确率超过92%。
为了更全面地展示EndoNet在整个数据集上的性能,我们在表V中展示了离线和在线模式下所有阶段的识别结果。可以看出EndoNet特征在识别所有阶段时表现都非常出色。在识别P5和P6阶段时性能有所下降,这可能是因为这些阶段之间的转换不是顺序的,并且它们之间并不总是有清晰的界限,特别是当一些图像有时没有显示任何活动时,这在阶段估计过程中会产生一些模糊性。
3. 微调子集大小的影响:为了展示微调过程中训练数据量的重要性,我们使用大小逐渐增加的微调子集(10、20、30,最终为40个视频)对网络进行微调。我们使用训练好的网络在Cholec80的评估子集上执行工具存在检测和阶段识别任务。结果如图11所示。正如预期的那样,网络的性能与微调子集中的数据量成比例增加。还可以看出,除了在使用较少视频训练网络的工具存在检测任务中,EndoNet的表现优于单任务网络(即PhaseNet和ToolNet)。这表明与ToolNet相比,EndoNet能更好地利用大数据集的优势。
图11 Cholec80上网络性能随微调子集视频数量的变化。(a)工具存在检测。(b)阶段识别。
(二)EndoVis数据集
从EndoVis数据集获得了类似的阶段识别结果,如表III和表IV-b所示。有趣的是,二元工具特征在两个数据集上的性能存在相当大的差异。应用HHMM后,该特征在EndoVis上的表现优于在Cholec80上的表现。然而,如果我们比较应用HHMM之前的结果(见表III),该特征在两个数据集上的表现相似(准确率分别为48.2%和49%)。
这表明这种改进来自时间模型。请注意,EndoVis的二元工具特征由10个二元信号组成,而Cholec80的二元工具特征由7个二元信号组成。因此,有可能SVM为EndoVis给出的置信度值更好(即更容易被时间模型在时间上进行平滑处理),因为EndoVis的二元工具特征比Cholec80的提供了更多信息。
在学习到的特征方面,可以观察到PhaseNet和EndoNet在EndoVis上获得的改进不如在Cholec80上的结果改进那么大,这是预期的,因为这些网络是使用Cholec80的视频进行微调的。
尽管如此,EndoVis数据集上的结果也表明,EndoNet特征显著提高了阶段识别结果。这表明多任务学习比单任务学习能得到更好的网络。EndoNet特征在所有情况下都产生最佳结果这一事实也表明EndoNet可以推广到其他数据集。
应该注意的是,我们使用EndoNet的层fc8的输出作为图像特征,其中包括工具存在的置信度值。由于EndoVis数据集中使用的工具与用于训练EndoNet的Cholec80数据集中的工具不同,这些置信度值可以简单地被视为附加到特征向量上的7个额外标量特征。结果表明,这些值有助于构建更具判别力的特征。
六、医学应用
在第五节中,我们讨论了离线和在线模式下的阶段识别结果。这些结果已经证明了使用EndoNet进行各种医疗任务的可行性,如情境感知支持(在线识别)和报告(离线识别)。在这里,我们进一步展示EndoNet在其他实际CAI应用中的适用性。
我们展示了用于生成图10的同一实验运行的结果。首先,为了展示使用EndoNet作为自动手术视频索引基础的可行性,我们以秒为单位展示阶段估计的误差,以表明EndoNet对阶段边界的估计有多精确。
其次,我们进一步研究EndoNet检测两种工具(夹子和双极电凝器)存在的准确性。这些工具特别值得关注,因为:(1)夹子的出现通常标志着切割和夹闭阶段的开始,这是手术过程中最精细的阶段;(2)双极电凝器通常用于止血,而出血可能导致可能即将发生的并发症。
(一)自动手术视频数据库索引
对于自动视频索引,该任务相当于在离线模式下进行阶段识别。从图10-a、c中所示的结果,人们已经可以大致了解阶段识别结果的准确性。为了给出更直观的评估,我们在表VI中展示了在定义的时间容差范围内检测到的阶段边界数量。可能会注意到P6阶段的出现次数不是40,因为并非所有手术都经历清洁和凝血阶段。我们可以看到,EndoNet在所有阶段的表现通常都非常好,89%的阶段边界在30秒内被检测到。还可以看到,只有6%的阶段边界检测误差超过2分钟。同样重要的是要注意,这个误差是根据注释中定义的严格阶段边界计算的。在实践中,这些边界并不那么严格或在视觉上不那么明显。因此,在大多数情况下,这个误差是可以接受的。换句话说,这表明EndoNet的结果不需要大量修正,这将使手术视频索引变得更快、更容易。
表6 在Cholec80的40个评估视频中,离线模式下在定义容差范围内正确识别的阶段数量
应该注意的是,对于在线模式下的阶段识别也可以计算类似的指标。然而,这是一个不适定问题,因为在线模式下识别得到的检测阶段没有明确的边界,因为检测结果可能在不同阶段之间跳跃(见图10-d)。在实践中,对于这个应用需要额外的后处理步骤,如在时间窗口上进行平滑处理,但这不在本文的研究范围内。
(二)双极电凝器和夹子检测
除了在表II中展示两种工具检测的AP值之外,我们还提出了一个更直观的指标来衡量EndoNet检测双极电凝器和夹子存在的可靠性。我们将工具块定义为一组连续的帧,其中某个工具存在。由于即使工具当前正在使用,它在图像中也可能并不总是可见,因此我们将地面真实数据中间隔小于15秒的(相同工具的)块合并。
然后,如果EndoNet能够在工具块内的至少一帧中检测到该工具,我们就将该工具块定义为已识别。为了展示EndoNet在时间精度方面的性能,我们还展示了工具块的第一帧与检测到的第一帧之间的时间差。
在这个实验中,我们通过设置一个能为每个工具提供高精度的置信度阈值来确定工具的存在,以便系统能够获得最小数量的误报,并在正确检测工具块时保持敏感性。由于误报率是使用工具块定义来测量的,我们还将间隔小于15秒的工具存在检测结果合并。
我们在表VII中展示了块检测结果。可以看出,EndoNet对所有双极电凝器块的检测都非常好。超过90%的块在5秒内被检测到。EndoNet对双极电凝器的误报率也非常低(即3.8%)。这种出色的性能得益于双极电凝器独特的视觉外观(例如,蓝色的杆)。
对于夹子,我们可以看到其误报率高于双极电凝器。这可能是因为它在数据集中的注释数量第二少,因为与剪刀类似,夹子在手术中仅短暂出现。然而,EndoNet在夹子检测方面仍然表现出色,显示80%和97%的块分别在5秒和30秒内被检测到。
七、讨论与结论
在本文中,我们解决了腹腔镜手术中的阶段识别问题,并提出了一种从原始图像中直接学习视觉特征的新方法。该方法基于一种名为EndoNet的卷积神经网络(CNN)架构,旨在同时执行两项任务:工具存在检测和阶段识别。我们通过实验表明,这种方法克服了数据集中固有的视觉挑战,随后产生的视觉特征优于先前使用的特征以及从单任务设计架构中获得的特征。
有趣的是,EndoNet的视觉特征在阶段识别任务中的表现也明显优于指示图像中可见工具的二元工具信号,即使这些信号是从地面真实注释中获得的。因此,这些结果表明,图像除了简单的工具存在信息之外,还包含对识别有用的其他特征,并且这些特征被EndoNet成功提取。此外,我们已经表明EndoNet在另一个较小的数据集EndoVis上也表现良好,因此具有泛化性。
为了训练和评估EndoNet,我们构建了一个大型数据集,其中包含13位外科医生进行的80个胆囊切除术视频。尽管胆囊切除术是手术工作流分析的常见关注点,但据我们所知,先前工作中使用的胆囊切除术数据集仅限于不到20个手术。
因此,这是首次针对这些识别任务进行的大规模研究。这也是首次对可用于腹腔镜手术阶段识别的特征进行比较。此外,表I-a中阶段持续时间的标准差表明,该数据集本身具有很高的可变性。EndoNet的最先进结果表明,我们提出的方法可以应对这种复杂性。
微调子集大小变化的结果表明,从Cholec80中获取更多视频来微调网络将导致更好的性能。然而,应该注意的是,Cholec80中的视频来自一家医院,因此数据的复杂性仅限于同一机构外科医生手术执行的可变性。
使用这样的数据集训练CNN网络可能会导致过拟合,从而降低网络的泛化性。为了获得更具泛化性的网络,应该纳入其他医疗机构的视频,以确保数据集中具有更高的可变性。EndoNet在执行工具存在检测和阶段识别任务方面的成功,应该被视为呼吁该领域开放数据,以加速针对这些任务的泛化解决方案的开发。
我们已经展示了EndoNet在两种不同应用中的适用性。这些应用侧重于视频数据库管理,这是我们临床合作伙伴的需求之一。在未来的工作中,应该解决其他相关应用,如在实时手术中提供情境感知辅助。探索EndoNet生成的特征是否可用于执行腹腔镜视频中的其他任务也很有趣,例如手术过程完成时间的估计[3]、手术视频的分类[35]以及解剖结构的识别。
尽管取得了最先进的结果,但本文提出的阶段识别流程仍然存在一些局限性。例如,阶段识别仍然依赖于HHMM,这是在阶段估计中强制执行时间约束所必需的。因此,EndoNet学习到的特征不包含视频中存在的任何时间信息。
此外,由于HHMM是与EndoNet微调过程分开训练的,EndoNet的特征并没有针对整个阶段识别任务进行优化。有了更多的训练数据,这些局限性可以通过使用长短期记忆(LSTM)架构来解决。这种方法将成为未来改进阶段识别工作的一部分。
相关文章:
【文献阅读】EndoNet A Deep Architecture for Recognition Tasks on Laparoscopic Videos
关于数据集的整理 Cholec80 胆囊切除手术视频数据集介绍 https://zhuanlan.zhihu.com/p/700024359 数据集信息 Cholec80 数据集 是一个针对内窥镜引导 下的胆囊切除手术视频流程识别数据集。数据集提供了每段视频中总共7种手术动作及总共7种手术工具的标注,标…...
UML统一建模
UML UML(统一建模语言)介绍 UML(统一建模语言)介绍 面向对象软件开发需要经过OOA面向对象分析、OOD面向对象设计和OOP面向对象编程三个阶段。OOA对目标系统进行分析并寄哪里分析模型,并将之文档化,OOD用面向…...
Ubuntu下安装和卸载MySQL
Ubuntu下安装和卸载MySQL 下面的演示系统版本:Ubuntu 24.04 更新系统软件包 在开始安装之前,建议先更新系统的软件包列表,以确保所有依赖项是最新的。 sudo apt update && sudo apt upgrade -y安装MySQL服务器 Ubuntu的官方软件…...
物联网技术赋能:复杂环境下的能源数据零丢失
安科瑞顾强 在全球能源挑战日益严峻的背景下,高效节能已成为各行业的核心诉求。无论是商业综合体、工业厂房还是公共设施,如何实现能源的精细化管理成为关键课题。安科瑞能耗云平台凭借其创新技术与多功能服务,为企业提供了一站式能源管理解…...
卷积神经网络综述
摘要 本文对卷积神经网络(Convolutional Neural Network,CNN)进行了全面综述。首先介绍了卷积神经网络的发展历程,包括早期的理论基础和关键突破。接着详细阐述了卷积神经网络的结构组成,包括卷积层、池化层、全连接层…...
SpringBoot3设置maven package直接打包成二进制可执行文件
注意事项 SpringBoot普通native打包顺序clean compile spring-boot:process-aot native:compile 使用以下配置只会的打包顺序clean package(注意:使用此配置以后打包会有编译后的class文件、jar包、original源文件、二进制可执行文件【Linux是无后缀的包…...
在 Anaconda 上安装多版本 Python 解释器并在 PyCharm 中配置
默认已安装好 Anaconda 和 PyCharm ,想在 Anaconda 上安装最新版本的 Python 解释器。 一、在 Anaconda 上创建虚拟环境 在连网状态下进入系统的命令提示符(快捷键:win r ,输入 cmd 即可),输入如下命令&a…...
AES (高级加密标准)
原理详解 AES是一种对称加密算法,使用相同的密钥进行加密和解密。它采用替代-置换网络(SPN)结构,主要步骤包括: 密钥扩展:从初始密钥派生多轮密钥 初始轮:AddRoundKey(轮密钥加) 主轮ÿ…...
Git拉分支技巧:从零开始创建并推送分支
Git拉分支技巧:从零开始创建并推送分支 在团队协作开发中,Git 分支管理是不可或缺的技能。合理地创建、同步和推送分支,不仅能提高开发效率,还能避免代码冲突。本文将基于以下技巧,详细讲解如何从零开始创建并推送一个…...
线性回归之归一化(normalization)
文章目录 归一化与梯度下降归一化的必要性:从特征量纲到梯度下降问题背景矛盾与低效归一化的作用 归一化提高模型精度的原因归一化的本质常见归一化方法最大值最小值归一化示例说明优缺点分析 标准归一化具体机制示例说明 强调 归一化与梯度下降 归一化与梯度下降 &…...
mac监控linux上mysql性能(Grafana+Prometheus+mysqld_exporter)
一、监控查看端安装 Grafana安装-CSDN博客 普罗米修斯Prometheus监控安装(mac)-CSDN博客 1.启动Grafana服务 brew services start grafana 打开浏览器输入http://localhost:3000进入grafana登录页面 (默认用户名和密码都为admin,进入后…...
【玩泰山派】MISC(杂项)- linux桌面环境
文章目录 linux桌面环境linux四大桌面环境概述ubuntu基于四大桌面环境的版本 显示管理器gdm3(GNOME Display Manager)lightdm(Lightweight Display Manager)SDDM(Simple Desktop Display Manager)KDM&#…...
MVCC介绍
MVCC(多版本并发控制)详解 MVCC(Multi-Version Concurrency Control) 是一种数据库并发控制技术,核心思想是通过维护数据的多个版本来实现读写操作的无锁并发,从而在高并发场景下提升性能。它广泛用于 MyS…...
神经网络与模型训练过程笔记
1.专有名词 ANN 人工神经网络,一种受生物神经元启发的监督学习算法。输入数据通过网络中的层级函数传递,激活特定神经元。函数复杂度越高,模型对数据的拟合能力越强,预测精度越高。 偏置项 其中x下表从1开始的是输入变量…...
ASP.NET 0~1学习
变量 string username Request["id"]; 声明并初始化一个字符串变量 username 数据类型 下面列出了常用的数据类型: 类型描述实例int整数(全数字)103, 12, 5168float浮点数3.14, 3.4e38decimal十进制数字(高精度&a…...
optool为macho文件增加动态库
对macho文件有一定理解后,了解下optool是如何给macho文件增加动态库等功能的 optool 源码 环境 macOS 13.4 (22F66) Xcode 14.3.1 0x0 编译 下载源码 $ git clone --recurse-submodules https://github.com/alexzielenski/optool.git修改下Deployment Target,比如改成11.0&…...
【C++】类和对象之日期类的实现(构造、运算符重载)
文章目录 一、日期类要实现的函数二、函数实现1、GetMonthDay获取对应月份的天数2、CheckDate检查日期3、Date构造函数4、Print打印日期5、运算符重载1. 、、-、-2. 前置/--、后置/--3. 两个日期类相减(求相差日期) 6、比较7、流插入、流提取࿰…...
【Rust 精进之路之第9篇-所有权·核心】规则与移动 (Move):Rust 内存安全基石详解
系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025年4月20日 引言:没有 GC,Rust 如何管好内存?答案是所有权! 在我们的 Rust 探索之旅中,我们已经学习了变量、数据类型、控制流、函数和强大的构建工具 Cargo。现在,我们将踏入 Rust 最…...
【任务调度】xxl-job入门
xxl- job 入门 附上笔者写的测视示例:chenmeng-test-demos/demo8-task/task-xxl-job at master cmty256/chenmeng-test-demos 官方文档 XXL-JOB官网 源码仓库地址: Github:https://github.com/xuxueli/xxl-job Gitee:http://g…...
Go语言--语法基础4--基本数据类型--浮点数类型
3 、浮点数类型 浮点型用于表示包含小数点的数据,比如 1.234 就是一个浮点型数据。 Go 语言中的浮点类型采用 IEEE-754 标准的表达方式。 float32 精度是小数点后 7 位 float64 精度是小数点后 15 位。 1. 浮点数表示 Go 语言定义了两个类型 float32 和 floa…...
秘密任务 3.0:如何通过 JWT 认证确保 WebSockets 安全
在之前的文章中,我们探讨了如何通过 WebSockets DTOs 设计实时操作。现在,我们迎来了一项新的挑战:确保 WebSocket 通信在任务执行过程中保持安全。如果敌方潜伏在我们的实时通信渠道中,机密情报可能会被泄露。 任务:…...
UID和GID的区别
UID(用户标识符)和 GID(组标识符)是 Linux/Unix 系统中用于管理用户和组权限的核心机制,它们的区别主要体现在作用对象和用途上: 目录 1. 定义与作用对象 2. 主要用途 3. 系统保留范围 4. 用户与组的关…...
【网络】通过Samba实现Window挂在Linux服务器路径
有时候我们去进行内网部署时,会遇到客户或者甲方爸爸说,需要将Linux中的某个路径共享出去到Window上,挂载出比如Z:\这种盘符。通过打开Z盘,来查看服务器的指定目录下的数据。 步骤1: 在Linux中安装samba yum install…...
UE5 UI 教程系列全集
https://www.youtube.com/TheRoyalSkies/search?queryUnreal-5%20UI...
论文笔记(七十八)Do generative video models understand physical principles?
Do generative video models understand physical principles? 文章概括Physics-IQ基准数据集评估协议为什么要创建一个真实世界的Physics-IQ数据集模型物理理解的评估指标动作发生在哪里?空间IoU(Spatial IoU)动作在哪里、何时发生…...
Viper配置管理笔记
一、什么是 Viper? Viper 是 Go 语言的一个强大工具,就像一个超级管家,专门负责帮你打理程序的各种配置。它能把配置文件(比如 JSON、YAML、TOML 等格式)里的内容读出来,还能监控配置文件的变化࿰…...
visual studio无法跳转到函数定义、变量定义、跳转函数位置不准问题解决
参考:https://blog.csdn.net/snakehacker/article/details/135438353 程序有时会出现大部分函数都不能准确的从头文件中正确定位到函数定位,这是因为数据库错乱造成的,可以通过重构数据库来解决,操作方法如下: 菜单栏:工具——选项 文本编辑…...
【Rust 精进之路之第15篇-枚举 Enum】定义、变体与数据关联:表达多种可能性
系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025年4月20日 引言:当值拥有“选项”——超越结构体的表达力 在上一篇【结构体 Struct】中,我们学习了如何使用结构体将多个相关的数据字段组合成一个有意义的整体。结构体非常适合表示那些…...
C++ 相关系统软件简介与学习方法【最水的一期】
C 作为一种强大的C 相关系统软件简介编程语言,广泛应用于系统软件开发领域。以下为你介绍几款基于 C 开发的典型系统软件及其特点: 操作系统内核 部分操作系统内核采用 C 开发,例如某些嵌入式操作系统。C 的高性能、底层硬件访问能力和强大的…...
【Linux我做主】GDB调试工具完全指南
Linux下GDB调试工具完全指南:25个核心命令详解与实战示例 github地址 有梦想的电信狗 前言 GDB(GNU Debugger)是Linux开发中不可或缺的调试工具,尤其在定位代码逻辑错误和内存问题时表现卓越。本文基于实际开发经验࿰…...
基于SpringBoot3实现MyBatis-Plus(SSMP)整合快速入门CURD(增删改查)
目录 一、快速搭建SpringBoot-Web工程脚手架。 1.1 Spring Initializr 初始化工程。(官方提供) 1.2 工程脚手架初始化详细步骤。(IDEA2024.1.1) 二、MyBatis-Plus的特性与快速上手。 2.1 官网地址与基本特性。 2.2 快速上手技术栈基础。 2.3 Spring Boot2 的 MyBatis-Plus Star…...
短视频电商新纪元:TikTok Shop全球蓝海争夺战进入关键窗口期
一、流量重构:TikTok Shop改写全球电商版图 2024年,全球跨境电商市场迎来新一轮洗牌。当Temu、Shein等平台深陷“低价内卷”泥潭时,TikTok Shop凭借日均30亿次的短视频流量,正在开辟一条“内容即货架”的颠覆性赛道。最新数据显示…...
uniapp-商城-29-vuex 关于系统状态的管理
按照我们前面讲的,vuex,的使用方式: 步骤如下: 1 先创建store 文件夹 2 在 store 中 创建一个 index.js 3、 在 store 中,创建一个modules文件夹 4、在store中,创建一个getters.js 5、在modules文件…...
Qt中修改了UI设计文件后编译不生效问题的解决办法
复制工程过来后: 1、删除build文件 2、删除.user文件,恢复为文件最初的那样 3、执行make distclean,删除所有由先前构建过程生成的文件 4、再次打开工程,修改ui文件编译生效!...
Python 项目环境配置与 Vanna 安装避坑指南 (PyCharm + venv)
在进行 Python 项目开发时,一个干净、隔离且配置正确的开发环境至关重要。尤其是在使用像 PyCharm 这样的集成开发环境 (IDE) 时,正确理解和配置虚拟环境 (Virtual Environment) 是避免许多常见问题的关键。本文结合之前安装 Vanna 库时遇到的问题&#…...
Matlab FCM模糊聚类
1、内容简介 Matlab 211-FCM模糊聚类 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
标准的JNI (Java Native Interface) 加载函数 JNI_OnLoad
1.JNI_OnLoad 在 Android Native 开发中,JNI_OnLoad 是动态注册本地方法的标准入口点。以下是一个标准实现示例及其说明: JNI_OnLoad 标准实现 #include <jni.h> #include <string>// 声明本地方法对应的 C/C 函数 jint native_add(JNIEnv…...
微信小程序中使用h5页面预览图片、视频、pdf文件
遇到了这么一个需求,需要在微信小程序中点击文件,进行文件预览。 要求: 图片:长图需要宽度100%高度自适应;横图的话宽度100%,高度居中显示视频:视频不管横向还是竖向都居中显示,有…...
A2A协议详解:打造统一的AI代理通信标准,实现多Agent系统协同
A2A 协议中文说明 文章目录 A2A 解决现有 Agent 问题 Agent 生态系统现状当前面临的主要问题为什么需要统一协议,有个标准采用复用 A2A 解决方案 统一通信标准代理能力发现机制安全协作框架灵活的交互模式 A2A 与 MCP 的关系 MCP 简介两者的区别与联系集成场景协同…...
博客系统案例练习2-用户注册-redis
前言 用户注册 [请求]/user/register[参数]contentType: application/json{"userName":"wangwu","password":"456789","githubUrl": "https://gitee.com/bubble-fish666/spring-cloud","email": &quo…...
【人工智能】推荐开源企业级OCR大模型InternVL3
推荐开源企业级OCR大模型InternVL3 文章参考来源: https://huggingface.co/OpenGVLab/InternVL3-14B-Instruct https://www.aivi.fyi/llms/deploy-InternVL3 InternVL3,这是一个高级多模态大型语言模型 (MLLM) 系列,展示了卓越的整…...
聊天室项目
一.完善注册页面 1.完善注册页面图标,添加检测注册页面各个登录信息是否完善,并且通过信号和槽与自定义一个计时器,当注册完毕后跳转到显示注册完毕的页面。 2.各个坚持注册页面是否按要求的函数 3.完善主页面,设置信号和槽&…...
并发设计模式实战系列(4):线程池
🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第四章线程池(Thread Pool),废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 线程池核心组件 2. 核心…...
大模型应用案例:主动提问式的 AI 面试官(接入 DeepSeek)
目录 核心逻辑 效果演示 技术选型 大模型应用开发框架:langchain-deepseek UI 展示框架—streamlit 代码获取 后续改进想法 本文附带详细的视频讲解,欢迎小伙伴们来支持—— 【代码宇宙017】大模型:主动提问式的 AI 面试官࿰…...
算法笔记—动态规划
1137. 第 N 个泰波那契数 - 力扣(LeetCode) class Solution { public:int tribonacci(int n) {if(n0) return 0;if(n1||n2) return 1;vector<int> dp(4);//初始化dp[0]0; dp[1]1; dp[2]1;for(int i3;i<n1;i){//滚动数组优化需要循环dp[i%4]dp[…...
Vue3集成Element Plus完整指南:从安装到主题定制上
一、Element Plus简介 Element Plus是一套基于Vue 3.0的桌面端组件库,由饿了么前端团队开源维护。它提供了丰富的UI组件,能够帮助开发者快速构建企业级中后台产品。 1. 安装与卸载 bash 复制 下载 # 安装最新版本 npm install element-plus -S# 卸…...
初识javascript
1. JavaScript 基础语法 (1) 变量声明 JavaScript支持三种声明变量的方式: var:传统的变量声明方式,存在作用域问题(函数作用域)。 let:块级作用域变量声明方式,避免了var的作用域问题。 co…...
C++项目 —— 基于多设计模式下的同步异步日志系统(5)(单例模式)
C项目 —— 基于多设计模式下的同步&异步日志系统(5)(单例模式) 一个问题单例模式实现1. 单例模式:全局唯一实例功能:实现细节:作用: 2. 日志器的注册与查找功能:实现…...
rag搭建,是如何进行向量匹配检索的?
RAG 里为什么要“向量检索”? 在 Retrieval-Augmented Generation (RAG) 中,我们的目标是让 LLM 能够“回答它本身不知道的内容”。做法是: 将知识(文本)进行向量化,存入向量数据库;用户提问后,也将问题向量化;去数据库里 找出与这个问题最相似的一批知识,返回喂给 …...
k8s 基础入门篇之开启 firewalld
前面在部署k8s时,都是直接关闭的防火墙。由于生产环境需要开启防火墙,只能放行一些特定的端口, 简单记录一下过程。 1. firewall 与 iptables 的关系 1.1 防火墙(Firewall) 定义: 防火墙是网络安全系统&…...