论文精读(保姆级解析)——DiFaReli: Diffusion Face Relighting

前言

  该论文发表在2023年ICCV上,主要针对人像重打光问题提出了一种新的方法,下面给出论文和项目链接:

  • paper
  • github

在这里插入图片描述

摘要

  提出了一种针对单张图像的重打光方法,作者提到针对非漫反射光照的处理比较困难,早期的工作主要是假设朗勃表面,简化了光照模型,或者引入估计3D人脸形状,反照率,阴影等。这种早期的方法容易估计的不准确,并且需要大量的光照训练数据。于是,作者试图绕开这种精确估计内在参数的方法,提出了一种只需要在2D图像上训练的方法。
关键思想:

  1. 通过利用条件扩散模型DDIM解码解缠光照信息和其他的面部信息,这些信息都是直接通过离线模型进行估计的。
  2. 提出了一种新颖的调节技术,使用渲染的阴影参考来空间调制DDIM,简化了光和几何之间复杂相互作用的建模。

引言

  重打光的应用非常广泛。。。

  重打光面部图像需要建模几何、材质和光照之间的复杂交互,这些物理相互作用在2D图像中并不固有,难以准确估计。早期方法多假设简化模型,难以处理复杂光照。最新方法利用多视图、多光照数据,提出了预测表面法线、反照率及阴影图的重打光pipeline。最近的一些方法旨在通过神经网络预测阴影映射来专门建模投射阴影或通过估算几何形状的物理光线追踪绘制阴影地图。这些方法都是先分解光照信息,然后再与阴影一起渲染输出。缺点是光照参数很难正确估计。如输入的图像要去除阴影,但是参数估计的时候并不是去除,会直接代入后面影响估计。并且眼睛,耳朵这些特征很难处理。
  本文引入了一种替代的方法,不依赖精确地内在分解,并且可以在2D数据集上进行训练,不需要依赖3D数据和多视图数据、真实光照数据,只需要几个离线的估计器即可。主要思路如下:

  1. 编码输入的图像为一个特征向量,然后解缠光照信息和其他信息,然后,对特征向量中的光编码进行修改并解码。

难点在于如何解缠光照信息和其他的信息(如面部信息),使得解码后的阴影直接影响光照而不影响其他的信息?关键思想如下:

  1. 利用条件隐式扩散模型结合一种新的条件技术来完成,通过在2D数据集上训练的生成模型隐式地学习光照交互

  主要思路依赖于DDIMDiffAEDDIM 具有确定性的逆过程,DiffAE可以将图像编码为有意义的语义编码,并将编码的语义与其他的随机信息解缠,通过修改语义编码,从而实现对语义属性的操作。借鉴到重打光任务,把光照信息解缠处理,对光照信息进行操作,实现对图像的重打光。但是,又与自动发现语义属性并将其编码为潜在编码的DiffAE不同,作者提出的方法需要明确且可解释的光编码,以方便用户进行照明操作。于是需要引入光照信息,但是有没有真实的光照信息。

  于是,为了解决没有光照真值情况下的重打光问题,引入了DECA估计器。将光照信息编码为SH系数,并依靠条件DDIM解码并学习此过程中解耦的光照系数。不同于之前的工作,这里的SH光照并不直接渲染输出阴影(SH能力有限,难以表达出复杂的阴影),只是用来条件化一个生成过程,该过程学习复杂的阴影先验以再现真实的2D人脸图像。为了在重光照中保持输入的身份,还将面部形状和人脸识别模型的深度特征等属性作为条件输入给DDIM

  作者引入的另一个关键的组件是为DDIM设计的新颖条件化技术,不同于DiffAE或者其他的扩散模型将SH视为全局,非空间条件向量,作者使用已知的SH方程渲染一个阴影参考,将其输入到另一个称为调制器的网络中,该网络计算DDIM的逐层空间调制权重。这种条件化技术有助于保留阴影参考中的空间信息,并提供易于学习的条件信号,因为阴影参考中的像素强度与输出的RGB像素更直接相关。

  通过提出的新颖框架,投射阴影的可见性也可以通过一个简单的修改来建模:向DDIM添加一个指示投射阴影“程度”的条件标量,在测试的时候通过修改这标量来控制阴影的大小。由于本文的基于扩散的框架没有直接在物理图像形成模型中使用该标志或形状和SH参数,因此可以容忍这些参数的不精确估计,并且不会显著影响打光效果。

  本文的方法能够生成高度可信且照片级的结果,并且能够有效地增强或减弱投射阴影。此外,还能够以高保真度还原原始面部细节,而使用神经网络预测法线贴图的方法很难做到这一点。进行了定性和定量评估,并在标准基准测试集Multi-Pie上实现了当前最佳性能。简而言之,贡献如下:

  1. 基于条件DDIM的最先进的面部照明框架,可产生逼真的阴影,而不需要准确的内在分解或3D和照明地面真相。
  2. 一种新的调节技术,将从估计的光线和形状参数渲染的阴影参考转换为分层空间调制权重。

