在这里插入图片描述

纹理一致性图像评价指标: Image Quality Assessment: Unifying Structure and Texture Similarity(2020 PAMI)

  • 专题介绍
  • 一、研究背景
  • 二、方法总览
    • 2.1 初始变换
    • 2.2 纹理表示和结构表示
    • 2.3 DISTS指标
    • 2.4 优化DISTS指标
  • 三、实验结果
  • 四、总结

本文将对统一图像结构和图像纹理的评价指标DISTS进行讲解。这篇主要的亮点在于作者开发了一个具有明确容忍纹理重采样的全参考质量评价模型,参考资料如下:
[1]. 论文地址
[2]. 代码地址
[3]. IQA-pytorch代码路径
[4]. 作者视频讲解地址


专题介绍

图像质量评价(Image Quality Assessment, IQA)是图像处理、计算机视觉和多媒体通信等领域的关键技术之一。IQA不仅被用于学术研究,更在影像相关行业内实现了完整的商业化应用,涉及影视、智能手机、专业相机、安防监控、工业质检、医疗影像等。IQA与图像如影随形,其重要程度可见一斑。

但随着算法侧的能力不断突破,AIGC技术发展火热,早期的IQA或已无法准确评估新技术的能力。另一方面,千行百业中各类应用对图像质量的需求也存在差异和变化,旧标准也面临着适应性不足的挑战。

本专题旨在梳理和跟进IQA技术发展内容和趋势,为读者分享有价值、有意思的IQA。希望能够为底层视觉领域内的研究者和从业者提供一些参考和思路。

系列文章如下:
【1】🔥IQA综述
【2】PSNR&SSIM
【3】Q-Insight
【4】VSI
【5】LPIPS


一、研究背景

作者研究的动机,可以用以下的图来直观明确的表达。
在这里插入图片描述
图中(a)、(b)、(c)分别是原图,原图进行jpeg压缩的图像,以及重新在同样的草上采样的图(这里作者用的词叫resample)。从人类的认知上来说,会觉得(c)和(a)会更相像,然而这里所有的常规的IQA方法都失效了,包含前面提到的PSNR、SSIM以及LPIPS等,这里失败的原因也很明显,作者想要捕捉的是纹理上的感知一致性,而纹理具有不规则的情况,对于人类的感知来说并不需要像素级别的完全对其或一致,以前的方法对于这种情况的纹理不太具有容忍度,与实际人类的感知是不一样的。

基于此,作者开发了一个能够在图像结构和图像纹理上都具有与人类相同感知判断的指标,在此之上,还希望纹理能够resample(不需要像素级对齐)之后也是一样的,另外区分开退化(JPEG,JPEG会损失纹理)。总的来说,作者的贡献如下(作者没有明确分点,博主这里做一个简单总结):

  1. 开发了第一个具有明确容忍纹理resample的全参考图像质量评价模型。
  2. 设计特征空间的均值作为图像纹理统计特征,引入全局SSIM作为结构相似性指标,结合这两点在多尺度特征上利用不同的权重得到一个综合评价的指标。
  3. 通过最小化从相同纹理图像裁剪的子图像之间的相似距离,进一步优化了同一纹理判断的鲁棒性。
  4. 优化后的方法在传统的图像评价数据集和纹理相似数据集上都更接近人类的判断结果,该方法在纹理分类和检索任务上表现优异,最后该方法还对几何变化(平移和扩张)不敏感且不需要专门的训练或数据增强。

二、方法总览

博主先对该方法做一个大概的流程总结,后续会按照这个流程进行描述,整体博主认为可以分为4个步骤:

  1. 对图像进行一个初始的变换,从像素空间变换到特征空间。
  2. 对特征提取所谓纹理的表示,对特征提取所谓结构的表示。
  3. 利用纹理和结构的表示,加入一些可学习的权重综合计算一个评价指标。
  4. 利用这个评价指标,进一步优化权重得到纹理区域resample不敏感的指标,且能够有结构和纹理上做感知相似度的模型。

