《视觉SLAM十四讲》-- 后端 1(下)

8.2 BA 与图优化

Bundle Adjustment 是指从视觉图像中提炼出最优的 3D 模型和相机参数(内参和外参)。

8.2.1 相机模型和 BA 代价函数

我们从一个世界坐标系中的点 p \boldsymbol{p} p 出发,把相机的内外参数和畸变都考虑进来,最后投影成像素坐标,步骤如下:

(1)世界坐标系转换到相机坐标系

P ′ = R p + t = [ X ′ , Y ′ , Z ′ ] T (8-30) \boldsymbol{P'}=\boldsymbol{Rp}+\boldsymbol{t}=[X',Y',Z']^\mathrm{T} \tag{8-30} P=Rp+t=[X,Y,Z]T(8-30)

(2)将 P ′ \boldsymbol{P'} P 投影至归一化平面,得到归一化坐标

P c = [ u c , v c , 1 ] T = [ X ′ / Z ′ , Y ′ / Z ′ , 1 ] T (8-31) \boldsymbol{P}_c=[u_c, v_c, 1]^{\mathrm{T}}=[X'/Z',Y'/Z', 1]^\mathrm{T} \tag{8-31} Pc=[uc,vc,1]T=[X/Z,Y/Z,1]T(8-31)

(3)去畸变(这里仅考虑径向畸变)

{ u c ′ = u c ( 1 + k 1 r c 2 + k 2 r c 4 ) v c ′ = v c ( 1 + k 1 r c 2 + k 2 r c 4 ) (8-32) \left\{\begin{array}{l} u_{\mathrm{c}}^{\prime}=u_{\mathrm{c}}\left(1+k_{1} r_{\mathrm{c}}^{2}+k_{2} r_{\mathrm{c}}^{4}\right) \\ v_{\mathrm{c}}^{\prime}=v_{\mathrm{c}}\left(1+k_{1} r_{\mathrm{c}}^{2}+k_{2} r_{\mathrm{c}}^{4}\right) \end{array}\right. \tag{8-32} {uc=uc(1+k1rc2+k2rc4)vc=vc(1+k1rc2+k2rc4)(8-32)
(4)根据内参模型,计算像素坐标

{ u s = f x u c ′ + c x v s = f y v c ′ + c y (8-33) \left\{\begin{array}{l} u_{s}=f_{x} u_{\mathrm{c}}^{\prime}+c_{x} \\ v_{s}=f_{y} v_{\mathrm{c}}^{\prime}+c_{y} \end{array}\right. \tag{8-33} {us=fxuc+cxvs=fyvc+cy(8-33)

上面的过程也就是 观测方程,将它抽象的记为

z = h ( x , y ) (8-34) \boldsymbol{z}=h({\boldsymbol{x},\boldsymbol{y}}) \tag{8-34} z=h(x,y)(8-34)

在这里插入图片描述

其中, x \boldsymbol{x} x 是指此时相机的位姿,即 R \boldsymbol{R} R t \boldsymbol{t} t,对应的李群为 T \boldsymbol{T} T,李代数为 ξ \boldsymbol{\xi} ξ;路标 y \boldsymbol{y} y 即三维点 p \boldsymbol{p} p;观测数据 z \boldsymbol{z} z 则是像素坐标。以最小二乘角度考虑,此次观测的误差为:

e = z − h ( T , p ) (8-35) \boldsymbol{e}=\boldsymbol{z}-h(\boldsymbol{T},\boldsymbol{p}) \tag{8-35} e=zh(T,p)(8-35)

把其他时刻的观测都考虑进来,设 z i j \boldsymbol{z}_{ij} zij 为在位姿 T i \boldsymbol{T}_i Ti 处观察路标 p j \boldsymbol{p}_j pj 产生的数据,那么整体的代价函数为

1 2 ∑ i = 1 m ∑ j = 1 n ∥ e i j ∥ 2 = 1 2 ∑ i = 1 m ∑ j = 1 n ∥ z i j − h ( T i , p j ) ∥ 2 (8-36) \frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{n}\|\boldsymbol{e}_{ij}\|^2=\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{n}\|\boldsymbol{z}_{ij}-h(\boldsymbol{T}_i,\boldsymbol{p}_j)\|^2 \tag{8-36} 21i=1mj=1neij2=21i=1mj=1nzijh(Ti,pj)2(8-36)

对这个最小二乘进行求解,相当于对位姿和路标同时进行优化,也就是所谓的 BA。

8.2.2 BA 的求解

容易看出 h ( T , p ) h(\boldsymbol{T},\boldsymbol{p}) h(T,p) 不是线性函数,因此我们希望采用非线性优化的方法求解最优值,所以关键在于梯度 Δ x \Delta \boldsymbol{x} Δx 的求解。

在整体 BA 目标函数上,我们把自变量定义为所有待优化的变量:

x = [ T 1 , T 2 , . . . , T m , p 1 , p 2 , . . . , p n ] T (8-37) \boldsymbol{x}=[\boldsymbol{T}_1,\boldsymbol{T}_2,...,\boldsymbol{T}_m,\boldsymbol{p}_1,\boldsymbol{p}_2,...,\boldsymbol{p}_n]^T \tag{8-37} x=[T1,T2,...,Tm,p1,p2,...,pn]T(8-37)

相应地,增量方程中的 Δ x \Delta \boldsymbol{x} Δx 是对整体自变量的增量。当我们给自变量一个增量时,目标函数变为:

1 2 ∥ f ( x + Δ x ) ∥ 2 ≈ 1 2 ∑ i = 1 m ∑ j = 1 n ∥ e i j + F i j Δ ξ i + E i j Δ ξ j ∥ 2 (8-38) \frac{1}{2}\|f(\boldsymbol{x}+\Delta \boldsymbol{ x})\|^2 \approx \frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{n}\|\boldsymbol{e}_{ij}+\boldsymbol{F}_{ij} \Delta \boldsymbol{\xi}_i+\boldsymbol{E}_{ij}\Delta \boldsymbol{\xi}_j\|^2 \tag{8-38} 21f(x+Δx)221i=1mj=1neij+FijΔξi+EijΔξj2(8-38)

其中, F i j \boldsymbol{F}_{ij} Fij 表示整个代价函数在当前状态下对相机位姿 ξ \boldsymbol{\xi} ξ 的偏导数, E i j \boldsymbol{E}_{ij} Eij 表示整个代价函数在当前状态下路标位置 p \boldsymbol{p} p 的偏导数。

把相机位姿放在一起

x c = [ ξ 1 , ξ 2 , . . . , ξ m ] T ∈ R 6 m (8-39) \boldsymbol{x}_c=[ \boldsymbol{\xi}_1,\boldsymbol{\xi}_2,...,\boldsymbol{\xi}_m]^\mathrm{T} \in \mathbb{R}^{6m} \tag{8-39} xc=[ξ1,ξ2,...,ξm]TR6m(8-39)

把空间点的变量也放在一起:

x p = [ p 1 , p 2 , . . . , p n ] T ∈ R 3 n (8-40) \boldsymbol{x}_p=[ \boldsymbol{p}_1,\boldsymbol{p}_2,...,\boldsymbol{p}_n]^\mathrm{T} \in \mathbb{R}^{3n} \tag{8-40} xp=[p1,p2,...,pn]TR3n(8-40)

那么,式(8-38)可简化为

1 2 ∥ f ( x + Δ x ) ∥ 2 ≈ 1 2 ∥ e + F Δ x c + E Δ x p ∥ 2 (8-41) \frac{1}{2}\|f(\boldsymbol{x}+\Delta \boldsymbol{ x})\|^2 \approx \frac{1}{2}\|\boldsymbol{e}+\boldsymbol{F} \Delta \boldsymbol{x}_c+\boldsymbol{E}\Delta \boldsymbol{x}_p\|^2 \tag{8-41} 21f(x+Δx)221e+FΔxc+EΔxp2(8-41)

上式将二次项之和写成了矩阵形式。这里的雅克比矩阵 F \boldsymbol{F} F E \boldsymbol{E} E 是整体目标函数对整体变量的导数,它是一个很大的矩阵,由每个误差项的导数 F i j \boldsymbol{F}_{ij} Fij E i j \boldsymbol{E}_{ij} Eij 拼凑而成。可以采用高斯牛顿法或 L-M 法,得到增量方程

H Δ x = g (8-42) \boldsymbol{H} \Delta \boldsymbol{x}=\boldsymbol{g} \tag{8-42} HΔx=g(8-42)

为便于表示,我们将变量归类为位姿和空间点两种,则雅克比矩阵分块为

J = [ F E ] (8-43) \boldsymbol{J=[F \quad E]} \tag{8-43} J=[FE](8-43)

以高斯牛顿法为例,则 H \boldsymbol{H} H 矩阵为

H = J T J = [ F T F F T E E T F E T E ] (8-44) \boldsymbol{H}=\boldsymbol{J}^{\mathrm{T}} \boldsymbol{J}=\left[\begin{array}{ll} \boldsymbol{F}^{\mathrm{T}} \boldsymbol{F} & \boldsymbol{F}^{\mathrm{T}} \boldsymbol{E} \\ \boldsymbol{E}^{\mathrm{T}} \boldsymbol{F} & \boldsymbol{E}^{\mathrm{T}} \boldsymbol{E} \end{array}\right] \tag{8-44} H=JTJ=[FTFETFFTEETE](8-44)

但是,这个矩阵的维度非常大,而且直接对 H \boldsymbol{H} H 求逆,复杂度也很高。所以我们需要利用 H \boldsymbol{H} H 矩阵的特殊结构,加速计算过程。

8.2.3 稀疏性和边缘化

(1) H \boldsymbol{H} H 矩阵的稀疏性是由雅克比矩阵 J ( x ) \boldsymbol{J}(\boldsymbol{x}) J(x) 引起的。考虑其中一个 e i j \boldsymbol{e}_{ij} eij,它只描述了相机在 T i \boldsymbol{T}_i Ti 处看到 p j \boldsymbol{p}_j pj这件事,只与第 i i i个位姿和第 j j j 个路标有关,而与其他位姿和路标都无关,因此对其余部分的变量的导数都为零。所以误差 e i j \boldsymbol{e}_{ij} eij 对应的雅克比矩阵为

J i j ( x ) = ( 0 2 × 6 , … 0 2 × 6 , ∂ e i j ∂ T i , 0 2 × 6 , … 0 2 × 3 , … 0 2 × 3 , ∂ e i j ∂ p j , 0 2 × 3 , … 0 2 × 3 ) (8-45) \boldsymbol{J}_{i j}(\boldsymbol{x})=\left(\mathbf{0}_{2 \times 6}, \ldots \boldsymbol{0}_{2 \times 6}, \frac{\partial \boldsymbol{e}_{i j}}{\partial \boldsymbol{T}_{i}}, \mathbf{0}_{2 \times 6}, \ldots \mathbf{0}_{2 \times 3}, \ldots \mathbf{0}_{2 \times 3}, \frac{\partial \boldsymbol{e}_{i j}}{\partial \boldsymbol{p}_{j}}, \mathbf{0}_{2 \times 3}, \ldots \mathbf{0}_{2 \times 3}\right) \tag{8-45} Jij(x)=(02×6,02×6,Tieij,02×6,02×3,02×3,pjeij,02×3,02×3)(8-45)

注意,误差对相机位姿的偏导 ∂ e i j / ∂ ξ i \partial \boldsymbol{e}_{i j} / \partial \boldsymbol{\xi}_{i} eij/ξi 维度为 2 × 6 2\times6 2×6,对路标点的偏导 ∂ e i j / ∂ p j \partial \boldsymbol{e}_{i j} / \partial \boldsymbol{p}_{j} eij/pj维度为 2 × 3 2\times3 2×3

(2)以下图为例,假设 J i j \boldsymbol{J}_{ij} Jij 只在 i i i j j j 处有非零块,那么它对 H \boldsymbol{H} H矩阵的贡献为 J i j T J i j \boldsymbol{J}_{ij}^\mathrm{T}\boldsymbol{J}_{ij} JijTJij J i j T J i j \boldsymbol{J}_{ij}^\mathrm{T}\boldsymbol{J}_{ij} JijTJij 矩阵有 4 个非零块,位于 ( i , i ) (i,i) (i,i) ( i , j ) (i,j) (i,j) ( j , i ) (j,i) (j,i) ( j , j ) (j,j) (j,j)。对整体的 H \boldsymbol{H} H,有

H = ∑ i , j J i j T J i j (8-46) \boldsymbol{H}=\sum_{i,j}\boldsymbol{J}_{ij}^\mathrm{T}\boldsymbol{J}_{ij} \tag{8-46} H=i,jJijTJij(8-46)

在这里插入图片描述

H \boldsymbol{H} H 矩阵分块

H = [ H 11 H 12 H 21 H 22 ] (8-47) \boldsymbol{H}=\left[\begin{array}{ll} \boldsymbol{H}_{11} & \boldsymbol{H}_{12} \\ \boldsymbol{H}_{21} & \boldsymbol{H}_{22} \end{array}\right] \tag{8-47} H=[H11H21H12H22](8-47)

结合式(8-44)可知, H 11 \boldsymbol{H}_{11} H11 只和相机位姿有关, H 22 \boldsymbol{H}_{22} H22 只和路标点有关。当遍历矩阵 H \boldsymbol{H} H时,总有:

H 11 \boldsymbol{H}_{11} H11 是对角矩阵,且只在 H i i \boldsymbol{H}_{ii} Hii 处有非零块;

H 22 \boldsymbol{H}_{22} H22 也是对角矩阵,且只在 H j j \boldsymbol{H}_{jj} Hjj处有非零块;

H 12 \boldsymbol{H}_{12} H12 H 21 \boldsymbol{H}_{21} H21 可能是稀疏的,也可能是稠密的,视具体观测数据而定。

(3)以下图为例

在这里插入图片描述

假设一个场景内,有 2 个相机位姿( C 1 \boldsymbol{C}_1 C1 C 2 \boldsymbol{C}_2 C2)和 6 个路标点( P 1 \boldsymbol{P}_1 P1 P 2 \boldsymbol{P}_2 P2 P 3 \boldsymbol{P}_3 P3 P 4 \boldsymbol{P}_4 P4 P 5 \boldsymbol{P}_5 P5 P 6 \boldsymbol{P}_6 P6),这些相机位姿和路标点所对应的变量为 T i , i = 1 , 2 \boldsymbol{T}_{i}, i=1,2 Ti,i=1,2 p j , j = 1 , 2 \boldsymbol{p}_{j}, j=1,2 pj,j=1,2。可以推出,此场景下的 BA 目标函数为:

1 2 ( ∥ e 11 ∥ 2 + ∥ e 12 ∥ 2 + ∥ e 13 ∥ 2 + ∥ e 14 ∥ 2 + ∥ e 23 ∥ 2 + ∥ e 24 ∥ 2 + ∥ e 25 ∥ 2 + ∥ e 26 ∥ 2 ) (8-48) \frac{1}{2}\left(\left\|e_{11}\right\|^{2}+\left\|e_{12}\right\|^{2}+\left\|e_{13}\right\|^{2}+\left\|e_{14}\right\|^{2}+\left\|e_{23}\right\|^{2}+\left\|e_{24}\right\|^{2}+\left\|e_{25}\right\|^{2}+\left\|e_{26}\right\|^{2}\right) \tag{8-48} 21(e112+e122+e132+e142+e232+e242+e252+e262)(8-48)

J 11 \boldsymbol{J}_{11} J11 e 11 \boldsymbol{e}_{11} e11 对应的雅克比矩阵,且 e 11 \boldsymbol{e}_{11} e11 对其他相机变量和路标点的偏导都为零。我们把所有变量以 x = ( ξ 1 , ξ 2 , p 1 , ⋯ , p 6 ) T \boldsymbol{x}=\left(\boldsymbol{\xi}_{1}, \boldsymbol{\xi}_{2}, \boldsymbol{p}_{1}, \cdots, \boldsymbol{p}_{6}\right)^{\mathrm{T}} x=(ξ1,ξ2,p1,,p6)T 的顺序摆放,则有

J 11 = ∂ e 11 ∂ x = ( ∂ e 11 ∂ ξ 1 , 0 2 × 6 , ∂ e 11 ∂ p 1 , 0 2 × 3 , 0 2 × 3 , 0 2 × 3 , 0 2 × 3 , 0 2 × 3 ) (8-49) \boldsymbol{J}_{11}=\frac{\partial \boldsymbol{e}_{11}}{\partial \boldsymbol{x}}=\left(\frac{\partial \boldsymbol{e}_{11}}{\partial \boldsymbol{\xi}_{1}}, \mathbf{0}_{2 \times 6}, \frac{\partial \boldsymbol{e}_{11}}{\partial \boldsymbol{p}_{1}}, \mathbf{0}_{2 \times 3}, \mathbf{0}_{2 \times 3}, \mathbf{0}_{2 \times 3}, \mathbf{0}_{2 \times 3}, \mathbf{0}_{2 \times 3}\right) \tag{8-49} J11=xe11=(ξ1e11,02×6,p1e11,02×3,02×3,02×3,02×3,02×3)(8-49)

我们用下图直观地表示雅克比矩阵的稀疏性:

在这里插入图片描述

由此,可以得到整体雅克比矩阵 J \boldsymbol{J} J H \boldsymbol{H} H矩阵。

在这里插入图片描述

H \boldsymbol{H} H 矩阵中非对角部分的非零矩阵块(长方形块)可理解为其对应的两个变量之间的关系。

在这里插入图片描述

更一般地,假设有 m m m 个相机位姿, n n n个路标点,且通常路标点的数量远多于相机,即 n ≫ m n \gg m nm。这种情况下的 H \boldsymbol{H} H 矩阵如下图所示,左上角块非常小,右下对角块很大,由于形状很像箭头,又称为箭头形矩阵。

在这里插入图片描述

(4)将 H \boldsymbol{H} H 矩阵划分为四个区域,不难看出,左上角为对角块矩阵,且每个对角块元素的维度与相机位姿维度相同,同样的,右下角也是对角块矩阵,且每个对角块元素的维度与路标点维度相同。而且这四个区域和式(8-44)中的矩阵块是对应的。

在这里插入图片描述

那么,增量方程 H Δ x = g \boldsymbol{H} \Delta\boldsymbol{x}=\boldsymbol{g} HΔx=g 可写为以下形式

[ B E E T C ] [ Δ x c Δ x p ] = [ v w ] (8-50) \left[\begin{array}{cc} \boldsymbol{B} & \boldsymbol{E} \\ \boldsymbol{E}^{\mathrm{T}} & \boldsymbol{C} \end{array}\right]\left[\begin{array}{l} \Delta \boldsymbol{x}_{\mathrm{c}} \\ \Delta \boldsymbol{x}_{p} \end{array}\right]=\left[\begin{array}{l} \boldsymbol{v} \\ \boldsymbol{w} \end{array}\right] \tag{8-50} [BETEC][ΔxcΔxp]=[vw](8-50)

对角块矩阵求逆的难度远小于一般矩阵的求逆难度,所以只需要对对角块矩阵分别求逆即可。对线性方程组进行高斯消元,得

[ I − E C − 1 0 I ] [ B E E T C ] [ Δ x c Δ x p ] = [ I − E C − 1 0 I ] [ v w ] (8-51) \left[\begin{array}{cc} \boldsymbol{I} & -\boldsymbol{E} \boldsymbol{C}^{-1} \\ \mathbf{0} & \boldsymbol{I} \end{array}\right]\left[\begin{array}{cc} \boldsymbol{B} & \boldsymbol{E} \\ \boldsymbol{E}^{\mathrm{T}} & C \end{array}\right]\left[\begin{array}{l} \Delta \boldsymbol{x}_{\mathrm{c}} \\ \Delta \boldsymbol{x}_{p} \end{array}\right]=\left[\begin{array}{cc} \boldsymbol{I} & -\boldsymbol{E} \boldsymbol{C}^{-1} \\ 0 & \boldsymbol{I} \end{array}\right]\left[\begin{array}{l} \boldsymbol{v} \\ \boldsymbol{w} \end{array}\right] \tag{8-51} [I0EC1I][BETEC][ΔxcΔxp]=[I0EC1I][vw](8-51)

整理,得

[ B − E C − 1 E T 0 E T C ] [ Δ x c Δ x p ] = [ v − E C − 1 w w ] (8-52) \left[\begin{array}{cc} \boldsymbol{B}-\boldsymbol{E} \boldsymbol{C}^{-1}\boldsymbol{E}^{\mathrm{T}} & \boldsymbol{0} \\ \boldsymbol{E}^{\mathrm{T}} & \boldsymbol{C} \end{array}\right]\left[\begin{array}{l} \Delta \boldsymbol{x}_{\mathrm{c}} \\ \Delta \boldsymbol{x}_{p} \end{array}\right]=\left[\begin{array}{c} \boldsymbol{v}-\boldsymbol{E} \boldsymbol{C}^{-1} \boldsymbol{w} \\ \boldsymbol{w} \end{array}\right] \tag{8-52} [BEC1ETET0C][ΔxcΔxp]=[vEC1ww](8-52)

可以看出,方程第一行只和 Δ x c \Delta \boldsymbol{x}_c Δxc 有关,我们可以先将 Δ x c \Delta \boldsymbol{x}_c Δxc 解出来:

( B − E C − 1 E T ) Δ x c = v − E C − 1 w (8-53) (\boldsymbol{B}-\boldsymbol{E} \boldsymbol{C}^{-1}\boldsymbol{E}^{\mathrm{T}})\Delta \boldsymbol{x}_c=\boldsymbol{v}-\boldsymbol{E} \boldsymbol{C}^{-1} \boldsymbol{w} \tag{8-53} (BEC1ET)Δxc=vEC1w(8-53)

Δ x c \Delta \boldsymbol{x}_c Δxc 解出来后,再将其代入第二行方程,从而将 Δ x p \Delta \boldsymbol{x}_p Δxp 求解出来。这个过程称为 Schur (舒尔)消元。相较于直接求解的方法,它的优势在于:

① 消元过程中, C \boldsymbol{C} C 为对角块,故 C − 1 \boldsymbol{C}^{-1} C1 容易求出;

Δ x c \Delta \boldsymbol{x}_c Δxc 解出来后,根据 Δ x p = C − 1 ( w − E T Δ x c ) \Delta \boldsymbol{x}_{p}=\boldsymbol{C}^{-1}\left(\boldsymbol{w}-\boldsymbol{E}^{\mathrm{T}} \Delta \boldsymbol{x}_{\mathrm{c}}\right) Δxp=C1(wETΔxc) 解出路标的增量方程。

(5)从概率角度来看,我们称这一步为 边缘化。我们将求解 ( Δ x c , Δ x p ) (\Delta \boldsymbol{x}_c,\Delta \boldsymbol{x}_p) (ΔxcΔxp) 的问题,转化成了先固定 Δ x p \Delta \boldsymbol{x}_p Δxp,求出 Δ x c \Delta \boldsymbol{x}_c Δxc,再求 Δ x p \Delta \boldsymbol{x}_p Δxp 的过程。这相当于做了条件概率展开:

P ( x c , x p ) = P ( x c ∣ x p ) P ( x p ) (8-54) P(\boldsymbol{x}_c,\boldsymbol{x}_p)=P( \boldsymbol{x}_c | \boldsymbol{x}_p)P(\boldsymbol{x}_p) \tag{8-54} P(xc,xp)=P(xcxp)P(xp)(8-54)

8.2.4 鲁棒核函数

在前面的 BA 问题中,我们将最小化误差项的二范数平方和作为目标函数,这样虽然直观,但是如果出现误匹配,该误差项会很大,从而将对整体函数产生较大影响,进而影响最终优化结果。

对此,我们将原先误差的二范数度量替换成一个增长没那么快的函数,同时保证光滑性质,使得优化结果更加稳健(减小误匹配项的影响),这样的函数称为 鲁棒核函数。鲁棒核函数有很多种,如 Huber 核:

H ( e ) = { 1 2 e 2 当  ∣ e ∣ ⩽ δ , δ ( ∣ e ∣ − 1 2 δ ) 其他  (8-55) H(e)= \begin{cases}\frac{1}{2} e^{2} & \text { 当 }|e| \leqslant \delta, \\ \delta\left(|e|-\frac{1}{2} \delta\right) & \text { 其他 }\end{cases} \tag{8-55} H(e)={21e2δ(e21δ)  eδ, 其他 (8-55)

当误差 e e e 大于阈值 δ \delta δ 时,函数增长由二次形式转为一次形式,相当于限制了梯度的最大值。同时 Huber 核函数又是光滑的,可以很方便的求导。如下图,在误差较大时,Huber 核函数增长明显低于二次函数。
在这里插入图片描述

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

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

相关文章

C语言从入门到精通之【char类型】

char类型用于储存字符(如,字母或标点符号),但是从技术层面看,char是整数类型。因为char类型实际上储存的是整数而不是字符。计算机使用数字编码来处理字符,即用特定的整数表示特定的字符。 char类型占1个字…

wx.canvasToTempFilePath生成图片保存到相册

微信小程序保存当前画布指定区域的内容导出生成指定大小的图片&#xff0c;记录一下 api&#xff1a;wx.canvasToTempFilePath 效果&#xff1a; 代码&#xff1a;wxml <canvas style"width: {{screenWidth}}px; height: {{canvasHeight}}px;" canvas-id"my…

NewStarCTF2023 Week3 Reverse方向 题目STL WP

分析 代码不多&#xff0c;逻辑挺清楚的。 先用Z3解出V7&#xff1a; from z3 import *s Solver() v1, v2, v3, v4, v5, v6 BitVecs(v1 v2 v3 v4 v5 v6, 32) v7, v8, v9, v10, v11 BitVecs(v7 v8 v9 v10 v11, 32)s.add((v1 << 15) ^ v1 0x2882D802120E) s.add((v2 …

借助拧紧曲线高效管理螺栓装配防错——SunTorque智能扭矩系统

拧紧曲线作为拧紧质量的“晴雨表”&#xff0c;在拧紧过程中&#xff0c;能够实时探知到拧紧状态是否存在异常&#xff0c;并根据曲线特质推测出拧紧过程中遇到了什么样的问题&#xff0c;今天SunTorque智能扭矩系统带您了解拧紧曲线在螺栓装配防错管理中如何发挥作用。 合格的…

搭建知识付费系统的最佳实践是什么

在数字化时代&#xff0c;搭建一个高效且用户友好的知识付费系统是许多创业者和内容创作者追求的目标。本文将介绍一些搭建知识付费系统的最佳实践&#xff0c;同时提供一些基本的技术代码示例&#xff0c;以帮助你快速入门。 1. 选择合适的技术栈&#xff1a; 搭建知识付费…

论文阅读:YOLOV: Making Still Image Object Detectors Great at Video Object Detection

发表时间&#xff1a;2023年3月5日 论文地址&#xff1a;https://arxiv.org/abs/2208.09686 项目地址&#xff1a;https://github.com/YuHengsss/YOLOV 视频物体检测&#xff08;VID&#xff09;具有挑战性&#xff0c;因为物体外观的高度变化以及一些帧的不同恶化。有利的信息…

GitHub Universe 2023:AI 技术引领软件开发创新浪潮

GitHub 是全球领先的软件开发和协作平台&#xff0c;数百万开发者和企业在此分享、学习和创建卓越的软件。同时 GitHub 处在 AI 技术前沿&#xff0c;通过其先进的 AI 技术增强开发者体验并赋能未来软件开发的使命。在今天的文章中&#xff0c;我们将一起看看在 GitHub 年度大会…

Python---数据序列类型之间的相互转换

list()方法&#xff1a;把某个序列类型的数据转化为列表 # 1、定义元组类型的序列 tuple1 (10, 20, 30) print(list(tuple1))# 2、定义一个集合类型的序列 set1 {a, b, c, d} print(list(set1))# 3、定义一个字典 dict1 {name:刘备, age:18, address:蜀中} print(list(dict1…

沉浸式航天vr科普馆VR太空主题馆展示

科普教育从小做起&#xff0c;现在我们的很多地方小孩子游乐体验不单单只有草坪玩耍体验&#xff0c;还有很多科普知识的体验馆和游玩馆。虽然现在我们还不能真实的上太空或者潜入海底&#xff0c;但是这些现在已经可以逼真的展示在我们面前。通过一种虚拟现实技术手段。人们带…

PON网络是什么

上节介绍到PON网络概念&#xff0c;PON网络具备节省局端光缆资源、避免故障点的同时&#xff0c;还具备拥有更远的传输距离、更高的带宽以及分光特性&#xff08;P2MP&#xff09;的优势。 PON&#xff08;无源光纤网络&#xff0c;Passive Optical Network&#xff09;网络&am…

基于单片机的智能家居安保系统(论文+源码)

1.系统设计 本次基于单片机的智能家居安保系统设计&#xff0c;在功能上如下&#xff1a; 1&#xff09;以51单片机为系统控制核心&#xff1b; 2&#xff09;温度传感器、人体红外静释电、烟雾传感器来实现检测目的&#xff1b; 3&#xff09;以GSM模块辅以按键来实现远/近程…

【阿里云】函数计算 X 通义千问快速部署

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

从能用到好用,国产CPU不是你想象中的样子了?

最近看到了挺多关于国产CPU的评测视频&#xff0c;主要测试了鲲鹏、飞腾、海光、龙芯这四家。作为信创从业者&#xff0c;也想结合日常工作中接触到的国产CPU使用体验&#xff0c;发表些自己的看法。 我看到的评测&#xff0c;主要是采用SPEC CPU2006进行横向对比。SPEC CPU20…

掌握这个技巧,你也能成为资产管理高手!

资产管理是企业管理中至关重要的一环&#xff0c;涉及到对公司财务、物资和信息等各个方面的有效监控和管理。 随着企业规模的扩大和业务复杂性的增加&#xff0c;采用先进的资产管理系统成为确保企业高效运营的必要条件之一。 客户案例 医疗机构 温州某医疗机构拥有大量的医…

电子学会C/C++编程等级考试2021年03月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:药房管理 随着信息技术的蓬勃发展,医疗信息化已经成为医院建设中必不可少的一部分。计算机可以很好地辅助医院管理医生信息、病人信息、药品信息等海量数据,使工作人员能够从这些机械的工作中解放出来,将更多精力投入真正的医…

docker安装MongoDB数据库,并且进行密码配置

很美的一首小诗> 我在外面流浪&#xff0c;回来时 故乡瘦了一圈—— 墩子叔走了&#xff0c;门前的池水 干了一半。 屋后驼背的柳树 头发散落了一地&#xff0c; 老房子蹲在坟边&#xff0c;屋顶的白云 仍在风中奔跑。 安装配置 要在Docker中安装MongoDB并启用远程连接&…

CDP体系化建设1-CDP综述

前言 从CRM到DMP&#xff0c;再到CDP的横空出世&#xff0c;数据产品领域推陈出新的速度也挺快的。 而了解CDP的人可能会说&#xff0c;CDP和BI一样&#xff0c;糅杂了太多东西&#xff0c;都不知道如何概括。 在我看来&#xff0c;CDP也是一个看似简单&#xff0c;但是需要借助…

如何使用Imagewheel+内网穿透搭建私人图床实现公网访问

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

使用 Redis 构建轻量的向量数据库应用:图片搜索引擎(一)

本篇文章聊聊更轻量的向量数据库方案&#xff1a;Redis。 以及基于 Redis 来快速实现一个高性能的本地图片搜索引擎&#xff0c;在本地环境中&#xff0c;使用最慢的稠密向量检索方式来在一张万图片中查找你想要的图片&#xff0c;总花费时间都不到十分之一秒。 写在前面 接着…

VS Code如何使用服务器的Python开发环境

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…