3 方法

在这里插入图片描述

给定输入的人脸图像,在目标照明条件下重新打光该图像,该条件由球面谐波系数和表示可见投射阴影“程度”的附加标量描述。

3.1 背景

为了更好地说明本文的方法,先给出DDIMDiffAE的背景介绍:

  • DDIM:一种扩散模型的变体,不同于标准的扩散模型,DDIM使用非马尔科夫链推断过程,该过程依赖一个条件分布, q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1} \mid x_t, x_0) q(xt1xt,x0),除了 x t x_t xt之外,还依赖于 x 0 x_0 x0为条件。值得注意的是,该过程是可逆的,可以从 x 0 − x T x_0-x_T x0xT,也可以从 x T − x 0 x_T-x_0 xTx0
  • DiffAEDiffAE表示图像编码生成 x T x_T xT中很少含有输入图像 x 0 x_0 x0的语义信息,并建议在DDIM的增加一个单独的图像编码器预测可学习的潜在变量 z z z作为条件。通过联合训练图像编码器和DDIM,编码的 z z z捕捉有意义的语义,而通过反转DDIM的确定性生成过程推断出的 x T x_T xT 捕捉未在 z z z中编码的其他信息,如随机变化。结果生成的潜在编码 ( z , x T ) (z, x_T) (z,xT) 也可以使用相同的条件DDIM近乎完美地解码回输入图像。通过修改语义潜在变量 z z z并解码新的 ( z ′ , x T ) (z^{\prime}, x_T) (z,xT)DiffAE 可以操作真实输入图像的语义属性——这一思路启发了作者的工作。

3.2 方法

  本文方法的思路是将输入图像编码为一个特征向量,该向量将光照信息与输入图像的其他信息分离开来。然后,通过修改特征向量中的光照编码,并使用条件DDIM对结果向量进行解码,生成重光照图像(如下图)。这个过程类似于DiffAE执行属性操作的方式;然而,本文的任务需要良好解耦且可解释的光照编码,以便用户进行光照操作。
  为了解决这个问题,作者使用现成的估计器将输入图像编码为光线、形状和相机编码,以及人脸嵌入、阴影标量和背景图像
在这里插入图片描述

3.3 编码器

  对输入图像进行编码:
f = ( l , s , c a m , ζ , c , b g ) f = (l,s,cam,\zeta,c,bg) f=(l,s,cam,ζ,c,bg)
其中:

  • l l l:二阶球谐光照系数
  • s s s:参数化的面部形状
  • c a m cam cam:正交相机参数
  • ζ \zeta ζ:基于ArcFace的深度特征
  • c c c:可见投射阴影的标志
  • b g bg bg:背景像素

l , s , c a m l,s,cam l,s,cam

  • 通过DECA进行估计,同时DECA还能预测出反照率(没有使用,论文中作者说没用)。为了光照编码 l l l,作者直接使用来自 DECASH 系数,每个 RGB通道包含 9 个系数。DECA3D 人脸形状基于 FLAME 模型参数,作为具有身份形状、姿态和表情的三种线性基的混合形状,它们各自的系数记为 β \beta β θ \theta θ ψ \psi ψ。人脸形状编码 s s s是组合后的 ( β , θ , ψ ) ∈ R ∣ β ∣ + ∣ θ ∣ + ∣ ψ ∣ (\beta, \theta, \psi) \in \mathbb{R}^{|\beta| + |\theta| + |\psi|} (β,θ,ψ)Rβ+θ+ψDECA 假设正交投影,并用各向同性缩放和 2D 平移来建模相机姿态。本文将缩放和平移参数组合成 c a m ∈ R 1 + 2 \mathbf{cam} \in \mathbb{R}^{1+2} camR1+2。注意,本文没有使用预测的反照率图,因为 DECA 的反照率估计可能不可靠,并且我们通过经验发现它是不必要的。

ζ \zeta ζ

  • ArcFace估计人脸深度特征进行身份编码