作者展示了这个评价指标做损失函数优化随机噪声和带JPEG噪声做输入的效果。可以看到本文的方法可以精准捕捉结构和纹理,优化后的效果在跟原图感知相似度上对比其他方法是最高的。
在这里插入图片描述
其他方法有些在输入为随机噪声时,连结构信息都被丢失了,最好表现的LPIPS在纹理上表现不如DISTS。
下面根据上面提到的几点根据顺序进行讲解。

2.1 初始变换

作者最后使用的是在ImageNet上训练的VGG16网络来对图像进行预处理,转换到特征空间,原因在于pixel空间不好对比感知距离。但是这个对于选取的变换,提到2个很重要的点:

  1. 下采样时需要抗混叠:作者描述的原因比较学术,博主这里做一些比较形象的描述,混叠现象一般会给图像的高频区域带来2个最常见的问题是,空间上的锯齿现象以及通道上的伪彩现象,这些是不抗混叠带来的artifact现象。那在这里,VGG16也是需要下采样的,下采样VGG16中使用到的算子是Maxpool,一个不抗混叠的算子,解决这个问题的方法非常简单,作者直接替换了这个算子引入了一个g滤波器,最后的表现形式名为L2-pooling,如下式所示。P(x)=g∗(x∗x)P(x)=\sqrt{g*(x*x)}P(x)=g(xx)g是一个Hanning window,具体表现为数值,大家可以参考后续的代码讲解,是一个较为低频的滤波器。
  2. 集合必须是单射(Injection):单射的意思就是不同的输入应该映射到不同的输出,一个对一个,不能一个特征的输出,对应着多个输入。例子就是当IQA指标最高时,对应的最佳输入不是参考图像,前面展示的一些方法(GTI-CNN等),就不满足这个性质,那么优化后的结果就很可能跟原图差距很大,损失大量结构信息或是纹理上的问题,这里LPIPS也是如此,没有严格的满足这个性质,所以在纹理上优化后也是存在一定的问题。作者对于DISTS的设计上为了满足这个性质,引入一个输入x,相当于预处理变换中引入一个identity变换,这样就能保证满足这个性质。即提取的预处理特征集合是:
    f(x)={xj(i);i=0,…,m;j=1,…,nif(x)=\{x_j^{(i)}; i = 0,\ldots,m; j = 1,\ldots,n_if(x)={xj(i);i=0,,m;j=1,,ni f(y)={y~j(i);i=0,…,m;j=1,…,nif(y)=\{\tilde{y}_j^{(i)}; i = 0,\ldots,m; j = 1,\ldots,n_if(y)={y~j(i);i=0,,m;j=1,,ni
    此两个分别代表输入和参考图像的预处理特征集合,是用VGG16提取的多个层的结果,对应conv1_2,conv2_2, conv3_3, conv4_3, and conv5_3,这里m=5,对应的x0和y0是identity变换。

2.2 纹理表示和结构表示

  • 首先是纹理的部分,这里作者引用了很多研究,结论是一个仅包含CNN通道均值和方差的简化统计集合足以用于纹理分类或风格转移任务,因此作者使用了一个简单的集合来表示纹理,只包含特征映射的空间均值(总共1475个统计数据),为视觉纹理提供了一个有效的参数化模型,如下式所示。
    l(x~j(i),y~j(i))=2μx~j(i)μy~j(i)+c1(μx~j(i))2+(μy~j(i))2+c2l(\tilde{x}_j^{(i)}, \tilde{y}_j^{(i)}) = \frac{2\mu_{\tilde{x}_j}^{(i)}\mu_{\tilde{y}_j}^{(i)} + c_1}{(\mu_{\tilde{x}_j}^{(i)})^2 + (\mu_{\tilde{y}_j}^{(i)})^2 + c_2}l(x~j(i),y~j(i))=(μx~j(i))2+(μy~j(i))2+c22μx~j(i)μy~j(i)+c1
    这里的μ\muμ就是我们一直讲到的均值,ccc是一个防除零的值。
    作者为了验证这个模型的可行性,用以下的公式来优化了以该特征的随机噪声输入。
    y⋆=argmin⁡yD(x,y)=argmin⁡y∑i,j(μx~j(i)−μy~j(i))2y^\star = \underset{y}{\mathrm{arg}\min} D(x, y) = \underset{y}{\mathrm{arg}\min} \sum_{i, j} (\mu_{\tilde{x}_j}^{(i)} - \mu_{\tilde{y}_j}^{(i)})^2y=yargminD(x,y)=yargmini,j(μx~j(i)μy~j(i))2

可视化的优化结果表明该模型是有意义的,如下图所示。
在这里插入图片描述
(b)和(f)是用了多层((b)指只用到最浅层的VGG,( c)指只用到第二层VGG),只不过层数逐渐增大,(g)-(k)是只使用了VGG的某一层,可以看到多层的效果要明显优于单层的,(f)的效果与原图(a)很相像了,也是DISTS指标使用到的,通过看单层的效果可以发现,浅层的均值更多与图像基本的强度和颜色相关,深层的与形状和结构更加相关。作者还对比了其他纹理提取方法的效果:
在这里插入图片描述
这里(a)是原图,(b)图是一个不熟悉的方法,(c)是图像复原领域中感知损失中关于风格损失的部分,使用gram矩阵统计的纹理相关性,(d)是本文的方法,可以看到本文的方法得到的效果和gram_matrix的效果不相上下,但本文使用到的特征数相比gram_matrix是大大减小的,不会有太多的冗余。

  • 结构的部分:使用了一个特征的相关系数,观察公式可以发现跟SSIM关于结构特征的定义是一样的,这里不同之处在于作者使用的global,全局的,因此可以理解为SSIM中窗口的尺寸跟特征图尺寸一样。
    s(x~j(i),y~j(i))=2σx~jy~j(i)+c2(σx~j(i))2+(σy~j(i))2+c2s(\tilde{x}_j^{(i)}, \tilde{y}_j^{(i)}) = \frac{2\sigma_{\tilde{x}_j\tilde{y}_j}^{(i)} + c_2}{(\sigma_{\tilde{x}_j}^{(i)})^2 + (\sigma_{\tilde{y}_j}^{(i)})^2 + c_2}s(x~j(i),y~j(i))=(σx~j(i))2+(σy~j(i))2+c22σx~jy~j(i)+c2
    这个没什么特别需要描述的,比较重要的点就是SSIM是分窗口计算,最后做平均,这里就是全局窗口,计算完一次就结束。

2.3 DISTS指标

DISTS指标的总览如下:l(x~j(i),y~j(i))=2μx~j(i)μy~j(i)+c1(μx~j(i))2+(μy~j(i))2+c1l(\tilde{x}_j^{(i)}, \tilde{y}_j^{(i)}) = \frac{2\mu_{\tilde{x}_j}^{(i)}\mu_{\tilde{y}_j}^{(i)} + c_1}{(\mu_{\tilde{x}_j}^{(i)})^2 + (\mu_{\tilde{y}_j}^{(i)})^2 + c_1}l(x~j(i),y~j(i))=(μx~j(i))2+(μy~j(i))2+c12μx~j(i)μy~j(i)+c1 s(x~j(i),y~j(i))=2σx~jy~j(i)+c2(σx~j(i))2+(σy~j(i))2+c2,s(\tilde{x}_j^{(i)}, \tilde{y}_j^{(i)}) = \frac{2\sigma_{\tilde{x}_j\tilde{y}_j}^{(i)} + c_2}{(\sigma_{\tilde{x}_j}^{(i)})^2 + (\sigma_{\tilde{y}_j}^{(i)})^2 + c_2},s(x~j(i),y~j(i))=(σx~j(i))2+(σy~j(i))2+c22σx~jy~j(i)+c2, D(x,y;α,β)=1−∑i=0m∑j=1ni(αijl(x~j(i),y~j(i))+βijs(x~j(i),y~j(i)))D(x, y; \alpha, \beta) = 1 - \sum_{i = 0}^{m} \sum_{j = 1}^{n_i} \left( \alpha_{ij} l(\tilde{x}_j^{(i)}, \tilde{y}_j^{(i)}) + \beta_{ij} s(\tilde{x}_j^{(i)}, \tilde{y}_j^{(i)}) \right)D(x,y;α,β)=1i=0mj=1ni(αijl(x~j(i),y~j(i))+βijs(x~j(i),y~j(i)))
对纹理和结构的对比结果进行一个α\alphaαβ\betaβ的加权求和,最后进行一个减法,即相似度越高,值越小。
作者这里还讲了下这个指标满足的一些数学性质:非负性、对称性、三角不等式、唯一最小值,论文中有证明,感兴趣的读者可以看一下。

2.4 优化DISTS指标

自然,因为DISTS指标已经定义完毕,我们首先可以针对数据集进行一个L1的距离的优化。
E1(x,y;α,β)=∣D(x,y;α,β)−q(y)∣E_1(x, y; \alpha, \beta) = \left| D(x, y; \alpha, \beta) - q(y) \right|E1(x,y;α,β)=D(x,y;α,β)q(y)
这里的q(y)q(y)q(y)是数据的分数标记。
为了使得容忍纹理resample更有效,作者还加入了一个正则项,显式的强制模型以数据驱动的方式来解决这个问题,最小化从同一纹理区域z中采样的两个patch(z1、z2)之间的距离。
E2(z;α,β)=D(z1,z2;α,β)E_2(z; \alpha, \beta) = D(z_1, z_2; \alpha, \beta)E2(z;α,β)=D(z1,z2;α,β)
那么总的优化函数就可以写作:
E(Q,T;α,β)=1∣Q∣∑x,y∈QE1(x,y;α,β)+λ1∣T∣∑z∈TE2(z;α,β)E(\mathcal{Q}, \mathcal{T}; \alpha, \beta) = \frac{1}{|\mathcal{Q}|} \sum_{x, y \in \mathcal{Q}} E_1(x, y; \alpha, \beta) + \lambda \frac{1}{|\mathcal{T}|} \sum_{z \in \mathcal{T}} E_2(z; \alpha, \beta)E(Q,T;α,β)=Q1x,yQE1(x,y;α,β)+λT1zTE2(z;α,β)
这里是从两个不同数据集上采样的mini-batch,分别优化我们前面讲到的内容,有分数的数据集优化E1E_1E1损失,纹理一致的数据集提供正则项E2E_2E2损失。
后续作者对比了其他的IQA方法,大概讲了下联系和区别,这个地方内容比较多,博主也不能完全讲明白,仅作一个抛砖引玉:

  1. SSIM和SSIM变种:都存在一个多尺度的操作,并且也可以调整多尺度给到最后结果的比例,SSIM也有能够解决轻微几何变换的能力,DISTS通过优化纹理不变性,这部分是相同的,但是前面也讲到SSIM是窗口的,DISTS是全局的,这个是比较大的一个区别。
  2. 自适应线性系统框架:这里是指一些将图像分离结构和非结构的方法,包含很多IQA模型,比如说MSE和空间频率加权的方法,方法上细节上肯定是存在一些不同。
  3. 图像内容和风格分离的方法:这个指的是常见的感知损失,图像内容的定义感知损失用的是特征之间的差值,风格的损失使用的是gram_matrix,计算的特征的相关性,作者认为这两个分量都存在大量冗余且不满足前面提到的变换唯一最小值的一个约束。
  4. 其他图像复原的损失:计算的pixel_loss,或者说跟感知损失的一个组合损失形式(开发中时常会使用到的情况,多个损失的组合),作者认为这种组合虽然说可以让模型复原的图像尽可能生成一些感知上有意义的结果,但没有达到作者想要的纹理不变性的水平。

三、实验结果

本篇文章的实验非常详细。

  • 最基本的功能,分数预测。
    在这里插入图片描述
    针对数据集进行一个分数的拟合,在主观平均意见分数(MoSs)的散点图上,DISTS基本上是线性的,存在明显优势。
    定量的实验上的表现:
    在这里插入图片描述
    在前面提到的LPIPS的数据集上进行了对比,效果也是在前列的,当然在分数预测上跟LPIPS没有明显优势。

  • 纹理相似性:优势明显,对比其他方法。
    在这里插入图片描述
    纹理的失真量化,可以做排序的应用。
    在这里插入图片描述
    从(a)到(p)是质量逐渐递减的,(a)是原图。
    纹理的分类和检索:纹理分类是将未知样本图像分类到已知纹理类的一种,纹理检索是在大型数据库上进行一个搜索,找到相似的图像。结果也是比较好的。
    在这里插入图片描述

  • 几何的形变:除了纹理上的相似度外,当原始图像跟退化图像存在全局或局部的错配时,大多数的全参考IQA方法会严重受损,根本原因他们需要像素对齐,当然配准可以解决这个问题,但是会带来更多的计算负担,且无法适应严重失真,本文提出的方法可以解决这个问题。
    定量的实验,有明显优势。
    在这里插入图片描述
    定性的实验表现如下:
    在这里插入图片描述
    其中(a)时原图,(b)做了translate平移,(c)做了dilate扩展,(d)做了旋转,(e)做了云层的移动,(f)做了高斯噪声,(g)高斯模糊,(h)jpeg压缩,(i)jpeg2000压缩,可以明显看到DISTS对几何形变更鲁棒,这跟人类的感知会更相像。

  • 消融实验:作者做了以下的实验:
    (a):原始LPIPS;(b):(a)基础上替换L2 pooling;(c):添加indentity,输入图像;(d):在(c)之上将LPIPS中的L2距离替换为局部的SSIM计算,窗口为11x11;(e):在(c)之上将LPIPS中的L2距离替换为全局的SSIM计算;(f):在(c)的基础上加上纹理不变性的正则;(g):在(d)的基础上加入纹理不变的正则;(h):在(e)的基础上添加纹理不变的正则。
    实验结果如下:
    在这里插入图片描述
    从中可以得到几个结论:

  • L2 pooling优于maxpool。

  • 将输入图像加入到其中对性能影响不大,但它保证了最小值唯一的情况,有利于感知优化。

  • 全局的SSIM距离由于欧式距离,特别是比较纹理相似性和几何变换的不变性上。滑动窗口11x11一样是存在这个问题,效果会下降。

  • 纹理不变正则项的训练,对于几何变换的不变性以及纹理的不变性有很大作用,尽管它会略微损失一部分对于分数评估的性能。

以上可以说明作者的DISTS中各个改进都是有益的。

四、总结

DISTS针对纹理和结构的全参考感知评估提供了一个新的方法,并且它还能对纹理resample和几何形变有一定容忍,更加靠近人类图像质量感知。不过还存在一些问题是:

  • 预处理网络的特征提取部分还是一个黑盒子,对于提取的那些纹理和属性是未知的。
  • 级联卷积和采样得到的多尺度特征对于最终结果的重要程度,如果我们可以量化它们,就可以针对性的定义距离,自适应的去使用,而不是现在这种固定的情况。

代码部分将会单起一篇进行解读。(未完待续)


感谢阅读,欢迎留言或私信,一起探讨和交流,如果对你有帮助的话,也希望可以给博主点一个关注,谢谢。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows下Docker安装路径、存储路径修改

一、命令行指定安装路径​ ​​下载安装包​​:从Docker官网获取安装程序(如Docker Desktop Installer.exe)。​​运行PowerShell​​: & "H:\Docker Desktop Installer.exe" install --installation-dir"F:…

thingsboard 自定义动作JS编程

在 ThingsBoard 中实现 自定义动作(Custom Action)的 JavaScript 编程,主要通过“Custom action (with HTML template)”方式完成,适用于创建弹窗、编辑实体、控制设备等交互行为。 实现步骤(以添加设备或资…

Spring Boot 简单接口角色授权检查实现

一、背景与目标在Spring Boot应用开发中,接口级别的权限控制是系统安全的重要组成部分。本文将介绍一种简单直接的接口角色授权检查实现方案,适合快速开发和安全合规检查场景。二、技术方案概述本方案采用自定义注解拦截器的方式实现,具有以下…

PytorchLightning最佳实践日志篇

在 PyTorch Lightning(PL)中,日志系统是 “炼丹” 过程中复现实验、对比效果、排查问题的核心工具。结合实际工程经验,总结以下最佳实践和技巧,帮助提升实验效率: 一、日志工具的选择与配置 PL 通过统一的s…

基于JavaWeb的兼职发布平台的设计与实现

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7数据库工具:Navicat12开发软件:eclipse/myeclipse/ideaMaven包:Maven3.6系统展示系统首页用户登录招聘信…

Linux学习--C语言(指针3)

1.指针函数和函数指针1.1 指针函数指针函数是函数&#xff0c;函数的返回值是指针不能返回局部变量的地址指针函数返回的地址可以作为下一个函数调用的参数1.2 函数指针函数指针是指针&#xff0c;指针指向一个函数#include <stdio.h>int Add(int x, int y) {return x y…

【JAVA EE初阶】多线程(上)

目录 1.预备知识 1.1 冯诺依曼体系结构&#xff1a; 1.2 现代CPU主要关心指标&#xff08;和日常开发密切相关的&#xff09; 1.3 计算机中&#xff0c;一个汉字占几个字节&#xff1f; 1.4 Windows和Linux的区别 1.5 PCB的一些关键要点 2.线程和进程 2.1 创建线程的写法…

用互联网思维扩展电商后台的 CRUD 功能

一、自定义实现MyBatis-Plus逆向工程 多数据源的问题解决了&#xff0c;接下来开始进行实际开发时&#xff0c;你会发现&#xff0c;最麻烦的一件事情就是要创建与数据库表对应的POJO了。这些没什么难度&#xff0c;但是繁琐的内容会占据大量的开发时间。比如一个PmsProducr对…

无代码测试平台ATECLOUD全场景测试方案

ATECLOUD 智能云测试平台是有纳米软件开发的一款以无代码架构与弹性扩展体系为核心的自动化测试平台&#xff0c;通过数据模型驱动的创新设计&#xff0c;为研发、产线等多场景提供高效可控的测试解决方案。​无代码架构 ATECLOUD 打破传统技术壁垒&#xff0c;构建完全可视化的…

当 AI 重构审计流程,CISA 认证为何成为破局关键

在南京审计大学最新发布的《面向审计行业 DeepSeek 大模型操作指南》中&#xff0c;一组数据引发行业深思&#xff1a;通过自动化数据处理、智能风险识别和定制化报告生成&#xff0c;AI 大模型能帮助审计人员降低 40% 以上的人工成本&#xff0c;同时将风险识别准确率提升至 9…

NAT技术、代理服务器

NAT/NAPT技术NAT的全称是network address translation&#xff0c;网络地址转换。NAT 能在对外通信时够将源 IP 转为新源 IP&#xff0c;对内通信时将目的ip转换成新目的ip&#xff0c;实现这个操作&#xff0c;靠的是地址转换表但NAT的说法其实是不准确的&#xff0c;因为多个…

【硬件-笔试面试题】硬件/电子工程师,笔试面试题-45,(知识点:负反馈的作用,基础理解,干扰和噪声的抑制)

目录 1、题目 2、解答 步骤一&#xff1a;明确负反馈的作用原理 步骤二&#xff1a;逐一分析选项 3、相关知识点 一、负反馈的基本原理 二、负反馈对干扰和噪声的抑制机制 三、选项分析与答案 四、扩展思考&#xff1a;如何抑制不同位置的干扰&#xff1f; 总结 题目…

Flutter蓝牙BLE开发完全指南(内含高级功能扩展)

Flutter蓝牙BLE开发完全指南 我将为您提供一个完整的Flutter蓝牙BLE实现方案,包含UI设计、权限处理、设备扫描、连接通信等完整功能。 完整实现方案 1. 添加依赖与权限配置 pubspec.yaml dependencies:flutter:sdk: flutterflutter_blue_plus: ^1.10.0permission_handler…

使用 Canvas 替代 <video> 标签加载并渲染视频

在部分浏览器环境或业务场景下&#xff0c;直接使用 <video> 标签加载视频会出现首帧延迟的情况。以下方法通过 WebGPU Canvas 2D 将视频帧绘制到自定义 Canvas 上&#xff0c;让 <video> 只做解码&#xff0c;WebGPU 接管渲染&#xff0c;通过最小化对象创建 精…

基于Flask的智能停车场管理系统开发实践

在现代城市中&#xff0c;停车难已成为一个普遍问题。为了解决这一问题&#xff0c;我开发了一个基于Python Flask框架的智能停车场管理系统。该系统集成了车牌识别、车位状态监控、收费管理等多项功能&#xff0c;为停车场的智能化管理提供了完整的解决方案。系统功能概述该停…

【C#获取高精度时间】

在C#中&#xff0c;有几种方法可以获取高精度时间&#xff08;高分辨率时间戳&#xff09;&#xff0c;适用于性能测量、计时等需要高精度的场景。以下是几种常用方法&#xff1a; 1. 使用 Stopwatch 类&#xff08;推荐&#xff09; Stopwatch 类提供了最高精度的时间测量&…

Spring Boot + React 打造现代化高校成绩管理系统实战记录

作者: 笙囧同学 发布时间: 2025年7月 技术栈: Spring Boot 3.2.3 React 18 TypeScript 华为云GaussDB 项目类型: 全栈Web应用 开发周期: 30天 代码量: 15000 行 &#x1f4d6; 前言 大家好&#xff0c;我是笙囧同学&#xff01;&#x1f64b;‍♂️ 作为一名计算机科学与技…

形参表不匹配(BUG)

在您的代码中&#xff0c;存在两个主要问题导致"形参表中不匹配"的错误&#xff1a;erase() 函数中的成员变量名错误iterator erase(iterator pos) {// ...size--; // ❌ 错误&#xff1a;成员变量名为 _size 而非 sizereturn iterator(next); }修正&#xff1a;ite…

Spring循环依赖以及三个级别缓存

Spring循环依赖以及三个级别缓存 什么是循环依赖&#xff1f; 循环依赖&#xff0c;顾名思义&#xff0c;就是指两个或多个 Spring Bean 之间相互依赖&#xff0c;形成一个闭环。 最常见也是 Spring 能够“解决”的循环依赖是构造器注入 和 setter 注入 混合或单独使用时&…

《零基础入门AI:OpenCV图像预处理进一步学习》

本文全面讲解OpenCV图像预处理的七大核心技术&#xff08;插值方法、边缘填充、图像矫正&#xff08;透视变换&#xff09;、图像掩膜、ROI切割、图像添加水印、图像噪点消除&#xff09;&#xff0c;每个知识点都配有详细解释和实用代码示例&#xff0c;帮助初学者建立系统的图…