当前位置: 首页 > news >正文

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。

实验结果

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

相关文章:

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

摘要 脉冲相机使用了“integrate and fire”机制来生成连续的脉冲流&#xff0c;以极高的时间分辨率来记录动态光照强度。但是极高的时间分辨率导致了受限的空间分辨率&#xff0c;致使重建出的图像无法很好保留原始场景的细节。为了解决这个问题&#xff0c;这篇文章提出了Sp…...

怎么使用手机远程控制Win10电脑?

可以使用手机远程控制电脑吗&#xff1f; “近期&#xff0c;我将出差一段时间。问题是&#xff0c;我希望能够从很远的地方浏览家里电脑上的一些东西&#xff0c;但我不会一直随身携带笨重的笔记本电脑。我可以手机远程访问Windows电脑吗&#xff1f; ” 当然&am…...

W6100-EVB-PICO 做UDP Client 进行数据回环测试(八)

前言 上一章我们用开发板作为UDP Server进行数据回环测试&#xff0c;本章我们让我们的开发板作为UDP Client进行数据回环测试。 连接方式 使开发板和我们的电脑处于同一网段&#xff1a; 开发板通过交叉线直连主机开发板和主机都接在路由器LAN口 测试工具 网路调试工具&a…...

Typora 相对路径保存图片以及 Gitee 无法显示图片

目录 Typora 相对路径保存图片 Gitee 无法显示图片 Typora 相对路径保存图片 Step1&#xff1a;修改 Typora 的偏好设置 自动在当前目录创建名为 "./${filename}.assets" 的文件夹粘贴图片到 md 中时&#xff0c;图片会自动另存到 "./${filename}.assets&qu…...

深入探索:Kali Linux 网络安全之旅

目录 前言 访问官方网站 导航到下载页面 启动后界面操作 前言 "Kali" 可能指的是 Kali Linux&#xff0c;它是一种基于 Debian 的 Linux 发行版&#xff0c;专门用于渗透测试、网络安全评估、数字取证和相关的安全任务。Kali Linux 旨在提供一系列用于测试网络和…...

Python 实现语音转文本

Python 实现语音转文本 Python可以使用多种方式来实现语音转文本&#xff0c;下面介绍其中两种。 方法一&#xff1a;使用Google Speech API Google Speech API 是 Google 在 2012 年推出的一个 API&#xff0c;可以用于实现语音转文本。使用 Google Speech API 需要安装 Sp…...

使用DSA、ECDSA、Ed25519 和 rfc6979_rust实现高安全性的数字签名

第一部分&#xff1a;背景和DSA简介 在数字世界中&#xff0c;确保数据的真实性和完整性是至关重要的。一个有效的方法是使用数字签名。在这篇文章中&#xff0c;我们将探讨四种流行的加密签名算法&#xff1a;DSA、ECDSA、Ed25519 和 rfc6979_rust。我们将重点讲解它们的基础…...

“深入探索JVM内部机制:解密Java虚拟机的奥秘“

标题&#xff1a;深入探索JVM内部机制&#xff1a;解密Java虚拟机的奥秘 摘要&#xff1a;本文将深入探索Java虚拟机&#xff08;JVM&#xff09;的内部机制&#xff0c;介绍JVM的基本原理、运行时数据区域以及垃圾回收机制&#xff0c;并通过示例代码解释这些概念。 正文&am…...

css3新增属性

文章目录 css3新增属性box-shadowborder-radius设置椭圆 position: sticky;渐变背景线性渐变可重复的渐变背景 径向渐变可重复的渐变背景 过渡分属性 动画关键帧与transition的关系demo 变形平移使用 旋转使用 其他使用立体效果perspective元素位于3D空间还是平面中 缩放变形的…...

自动驾驶港口车辆故障及事故处理机制

1、传感器故障&#xff1a; &#xff08;1&#xff09;单一传感器数据异常处理。自动驾驶电动平板传感方案为冗余设置&#xff0c;有其他传感器能够覆盖故障传感器观测区域&#xff0c;感知/定位模块将数据异常情况发给到规划决策模块&#xff0c;由“大脑”向中控平台上报故障…...