c c c

  • 投射阴影编码,训练了一个模型来从人脸图像中估计 c c c,并固定了这个预训练的估计器。为此,作者手动标记了大约 1000 张人脸图像,使用二进制标志指示是否可见投射阴影。按照 DiffAE提出的技术,首先使用 DiffAE 的预训练编码器将每张人脸图像映射到一个具有语义意义的潜在编码码 z z z,然后训练一个基于z的逻辑回归分类器去预测标志。 c c c然后被计算为逻辑回归的 logit 值。如DiffAE所示,这种技术有助于减少获得良好准确性所需的训练样本数量, c c c也可以通过其他方式估计,例如使用卷积神经网络(CNN)。

b g bg bg

  • 背景编码,为了在重打光过程中固定背景,使用输入图像的背景对DDIM条件化,背景区域通过人脸分割算法检测。

3.4 DDIM解码器和调制网络

  DDIM用于将输入的特征向量(已经修改过光照信息)解码为输入图像的新编码,即在训练时,DDIM将噪声映射为原始图像;在重光照时,通过反向生成过程将原始图像映射为重光照图像。这种调节涉及到另一个称为调制器网络的网络,它将光、形状和相机编码转换为DDIM解码器的空间调制权重。DDIM的组成结构为基于UNet的一堆残差结构和自注意力机制,本文的区别在于:

  • 1)UNet 前半部分每个残差块的输出将被调制器网络的信号调制;
  • 2)使用自定义的自适应组归一化。我们的调制器网络与 DDIM 的 UNet 前半部分架构相同,但不共享权重。

3.5 条件DDIM解码器

  在条件向量上调节扩散模型可以通过各种方式完成,例如通过自适应群体归一化或基于注意的机制。在本文的问题中,光照信息被明确地编码为SH系数,并且它们与3D形状(特别是表面法线)的交互可以通过SH光照方程精确建模。本文的想法是通过渲染目标光照的面部阴影参考来简化已知交互的建模。该参考的主要目的是以空间对齐的方式传达目标光照和阴影信息,而不是几何形状或确切的阴影强度。以下部分详细介绍了这种“空间”条件化技术以及用于其他编码的标准非空间条件化技术。

3.5.1 空间条件

  这种技术用于光照、形状、相机和背景编码 ( l , s , c a m , b g ) (l, s, cam, bg) l,s,cam,bg。给定面部形状 s s s,首先使用 FLAME 模型的三个线性基将其转换为三角网格,并移除网格中的耳朵、眼球、脖子和头皮,只保留面部区域(见网络框图)。移除这些部分是因为它们通常不准确且难以正确估计(例如,被头发遮挡的耳朵)。本文假设一个恒定的灰色反照率 (0.7, 0.7, 0.7) 并在由 c a m cam cam 描述的相机姿态下渲染此网格,使用标准的 S H SH SH 光照方程计算表面颜色 l l l
  然后,这个阴影参考 R R R,它显示了在目标光照下输入人物的形状和姿态的阴影面部,被与背景图像 b g bg bg连接并传递给Modulator网络。用 m i ∈ R H i × W i × D i m_i ∈ R^{H_i×W_i×D_i} miRHi×Wi×Di表示Modulator网络中每个残差块i的输出,用 o i ∈ R H i × W i × D i o_i ∈ R^{H_i×W_i×D_i} oiRHi×Wi×Di表示相同DDIM的前半部分中对应残差块的输出。在DDIM中,作者将每个残差块的输出 o i o_i oi替换为 o i ′ o_i^\prime oi,并将其作为网络中后续层的输入:
o i ′ = o i ⊙ t a n h ( m i ) o_i^\prime = o_i \odot tanh(m_i) oi=oitanh(mi)
这种调节技术允许阴影图像 R R R和背景保持其空间结构,并促进生成的局部调节,因为它们在空间上与输入对齐(例如,它们的面部部分和背景在相同的位置)。

3.5.2 非空间调节技术

  非空间条件化。该技术被用于 ( s , c a m , ξ , c ) (s, cam, ξ, c) s,cam,ξ,c。在这种技术中,除了通过阴影参考间接使用外,直接使用 s , c a m s,cam s,cam也是有帮助的。作者使用基于自适应组归一化(AdaGN)(借鉴某个扩散模型中的方法),用于这些编码以及标准扩散模型训练中的时间嵌入γ(t),其中γ是一个正弦编码函数。给定输入特征图 h j ∈ R H j × W j × D j h_j ∈ R^{H_j×W_j×D_j} hjRHj×Wj×Dj,计算:
