Learning to Super-resolve Dynamic Scenes for Neuromorphic Spike Camera论文笔记

摘要

脉冲相机使用了“integrate and fire”机制来生成连续的脉冲流,以极高的时间分辨率来记录动态光照强度。但是极高的时间分辨率导致了受限的空间分辨率,致使重建出的图像无法很好保留原始场景的细节。为了解决这个问题,这篇文章提出了SpikeSR-Net来从低分辨率二进制脉冲流中恢复出高像素图像。Spike-Net基于脉冲相机模型进行设计,融合和基于模型和学习的方法。为了解决二进制数据有限的表达能力,文中提出了一个像素自适应的脉冲编码器,将脉冲转化为潜在的表达,用以推测光照强度以及物体的运动信息。然后,一个运动对其的超分辨率器被用来探索长期关联,从而时间域的密集采样(对应其超高的时间分辨率)可以被用来增强其空间分辨率,并且不引入运动模糊。实验结果显示SpikeSR-Net取得了很好的结果。

介绍

新兴的实时计算机视觉应用,比如自动驾驶,无人机技术等都需要机器能够清楚地记录高速运动并且迅速响应。这暴露了传统相机的不足。传统的相机主要是基于一次性曝光成像,对静态场景或者低速运动可以进行很好的成像。但是对于高度运动,运动物体上的某一点可能会被投影到传感器的不同像素上,导致运动模糊。

为了清晰地捕捉高动态场景,脉冲相机被发明。不同于传统相机将所有一个曝光周期内的所有视觉信息压缩成一张快照,脉冲相机没有采用曝光窗口的概念。相反,脉冲相机持续连续地监控到达的光线,然后输出二进制脉冲流来记录极高时间分辨率下的动态场景(40000hz)。除此之外,不同于使用微分采样模型记录光照变化的事件相机,脉冲相机发出脉冲,当到达的光子数量达到所设阈值时。这种集成的采样模式使得脉冲相机可以记录每个像素点的亮度强度,给恢复纹理信息提供更多明显的信息。

对于脉冲相机来说,图像重建是弥补二值脉冲和光强之间域差异的重要手段。这在过去几年中吸引了很多的注意力。然后,之前的工作由于以下的问题,常常会出现噪声、运动模糊和不满意的细节:
(1)超高速运动。由于超高速运动,一个传感器像素发出的脉冲不在描述运动物体上的同一点了。因此,需要特别注意避免来自不同物体点的灯光的混合。

(2)不理想的噪声。由于光子到达的泊松效应和热噪声的存在,临近脉冲的发射间隔存在剧烈的波动。因为这个原因,重建结果噪声较多,不稳定并且存在时空不一致的问题。

(3)有限的空间分辨率。作为对高时间分辨率的权衡,脉冲相机的空间分辨率首先,导致了重建细节不佳。

为了解决上述问题,本文提出了一个端到端的脉冲相机超分辨率网络SpikeSR-Net,旨在对脉冲流进行超分辨率处理,得到高像素的强度图像。具体来说,我们首先提出了像素自适应脉冲编码器(PASE, pixel-adaptive spike encoder)来将原始的二进制脉冲转化为潜在的强度表达。考虑到场景内容的多样性,PASE自适应地探索局部时空关联来解决不同的运动和光照条件。然后,我们提出了运动对齐超分辨率器(MASR, motion-aligned super resolver),用来循环进行运动对齐的梯度下降和近端映射。MASR运用长期时间联合将时域的密集采样转化到空间域中,使得超分辨率化后的图像拥有了更加细致的细节,高的最大信噪比(PSNR)和更少的模糊。在真实以及合成脉冲数据上的实验结果显示了Spike-Net优越的性能。

这项工作的主要贡献如下:
(1)我们设计了一个基于优化的网络,通过结合基于模型以及基于学习方法的优点来超像素化二进制脉冲数据流,获得拥有更高质量纹理细节的强度图像。