【leetcode 力扣刷题】快乐数/可被k整除的最小整数(可能存在无限循环的技巧题)

可能存在无限循环的技巧题 202. 快乐数数学分析 1015. 可被k整除的最小整数数学分析 202. 快乐数 题目链接&#xff1a;202. 快乐数 题目内容&#xff1a; 理解题意&#xff0c;快乐数就是重复每位数的平方之和得到的新数的过程&#xff0c;最终这个数能变成1。变成1以后&…...

Python 的下一代 HTTP 客户端

迷途小书童 读完需要 9分钟 速读仅需 3 分钟 1 环境 windows 10 64bitpython 3.8httpx 0.23.0 2 简介 之前我们介绍过使用 requests ( https://xugaoxiang.com/2020/11/28/python-module-requests/ ) 来进行 http 操作&#xff0c;本篇介绍另一个功能非常类似的第三方库 httpx&…...

网络安全---webshell实践

一、首先环境配置 1.上传文件并解压 2.进入目录下 为了方便解释&#xff0c;我们只用两个节点&#xff0c;启动之后&#xff0c;大家可以看到有 3 个容器&#xff08;可想像成有 3 台服务器就成&#xff09;。 二、使用蚁剑去连接 因为两台节点都在相同的位置存在 ant.jsp&…...

论AI GPT跨境贸易架构及其应用

摘要 2023年初,我司启动了智慧化跨境贸易供应链一体化平台的建设工作。我在该项目中担任系统架构设计师的职务,主要负责设计平台系统架构和安全体系架构。该平台以移动信息化发展为契机,采用”平台+AI”的模式解决现有应用的集中移动化需求。平台整体的逻辑复杂,对系统的高…...

github的CodeSpace如何对外提供TCP 端口服务?

github提供了codespace&#xff0c;一个IDE环境&#xff0c;可以远程以WEB的形式&#xff0c;运行VS code进行开发。 他会给你提供一个虚拟机&#xff0c;4核16G内存&#xff0c;还是很香的&#xff0c;比普通的VPS性能好多了。 缺点是没有独立的IP地址&#xff0c;无法对外进…...

借助Midjourney创作龙九子图

&#xff08;本文阅读时间&#xff1a;5 分钟&#xff09; 《西游记》中有这么一段描写&#xff1a; 龙王道&#xff1a;“舍妹有九个儿子。那八个都是好的。第一个小黄龙&#xff0c;见居淮渎&#xff1b;第二个小骊龙&#xff0c;见住济渎&#xff1b;第三个青背龙&#xff0…...

Azure存储访问层

blob数据的热访问层&#xff0c;冷访问层和存档访问层 Azure Blob 存储是一种托管对象存储服务&#xff0c;可用于存储和访问大量非结构化数据&#xff0c;如文本和二进制数据。Azure Blob 存储提供了三个不同层级的访问方式&#xff0c;以适应不同数据的使用模式和成本效益需…...

Unity进阶–通过PhotonServer实现人物移动和攻击–PhotonServer(五)

文章目录 Unity进阶–通过PhotonServer实现人物移动和攻击–PhotonServer(五)DLc&#xff1a; 消息类和通信类服务器客户端 Unity进阶–通过PhotonServer实现人物移动和攻击–PhotonServer(五) DLc&#xff1a; 消息类和通信类 Message namespace Net {public class Message{p…...

中间件: Redis安装与部署

单机部署 yum install -y epel-release yum install -y redissed -i "s/bind 127.0.0.1/bind 0.0.0.0/g" /etc/redis.conf sed -i "s/# requirepass foobared/requirepass abcd1234/g" /etc/redis.conf systemctl restart redis集群部署 启动6个redis节点…...

Java日志框架-JUL

JUL全称Java util logging 入门案例 先来看着入门案例&#xff0c;直接创建logger对象&#xff0c;然后传入日志级别和打印的信息&#xff0c;就能在控制台输出信息。 可以看出只输出了部分的信息&#xff0c;其实默认的日志控制器是有一个默认的日志级别的&#xff0c;默认就…...

【Java】智慧工地SaaS平台源码:AI/云计算/物联网/智慧监管

智慧工地是指运用信息化手段&#xff0c;围绕施工过程管理&#xff0c;建立互联协同、智能生产、科学管理的施工项目信息化生态圈&#xff0c;并将此数据在虚拟现实环境下与物联网采集到的工程信息进行数据挖掘分析&#xff0c;提供过程趋势预测及专家预案&#xff0c;实现工程…...

Dodaf架构的学习分享

一.Dodaf的内容 Dodaf的背景 DODAF&#xff08;Department of Defense Architecture Framework&#xff09;起源于美国国防部&#xff0c;是一个用于支持复杂系统设计、规划和实施的架构框架。以下是DODAF的背景和起源&#xff1a; 复杂系统需求&#xff1a;在军事和国防领域&…...

听GPT 讲Prometheus源代码--discovery

Prometheus是一个开源的系统监控和警报工具包&#xff0c;以下是Prometheus源代码中一些主要的文件夹及其作用&#xff1a; cmd/&#xff1a;这个目录包含了Prometheus主要的命令行工具&#xff0c;如prometheus/&#xff0c;promtool/等。每个子目录都代表一个可执行的命令行应…...

HTTP 介绍

HTTP 介绍 HTTP 协议一般指 HTTP&#xff08;超文本传输协议&#xff09;。超文本传输协议&#xff08;英语&#xff1a;HyperText Transfer Protocol&#xff0c;缩写&#xff1a;HTTP&#xff09;是一种用于分布式、协作式和超媒体信息系统的应用层协议&#xff0c;是因特网…...

Rust语言深入解析:后向和前向链接算法的实现与应用

内容 - 第一部分 (1/3)&#xff1a; Rust&#xff0c;作为一个旨在提供安全、并行和高性能的系统编程语言&#xff0c;为开发者带来了独特的编程模式和工具。其中&#xff0c;对于数据结构和算法的实现&#xff0c;Rust提供了一套强大的机制。本文将详细介绍如何在Rust中实现后…...

快速提高写作生产力——使用PicGo+Github搭建免费图床,并结合Typora

文章目录 简述PicGo下载PicGo获取Token配置PicGo结合Typora总结 简述PicGo PicGo: 一个用于快速上传图片并获取图片 URL 链接的工具 PicGo 本体支持如下图床&#xff1a; 七牛图床 v1.0腾讯云 COS v4\v5 版本 v1.1 & v1.5.0又拍云 v1.2.0GitHub v1.5.0SM.MS V2 v2.3.0-b…...

Java方法的参数可以有默认值吗?

在日常web开发这种&#xff0c;controller层接受参数时可以通过RequestParam(requiredfalse)设置参数非必填。 所以就想Java的方法可以有非必填这种操作吗&#xff1f;网上搜了一下&#xff0c;发现不支持这种操作。 可以通过方法重载的方式来变相实现。不需要传这个参数就会…...

电子商务的安全防范

(1)安全协议问题&#xff1a;我国大多数尚处在 SSL&#xff08;安全套接层协议&#xff09;的应用上&#xff0c;SET 协议的应用还只是刚刚试验成功&#xff0c;在信息的安全保密体制上还不成熟&#xff0c;对安全协议 还没有全球性的标准和规范&#xff0c;相对制约了国际性…...

STM32开关输入控制220V灯泡亮灭源代码(附带PROTEUSd电路图)

//main.c文件 /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body************************************************************************…...

Spring Boot配置文件

目录 1.配置文件的作用 2.配置文件的格式 3.properties配置文件说明 3.1 properties基本语法 3.2 读取配置文件信息 3.3 properties 缺点分析 4.yml 配置⽂件说明 4.1 yml 基本语法 4.2 yml 使⽤进阶 4.2.1 yml 配置不同数据类型及 null 4.2.2 配置对象 5.propert…...

函数(2)

6. 函数的声明和定义 6.1 函数声明&#xff1a; 1. 告诉编译器有一个函数叫什么&#xff0c;参数是什么&#xff0c;返回类型是什么。但是具体是不是存在&#xff0c;函数 声明决定不了。 2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。 3. 函数的声明一般要放…...

Linux笔试题(4)

67、在局域网络内的某台主机用ping命令测试网络连接时发现网络内部的主机都可以连同,而不能与公网连通,问题可能是__C_ A.主机ip设置有误 B.没有设置连接局域网的网关 C.局域网的网关或主机的网关设置有误 D.局域网DNS服务器设置有误 解析&#xff1a;在局域网络内的某台主…...

Selenium的使用:WEB功能测试

Selenium是ThrougthWorks公司一个强大的开源WEB功能测试工具系列&#xff0c;本系统包括多款软件 Selenium语言简单&#xff0c;用(Command,target,value)三种元素组成一个行为&#xff0c;并且有协助录制脚本工具&#xff0c;但Selenese有一些严格的限制&#xff1a; …...

Kubernetes(K8s)从入门到精通系列之十七:minikube启动K8s dashboard

Kubernetes K8s从入门到精通系列之十七:minikube启动K8s dashboard 一、安装minikube的详细步骤二、查看Pod三、启动dashboard四、创建代理访问dashboard五、远程访问dashboard一、安装minikube的详细步骤 Kubernetes(K8s)从入门到精通系列之十六:linux服务器安装minikube的详…...

C++ 网络编程项目fastDFS分布式文件系统(五)--nginx+fastdfs

目录 1. 文件上传下载流程 2. Nginx和fastDFS的整合 3. 数据库表 3.1 数据库操 3.2 数据库建表 1. 文件上传下载流程 fileID 需要是一个哈希来判定。 2. 文件下载流程 3. 优化 优化思路 : 直接让客户端连接 fastDFS 的存储节点 , 实现文件下载 举例 , 访问一个…...

开发者本地搭建性能监测工具(Windows)

ElasticSearch 8.9.0 开发模式安装 JDK安装 官方提供版本与JDK支持关系&#xff1a;https://www.elastic.co/cn/support/matrix#matrix_jvm 我们安装Elasticsearch 8.9.x&#xff0c;看到支持的最低JDK版本是17。 JDK&#xff08;Windows/Mac含M1/M2 Arm原生JDK&#xff09;…...

嵌入式Linux开发实操(八):UART串口开发

串口可以说是非常好用的一个接口,它同USB、CAN、I2C、SPI等接口一样,为SOC/MCU构建了丰富的接口功能。那么在嵌入式linux中又是如何搭建和使用UART接口的呢? 一、Console接口即ttyS0 ttyS0通常做为u-boot(bootloader的一种,像是Windows的BIOS),它需要一个交互界面,一般…...

公告:微信小程序备案期限官方要求

备案期限要求 1、若微信小程序未上架&#xff0c;自2023年9月1日起&#xff0c;微信小程序须完成备案后才可上架&#xff0c;备案时间1-20日不等&#xff1b; 2、若微信小程序已上架&#xff0c;请于2024年3月31日前完成备案&#xff0c;逾期未完成备案&#xff0c;平台将按照…...

cesium中获取高度的误区

this.ellipsoid viewer.scene.globe.ellipsoid; var cartesian viewer.camera.pickEllipsoid(e.position, this.ellipsoid);if(cartesian){// 苗卡尔椭球体的三维坐标 转 地图坐标&#xff08;弧度&#xff09;var cartographic viewer.scene.globe.ellipsoid.cartesianToCa…...

基于Centos:服务器基础环境安装: JDK、Maven、Python、Go、Docker、K8s

创建用户 useradd dev groupadd op chown -R :op /opt chmod -R 770 /opt usermod -aG op devJDK8 yum install -y java-1.8.0-openjdk-devel echo export JAVA_HOME/usr/lib/jvm/java-1.8.0/>> /etc/profilesource /etc/profileJDK11 yum install -y java-11-openjd…...

Elasticsearch的数据删除策略只能触发一次

在Elasticsearch中&#xff0c;可以使用Index Lifecycle Management&#xff08;ILM&#xff09;来设置删除数据的保留时长。ILM是Elasticsearch的一项功能&#xff0c;用于管理索引的生命周期&#xff0c;包括数据保留、备份、归档等操作。 要设置删除数据的保留时长&#xf…...

Open3D 最小二乘拟合空间直线(方法一)

目录 一、算法原理1、空间直线2、最小二乘法拟合二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、空间直线 x −...

解决uniapp 二次登陆 登录页是首页时,登录页闪现问题

pages.json文件中&#xff0c;pages数组中第一项是登录页&#xff0c;用户第一次登录后&#xff0c;存储登录状态&#xff0c;以后再进入应用时&#xff0c;自动登录跳转至首页。 但是自动登录跳转至首页时&#xff0c;登录页总是会闪现一下。 第一步&#xff1a;manifest.js…...

如何快速制作一个房地产电子传单?

在如今高度数字化的时代&#xff0c;电子传单成为了宣传推广的一种重要方式。下面将介绍如何利用乔拓云平台快速制作一个房地产电子传单。 第一步&#xff0c;找一个可靠的第三方制作平台/工具&#xff0c;比如乔拓云平台。乔拓云平台是一个功能强大、简单易用的电子传单制作工…...

golang云原生项目之:etcd服务注册与发现

服务注册与发现&#xff1a;ETCD 1直接调包 kitex-contrib&#xff1a; 上面有实现的案例&#xff0c;直接cv。下面是具体的理解 2 相关概念 EtcdResolver: etcd resolver是一种DNS解析器&#xff0c;用于将域名转换为etcd集群中的具体地址&#xff0c;以便应用程序可以与et…...

arm:day4

1. 实现三盏灯的点亮 .text .global _start_start: led1初始化函数LED_INIT: 1 通过RCC_AHB4_ENSETR寄存器&#xff0c;设置GPIOE F组控制器使能 0x50000A28[5:4]1ldr r0,0X50000A28ldr r1,[r0]orr r1,r1,#(0X3<<4)str r1,[r0] 2.1 通过GPIOE_MODER寄存器&#xff0c;…...

flutter 常见的状态管理器

flutter 常见的状态管理器 前言一、Provider二、Bloc三、Redux四、GetX总结 前言 当我们构建复杂的移动应用时&#xff0c;有效的状态管理是至关重要的&#xff0c;因为应用的不同部分可能需要共享数据、相应用户交互并保持一致的状态。Flutter 中有多种状态管理解决方案&#…...

Kotlin的Map

在 Kotlin 中&#xff0c;Map 是一种键值对的集合数据结构&#xff0c;用于存储一组关联的键和值。Kotlin 标准库提供了 Map 接口和多种实现类&#xff0c;使得操作和处理键值对数据更加方便。下面详细描述 Kotlin 的 Map 的用法&#xff1a; 创建 Map Kotlin 提供了几种方式…...

STM32 串口复习

按数据通信方式分类&#xff1a; 串行通信&#xff1a;数据逐位按顺序依次传输。传输速率较低&#xff0c;抗干扰能力较强&#xff0c;通信距离较长&#xff0c;I/O资源占用较少&#xff0c;成本较低。并行通信&#xff1a;数据各位通过多条线同时传输。 按数据传输方向分类&…...

VScode替换cmd powershell为git bash 终端,并设置为默认

效果图 步骤 1. 解决VScode缺少git bash的问题_failed to start bash - is git-bash.exe on the syst_Rudon滨海渔村的博客-CSDN博客效果解决步骤找到git安装目录下的/bin/bash.exe&#xff0c;复制其绝对路径&#xff0c;例如D:\Program Files\Git\bin\bash.exe把路径的右斜…...