A d a G N j ( h j , s , c a m , c , t ) = k j ( t j s G N ( h j ) + t j b ) AdaGN_j(h_j,s,cam,c,t) = k_j(t_j^{s}GN(h_j)+t_j^{b}) AdaGNj(hj,s,cam,c,t)=kj(tjsGN(hj)+tjb)
其中: k j = M L P j 3 ( C o n c a t ( s , c a m , ζ , c ) ) ∈ R D j k_j=MLP_j^{3}(Concat(s,cam,\zeta,c))\in R^{D_j} kj=MLPj3(Concat(s,cam,ζ,c))RDj是一个基于SiLU激活函数的三层,MLP的输出, ( t i s , t j s ) (t_i^{s},t_j^{s}) tistjs是一个基于SiLU的单层输出,GN是一个标准的组归一化。作者使用自己的AdaGN来代替原始架构中的所有AdaGN,这些AdaGN出现在整个UNet中。

3.6 训练

  联合训练DDIM解码器(参数化为噪声预测网络 ϵ θ ϵ_θ ϵθ)和调制器网络 M ϕ ( l , s , c a m , b g ) M_ϕ(l, s, cam, bg) Mϕ(l,s,cam,bg),使用标准的扩散训练方法。这里作者将框图中的MLP视为DDIM的一部分。采用简化的、重新加权的变分下界版本,使用 ε \varepsilon ε参数化:
L s i m p l e = E t , x 0 , ε ∥ ε θ ( x t , t , M p h i , s , c a m , ζ , c ) − ε ∥ 2 2 L_{simple} = E_{t,x_0,\varepsilon}\|\ \varepsilon_{\theta}(x_t,t,M_{phi},s,cam,\zeta,c)- \varepsilon \|_2^2 Lsimple=Et,x0,ε εθ(xt,t,Mphi,s,cam,ζ,c)ε22

其中, ϵ θ \epsilon_{\theta} ϵθ 被训练用于预测给定图像 x 0 x_0 x0时加入的噪声 ϵ ∼ N ( 0 , I ) \epsilon \sim \mathcal{N}(0, I) ϵN(0,I),在 ( α t ) x 0 + ( 1 − α t ) ε \sqrt(\alpha_t)x_0+\sqrt(1-\alpha_t)\varepsilon ( αt)x0+( 1αt)ε。我们定义 α t \alpha_t αt ∏ s = 1 t − β s \prod_{s=1}^{t} - \beta_s s=1tβs,其中 β t \beta_t βt是一个高斯扩散处理( q ( x t ∣ x t 1 ) = N ( ( 1 − β t ) x t − 1 , β t I ) q(x_t|x_{t_1})=\N(\sqrt(1-\beta_t)x_{t-1},\beta_tI) qxtxt1=N(( 1βt)xt1βtI))时间 t t t时的噪声级别。本文中作者使用了总步数1000步(更标准的扩散模型步数一致)。作者在训练的时候并没有将 x T x_T xT反转回 x 0 x_0 x0

3.7 重打光

  首先根据图像编码公式 f f f将输入图像编码为特征向量 f f f,然后然后从输入图像从 x 0 x_0 x0开始,通过在条件 f f f上的DDIM的确定性生成过程反向生成 x T = 1000 x_T=1000 xT=1000:
x t + 1 = α t + 1 g θ ( x t , t , f ) + 1 − α t + 1 ϵ θ ( x t , t , f ) x_{t+1} = \sqrt{\alpha_{t+1}} g_\theta (x_t , t, f) + \sqrt{1-\alpha_{t+1}} \epsilon_\theta (x_t, t, f) xt+1=αt+1 gθ(xt,t,f)+1αt+1 ϵθ(xt,t,f)
其中, g θ g_\theta gθ表示预测的 x 0 x_0 x0,它是从 ε θ \varepsilon_\theta εθ重新参数化而来的,并计算如下:

