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。

实验结果

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何声明一个全局变量?有什么注意事项?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 声明全局变量⭐ 注意事项⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏是为那些对Web开发感兴趣、刚…

python+django+mysql高校校园外卖点餐系统--计算机毕设项目

本文的研究目标是以高校校园外卖点餐为对象&#xff0c;使其高校校园外卖点餐为目标&#xff0c;使得高校校园外卖点餐的信息化体系发展水平提高。论文的研究内容包括对个人中心、美食分类管理、用户管理、商家管理、美食信息管理、工作人员管理、安全检查管理、系统管理、订单…

CI/CD入门(二)

CI/CD入门(二) 目录 CI/CD入门(二) 1、代码上线方案 1.1 早期手动部署代码1.2 合理化上线方案1.3 大型企业上线制度和流程1.4 php程序代码上线的具体方案1.5 Java程序代码上线的具体方案1.6 代码上线解决方案注意事项2、理解持续集成、持续交付、持续部署 2.1 持续集成2.2 持续…

移植PeerTalk开源库IOS的USB通信监听服务到QT生成的FFmpeg工程

1.添加生成的PeerTalk库 下图选中部分为FFmpeg依赖库 将USB通信服务的m与h文件添加到工程 因为OC文件使用了弱指针,所以要启用弱指针支持 因为FFmpeg拉流动用到本地网络,所以要在plist文件中启动本地网络使用 设置PeerTalk为嵌入模式 设置Runpath Search Paths为@executable_p…

【Linux操作系统】Linux系统编程中的共享存储映射(mmap)

在Linux系统编程中&#xff0c;进程之间的通信是一项重要的任务。共享存储映射&#xff08;mmap&#xff09;是一种高效的进程通信方式&#xff0c;它允许多个进程共享同一个内存区域&#xff0c;从而实现数据的共享和通信。本文将介绍共享存储映射的概念、原理、使用方法和注意…

Rabbitmq的应用场景

Rabbitmq的应用场景 一、异步处理 场景说明&#xff1a;用户注册后&#xff0c;需要发注册邮件和注册短信,传统的做法有两种 1.串行的方式 2.并行的方式 ​​串行方式​​: 将注册信息写入数据库后,发送注册邮件,再发送注册短信,以上三个任务全部完成后才返回给客户端。 这有…

前端 -- 基础 网页、HTML、 WEB标准 扫盲详解

什么是网页 : 网页是构成网站的基本元素&#xff0c;它通常由 图片、链接、文字、声音、视频等元素组成。 通常我们看到的网页 &#xff0c;常见以 .html 或 .htm 后缀结尾的文件&#xff0c; 因此俗称 HTML 文件 什么是 HTML : HTML 指的是 超文本标记语言&#xff0c…

kafka--kafka基础概念-ISR详解

kafka基础概念-ISR详解 主要是讲 主 往 从同步中的问题 当绿色P1接收到写入的数据&#xff0c;要同步到紫色的P1S1和P1S2 如何保证一致性呢&#xff1f; 使用In Sync Replicas 也就是ISR概念 为什么不一致的&#xff1f; 因为P1S1同步数据 可能花费 50ms P1S2可能花费60ms…

github拉取自己的私有仓库(Token方式、本地秘钥方式)

github拉取自己的私有仓库(Token方式、本地秘钥方式) 问题背景 日常开发和学习过程中&#xff0c;经常碰到需要从GitHub或者其他类似网站&#xff0c;拉取私有仓代码的需求。本文将总结常用的两种方式&#xff0c;Token方式和本地秘钥方式&#xff0c;方便后续查阅和优化。 …

拒绝摆烂!C语言练习打卡第四天

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;每日一练 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、选择题 &#x1f4dd;1.第一题 &#x1f4dd;2.第二题 &#x1f4d…

要跟静音开关说再见了!iPhone15新变革,Action按钮引领方向

