计算机视觉单阶段实例分割实践指南与综述
概述
原文地址:https://towardsdatascience.com/single-stage-instance-segmentation-a-review-1eeb66e0cc49
实例分割是一项具有挑战性的计算机视觉任务,需要预测对象实例及其每像素分割掩码。这使其成为语义分割和目标检测的混合体。
自 Mask R-CNN 以来,实例分割的SOTA方法主要是 Mask RCNN及其变体(PANet、Mask Score RCNN 等)。它采用先检测再分割的方法,先进行目标检测,提取每个目标实例周围的边界框,然后在每个边界框内部进行二值分割,分离前景(目标)和背景。
除了检测然后分割(或逐检测分割)的自顶向下方法之外,还有其他一些实例分割方法。一个例子是通过将实例分割作为自底向上的像素分配问题来关注像素,就像在 SpatialEmbedding(ICCV 2019) 中所做的那样。但是这些方法通常比检测然后分割的 SOTA 具有更差的性能,我们不会在这篇文章中详细介绍。
然而,Mask RCNN 速度非常慢,许多实时应用场合无法使用。此外,Mask RCNN 预测的掩码具有固定的分辨率,因此对于具有复杂形状的大目标来说不够精细。由于anchor-free目标检测方法(例如 CenterNet 和 FCOS)的进步,已经出现了一波关于单阶段实例分割的研究。其中许多方法比 Mask RCNN 更快、更准确,如下图所示。
最近在 Tesla V100 GPU 上测试的单阶段方法的推理时间
本文将回顾单阶段实例分割的最新进展,重点是掩码表示——实例分割的一个关键方面。
局部掩码和全局掩码
在实例分割中要问的一个核心问题是实例掩码的表示或参数化——1)是使用局部掩码还是全局掩码,2)如何表示/参数化掩码。
主要有两种表示实例掩码的方法:局部掩码和全局掩码。
全局掩码是我们最终想要的,它与输入图像具有相同的空间范围,尽管分辨率可能更小,例如原始图像的 1/4 或 1/8。它具有对大或小目标具有相同分辨率(因此具有固定长度特征)的天然优势。这不会牺牲更大目标的分辨率,固定分辨率有助于执行批处理以进行优化。
局部掩码通常更紧凑,因为它没有作为全局掩码的过多边界。它必须与要恢复到全局掩码的掩码位置一起使用,并且局部掩码大小将取决于目标大小。但是要执行有效的批处理,实例掩码需要固定长度的参数化。最简单的解决方案是将实例掩码调整为固定图像分辨率,如 Mask RCNN 所采用的那样。正如我们在下面看到的,还有更有效的方法来参数化局部掩码。
根据是使用局部掩码还是全局掩码,单阶段实例分割在很大程度上可以分为基于局部掩码( local-mask-based )和基于全局掩码( global-mask-based )的方法。
基于局部掩码的方法
基于局部掩码的方法直接在每个局部区域上输出实例掩码。
显式编码的轮廓
Bounding box 在某种意义上是一个粗糙的掩码,它用最小的边界矩形来逼近掩码的轮廓。ExtremeNet(Bottom-up Object Detection by Grouping Extreme and Center Points,CVPR 2019)通过使用四个极值点(因此是一个具有8个自由度的边界框而不是传统的4个DoF)进行检测,并且这种更丰富的参数化可以自然地扩展通过在其对应边缘上的两个方向上的极值点延伸到整个边缘长度的 1/4 的一段,到八边形掩模。
从那时起,有一系列工作试图将实例掩码的轮廓编码/参数化为固定长度的系数,给定不同的分解基础。这些方法回归每个实例的中心(不一定是 bbox 中心)和相对于该中心的轮廓。
ESE-Seg(Explicit Shape Encoding for Real-Time Instance Segmentation,ICCV 2019)为每个实例设计了一个内圆心半径形状签名,并将其与切比雪夫多项式拟合。
PolarMask(PolarMask:Single Shot Instance Segmentation with Polar Representation,CVPR 2020)使用从中心以恒定角度间隔的光线来描述轮廓。
FourierNet(FourierNet:Compact mask representation for instance segmentation using differentiable shape decoders)引入了使用傅立叶变换的轮廓形状解码器,并实现了比 PolarMask 更平滑的边界。
各种基于轮廓的方法
这些方法通常使用 20 到 40 个系数来参数化掩码轮廓。它们推理速度快且易于优化。但是,它们的缺点也很明显。首先,从视觉上看,它们都看起来——老实说——非常糟糕。它们无法精确描绘掩码,也无法描绘中心有孔的物体。
这系列方法很有意思,但是前途渺茫。实例掩码的复杂拓扑或其轮廓的显式编码是难以处理的。
结构化 4D 张量
TensorMask(TensorMask: A Foundation for Dense Object Segmentation, ICCV 2019) 是通过预测每个特征图位置的掩码来展示密集掩码预测思想的首批作品之一。TensorMask 仍然通过感兴趣区域而不是全局掩码来预测掩码,并且它能够在不运行目标检测的情况下运行实例分割。
TensorMask 利用结构化的 4D 张量来表示空间域上的掩码(2D 迭代输入图像中的所有可能位置,2D 表示每个位置的掩码),它还引入了对齐表示和张量双锥体( aligned representation and tensor bipyramid )来恢复空间细节,但这些对齐操作使网络甚至比两阶段的 Mask R-CNN 还要慢。此外,为了获得良好的性能,它需要使用比标准 COCO 目标检测管道(6x schedule)长 6 倍的调度进行训练。
紧凑型掩码编码
自然的目标掩码不是随机的,类似于自然图像,实例掩码位于比像素空间低得多的内在维度。
MEInst(Mask Encoding for Single Shot Instance Segmentation,CVPR 2020)将掩码提炼为紧凑且固定的维度表示。通过使用 PCA 进行简单的线性变换,MEInst 能够将 28x28 的局部掩码压缩为 60 维的特征向量。 该论文还尝试在单级目标检测器(FCOS)上直接回归 28x28=784-dim 特征向量,并且在 1 到 2 个 AP 点下降的情况下也得到了合理的结果。
这意味着直接预测高维掩码(以每个 TensorMask 的自然表示)并非完全不可能,但很难优化。掩码的紧凑表示使其更容易优化,并且在推理时运行速度也更快。它与 Mask RCNN 最相似,可以直接与大多数其他目标检测算法一起使用。
基于全局掩码的方法
基于全局掩码( Global-mask-based )的方法首先基于整个图像生成中间和共享特征图,然后组合提取的特征以形成每个实例的最终掩码。这是最近的单阶段实例分割方法中的主流方法。
原型和系数( Prototypes and Coefficients )
YOLACT(YOLACT:实时实例分割,ICCV 2019)是最早尝试实时实例分割的方法之一。YOLACT 将实例分割分解为两个并行任务,生成一组原型掩码并预测每个实例的掩码系数。
原型掩码( prototype masks )是用 FCN 生成的,可以直接受益于语义分割的进步。系数被预测为边界框的额外特征。这两个并行步骤之后是组装步骤:通过矩阵乘法实现的简单线性组合和对每个实例的预测边界框的裁剪操作。裁剪操作减少了网络抑制边界框外噪声的负担,但如果边界框包含同一类的另一个实例的一部分,仍然会看到一些泄漏。
原型掩码的预测对于确保最终实例掩码的高分辨率至关重要,这与语义分割相当。原型掩码仅依赖于输入图像,与类别和特定实例无关。这种分布式表示是紧凑的,因为原型掩码的数量与实例的数量无关,这使得 YOLACT 的掩码计算成本恒定(不像 Mask RCNN 的计算成本与实例数量成线性关系)。
回顾 InstanceFCN(Instance-sensitivefully Convolutional Networks,ECCV 2016)和 MSRA 的后续研究 FCIS(Fully Convolutional Instance-aware Semantic Segmentation,CVPR 2017),它们似乎是 YOLACT 的一个特例。InstanceFCN 和 FCIS 都利用 FCN 生成多个实例敏感的分数图,其中包含目标实例的相对位置,然后应用组装模块输出目标实例。位置敏感的分数图可以被视为原型掩码,但 IntanceFCN 和 FCIS 使用一组固定的空间池操作来组合位置敏感的原型掩码,而不是学习线性系数。
InstanceFCN [b] 和 FCIS [c] 使用固定池操作进行实例分割
BlendMask(BlendMask: Top-Down Meets Bottom-Up for Instance Segmentation, CVPR 2020) 建立在 YOLACT 之上,但不是为每个原型掩码预测一个标量系数,BlendMask 预测一个低分辨率 (7x7) 注意力图来混合其中的掩码边界框。该注意力图被预测为附加到每个边界框的高维特征 (7x7=49-d)。有趣的是,BlendMask 使用的原型掩码是 4 个,但它甚至只对 1 个原型掩码起作用。
CenterMask(CenterMask:single shot instance segmentation with point representation,CVPR 2020)的工作方式几乎完全相同,并明确使用 1 个原型掩码(命名为全局显着图)。
CenterMask 使用 CenterNet 作为主干,而 BlendMask 使用类似的anchor-free和单级 FCOS 作为主干。
CenterMask 的架构。BlendMask 有一个极其相似的管道。
请注意,BlendMask 和 CenterMask 都进一步依赖于检测到的边界框。在与裁剪的原型蒙版混合之前,注意力图或掩码大小必须缩放到与边界框相同的大小。
CondInst(Conditional Convolutions for Instance Segmentation) 更进一步,完全消除了对边界框的任何依赖。它没有组装裁剪的原型掩码,而是借用了动态过滤器的思想并预测了轻量级 FCN 头部的参数。FCN头部共有三层,共有169个参数。令人惊奇的是,作者表明,即使原型掩码是单独的 2-ch CoordConv,网络也能在 COCO 上达到 31 个 AP。我们将在下面的隐式表示部分讨论这个。
BlendMask /CenterMask 和 CondInst 都是 YOLACT 的扩展。
-
BlendMask/CenterMask 正在尝试将裁剪的原型掩码与每个 bbox 中的细粒度掩码混合。YOLACT 是 BlendMask 或 CenterMask 的一种特殊情况,其中注意力图的分辨率为 1x1。
-
CondInst 正在尝试将裁剪的原型掩码与由动态预测过滤器组成的更深层次的卷积混合在一起。YOLACT 是 CondInst 的一种特殊情况,其中 FCN 是 1 1x1 conv 层。
使用分支来预测原型掩码允许这些方法受益于使用语义分割的辅助任务(通常在 AP 中提升 1 到 2 个点)。它也可以自然地扩展到执行全景分割( panoptic segmentation )。
关于表示每个实例掩码所需的参数,下面列出了一些技术细节。这些具有全局掩码和系数的方法每个实例掩码使用 32、196、169 个参数。
-
YOLACT使用32个原型掩码+32-dim掩码系数+框裁剪;
-
BlendMask 使用 4 个原型掩码 + 4 个 7x7 注意力图 + 框裁剪;
-
CondInst 使用 coordConv + 3 1x1 动态 conv(169 个参数)
SOLO 和 SOLOv2:按位置分割目标
SOLO是其中一种,值得拥有自己的部分。这些论文很有见地,而且写得很好。它们对我来说是一件艺术品(就像另一个我最喜欢的 CenterNet)。
SOLOv1 的架构
论文第一作者在知乎上回复了SOLO的动机,我引用如下:
“语义分割预测图像中每个像素的语义类别。类似地,例如分割,我们建议预测每个像素的“实例类别”。现在关键的问题是,我们如何定义实例类别?”
如果输入图像中的两个目标实例具有完全相同的形状和位置,则它们是同一个实例。任何两个不同的实例要么具有不同的位置或形状。由于形状一般难以描述,我们用尺寸近似形状。
因此,“实例类别”由位置和大小定义。位置按其中心位置分类。SOLO 通过将输入图像划分为 S x S 单元格和 S² 类的网格来近似中心位置。通过将不同大小的目标分配到特征金字塔 (FPN) 的不同级别来处理大小。因此对于每个像素,SOLO 只需要决定将像素(和相应的实例类别)分配给哪个 SxS 网格单元和哪个 FPN 级别。所以SOLO只需要执行两个像素级别的分类问题,类似于语义分割。
现在另一个关键问题是掩码是如何表示的?
实例掩码直接由堆叠到 S² 通道中的全局掩码表示。这是一个巧妙的设计,可以同时解决许多问题。首先,许多先前的研究将 2D 掩码存储为扁平向量,当掩码分辨率增加导致通道数量激增时,这很快变得难以处理。全局掩码自然地保留了掩码像素内的空间关系。其次,全局掩码生成可以保持掩码的高分辨率。第三,预测掩码的数量是固定的,与图像中的目标无关。这类似于原型掩码的工作线,我们将在 SOLOv2 中看到这两个流如何合并。
SOLO 将实例分割制定为仅分类问题,并删除任何依赖于回归的问题。这使得 SOLO 自然独立于目标检测。SOLO 和 CondInst 是直接操作全局掩码的两个作品,是真正的无边界框方法。
SOLO 预测的全局掩码。掩码是冗余的、稀疏的并且对目标定位错误具有鲁棒性。
分辨率权衡( Resolution tradeoff )
从 SOLO 预测的全局掩码中,我们可以看到掩码对定位误差相对不敏感,因为相邻通道预测的掩码非常相似。这带来了目标定位的分辨率(以及精度)和实例掩码之间的权衡。
TensorMask 的 4D 结构化张量的想法在理论上很合理,但在当前 NHWC 张量格式的框架中很难在实践中实现。将具有空间语义的二维张量展平为一维向量不可避免地会丢失一些空间细节(类似于使用全连接网络进行语义分割),并且即使表示 128x128 的低分辨率图像也有其局限性。位置的 2D 或掩模的 2D 必须牺牲分辨率。大多数先前的研究都认为位置分辨率更重要并且对掩码尺寸进行下采样/压缩,从而损害了掩码的表现力和质量。TensorMask 试图取得平衡,但繁琐的操作导致训练和推理缓慢。SOLO 意识到我们不需要高分辨率的位置信息,并通过将位置压缩为粗略的 S² 网格来借用 YOLO。这样,SOLO 就保持了全局掩码的高分辨率。
我天真地认为 SOLO 或许可以通过将 S² x W x H 全局掩码预测为附加到 YOLO 中每个 S² 网格的附加扁平 WH 维特征来工作。我错了——以全分辨率而不是扁平矢量来制定全局掩码实际上是 SOLO 成功的关键。
Decoupled SOLO 和 Dynamic SOLO
如上所述,SOLO 在 S² 通道中预测的全局掩码非常冗余和稀疏。即使在 S=20 的粗分辨率下,也有 400 个通道,而且图片中的对象也不可能太多以至于每个通道都包含一个有效的实例掩码。
在Decoupled SOLO 中,形状为 H x W x S² 的原始 M 张量被两个形状为 H x W x S 的张量 X 和 Y 替换。对于位于网格位置 (i, j) 的对象,M_ij 近似为 逐元素乘法 X_i ⊗ Y_j。这将 400 个通道减少到 40 个通道,实验表明性能没有下降。
SOLO vs Decoupled SOLO vs SOLOv2
现在很自然地会问,我们是否可以通过预测更少的掩码并预测每个网格单元的系数来组合它们来借鉴 YOLACT 的原型掩码想法?SOLOv2 正是这样做的。
在 SOLOv2 中,有两个分支,一个特征分支和一个内核分支。特征分支预测 E 原型掩码,内核分支在每个 S² 网格单元位置预测大小为 D 的内核。正如我们在上面的 YOLACT 部分中看到的那样,这种动态过滤器方法是最灵活的。当 D=E 时,是原型掩码(或 1x1 conv)的简单线性组合,与 YOLACT 相同。该论文还尝试了 3x3 conv kernels(D=9E)。这可以通过预测轻量级多层 FCN 的权重和偏差(例如在 CondInst 中)更进一步。
现在,由于全局掩码分支与其专用位置解耦,我们可以观察到新的原型掩码表现出比 SOLO 中的更复杂的模式。它们仍然对位置敏感,并且更类似于 YOLACT。
掩码的隐式表示
CondInst 和 SOLOv2 中使用的动态滤波器的想法起初听起来很棒,但如果将其视为用于线性组合的系数列表的自然扩展,则实际上非常简单。
还可以认为我们使用系数或注意力图对掩码进行了参数化,或者最终将其参数化为用于小型神经网络头部的动态滤波器。最近在 3D 学习中也探索了使用神经网络动态编码几何实体的想法。传统上,3D 形状要么使用体素、点云或网格进行编码。Occupancy Networks(Occupancy Networks: Learning 3D Reconstruction in Function Space, CVPR 2019) 提出将形状编码为神经网络,将深度神经网络的连续决策边界视为 3D 表面。网络接收 3D 中的一个点并判断它是否在编码的 3D 形状的边界上。这种方法允许在推理期间以任何分辨率提取 3D 网格。
Occupancy Networks 中提出的隐式表示
我们能否学习一个由每个目标实例的动态过滤器组成的神经网络,以便网络接收 2D 中的一个点并输出该点是否属于该目标掩码?这自然会输出一个全局掩码,并且可以具有任何所需的分辨率。
回顾 CondInst 的消融研究,证明即使没有原型掩码,也只有 CoordConv 输入(用于执行均匀空间采样)。由于此操作与原型掩码的分辨率分离,因此以更高分辨率单独输入 CoordConv 以获得更高分辨率的全局掩码以查看这是否会提高性能会很有趣。我坚信实例掩码的隐式编码是未来。
只有 CoordConv 输入没有原型掩码,CondInst 也可以预测不错的性能
最后一句
大多数单阶段实例分割工作都是基于anchor-free目标检测,如CenterNet和FCOS。也许不出所料,上述许多论文都来自阿德莱德大学创建 FCOS 的同一个实验室。他们最近在 https://github.com/aim-uofa/AdelaiDet/ 上开源了他们的平台。
最近的许多方法都很快,并且可以实现实时或接近实时的性能 (30+ FPS)。NMS 通常是实时实例分割的瓶颈。为了实现真正的实时性能,YOLACT 使用 Fast NMS,SOLOv2 使用 Matrix NMS。
后记
-
预测实例掩码的高维特征向量是棘手的。几乎所有的方法都集中在如何将掩码压缩成低维表示。这些方法通常使用 20 到 200 个参数来描述一个掩码,取得不同程度的成功。我认为这是对表示掩码形状的最少参数数量的基本限制。
-
手工设计的参数化轮廓并不是很有前途。
-
局部掩码本质上取决于目标检测。希望能看到更多直接生成全局掩码的研究。
-
掩码的隐式表示是富有表现力的、紧凑的并且可以以任何分辨率生成掩码。CondInst 有可能通过利用隐式表示的力量生成更高分辨率的全局掩码。
-
SOLO 很简单,而 SOLOv2 又快又准。希望能看到更多沿着这条路线的未来研究。
相关文章:
计算机视觉单阶段实例分割实践指南与综述
概述 原文地址:https://towardsdatascience.com/single-stage-instance-segmentation-a-review-1eeb66e0cc49 实例分割是一项具有挑战性的计算机视觉任务,需要预测对象实例及其每像素分割掩码。这使其成为语义分割和目标检测的混合体。 自 Mask R-CNN …...
Axios结合Typescript 二次封装完整详细场景使用案例
Axios 是一个基于 promise 的 HTTP 客户端,用于浏览器和 node.js。二次封装 Axios 主要是为了统一管理 HTTP 请求,例如设置统一的请求前缀、头部、超时时间,统一处理请求和响应的格式,以及错误处理等。 以下是一个使用 TypeScrip…...
C++面试:HTTP1.0/1.1,HTTP2.0,HTPP3.0的区别
1.你对HTTP1.0/1.1,HTTP2.0,HTPP3.0有什么了解? 答:HTTP1.0: ①属于无连接式,每次发送HTTP请求都需要建立TCP连接。 ②会造成发送时的对头阻塞,当上一个请求没有应答,当前的请求就会…...
使用 Docker Compose 部署 Redis 主从与 Sentinel 高可用集群
文章目录 使用 Docker Compose 部署 Redis 主从与 Sentinel 高可用集群Redis 主从架构简介Redis Sentinel 简介配置文件1. 主节点配置 (redis-master.conf)2. 从节点配置 (redis-slave1.conf 和 redis-slave2.conf)redis-slave1.confredis-slave2.conf3. Sentinel 配置 (sentin…...
【Java】4、虚拟机 JVM
目录 Java内存区域详解(重点) JVM垃圾回收详解(重点) 类文件结构详解 类加载过程详解 类加载器详解(重点) 最重要的JVM参数总结 JDK监控和故障处理工具总结 JVM线上问题排查和性能调优案例 参考: JVM 核心技术 32 讲 深入浅出 Java 虚拟机...
Vue3之组合式API详解
Vue 3引入了一种新的API风格——组合式API(Composition API),旨在提升组件的逻辑复用性和可维护性。本文将详细阐述Vue 3中的组合式API,包括其定义、特点、使用场景、优势等,并给出具体的示例代码。 一、定义 组合式…...
Flutter编译Module was compiled with an incompatible version of Kotlin错误解决
文章目录 编译报错如下解决方法修复方案 编译报错如下 e: C:/Users/YUAN/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.9.20/e58b4816ac517e9cc5df1db051120c63d4cde669/kotlin-stdlib-1.9 .20.jar!/META-INF/kotlin-stdlib-jdk8.kotlin_module:…...
Uniapp插件如何通过NFC读取多种证卡信息?
nfc读卡uniapp插件,由中软高科进行开发,主要是通过NFC读取居民身份证、港澳台居住证、外国人居住证、护照等证卡的信息。经过多个版本的升级更新,目前性能已趋于稳定,并且读卡速度较之最初版本有了大的提升。 注意事项 测试使用的…...
本地docker镜像改名字
如果你想修改本地 Docker 镜像的名字,可以通过创建该镜像的新标签(tag)来实现。Docker 中没有直接修改镜像名字的命令,但可以通过重新打标签的方式实现类似的效果。以下是具体步骤: 查看当前镜像: docker…...
VS Code 远程连接 SSH 服务器
文章目录 一、安装 Remote - SSH 扩展并连接远程主机二、免密连接远程主机1. 生成 SSH 密钥对2. 将公钥复制到远程服务器3. 配置 SSH 客服端4. 连接测试 随着技术的不断迭代更新,在 Linux 系统中使用 Vim、nano 等基于 Shell 终端的编辑器(我曾经也是个 …...
艾体宝案例丨CircleCI 助力 ANA Systems 打造高效 CI/CD 模型
在现代软件开发领域,效率和可靠性是企业在竞争中取胜的关键。本文将深入探讨 ANA Systems 如何通过引入业界领先的 CI/CD 平台——CircleCI,克服传统开发流程的瓶颈,实现开发运营效率的全面提升。同时,本文还将详细解析 CircleCI …...
vue 上传组件 vxe-upload 实现拖拽调整顺序
vue 上传组件 vxe-upload 实现拖拽调整顺序,通过设置 drag-sort 参数就可以启用拖拽排序功能 官网:https://vxeui.com/ 图片拖拽排序 <template><div><vxe-upload v-model"imgList" mode"image" multiple drag-sor…...
Elasticsearch的一些介绍
你想问的可能是 **Elasticsearch**,以下是关于它的一些介绍: ### 概述 Elasticsearch是一个基于Apache Lucene库构建的开源分布式搜索和分析引擎,采用Java语言编写,具有高性能、可扩展性和易用性等特点,可用于各种数据…...
从源码构建安装Landoop kafka-connect-ui
背景 部署Landoop kafka-connect-ui最简单的办法还是通过docker来部署,我们之前的kafka-connect-ui就是通过docker部署的,但是,最近发现个问题:当使用docker部署且防火墙使用的是firewalld的情况下,就会出现端口冲突。…...
MybatisPlus-扩展功能
代码生成 在使用MybatisPlus以后,基础的Mapper、Service、PO代码相对固定,重复编写也比较麻烦。因此MybatisPlus官方提供了代码生成器根据数据库表结构生成PO、Mapper、Service等相关代码。只不过代码生成器同样要编码使用,也很麻烦。 这里…...
发布/部署WebApi服务器(IIS+.NET8+ASP.NETCore)
CS软件授权注册系统-发布/部署WebApi服务器(IIS.NET8ASP.NETCore) 目录 本文摘要VS2022配置发布VS2022发布WebApiIIS服务器部署WebApi 将程序文件复制到云服务器添加网站配置应用程序池配置dns域名配置端口阿里云ECS服务器配置19980端口配置https协议 (申请ssl证书)测试WebAp…...
【2025最新计算机毕业设计】基于SpringBoot+Vue城市中小学体育场馆预约系统【提供源码+答辩PPT+文档+项目部署】
一、项目技术架构: 本项目是一款城市中小学体育场馆预约系统的设计与实现。 该SpringBootVue的城市中小学体育场馆预约系统,后端采用SpringBoot架构,前端采用VueElementUI实现页面的快速开发,并使用关系型数据库MySQL存储系统运行…...
Spring Security 6 系列之二 - 基于数据库的用户认证和认证原理
之所以想写这一系列,是因为之前工作过程中使用Spring Security,但当时基于spring-boot 2.3.x,其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0,结果一看Spring Security也升级为6.3.0,关键是其风…...
vue中打包dist文件内static 和 assets 的区别
背景 在Vue.js项目中,assets 和 static 是两个用于存放静态资源的文件夹,但它们在使用方式和处理机制上有所不同 用途 assets: assets 文件夹通常用于存放那些需要在构建过程中被Webpack处理的静态资源。这些资源可以包括图片、字体、样式文件&#…...
Big Model weekly | 第49期
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 01 Magnetic Preference Optimization: Achieving Last-iterate Convergence for Language Models Alignment 自我对弈方法在多个领域增强模型能力方面展现出了显著的成功。在基于人类反馈的强化学习࿰…...
Node.js内置模块
1.内置模块 Node.js的中文网参考手册:https://nodejs.cn//api 帮助文档 API文档:查看对应的模块,左边是模块,右边是模块的成员 源码:https://github.com/nodejs/node/tree/main/lib 查看 例如: http.js 创建web服务器的模块 -->进入源码中,搜索…...
使用Nexus3搭建npm私有仓库
一、npm介绍 npm的全称是Node Package Manager,它是一个开放源代码的命令行工具,用于安装、更新和管理Node.js模块。npm是Node.js的官方模块管理器,它允许用户从一个集中的仓库中下载和安装公共的Node.js模块,并将这些模块集成到…...
MySQL学习之表操作
MySQL学习之表操作 基础命令 查询当前所在数据库的所有表 show tables;查看指定的表结构, 可以查看到指定表的字段,字段的类型、是否可以为NULL,是否存在默认值等信息 mysql> desc user; ----------------------------------------------- | Field |…...
C语言学习day22:ReadProcessMemory函数/游戏内存数据读取工具开发
简言: ReadProcessMemory函数是 Windows API 中的一个函数,用于从目标进程的虚拟内存空间中读取数据。这个函数非常有用,尤其是在进行内存分析、调试、或某些类型的逆向工程时。 ReadProcessMemory函数 函数原型 BOOL ReadProcessMemory(…...
Linux虚拟文件系统
参考:深入分析LINUX内核源码 深入分析Linux内核源码 (kerneltravel.net) 作为一个最著名的自由软件,Linux 确实名不虚传,几乎处处体现了“自由”,你可以编译适合自己系统要求的内核,或者轻松添加别人开发的新的模块。只…...
OpenIPC开源FPV之Adaptive-Link天空端代码解析
OpenIPC开源FPV之Adaptive-Link天空端代码解析 1. 源由2. 框架代码3. 报文处理3.1 special报文3.2 普通报文 4. 工作流程4.1 Profile 竞选4.2 Profile 研判4.3 Profile 应用 5. 总结6. 参考资料7. 补充资料7.1 RSSI 和 SNR 的物理含义7.2 信号质量加权的理论依据7.3 实际应用中…...
NPU是什么?电脑NPU和CPU、GPU区别介绍
随着人工智能技术的飞速发展,计算机硬件架构也在不断演进以适应日益复杂的AI应用场景。其中,NPU(Neural Processing Unit,神经网络处理器)作为一种专为深度学习和神经网络运算设计的新型处理器,正逐渐崭露头…...
.Net WebAPI(一)
文章目录 项目地址一、WebAPI基础1. 项目初始化1.1 创建简单的API1.1.1 get请求1.1.2 post请求1.1.3 put请求1.1.4 Delete请求 1.2 webapi的流程 2.Controllers2.1 创建一个shirts的Controller 3. Routing3.1 使用和创建MapControllers3.2 使用Routing的模板语言 4. Mould Bind…...
.NET 技术 | 调用系统API创建Windows服务
01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失…...
OpenLinkSaas 2025年1月开发计划
先来看看OpenLinkSaas的大目标 在OpenLinkSaas的产品目标中,让开发人员更加方便的使用云资源是目标之一。通过各大云厂商的API,来可视化云上基础设施的数据是远远不够的。我们准备在2025年1月份增加方便管理和运营研发场景下服务器的能力。 这部分的功能…...
同态加密算法详解及Python实现
目录 同态加密算法详解及Python实现第一部分:同态加密概述与原理1.1 什么是同态加密?同态加密的定义:1.2 同态加密的分类1.3 同态加密的优势与挑战优势挑战第二部分:常见同态加密算法及其应用场景2.1 RSA同态加密支持操作应用场景2.2 Paillier加密支持操作应用场景2.3 Gent…...
【HarmonyOS NEXT】ArkTs函数、类、接口、泛型、装饰器解析与使用
1. 前置学习文档 【HarmonyOS NEXT】ArkTs数据类型解析与使用(https://juejin.cn/spost/7448894500348608522) 2. 前言 在原生JavaScript中只有函数和类的实现,为了更好的面向对象编程,TypeScript 引入了接口、泛型、装饰器等特性。ArkTS也继承了这些特性…...
【数学】矩阵的逆与伪逆 EEGLAB
文章目录 前言matlab代码作用EEGLAB 中的代码总结参考文献 前言 在 EEGLAB 的使用中,运行程序时出现了矩阵接近奇异值,或者缩放错误。结果可能不准确。RCOND 1.873732e-20 的 bug,调查 EEGLAB 后发现是 raw 数据的问题。 matlab代码 A_1 …...
用github镜像加速, --recursive还是去github站怎么处理?
小伙伴们大多碰到过github抽风的情况,时通时断,时快时慢,非常考验心情。 以前碰到连不上的时候,我大多就是在gitee和gitcode网站找一下镜像,找到后直接git clone 新地址即可。但是碰到 --recursive的时候就不行了&…...
第P2周:Pytorch实现CIFAR10彩色图片识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 实现CIFAR-10的彩色图片识别实现比P1周更复杂一点的CNN网络 具体实现 (一)环境 语言环境:Python 3.10 编 译 器: …...
springboot3访问第三方接口
添加依赖(如果尚未添加) 在pom.xml文件中,确保已经包含spring-boot-starter-web依赖,因为RestTemplate通常在这个依赖范围内。如果没有,添加如下依赖: <dependency><groupId>org.springframe…...
Ubuntu K8s
https://serious-lose.notion.site/Ubuntu-K8s-d8d6a978ad784c1baa2fc8c531fbce68?pvs74 2 核 2G Ubuntu 20.4 IP 172.24.53.10 kubeadmkubeletkubectl版本1.23.01.23.01.23.0 kubeadm、kubelet 和 kubectl 是 Kubernetes 生态系统中的三个重要组件 kubeadm: 主…...
大数据第三次周赛
类斐波那契循环数 #include<bits/stdc.h> using namespace std; #define int long long int arr[1000010]; bool key(int k){int num0;string strto_string(k);for(int i0;i<str.length();i){arr[num]str[i]-0;}int l0,rnum-1;int shix0; while(shix<k){shix0;for…...
《Java核心技术I》Swing用户界面组件
Swing和模型-视图-控制器设计模式 用户界面组件各个组成部分,如按钮,复选框,文本框或复杂的树控件,每个组件都有三个特征: 内容,如按钮的状态,文本域中的文本。外观,颜色,…...
Web开发 -前端部分-CSS
CSS CSS(Cascading Style Sheet):层叠样式表,用于控制页面的样式(表现)。 一 基础知识 1 标题格式 标题格式一: 行内样式 <!DOCTYPE html> <html lang"en"><head><meta…...
旅游系统旅游小程序PHP+Uniapp
旅游门票预订系统,支持景点门票、导游产品便捷预订、美食打卡、景点分享、旅游笔记分享等综合系统 更新日志 V1.3.0 1、修复富文本标签 2、新增景点入驻【高级版本】3、新增门票核销【高级版】4、新增门票端口【高级版】...
Windows 与 Linux 下 Ping IPv6 地址 | 常用网络命令
注:本文为网络命令相关文章合辑。 未整理去重。 一、IPv6 概述 IPv6 即 “Internet 协议版本 6”,因 IPv4 地址资源面临耗尽问题而被引入以替代 IPv4。IPv6 则提供了理论上多达 2 128 2^{128} 2128 个地址,有效解决地址不足困境。 IPv6 具…...
前端学习一
一 进程与线程 线程是进程执行的最小单位,进程是系统分配任务的最小单位。 一个进程可执行最少一个线程。线程分为子线程和主线程。 主线程关闭则子线程关闭。 二 浏览器进程 浏览器是多进程多线程应用。 进程包括: 浏览器进程 负责程序交互渲染…...
【Python · PyTorch】卷积神经网络(基础概念)
【Python PyTorch】卷积神经网络 CNN(基础概念) 0. 生物学相似性1. 概念1.1 定义1.2 优势1.2.1 权重共享1.2.2 局部连接1.2.3 层次结构 1.3 结构1.4 数据预处理1.4.1 标签编码① One-Hot编码 / 独热编码② Word Embedding / 词嵌入 1.4.2 归一化① Min-…...
Spring Framework 路径遍历漏洞复现(CVE-2024-38819)
hu0x01 产品描述: Spring Framework 是一个功能强大的 Java 应用程序框架,旨在提供高效且可扩展的开发环境。它结合了轻量级的容器和依赖注入功能,提供了一种使用 POJO 进行容器配置和面向切面的编程的简单方法,以及一组用于AOP的模块。0x02 漏洞描述: Spring Framework 存…...
心法利器[122] | 算法面试的八股和非八股讨论
心法利器 本栏目主要和大家一起讨论近期自己学习的心得和体会。具体介绍:仓颉专项:飞机大炮我都会,利器心法我还有。 2023年新的文章合集已经发布,获取方式看这里:又添十万字-CS的陋室2023年文章合集来袭,更…...
实操给自助触摸一体机接入大模型语音交互
本文以CSK6 大模型开发板串口触摸屏为例,实操讲解触摸一体机怎样快速增加大模型语音交互功能,使用户能够通过语音在一体机上查询信息、获取智能回答及实现更多互动功能等。 在本文方案中通过CSK6大模型语音开发板采集用户语音,将语音数据传输…...
AJAX家政系统自营+多商家家政系统服务小程序PHP+Uniapp
一款同城预约、上门服务、到店核销家政系统,用户端、服务端、门店端各端相互依赖又相互独立,支持选择项目、选择服务人员、选择门店多种下单方式,支持上门服务和到店核销两种服务方式,支持自营和多商家联营两种运营模式࿰…...
LiveData源码研究
LiveData 源码分析 前言 用过MVVM的大概知道LiveData可以感知组件的生命周期,当页面活跃时,更新页面数据, 当页面处于非活跃状态,它又会暂停更新,还能自动注册和注销观测者,能有效避免内存泄漏和不必要的…...
Root软件学习
一、命令行输入下方命令打开root文件 root filename.root 二、在root命令行下输入.help查看root下可用的指令 .help输入.q是退出root命令行 .q 三、输入下方指令查看当前打开的root文件的目录 .ls 四、打印Hits树下的内容(print) 方框里是各种树文…...