g θ ( x t , t , f ) = 1 α t ( x t − 1 − α t ( ε θ ( x t , t , f ) ) ) g_\theta(x_t,t,f) = \frac{1}{\sqrt{\alpha_t}}(x_t-\sqrt{1-\alpha_t}(\varepsilon_\theta(x_t,t,f))) gθ(xt,t,f)=αt 1(xt1αt (εθ(xt,t,f)))

  在获得 x T x_T xT后,将SH光照编码 l l l和投射阴影标志 c c c修改为目标 l ′ l^{\prime} l c ′ c^{\prime} c,这些可以手动设置或通过使用 DECA 的投射阴影估算器从参考光照图像中推断出来。然后,使用方程 x t + 1 x_{t+1} xt+1的反向过程从 x T x_T xT开始解码修改后的以生成最终输出。从获取 x T x_T xT的反向过程是再现输入图像高频细节的关键。如 DiffAE所示,DDIM 将在噪声图中编码任何未被条件特征向量 f f f捕获的信息。这些信息包括高频细节,如头发纹理或皮肤纹理。
  为了应对图像的背景过亮或者过暗的问题,作者对DDIM进行了改进,通过计算 DDIM 生成逆向过程 ( x 0 → x T ) (x0→xT) x0xT中每个 x t x_t xt和从逆向噪声 x T x_T xT自我解码得到的 x t x_t xt之间的均值像素差异来缓解这个问题。

4 实验

  • 训练数据集:Multi-PIE
  • 评估指标:DSSIMLPIPSMSE

4.1 定量比较

在这里插入图片描述

以上就是对本篇论文的解读,如有任何问题欢迎留言,批评指正!

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

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

相关文章

Map系列集合

1.Map集合 1.1Map集合概述和特点 Map集合概述 interface Map<K,V> K&#xff1a;键的类型&#xff1b;V&#xff1a;值的类型 Map集合的特点 双列集合,一个键对应一个值 键不可以重复,值可以重复 Map集合的基本使用 public class MapDemo01 {public static void mai…

防火墙NAT实验

一.实验拓扑 二.实验要求 1.办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 2.分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 3.多出口环境基于带宽比例进行选路&#xff0c;但是&#xff0c…

神经网络 | Transformer 基本原理

目录 1 为什么使用 Transformer&#xff1f;2 Attention 注意力机制2.1 什么是 Q、K、V 矩阵&#xff1f;2.2 Attention Value 计算流程2.3 Self-Attention 自注意力机制2.3 Multi-Head Attention 多头注意力机制 3 Transformer 模型架构3.1 Positional Encoding 位置编…

《梦醒蝶飞:释放Excel函数与公式的力量》12.1 DSUM函数

第12章&#xff1a;数据库函数 第一节 12.1 DSUM函数 12.1.1 简介 DSUM函数是Excel中的一个数据库函数&#xff0c;用于计算数据库或数据表中特定条件下某字段的总和。DSUM函数在处理大规模数据、数据筛选和分析时非常有用。 12.1.2 语法 DSUM(database, field, criteria)…

【学术会议征稿】第三届智能电网与能源系统国际学术会议

第三届智能电网与能源系统国际学术会议 2024 3rd International Conference on Smart Grid and Energy Systems 第三届智能电网与能源系统国际学术会议&#xff08;SGES 2024&#xff09;将于2024年10月25日-27日在郑州召开。 智能电网可以优化能源布局&#xff0c;让现有能源…

大模型LLM 应用私有化部署项目

LLM 参数包含数十亿甚至万亿级的架构复杂&#xff0c;训练和推理涉及大量计算资源。企业客户训练资料少&#xff0c;在实际应用中可能表现出检索幻觉、精准度差&#xff0c;同时也带来了性能、安全性和效率等方面的挑战。 ChatGPT、LLaMa、Bard 等大语言模型(LLMs)取得了非常巨…

【python】基于决策树的语音识别

目录 引言 决策树的主要特点 决策树的构建过程 决策树的应用 数据集 代码实现 引言 决策树&#xff08;Decision Tree&#xff09;是一种常用的分类与回归方法&#xff0c;其中最为人所知的是其在分类问题上的应用。决策树模型呈树形结构&#xff0c;其中每个内部节点表…

python数据可视化(5)——绘制饼图

课程学习来源&#xff1a;b站up&#xff1a;【蚂蚁学python】 【课程链接&#xff1a;【【数据可视化】Python数据图表可视化入门到实战】】 【课程资料链接&#xff1a;【链接】】 Python绘制饼图分析北京天气 饼图&#xff0c;是一个划分为几个扇形的圆形统计图表&#xff…

基于全国产复旦微JFM7K325T+ARM人工智能数据处理平台

复旦微可以配合的ARM平台有&#xff1a;RK3588/TI AM62X/ NXP IMX.8P/飞腾FT2000等。 产品概述 基于PCIE总线架构的高性能数据预处理FMC载板&#xff0c;板卡采用复旦微的JFM7K325T FPGA作为实时处理器&#xff0c;实现各个接口之间的互联。该板卡可以实现100%国产化。 板卡具…