(2)我们提出了像素自适应的脉冲编码器来将二进制的脉冲传化为潜在的表达。编码器自适应地探索时空一致性来解决不同的运动和光照情况。所提出的方法还可以被灵活地运用到其他脉冲相机任务中。

(3)我们设计了一个展开的运动对齐超像素器,通过循环运用梯度下降以及近端映射,使得网络可以探索长期的时空关系来提升图像的信噪比以及纹理细节。

问题描述

脉冲相机的基础

脉冲相机使用了“integrate-and-fire”机制来连续地对到达的光照 I ( t ) I(t) I(t)进行累计。当到达阈值 θ \theta θ时,一个脉冲会被激发并且积分器归零。假设 t 1 , t 2 , . . . , t n {t_1, t_2,...,t_n} t1,t2,...,tn是生成的脉冲的发射时间,第 k k k个脉冲的产生过程可以描述为:
∫ t k − 1 t k η I ( x ) d x = θ (1) \int_{t_{k-1}}^{t_k}\eta I(x)dx=\theta \tag{1} tk1tkηI(x)dx=θ(1)
其中 η \eta η表示光电转化率。脉冲图像传感器上的一个像素可能在任意时间发射脉冲,但是相机只能以离散二进制的形式读出脉冲信号 S ( n ) S(n) S(n)。具体说来,在 t k t_k tk时间激发的第 k k k个脉冲会被读出并表示为 S ( n k ) = 1 S(n_k)=1 S(nk)=1,其中 η k = ⌈ t k / δ ⌉ \eta_k=\lceil t_k/\delta \rceil ηk=tk/δ δ \delta δ是脉冲相机的读出间隔。

脉冲相机超像素成像

如图一所示,由于相机和物体之间的相对运动,脉冲相机在不同的时刻可能是在不同的位置进行采样的。进一步说来,脉冲相机用极高的时间分辨率记录了动态场景,进而产生了亚像素位移,并且为超像素提供了亚像素覆盖。

假设 X k X_k Xk表示 k k k时刻的高分辨率(HD)图像。基于光度一致性假设,脉冲相机高分辨率成像的观测模型可以表示为:
Y i = D s H i T k → i X k + N i , i = 1 , 2 , . . . , n S 1 , S 2 , . . . , S n = T ( { Y 1 , Y 2 , Y 3 } , θ ) (2) Y_i=\mathcal{D}_s\mathcal{H}_i\mathcal{T}_{k\rightarrow i}X_k+N_i, \ i=1,2,...,n\\\\ {S_1,S_2,...,S_n}=T(\{Y_1,Y_2,Y_3\},\theta)\tag{2} Yi=DsHiTkiXk+Ni, i=1,2,...,nS1,S2,...,Sn=T({Y1,Y2,Y3},θ)(2)
这里 H i \mathcal{H_i} Hi T k → i \mathcal{T}_{k\rightarrow i} Tki分别代表模糊退化以及运动变换矩阵。 D s \mathcal{D}_s Ds表示以 s s s为缩放系数进行的下采样。 N i N_i Ni是额外的噪声。 { Y 1 , Y 2 , . . . , Y n } \{Y_1,Y_2,...,Y_n\} {Y1,Y2,...,Yn}是不同时刻退化后的低分辨率强度信息。 T ( ⋅ ) T(\cdot) T()表示脉冲相机的“integrate-and-fire”机制,进而产生二进制的脉冲流。脉冲相机超分辨率(SCSR, spike camera super resolution)的目的是将时域中的密集采样转化到空间域中,超分辨率化低像素的脉冲数据 { S 1 , S 2 , S 3 } \{S_1,S_2,S_3\} {S1,S2,S3}来获得高质量的高分辨率强度图像 X ^ k \hat{X}_k X^k
在这里插入图片描述

方法

整体流程