有很多传言称iPhone 15 Pro会有很多变化&#xff0c;但其中一个变化可能意味着iPhone体验从第一天起就有的一项功能的终结。我说的是静音开关&#xff0c;它可以让你轻松地打开或关闭iPhone的铃声。 根据越来越多的传言&#xff0c;iPhone 15 Pro和iPhone 15 Pro Max将拆除静音…

FPGA:RS编码仿真过程

FPGA&#xff1a;RS编码仿真过程 RS码是一种纠错性能很强的线性纠错码&#xff0c;能够纠正随机错误和突发错误。RS码是一种多进制BCH码&#xff0c;能够同时纠正多个码元错误。 之前已经记录了在MATLAB中进行rs编解码的过程&#xff0c;现在利用FPGA的IP核实现RS编码的过程&…

vue项目预览pdf功能(解决动态文字无法显示的问题)

最近&#xff0c;因为公司项目需要预览pdf的功能&#xff0c;开始的时候找了市面上的一些pdf插件&#xff0c;都能用&#xff0c;但是&#xff0c;后面因为pdf变成了需要根据内容进行变化的&#xff0c;然后&#xff0c;就出现了需要动态生成的文字不显示了。换了好多好多的插件…

步步向前,曙光已现:百度的大模型之路

大模型&#xff0c;是今年全球科技界最火热&#xff0c;最耀眼的关键词。在几个月的狂飙突进中&#xff0c;全球主要科技公司纷纷加入了大模型领域。中国AI产业更是开启了被戏称为“百模大战”的盛况。 但喧嚣与热闹之后&#xff0c;新的问题也随之而来&#xff1a;大模型的力量…

算法通关村第十关 | 快速排序

1.快速排序的基本过程 快速排序是分治法运用到排序问题的典型例子&#xff0c;基本思想是&#xff1a;通过一个标记pivot元素将n个元素的序列划分为左右两个子序列left和right&#xff0c;其中left中的元素都比pivot小&#xff0c;right的都比pivot的大&#xff0c;然后再次对l…

前端打开后端返回的HTML格式的数据

前端打开后端返回的 HTML格式 的数据&#xff1a; 后端返回的数据格式如下示例&#xff1a; 前端通过 js 方式处理&#xff08;核心代码如下&#xff09; console.log(回调, path); // path 是后端返回的 HTML 格式数据// 必须要存进localstorage&#xff0c;否则会报错&am…

STM32 CubeMX (第四步Freertos内存管理和CPU使用率)

STM32 CubeMX STM32 CubeMX &#xff08;第四步Freertos内存管理和CPU使用率&#xff09; STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1&#xff08;不要选择滴答定时器&#xff1b;滴答定时器留给OS系统做时基&#xff09;使用STM32 CubeMX 库&#xff0c;配置Fr…

面试官:JVM是如何判定对象已死的?学JVM必会的知识!

本文已收录至GitHub&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录 引用计数算法可达性分析算法引用类型Dead Or Alive永久代真的"永久"吗&#xff1f;垃圾收集算法标记-清除算法标记-复制算法标记-整理算法标记-清除 VS 标记-整理 作为一名Java程序员&…

Unity 变量修饰符 之protected ,internal,const , readonly, static

文章目录 protectedinternalconstreadonlystatic protected 当在Unity中使用C#编程时&#xff0c;protected是一种访问修饰符&#xff0c;用于控制类成员&#xff08;字段、方法、属性等&#xff09;的可见性和访问权限。protected修饰的成员可以在当前类内部、派生类&#xf…

Windows上使用FFmpeg实现本地视频推送模拟海康协议rtsp视频流

场景 Nginx搭建RTMP服务器FFmpeg实现海康威视摄像头预览&#xff1a; Nginx搭建RTMP服务器FFmpeg实现海康威视摄像头预览_nginx rtmp 海康摄像头_霸道流氓气质的博客-CSDN博客 上面记录的是使用FFmpeg拉取海康协议摄像头的rtsp流并推流到流媒体服务器。 如果在其它业务场景…