华为模拟器防火墙配置实验(二)

一.实验拓扑 二.实验要求 1&#xff0c;DMZ区内的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9&#xff1a;00 - 18&#xff1a;00&#xff09;可以访问&#xff0c;生产区的设备全天可以访问. 2&#xff0c;生产区不允许访问互联网&#xff0c;办公区和游客区允许…

240712_昇思学习打卡-Day24-LSTM+CRF序列标注(3)

240712_昇思学习打卡-Day24-LSTMCRF序列标注&#xff08;3&#xff09; 今天做LSTMCRF序列标注第三部分&#xff0c;同样&#xff0c;仅作简单记录及注释&#xff0c;最近确实太忙了。 Viterbi算法 在完成前向训练部分后&#xff0c;需要实现解码部分。这里我们选择适合求解…

从“Hello,World”谈起(C++入门)

前言 c的发展史及c能干什么不能干什么不是我们今天的重点&#xff0c;不在这里展开&#xff0c;有兴趣的朋友可以自行查阅相关资料。今天我们主要是围绕c的入门程序&#xff0c;写一个“hello&#xff0c;world”&#xff0c;并且围绕这个入门程序简单介绍一下c和c的一些语法&…

C++ Qt 自制开源科学计算器

C Qt 自制开源科学计算器 项目地址 软件下载地址 目录 0. 效果预览1. 数据库准备2. 按键&快捷键说明3. 颜色切换功能(初版)4. 未来开发展望5. 联系邮箱 0. 效果预览 普通计算模式效果如下&#xff1a; 科学计算模式效果如下&#xff1a; 更具体的功能演示视频见如下链接…

stm32入门-----初识stm32

目录 前言 ARM stm32 1.stm32家族 2.stm32的外设资源 3.命名规则 4.系统结构 ​编辑 5.引脚定义 6.启动配置 7.STM32F103C8T6芯片 8.STM32F103C8T6芯片原理图与最小系统电路 前言 已经很久没跟新了&#xff0c;上次发文的时候是好几个月之前了&#xff0c;现在我是想去…

论文分享|NeurIPS2022‘华盛顿大学|俄罗斯套娃表示学习(OpenAI使用的文本表示学习技术)

论文题目&#xff1a;Matryoshka Representation Learning 来源&#xff1a;NeurIPS2022/华盛顿大学谷歌 方向&#xff1a;表示学习 开源地址&#xff1a;https://github.com/RAIVNLab/MRL 摘要 学习表征对于现代机器学习很重要&#xff0c;广泛用于很多下游任务。大多数情…

java配置nginx网络安全,防止国外ip访问,自动添加黑名单,需手动重新加载nginx

通过访问日志自动添加国外ip黑名单 创建一个类&#xff0c;自己添加一个main启动类即可测试 import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.json.JSONArray; import org.json.JSONObject; import org.sp…

面试经验之谈

优质博文&#xff1a;IT-BLOG-CN ​通常面试官会把每一轮面试分为三个环节&#xff1a;① 行为面试 ② 技术面试 ③ 应聘者提问 行为面试环节 面试开始的5~10分钟通常是行为面试的时间&#xff0c;面试官会参照简历和你的自我介绍了解应聘者的过往经验和项目经历。由于面试官…

nodejs模板引擎(一)

在 Node.js 中使用模板引擎可以让您更轻松地生成动态 HTML 页面&#xff0c;通过将静态模板与动态数据结合&#xff0c;您可以创建可维护且易于扩展的 Web 应用程序。以下是一个使用 Express 框架和 EJS 模板引擎的基本示例&#xff1a; 安装必要的依赖&#xff1a; 首先&#…

分享浏览器被hao123网页劫持,去除劫持的方式

昨天看python相关的自动化工作代码时&#xff0c;发现谷歌浏览器被hao123劫持了&#xff0c;把那些程序删了也不管用 方法1&#xff1a;删除hao123注册表&#xff0c;这个方式不太好用&#xff0c;会找不到注册表 方法2&#xff1a;看浏览器快捷方式的属性页面&#xff0c;一…

【C++】入门基础(命名空间、缺省参数、函数重载)

目录 一.命名空间&#xff1a;namespace 1.namespace的价值 2.namespace的定义 3.namespace的使用方法 3.1 域解析运算符:: 3.2 using展开 3.3 using域解析运算符 二.输入输出 三.缺省参数 四.函数重载 1.参数类型不同 2.参数个数不同 3.参数顺序不同 一.命名空间&…