收到SCSR观测模型的启发,本文提出了一个端到端可训的SCSR模型,称为Spike-Net来从低分辨率的脉冲流中得到超分辨率化的图像。图二展示了Spike-Net的整体流程。它将第 k k k帧附近连续的脉冲帧 { S k + 1 } , i = ± 1 , ± 2 , . . . \{S_{k+1}\},i=\pm1,\pm2,... {Sk+1},i=±1,±2,...作为输入,使得网络可以探索空间关联来生成高质量的高像素图像 X ^ k \hat{X}_k X^k。网络主要包含两部分,PASE和MASR。首先,输入的脉冲流会被分成一些重叠的短期的脉冲块 { B i } , i ∈ { 1 , 2 , . . . , k , . . . , n − 1 , n } \{B_i\},i\in\{1,2,...,k,...,n-1,n\} {Bi},i{1,2,...,k,...,n1,n}。PASE E \mathcal{E} E自适应地探索每一个二进制脉冲块之间的时空关联,产生潜在的强度表示 { Y i } \{Y_i\} {Yi}
Y i = E ( B i ) (3) Y_i=\mathcal{E}(B_i)\tag{3} Yi=E(Bi)(3)
然后,超分辨率器的目标可以描述为:
arg ⁡ min ⁡ X k ∑ i = 1 n w i ⋅ ∣ ∣ D s H i T k → i X k − Y i ∣ ∣ 2 2 + λ Ψ ( X k ) (4) \arg \mathop{\min}\limits_{X_k}\sum_{i=1}^nw_i\cdot||\mathcal{D}_s\mathcal{H}_i\mathcal{T}_{k\rightarrow i}X_k-Y_i||_2^2+\lambda\Psi(X_k)\tag{4} argXkmini=1nwi∣∣DsHiTkiXkYi22+λΨ(Xk)(4)
其中, w i w_i wi表示关于噪声 N i N_i Ni的权重。 Ψ ( X k ) \Psi(X_k) Ψ(Xk)表示高像素图像的先验, λ \lambda λ表示正则项。上述的逆问题可以通过迭代下面的更新步骤进行解决:
R k ( t ) = X k t − 1 − β ∑ i = 1 n w i T k → i T H i T D s T ( D s H i T k → i X k t − 1 − Y i ) X k ( t ) = arg ⁡ min ⁡ X k ∣ ∣ X k − R k ( t ) ∣ ∣ 2 2 + λ Ψ ( X k ) (5) R_k^{(t)}=X_k^{t-1}-\beta\sum_{i=1}^nw_i\mathcal{T}_{k\rightarrow i}^T\mathcal{H}_i^T\mathcal{D}_s^T(\mathcal{D}_s\mathcal{H}_i\mathcal{T}_{k\rightarrow i}X_k^{t-1}-Y_i)\\\\ X_k^{(t)}=\arg \mathop{\min}\limits_{X_k}||X_k-R_k^{(t)}||_2^2+\lambda\Psi(X_k)\tag{5} Rk(t)=Xkt1βi=1nwiTkiTHiTDsT(DsHiTkiXkt1Yi)Xk(t)=argXkmin∣∣XkRk(t)22+λΨ(Xk)(5)
这里 β \beta β是更新率。(这里面用到了ADMM算法)

受到优化过程过程的启发,我们设计了一个迭代的基于CNN的超分辨率器来进一步探索长期的时间关联并且构建更加细致的高分辨率图像。具体的流程可以表示为:
R k ( t ) = G ( X k ( t − 1 ) , Y 0 , Y 1 , . . . , Y n ) X k ( t ) = P ( R k ( t ) ) (6) R_k^{(t)}=\mathcal{G}(X_k^{(t-1)},{Y_0,Y_1,...,Y_n})\\\\ X_k^{(t)}=\mathcal{P}(R_k^{(t)})\tag{6} Rk(t)=G(Xk(t1),Y0,Y1,...,Yn)Xk(t)=P(Rk(t))(6)
G ( ⋅ ) \mathcal{G}(\cdot) G() P ( ⋅ ) \mathcal{P}(\cdot) P()分别代表梯度下降模块(GDM, gradient decent module)和近端映射模块(PMM, proximal mapping module)。 E ( ⋅ ) \mathcal{E}(\cdot) E() G ( ⋅ ) \mathcal{G}(\cdot) G() P ( ⋅ ) \mathcal{P}(\cdot) P()的细节会在接下来的部分详细讨论。
在这里插入图片描述

PASE

在脉冲相机中,每一个脉冲的激发表示着到达了一定的光子,这个积累的过程可能会延续好几个读出周期。也就是说,除了代表实时性的强度信息,每一个脉冲还暗含了有限的视觉信息。为了解决这一问题,我们设计了PASE来将二进制脉冲流转化成潜在的强度表达。

图三展示了所提出的PASE。为了增强表达能力,卷积被用来探索脉冲流之间的局部时空关联。然而,场景内容的多样性可能会导致关联结构的多样性,而固定的卷积kernel难以很好地处理多种内容。举例来说,对于高速运动或者有高频率边的区域,注意力应该放在避免模糊上。因此,相比于直接使用固定的卷积网络提取特征,PASE使用卷积网络来分析脉冲块 B i B_i Bi之间的关联结构,并且生成一组可学习的kernel特征 K i H × W × L K 2 \mathcal{K}_i^{H\times W\times LK^2} KiH×W×LK2。其中 H H H W W W L L L是输入脉冲块的高度、宽度和长度。 K K K是滤波器的尺寸。然后,kernel特征会被重塑为 H × W H\times W H×W的线性滤波器 K i , j ′ K × K × L K_{i,j}^{'K\times K\times L} Ki,jK×K×L,并且每个滤波器都被用来为相应的输入块提取瞬时的强度信息:
Y i ( x , y ) = K i , j ′ ( x , y ) ⊗ P i ( x , y ) (7) Y_i(x,y)=K'_{i,j}(x,y)\otimes P_i(x,y)\tag{7} Yi(x,y)=Ki,j(x,y)Pi(x,y)(7)
其中, K i , j ′ ( x , y ) K'_{i,j}(x,y) Ki,j(x,y)表示 P i ( x , y ) P_i(x,y) Pi(x,y)对应的第 j j j个kernel, P i ( x , y ) P_i(x,y) Pi(x,y)表示以 ( x , y ) (x,y) (x,y)为中心的 K × K × L K \times K \times L K×K×L的二进制脉冲块。除此之外,为了增强PASE的能力。我们使用一些平行的分支来生成多组kernel。不同组的滤波器尺寸可以是不同的,所以PASE可以拥有不同的感受野。PASE的输出是一系列从不同分支中获得的特征,可以表示为 Y i = [ Y i 1 , Y i 2 , . . . , Y i C ] Y_i=[Y_i^1,Y_i^2,...,Y_i^C] Yi=[Yi1,Yi2,...,YiC]。其中 C C C是分支数。在本文中,PASE被用在所有的短期脉冲块中,生成了一系列的潜在表达 Y 1 , Y 2 , Y 3 {Y_1,Y_2,Y_3} Y1,Y2,Y3
在这里插入图片描述

MASR

超分辨率器的目标是重建高分辨,拥有更多细节的强度图像。为此,我们进一步探索了不同时刻之间的长期时间关联,从而将时域上的密集采样转化到空间域上。考虑到室外场景中的高速运动,我们格外在意对运动的避免。收到优化模型的启发,我们提出了基于运动对齐的GDM G ( ⋅ ) \mathcal{G(\cdot)} G()和PMM P ( ⋅ ) \mathcal{P(\cdot)} P()来发挥长期关联的优势并且迭代优化细节。

基于运动对齐的GDM

图四展示了基于运动对齐的GDM G ( ⋅ ) \mathcal{G(\cdot)} G()的架构。根据公式(5),我们采用梯度计算单元,基于不同时刻的潜在表示来计算梯度。第 i i i个分支的梯度计算单元可以被定义为:
对齐: E i ( t ) = T k → i ( [ X k ( t − 1 ) , D s − 1 ( Y i ) ] ) (8) E_i^{(t)}=\mathcal{T}_{k\rightarrow i}([X_k^{(t-1)},\mathcal{D}_s^{-1}(Y_i)])\tag{8} Ei(t)=Tki([Xk(t1),Ds1(Yi)])(8)
按比例缩减: L i ( t ) = D s ( H i ( E i ( t ) ) ) (9) L_i^{(t)}=\mathcal{D}_s(\mathcal{H}_i(E_i^{(t)}))\tag{9} Li(t)=Ds(Hi(Ei(t)))(9)
缩放残余: F i ( t ) = H s − 1 ( D i − 1 ( L i ( t ) − Y i ) ) (10) F_i^{(t)}=\mathcal{H}_s^{-1}(\mathcal{D}_i^{-1}(L_i^{(t)}-Y_i))\tag{10} Fi(t)=Hs1(Di1(Li(t)Yi))(10)
对齐: G i ( t ) = T k → i − 1 ( [ F i ( t ) , X k ( t − 1 ) ] ) (11) G_i^{(t)}=\mathcal{T}_{k\rightarrow i}^{-1}([F_i^{(t)},X_k^{(t-1)}])\tag{11} Gi(t)=Tki1([Fi(t),Xk(t1)])(11)
其中 [ , ] [,] [,]表示拼接。 D s ( ⋅ ) \mathcal{D}_s(\cdot) Ds() D s − 1 ( ⋅ ) \mathcal{D}_s^{-1}(\cdot) Ds1()是基于卷积和反卷积(stride为 s s s)的下采样和上采样操作。 H i ( ⋅ ) \mathcal{H}_i(\cdot) Hi() H i − 1 ( ⋅ ) \mathcal{H}_i^{-1}(\cdot) Hi1()是基于残差块的退化和精修操作。 T k → i ( ⋅ ) \mathcal{T}_{k\rightarrow i}(\cdot) Tki()表示可变形卷积,它可以对齐 k k k时刻的特征以及 i i i时刻的特征,并且有 T k → i − 1 ( ⋅ ) = T i → k ( ⋅ ) \mathcal{T}_{k\rightarrow i}^{-1}(\cdot)=\mathcal{T}_{i\rightarrow k}(\cdot) Tki1()=Tik()。在可变性卷积中,额外的偏置会被习得来增强空间采样位置,这在低层的计算机视觉领域展示了强大的转化模型能力。这里,我们使用可变性卷积来对齐不同时刻的特征,以避免运动模糊。
在这里插入图片描述
接下来,为了进一步探索长期时间关联,我们引入了基于ConvGRU的双向特征融合来自适应地整合梯度 { G 1 ( t ) , G 2 ( t ) , . . . , G n ( t ) } \{G_1^{(t)},G_2^{(t)},...,G_n^{(t)}\} {G1(t),G2(t),...,Gn(t)}。每一个ConvGRU包含了一个可学习的更新门和一个可学习的置位门。前向整合过程可以描述为:
Q i ( t ) = tanh ⁡ ( C o n v ( [ C i ( t ) ⊙ H i − 1 , G i ( t ) ] ) ) H i ( t ) = ( 1 − Z i ( t ) ) ⊙ H i − 1 ( t ) + Z i ( t ) ⋅ Q i ( t ) (12) Q_i^{(t)}=\tanh(Conv([C_i^{(t)}\odot H_{i-1},G_i^{(t)}]))\\\\ H_i^{(t)}=(1-Z_i^{(t)})\odot H_{i-1}^{(t)}+Z_i^{(t)}\cdot Q_i^{(t)}\tag{12} Qi(t)=tanh(Conv([Ci(t)Hi1,Gi(t)]))Hi(t)=(1Zi(t))Hi1(t)+Zi(t)Qi(t)(12)
更新门 Z i ( t ) Z_i^{(t)} Zi(t)控制了多少现有的信息会被整合到新状态下。置位门 C i ( t ) C_i^{(t)} Ci(t)控制了多少之前额状态会被保留。 Z i ( t ) Z_i^{(t)} Zi(t) C i ( t ) C_i^{(t)} Ci(t)是基于 H i − 1 ( t ) H_{i-1}^{(t)} Hi1(t) G i ( t ) G_i^{(t)} Gi(t)通过卷积和sigmoid激活操作得到的(所以这个 H i H_i Hi是怎么得到呢,看图四是 G i G_i Gi通过ConvGRU后得到的)。反向整合的和前向整合类似。GDM在 t t t时候的输出可以表示为:
R k ( t ) = X k ( t − 1 ) − C o n v ( [ H K ( t ) , H K ′ ( t ) ] ) (13) R_k^{(t)}=X_k^{(t-1)}-Conv([H_K^{(t)},H_K^{'(t)}])\tag{13} Rk(t)=Xk(t1)Conv([HK(t),HK(t)])(13)
其中 H K ( t ) H_K^{(t)} HK(t) H K ′ ( t ) H_K^{'(t)} HK(t)分别表示前向和后向的梯度整合。

前端映射模块(PMM)

紧接着,一个PMM P ( ⋅ ) \mathcal{P(\cdot)} P()被提出用来解决公式(5)中的前端映射问题。PMM的目标是修复 R k ( t ) R_k^{(t)} Rk(t)使其更接近理想的信号。为此,我们采用连接的残差块来优化细节,生成输出 X k t = P ( R k ( t ) ) X_k^{t}=\mathcal{P}(R_k^{(t)}) Xkt=P(Rk(t))

因此,最终的重建可以表示为 X ^ k = X k ( T ) \hat{X}_k=X_k^{(T)} X^k=Xk(T),这里 T T T表示状态号(stage number,对应之前的不同分支么?)。

初始化

在开始循环之前,需要对 X k ( 0 ) X_k^{(0)} Xk(0)进行初始化。本文中,我们使用了一个基于运动对齐的混合模块 F ( ⋅ ) \mathcal{F}(\cdot) F()来初始化 X k ( 0 ) X_k^{(0)} Xk(0)。具体来说,我们首先使用可变性卷积,以 Y k Y_k Yk为准来对齐每一个临近的表达 Y i Y_i Yi。然后,我们使用基于双向ConvGRU的特征融合(如上所述)来整合对齐后的特征。最后,我们对整合的特征进行了上采样,并推导出 X k ( 0 ) X_k^{(0)} Xk(0)

实现

数据准备

为了训练和评估SpikeSR-Net,需要脉冲数据集,包括低分辨率脉冲流和相应的高分辨率(HR)图像。然而,捕捉高质量的HR图像具有挑战性,特别是在高运动的动态场景中。为了解决这一问题,我们修改了(SpK2ImgNet)中的脉冲摄像机模拟器,以同时生成LR脉冲流和HR真值。本文考虑了基于图像的合成和基于视频的合成这两种模式。对于基于图像的合成,我们将每个被选择的图像视为要记录的场景,并假设在场景和传感器之间存在一个全局运动。我们使用来自DIV2K数据集的图像,来自REDS数据集和×4K1000FPS数据集的视频作为虚拟场景。训练数据集由600个脉冲流组成,这些脉冲流流是基于所有三个数据集生成的,以增强多样性。对于测试数据集,我们建立了一个基于DIV2K数据集的脉冲数据集和一个基于REDS数据集的脉冲数据集。每个测试数据集由40个脉冲序列组成。请注意,测试数据集和训练数据集之间没有重叠。

训练细节

在我们的实现中,在kernel预测器中使用了四个残差块。超分辨率器的级数设置为4。损失函数定义为:
L = λ t ∑ t = 1 T ∣ ∣ X k ( t ) − I k ∣ ∣ \mathcal{L}=\lambda_t\sum_{t=1}^T||X_k^{(t)}-I_k|| L=λtt=1T∣∣Xk(t)Ik∣∣
其中 I k I_k Ik k k k时刻的真值。当 t < T t < T t<T时, λ t \lambda_t λt被设置为 0.1 0.1 0.1。否则, λ t \lambda_t λt将被设置为 1 1 1。我们将脉冲帧裁剪成40×40的patch,并将batch size设置为 6 6 6。在训练过程中,通过随机旋转 90 ° 、 180 ° 、 270 ° 90°、180°、270° 90°180°270°和水平翻转来进行数据增强。我们使用 A d a m Adam Adam优化器,并使用两个 G T X 1080 T i GTX 1080Ti GTX1080Ti GPU(PyTorch)实现我们的实验。该模型被训练了 30 30 30个epoch。

实验结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

idea2023 springboot2.7.5+mybatisplus3.5.2+jsp 初学单表增删改查

创建项目 修改pom.xml 为2.7.5 引入mybatisplus 2.1 修改pom.xml <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!--mysq…

【STM32 学习】电源解析(VCC、VDD、VREF+、VBAT)

VCC电源电压GND电源供电负电压&#xff08;通常接地&#xff09;VDD模块工作正电压VSS模块工作负电压VREFADC参考正电压VREF-ADC参考负电压VBAT电池或其他电源供电VDDA模拟供电正电压VSSA模拟供电负电压 一、VCC&#xff08;供电电压&#xff09; VCC是指芯片的电源电压&#…

MNIST手写数字数据集+7000张图片下载

MNIST手写数字图像数据集是一个经典的用于图像分类任务的数据集&#xff0c;其中包含了大量的手写数字图像样本 数据集点击下载&#xff1a; MNIST手写数字数据集7000张图片.rar

函数栈帧理解

本文是从汇编角度来展示的函数调用&#xff0c;而且是在vs2013下根据调试展开的探究&#xff0c;其它平台在一些指令上会有点不同&#xff0c;指令不多&#xff0c;简单记忆一下即可&#xff0c;在我前些年的学习中&#xff0c;学的这几句汇编指令对我调试找错误起了不小的作用…

【令牌桶算法与漏桶算法】

&#x1f4a7; 令牌桶算法与漏桶算法 \color{#FF1493}{令牌桶算法与漏桶算法} 令牌桶算法与漏桶算法&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专…

【前端|JS实战第1篇】使用JS来实现属于自己的贪吃蛇游戏!

前言 贪吃蛇游戏是经典的小游戏&#xff0c;也是学习前端JS的一个很好的练习项目。在本教程中&#xff0c;我们将使用 JavaScript 来逐步构建一个贪吃蛇游戏。我们会从创建游戏区域开始&#xff0c;逐步添加蛇的移动、食物的生成以及游戏逻辑等功能。 &#x1f680; 作者简介&a…

韦东山-电子量产工具项目:业务系统

代码结构 所有代码都已通过测试跑通&#xff0c;其中代码结构如下&#xff1a; 一、include文件夹 1.1 common.h #ifndef _COMMON_H #define _COMMON_Htypedef struct Region {int iLeftUpX; //区域左上方的坐标int iLeftUpY; //区域左下方的坐标int iWidth; //区域宽…

java八股文面试[java基础]——String StringBuilder StringBuffer

String类型定义&#xff1a; final String 不可以继承 final char [] 不可以修改 String不可变的好处&#xff1a; hash值只需要算一次&#xff0c;当String作为map的key时&#xff0c; 不需要考虑hash改变 天然的线程安全 知识来源&#xff1a; 【基础】String、StringB…

Python web实战之细说 Django 的单元测试

关键词&#xff1a; Python Web 开发、Django、单元测试、测试驱动开发、TDD、测试框架、持续集成、自动化测试 大家好&#xff0c;今天&#xff0c;我将带领大家进入 Python Web 开发的新世界&#xff0c;深入探讨 Django 的单元测试。通过本文的实战案例和详细讲解&#xff…

ubuntu安装Microsoft Edge并设置为中文

1、下载 edge.deb 版本并安装 sudo dpkg -i microsoft-edg.deb 2. 设置默认中文显示 如果是通过.deb方式安装的&#xff1a; 打开默认安装路径下的microsoft-edge-dev文件&#xff0c;在文件最开头加上: export LANGUAGEZH-CN.UTF-8 &#xff0c;保存退出。 cd /opt/micr…

PHP8的字符串操作3-PHP8知识详解

今天继续分享字符串的操作&#xff0c;前面说到了字符串的去除空格和特殊字符&#xff0c;获取字符串的长度&#xff0c;截取字符串、检索字符串。 今天继续分享字符串的其他操作。如&#xff1a;替换字符串、分割和合成字符串。 5、替换字符串 替换字符串就是对指定字符串中…

【算法系列篇】滑动窗口

文章目录 前言什么是滑动窗口1.长度最小的子数组1.1 题目要求1.2 做题思路 1.3 Java代码实现2.无重复字符的最长子串2.1 题目要求2.2 做题思路2.3 Java代码实现 3.最大连续1的个数 III3.1 题目要求3.2 做题思路3.3 Java代码实现 4.将x减到0的最小操作数4.1 题目要求4.2 做题思路…

【仿写框架之仿写Tomact】四、封装HttpRequest对象(属性映射http请求报文)、HttpResponse对象(属性映射http响应报文)

文章目录 1、创建HttpRequest对象2、创建HttpResponse对象 1、创建HttpRequest对象 HttpRequest对象中的属性与HTTP协议中的内容对应&#xff0c;用于后序servlet从request中获取请求中的参数。 参照http请求报文&#xff1a; import java.io.BufferedReader; import java…

配置使用Gitee账号认证登录Grafana

三方社会化身份源 集成gitee第三方登录 第三方登录的原理 所谓第三方登录&#xff0c;实质就是 OAuth 授权。用户想要登录 A 网站&#xff0c;A 网站让用户提供第三方网站的数据&#xff0c;证明自己的身份。获取第三方网站的身份数据&#xff0c;就需要 OAuth 授权。 举例来…

ubuntu上使用osg3.2+osgearth2.9

一、介绍 在ubuntu上使用osgearth加载三维数字地球&#xff0c;首先要有osg和osgearth的库&#xff0c;这些可以直接使用apt-get下载安装&#xff0c;但是版本有些老&#xff0c;如果需要新版本的就需要自己编译。 #查看现有版本 sudo apt-cache madison openscenegraph #安装…

Python写一个创意五子棋游戏

前言 在本教程中&#xff0c;我们将使用Python写一个创意五子棋游戏 &#x1f4dd;个人主页→数据挖掘博主ZTLJQ的主页 个人推荐python学习系列&#xff1a; ☄️爬虫JS逆向系列专栏 - 爬虫逆向教学 ☄️python系列专栏 - 从零开始学python 首先 GomokuGame 类的构造函数 __ini…

小程序 CSS-in-JS 和原子化的另一种选择

小程序 CSS-in-JS 和原子化的另一种选择 小程序 CSS-in-JS 和原子化的另一种选择 介绍快速开始 pandacss 安装和配置 0. 安装和初始化 pandacss1. 配置 postcss2. 检查你的 panda.config.ts3. 修改 package.json 脚本4. 全局 css 注册 pandacss5. 配置的优化与别名 weapp-pand…

LeetCode 周赛上分之旅 #40 结合特征压缩的数位 DP 问题

⭐️ 本文已收录到 AndroidFamily&#xff0c;技术和职场问题&#xff0c;请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架&#xff0c;你的思考越抽象&#xff0c;它能覆盖的问题域就越广&#xff0c;理解难度…

07_缓存预热缓存雪崩缓存击穿缓存穿透

缓存预热&缓存雪崩&缓存击穿&缓存穿透 一、缓存预热 提前将数据从数据库同步到redis。 在程序启动的时候&#xff0c;直接将数据刷新到redis懒加载&#xff0c;用户访问的时候&#xff0c;第一次查询数据库&#xff0c;然后将数据写入redis 二、缓存雪崩 发生情…

Roxy-Wi 命令执行漏洞复现

漏洞描述 Roxy-WI是开源的一款用于管理 Haproxy、Nginx 和 Keepalived 服务器的 Web 界面 Roxy-WI 6.1.1.0 之前的版本存在安全漏洞,该漏洞源于系统命令可以通过 subprocess_execute 函数远程运行,远程攻击者利用该漏洞可以执行远程代码。 免责声明 技术文章仅供参考,任…