本文是CSK与KCF算法推导的第三篇,主要介绍算法的主体部分推导。

  • CSK与KCF算法推导(一)——DFT、相关运算和循环卷积
  • CSK与KCF算法推导(二)——带核函数的岭回归问题求解
  • (本文)CSK与KCF算法推导(三)——算法主体部分推导
  • CSK与KCF算法推导(四)——从一维推广到二维
  • CSK与KCF算法推导(五)——具体实现细节
  • CSK与KCF算法推导(六)——HOG特征提取与多通道计算

循环矩阵

  循环矩阵从CSK的文章里就提出了,概念也很容易理解。一个样本xxx,可以通过循环移位生成不同的向量,组合成一个矩阵C(x)C(x)C(x)。下面的图里分别列出了xxx、C(x)C(x)C(x)和C(x)C(x)C(x)的转置。

  循环矩阵C(x)C(x)C(x)和另一个列向量zzz相乘,得到的结果就是xxx和zzz进行相关运算的结果。这个也很好理解,就是xxx在zzz上面滑动,然后进行乘加运算。同样可以写出循环卷积的矩阵表达式,循环卷积需要先将xxx倒序,然后再滑动。对比循环卷积所用的矩阵和(C(x))T(C(x))^T(C(x))T的颜色,可以发现它们俩是一样的!

  循环矩阵C(x)C(x)C(x)既然能和循环卷积联系起来了,那么自然可以想到把DFT矩阵也联系起来。这就能得出一个重要的结论:循环矩阵C(x)C(x)C(x)能够用DFT矩阵对角化!
  下面是证明过程。先根据时域卷积等于频域乘积写出等式:
(C(x))Tz=x∗z=F−1(x^⊙z^){\left( {C(x)} \right)^T}z = x*z = {{\mathcal F}^{ - 1}}(\hat x \odot \hat z)(C(x))Tz=x∗z=F−1(x^⊙z^)
  其中“⊙\odot⊙”是哈达玛积(Hadamard product),或者称为“element-wise product”,表示两个向量对应位置的分量直接相乘。x^\hat xx^和z^\hat zz^分别表示xxx和zzzDFT变换之后的序列。
(C(x))Tz=1sFH(x^⊙Fz)=1sFHdiag(x^)Fz{\left( {C(x)} \right)^T}z = \frac{1}{s}{F^H}(\hat x \odot Fz) = \frac{1}{s}{F^H}diag(\hat x)Fz(C(x))Tz=s1​FH(x^⊙Fz)=s1​FHdiag(x^)Fz
  两个列向量的哈达玛积可以转换成对角矩阵和列向量相乘。diag(x^)diag(\hat x)diag(x^)表示把x^\hat xx^放到对角线上形成对角矩阵。因为上式对所有的zzz都成立,所以可以去掉zzz,得到:
(C(x))T=1sFHdiag(x^)FC(x)=(1sFT)diag(x^)(1sF∗)\begin{array}{l} {\left( {C(x)} \right)^T} = \frac{1}{s}{F^H}diag(\hat x)F\\ C(x) = \left( {\frac{1}{{\sqrt s }}{F^T}} \right)diag(\hat x)\left( {\frac{1}{{\sqrt s }}{F^*}} \right) \end{array}(C(x))T=s1​FHdiag(x^)FC(x)=(s​1​FT)diag(x^)(s​1​F∗)​
  又因为F=FTF=F^TF=FT,且U=1sFU={\frac{1}{{\sqrt s }}F}U=s​1​F是酉矩阵。C(x)C(x)C(x)可以进一步表示为:
C(x)=Udiag(x^)U∗C(x) = Udiag(\hat x){U^*}C(x)=Udiag(x^)U∗
  这个结论就非常厉害了。所有循环矩阵都可以特征分解,特征值是原始序列的DFT;所有循环矩阵的特征向量都相同。这就为后面的运算带来了很大的便利。
  上面的推导是从循环卷积的角度出发的,而我在第一篇文章中还写了相关运算与DFT的关系。

  这里的相关运算相当于是xxx相对于zzz在向右滑动,所以xxx的DFT结果需要取复共轭,可以这样表示结果:
C(x)z=x⋆z=F−1(x^∗⊙z^){{C(x)z = x}} \star z = {{\mathcal F}^{ - 1}}({{\hat x}^*} \odot \hat z)C(x)z=x⋆z=F−1(x^∗⊙z^)
  其中⋆\star⋆表示相关运算,经过类似的推导之后可以得到:
C(x)=U∗diag(x^∗)UC(x) = U^*diag(\hat x^*){U}C(x)=U∗diag(x^∗)U

循环移位的意义

  一方面原因已经在上面推导,循环矩阵能够用DFT对角化。另一方面要清楚输入样本xxx并不都是我们关心的目标。我们关心的Target只有其中的一部分,就如下面的图所示。

  这么做就能够在训练的时候为我们关心的Target提供一些上下文(context)信息。xxx在循环移位的过程中确实起到了“密集采样”的作用。

生成标签

  在生成标签的时候我们可以给原始样本xxx一个较大的标签值,其他由循环移位产生的样本给较小的标签值,相对位移越大,标签值越小。

  因为是循环移位,所以移位越接近一个周期,这个样本越接近正样本。所以样本的标签值是一个峰值在两侧的高斯函数。

训练(不带核函数)

  样本训练还是用的岭回归。结合第二篇文章,虽然在引入核函数之后,我们就不关心ω\omegaω是多少了,但在没有引入核函数的时候,能求出ω\omegaω自然更好。
ω=(XTX+λI)−1XTy\omega = {\left( {X^TX + \lambda I} \right)^{ - 1}}X^Tyω=(XTX+λI)−1XTy
  只需要将样本矩阵XXX替换成C(x)C(x)C(x)即可。上面的表达式里用的是转置而不是共轭转置,因为我们前面的推导是在实数的条件下得到的,因为这对于我们分析问题来说已经足够了。
  有人可能会担心,C(x)C(x)C(x)分解之后的三个矩阵都是复矩阵,这里是不是应该用共轭转置啊?要用共轭转置很简单,把前面岭回归的推导用共轭转置推导一遍就行,这里的转置是可以推广到共轭转置的。但其实也可以就只用转置,因为这里的C(x)C(x)C(x)本质上还是实数矩阵,转置是能够成立的。我们已经在前面已经有两个关于C(x)C(x)C(x)的分解了,可以都用来帮助化简。把X=C(x)X=C(x)X=C(x)代入:
ω=(UTdiag(x^∗)UHUdiag(x^)U∗+λI)−1UTdiag(x^∗)UHy\omega = {\left( {{U^T}diag({{\hat x}^*}){U^H}Udiag(\hat x){U^*} + \lambda I} \right)^{ - 1}}{U^T}diag({{\hat x}^*}){U^H}yω=(UTdiag(x^∗)UHUdiag(x^)U∗+λI)−1UTdiag(x^∗)UHy
  把握几个关键点,UHU=UUH=U∗U=UU∗=IU^HU=UU^H=U^*U=UU^*=IUHU=UUH=U∗U=UU∗=I;对角矩阵相乘就是对角线上元素的对应相乘;对角矩阵转置就是对角线上元素求倒数;(ABC)−1=C−1B−1C−1(ABC)^{-1}=C^{-1}B^{-1}C^{-1}(ABC)−1=C−1B−1C−1;Ux=x^/sUx=\hat x/\sqrt sUx=x^/s​;U∗x=x^∗/sU^*x=\hat x^*/\sqrt sU∗x=x^∗/s​。
ω=(UTdiag(x^∗)UHUdiag(x^)U∗+λI)−1UTdiag(x^∗)UHy=Udiag(1x^∗⊙x^+λ)U∗Udiag(x^∗)U∗y=Udiag(x^∗x^∗⊙x^+λ)U∗y\begin{array}{l} \omega = {\left( {{U^T}diag({{\hat x}^*}){U^H}Udiag(\hat x){U^*} + \lambda I} \right)^{ - 1}}{U^T}diag({{\hat x}^*}){U^H}y\\ \ \ \ \ = Udiag\left( {\frac{1}{{{{\hat x}^*} \odot \hat x + \lambda }}} \right){U^*}Udiag({{\hat x}^*}){U^*}y\\ \ \ \ \ = Udiag\left( {\frac{{{{\hat x}^*}}}{{{{\hat x}^*} \odot \hat x + \lambda }}} \right){U^*}y \end{array}ω=(UTdiag(x^∗)UHUdiag(x^)U∗+λI)−1UTdiag(x^∗)UHy    =Udiag(x^∗⊙x^+λ1​)U∗Udiag(x^∗)U∗y    =Udiag(x^∗⊙x^+λx^∗​)U∗y​
  这里diagdiagdiag里面的计算都是element-wise的。
U∗ω=diag(x^∗x^∗⊙x^+λ)U∗y{U^*}\omega = diag\left( {\frac{{{{\hat x}^*}}}{{{{\hat x}^*} \odot \hat x + \lambda }}} \right){U^*}yU∗ω=diag(x^∗⊙x^+λx^∗​)U∗y
ω^∗=x^∗⊙y^∗x^∗⊙x^+λ{{\hat \omega }^*} = \frac{{{{\hat x}^*} \odot {{\hat y}^*}}}{{{{\hat x}^*} \odot \hat x + \lambda }}ω^∗=x^∗⊙x^+λx^∗⊙y^​∗​
  最后的化简结果如下。相比于原先复杂的矩阵运算,现在只需要少量DFT、IDFT和element-wise的运算即可。
ω^=x^⊙y^x^∗⊙x^+λ\hat \omega = \frac{{\hat x \odot \hat y}}{{{{\hat x}^*} \odot \hat x + \lambda }}ω^=x^∗⊙x^+λx^⊙y^​​
  这个地方的推导也是知乎上有人提出推导有误的地方。原文中的结果里面分子的x^\hat xx^多了复共轭,因为在原文的公式(55)处落下了一个复共轭。而这部分结果作者也没有用到具体算法中,所以对算法没有影响。

训练(带核函数)

  带核函数的情况下,我们就不用求ω\omegaω了,只要求中间变量α\alphaα就好了。
α=(K+λI)−1y\alpha = {\left( {K + \lambda I} \right)^{ - 1}}yα=(K+λI)−1y
  计算Gram矩阵

  逐行观察上面的矩阵乘法,就看前两行就行。可以发现这两行的结果也是一个相对移位的关系。所以当样本矩阵是循环矩阵的时候,这一组样本的Gram矩阵也会是循环矩阵。而循环的基向量就是Gram矩阵的第一行。KKK是高维空间的Gram矩阵,这一结论自然也成立,KKK也是一个循环矩阵。
K=C(kxx)kxx=[κ(x,P0x)κ(x,P1x)κ(x,P2x)⋯κ(x,Pnx)]K = C({k^{xx}})\;\;\;\;{k^{xx}} = \left[ {\begin{matrix} {\kappa (x,P^0x)}&{\kappa (x,P^1x)}&{\kappa (x,P^2x)}& \cdots &{\kappa (x,P^nx)} \end{matrix}} \right]K=C(kxx)kxx=[κ(x,P0x)​κ(x,P1x)​κ(x,P2x)​⋯​κ(x,Pnx)​]
  这里的PPP矩阵的作用是让列向量φ(x)\varphi(x)φ(x)循环移位。比如P0P^0P0是不移位,P1P^1P1是循环移位1次,P2P^2P2是循环移位2次,以此类推。
α=(C(kxx)+λI)−1y=(Udiag(k^xx)U∗+λI)−1y\alpha = {\left( {C({k^{xx}}) + \lambda I} \right)^{ - 1}}y = {\left( {Udiag({{\hat k}^{xx}}){U^*} + \lambda I} \right)^{ - 1}}yα=(C(kxx)+λI)−1y=(Udiag(k^xx)U∗+λI)−1y
U∗α=diag(1k^xx+λ)U∗y{U^*}\alpha = diag\left( {\frac{1}{{{{\hat k}^{xx}} + \lambda }}} \right){U^*}yU∗α=diag(k^xx+λ1​)U∗y
α^∗=y^∗k^xx+λ\hat \alpha^* = \frac{{\hat y^*}}{{{{\hat k}^{xx}} + \lambda }}α^∗=k^xx+λy^​∗​
  用循环矩阵的形式表示KKK,然后特征分解,利用对角矩阵和酉矩阵的特性即可完成上面的化简。这时候计算量相对比较大的地方就是求kxxk^{xx}kxx了,它是向量xxx和xxx的循环移位的向量在高维空间的内积构成的向量。
  然后对上面的等式两边取复共轭,就可以得到:
α^=y^k^xx∗+λ\hat \alpha = \frac{{\hat y}}{{{{{\hat k}^{xx}}^*} + \lambda }}α^=k^xx∗+λy^​​
  但这和论文里的结论不一样,论文里的结论,分母的k^xx{\hat k }^{xx}k^xx没有取复共轭。但实际上这里取复共轭或者不取复共轭都行,因为k^xx{\hat k }^{xx}k^xx是实数。
  什么样的实数序列做DFT之后还能是实数?观察旋转因子WNknW_N^{kn}WNkn​,旋转因子在复平面上的分布就是有对称性的,当实数序列满足一定条件之后,虚部就能够抵消。

  观察可以发现,只要序列满足x[i]=x[N−i]i=1,2,...,N−1x[i] = x[N-i]\ \ \ i=1,2,...,N-1x[i]=x[N−i]   i=1,2,...,N−1这个条件,这些旋转因子的虚部就都能够被抵消。对于二维的图像来说,就是我们不关心它的第0行和第0列,第0行和第0列可以是任意实数,然后剩余的数据是中心对称的就可以。
  序列xxx的自相关kxxk^{xx}kxx自然就满足这一条件。所以更一般的结果还可以是:
α^=y^real(k^xx)+λ\hat \alpha = \frac{{\hat y}}{{{real({{\hat k}^{xx}})} + \lambda }}α^=real(k^xx)+λy^​​
  我们还可以让结果更简单,就是如果yyy给定的标签同样满足上面的条件,那么y^\hat yy^​就也是一个实数。这样整个α^\hat \alphaα^也是实数了!!
α^=real(y^)real(k^xx)+λ\hat \alpha = \frac{real({\hat y})}{{{real({{\hat k}^{xx}})} + \lambda }}α^=real(k^xx)+λreal(y^​)​
  通过上面的计算,我们还可以想到一个结论,K=C(kxx)K = C({k^{xx}})K=C(kxx)不光是一个循环矩阵,也还是一个对称矩阵,K=KTK=K^TK=KT。结合这一结论我们可以重新进行一次推导:
α=(KT+λI)−1y\alpha = {\left( {{K^T} + \lambda I} \right)^{ - 1}}yα=(KT+λI)−1y
α=(C(kxx)T+λI)−1y=(U∗diag(k^xx)U+λI)−1y\alpha = {\left( {C({k^{xx}})^T + \lambda I} \right)^{ - 1}}y = {\left( {U^*diag({{\hat k}^{xx}}){U} + \lambda I} \right)^{ - 1}}yα=(C(kxx)T+λI)−1y=(U∗diag(k^xx)U+λI)−1y
Uα=diag(1k^xx+λ)Uy{U}\alpha = diag\left( {\frac{1}{{{{\hat k}^{xx}} + \lambda }}} \right){U}yUα=diag(k^xx+λ1​)Uy
α^=y^k^xx+λ\hat \alpha = \frac{{\hat y}}{{{{\hat k}^{xx}} + \lambda }}α^=k^xx+λy^​​
  这样就能直接得到论文中给出的结论。

带核函数的检测

  检测就是我们的训练完成之后送进一个新的样本zzz来预测输出。不带核函数的情况下因为直接计算出了ω\omegaω,所以只需要求ω\omegaω和zzz的内积就能得到结果。带核函数的情况在上一篇文章中介绍了,不需要显式地求出ω\omegaω,只需要将输入样本zzz和所有训练样本做内积,得到一个维度是样本个数的列向量,然后把这个列向量和α\alphaα做内积即可得到一个预测结果。
  逐个样本zzz进行检测太慢了,我们把zzz也扩展成循环矩阵C(z)C(z)C(z),然后就可以直接做一批样本的检测,这一批样本相互之间是空间上的位移关系,最后得到f(z)f(z)f(z)是一个列向量,表示一批样本的检测结果。

  在没有引入核函数的情况下,上面的C(z)C(z)C(z)和(C(x))T(C(x))^T(C(x))T相乘得到的也是一个循环矩阵。引入核函数之后,每个样本都经过φ(x)\varphi(x)φ(x)映射到高维空间。我们把高维空间的C′(z)C'(z)C′(z)和(C′(x))T(C'(x))^T(C′(x))T相乘的结果记作KzK^zKz
Kz=C(kzx)kzx=[κ(z,P0x)κ(z,P1x)κ(z,P2x)⋯κ(z,Pnx)]K^z = C({k^{zx}})\;\;\;\;{k^{zx}} = \left[ {\begin{matrix} {\kappa (z,P^0x)}&{\kappa (z,P^1x)}&{\kappa (z,P^2x)}& \cdots &{\kappa (z,P^nx)} \end{matrix}} \right]Kz=C(kzx)kzx=[κ(z,P0x)​κ(z,P1x)​κ(z,P2x)​⋯​κ(z,Pnx)​]
  把结果用循环矩阵化简:
f(z)=C(z)(C(x))Tα=Kzα=C(kzx)α=Udiag(k^zx)U∗αf(z) = C(z){\left( {C(x)} \right)^T}\alpha = {K^z}\alpha = C({k^{zx}})\alpha = Udiag({\hat k^{zx}}){U^*}\alphaf(z)=C(z)(C(x))Tα=Kzα=C(kzx)α=Udiag(k^zx)U∗α
U∗f(z)=diag(k^zx)U∗α{U^*}f(z) = diag({{\hat k}^{zx}}){U^*}\alphaU∗f(z)=diag(k^zx)U∗α
f^∗(z)=k^zx⊙a^∗{{\hat f}^*}(z) = {{\hat k}^{zx}} \odot {{\hat a}^*}f^​∗(z)=k^zx⊙a^∗
  这里的结果和论文中的结果有点不一样,这是因为KzK^zKz的表示方式不太一样,原文中用的是f(z)=(Kz)Tαf(z)=(K^z)^T\alphaf(z)=(Kz)Tα,所以Kz=C(x)(C(z))TK^z=C(x)\left (C(z) \right)^TKz=C(x)(C(z))T

Kz=C(kxz)kxz=[κ(x,P0z)κ(x,P1z)κ(x,P2z)⋯κ(x,Pnz)]K^z = C({k^{xz}})\;\;\;\;{k^{xz}} = \left[ {\begin{matrix} {\kappa (x,P^0z)}&{\kappa (x,P^1z)}&{\kappa (x,P^2z)}& \cdots &{\kappa (x,P^nz)} \end{matrix}} \right]Kz=C(kxz)kxz=[κ(x,P0z)​κ(x,P1z)​κ(x,P2z)​⋯​κ(x,Pnz)​]
  把结果用循环矩阵化简:
f(z)=(Kz)Tα=(C(kxz))Tα=U∗diag(k^xz)Uαf(z) = ({K^z})^T\alpha = (C({k^{xz}}))^T\alpha = U^*diag({\hat k^{xz}}){U}\alphaf(z)=(Kz)Tα=(C(kxz))Tα=U∗diag(k^xz)Uα
Uf(z)=diag(k^xz)Uα{U}f(z) = diag({{\hat k}^{xz}}){U}\alphaUf(z)=diag(k^xz)Uα
f^(z)=k^xz⊙a^{{\hat f}}(z) = {{\hat k}^{xz}} \odot {{\hat a}}f^​(z)=k^xz⊙a^
  这两个结论的区别在于求xxx和zzz的互相关时,两个序列的相对滑动方向不一样。结合我的第一篇文章中关于相关运算用DFT加速的内容:
k^zx=z^⊙x^∗{\hat k}^{zx} = \hat z \odot{\hat x}^*k^zx=z^⊙x^∗
k^xz=x^⊙z^∗{\hat k}^{xz} = \hat x \odot{\hat z}^*k^xz=x^⊙z^∗
  我更倾向于使用后者的结论,那样在没有引入核函数的情况下计算f(z)f(z)f(z)可以表示为:
f(z)=F−1(x^⊙z^∗⊙α^)f(z)={\mathcal F}^{-1}(\hat x \odot{\hat z}^*\odot\hat \alpha)f(z)=F−1(x^⊙z^∗⊙α^)

核函数计算

  有些核函数的计算也可以利用循环矩阵来加速。

多项式核

κ(u,v)=(uTv+a)b\kappa(u,v)=(u^Tv+a)^bκ(u,v)=(uTv+a)b
  在训练的时候计算kxxk^{xx}kxx,uuu和vvv一个始终是原始样本xxx,另一个是循环移位的样本。这就是自相关运算,所以可以用DFT来加速。
kixx=κ(x,Pix)=(xTPix+a)b=(F−1(x^⊙x^∗)+a)bk_i^{xx} = \kappa (x,{P^i}x) = {({x^T}{P^i}x + a)^b} = {\left( {{{\mathcal F}^{ - 1}}(\hat x \odot {{\hat x}^*}) + a} \right)^b}kixx​=κ(x,Pix)=(xTPix+a)b=(F−1(x^⊙x^∗)+a)b
  在检测的时候计算kxzk^{xz}kxz。这时候是互相关运算,互相关运算要注意它们相对滑动的方向,然后再确定哪个需要取复共轭。
kixz=κ(z,Pix)=(zTPix+a)b=(F−1(x^⊙z^∗)+a)bk_i^{xz} = \kappa (z,{P^i}x) = {({z^T}{P^i}x + a)^b} = {\left( {{{\mathcal F}^{ - 1}}(\hat x \odot {{\hat z}^*}) + a} \right)^b}kixz​=κ(z,Pix)=(zTPix+a)b=(F−1(x^⊙z^∗)+a)b

高斯核

κ(u,v)=exp(−1σ2∣∣u−v∣∣2)\kappa (u,v) = exp\left( { - \frac{1}{{{\sigma ^2}}}||u - v|{|^2}} \right)κ(u,v)=exp(−σ21​∣∣u−v∣∣2)
  在训练的时候计算kxxk^{xx}kxx。
kixx=κ(x,Pix)=exp(−2σ2(∣∣x∣∣2−F−1(x^⊙x^∗)))k_i^{xx} = \kappa (x,{P^i}x) = exp\left( { - \frac{2}{{{\sigma ^2}}}\left( {||x|{|^2} - {{\mathcal F}^{ - 1}}(\hat x \odot {{\hat x}^*})} \right)} \right)kixx​=κ(x,Pix)=exp(−σ22​(∣∣x∣∣2−F−1(x^⊙x^∗)))
  在检测的时候计算kxzk^{xz}kxz。
kixz=κ(x,Pix)=exp(−1σ2(∣∣x∣∣2+∣∣z∣∣2−2F−1(x^⊙z^∗)))k_i^{xz} = \kappa (x,{P^i}x) = exp\left( { - \frac{1}{{{\sigma ^2}}}\left( {||x|{|^2} + ||z|{|^2} - 2{{\mathcal F}^{ - 1}}(\hat x \odot {{\hat z}^*})} \right)} \right)kixz​=κ(x,Pix)=exp(−σ21​(∣∣x∣∣2+∣∣z∣∣2−2F−1(x^⊙z^∗)))

CSK与KCF算法推导(三)相关推荐

  1. CSK与KCF算法推导(二)

      本文是CSK与KCF算法推导的第二篇,主要介绍标量对向量求导.核函数.岭回归问题求解等内容. CSK与KCF算法推导(一)--DFT.相关运算和循环卷积 (本文)CSK与KCF算法推导(二)--带 ...

  2. CSK与KCF算法推导(四)

      本文是CSK与KCF算法推导的第四篇,主要介绍将前面推导采用的一维情况推广到二维. CSK与KCF算法推导(一)--DFT.相关运算和循环卷积 CSK与KCF算法推导(二)--带核函数的岭回归问题 ...

  3. CSK与KCF算法推导(六)

      本文是CSK与KCF算法推导的第六篇,主要介绍HOG特征提取与多通道计算. CSK与KCF算法推导(一)--DFT.相关运算和循环卷积 CSK与KCF算法推导(二)--带核函数的岭回归问题求解 C ...

  4. CSK与KCF算法推导(五)

      本文是CSK与KCF算法推导的第五篇,主要介绍具体实现的细节. CSK与KCF算法推导(一)--DFT.相关运算和循环卷积 CSK与KCF算法推导(二)--带核函数的岭回归问题求解 CSK与KCF ...

  5. CSK与KCF算法推导(一)

      从2015年João F. Henriques等人提出KCF以来,网上已经有了很多相关的科普,也有博主给出了非常详细的推导,但如果想要真正理解我觉得还是得自己推导一遍,所以我在这里准备写一下自己学 ...

  6. FEC介绍(三)—算法推导【转载】

    基于IP的语音和视频通话业务为了实时性,一般都是采用UDP进行传输,基站无线一般配置UM模式的RLC承载,因此丢包是不可避免的,在小区信号的边沿则丢包率会更高:为了通话的实时性,一般不会采用接收端发现 ...

  7. 机器学习之EM算法的原理及推导(三硬币模型)及Python实现

    EM算法的简介 EM算法由两步组成:E步和M步,是最常用的迭代算法. 本文主要参考了李航博士的<统计学习方法> 在此基础上主要依据EM算法原理补充了三硬币模型的推导. 1.EM算法的原理 ...

  8. 相关滤波目标追踪二:从Mosse、csk、kcf、ddst单目标跟踪算法的一些总结。

    相关滤波源于信号处理领域,相关性用于表示两个信号之间的相似程度,通常用卷积表示相关操作.那么基于相关滤波的跟踪方法的基本思想就是,寻找一个滤波模板,让下一帧的图像与我们的滤波模板做卷积操作,响应最大的 ...

  9. 【KCF算法解析】High-Speed Tracking with Kernelized Correlation Filters笔记

    前段时间研究了一下KCF算法,单单看论文有很多看不懂的地方.查阅参考了,很多博客和其他材料才算了解了文章的大题思路,现将个人的理解在此记录,作为笔记. 主要内容 0.1 目标跟踪的背景介绍 0.2 学 ...

最新文章

  1. 2021年大数据ELK(十一):Elasticsearch架构原理
  2. UVA 10494 - If We Were a Child Again(高精度除法和取余)
  3. VUE—从入门到飞起(五)
  4. 【CyberSecurityLearning 附】Docker 初识
  5. 智能车大赛信标组_第十五届全国大学生智能汽车竞赛在南京信息工程大学圆满闭幕...
  6. php ssc 源码_吃透这篇,你也能搭建出一个高并发和高性能的系统
  7. uoj#351. 新年的叶子(概率期望)
  8. 《计算机组成与体系结构:性能设计》读后小记 6、外部存储器
  9. 同步/异步阻塞/非阻塞
  10. C#设置系统日期时间格式
  11. 超市商品购买与管理系统
  12. linux笔记:shell编程-正则表达式
  13. servlet笔试题java,Java推荐!Servlet面试题和答案汇集
  14. 全国市场调查大赛经历分享(一)
  15. 多多客api_拼多多推广接口多多客API的简单使用
  16. 自学php多久可以工作_PHP语言自学要多久才能工作
  17. “INNER JOIN”和“OUTER JOIN”有什么区别?
  18. 微积分——求导数的链式法则
  19. 方案设计-实现地图导航
  20. python 正则去除括号以及里边的内容

热门文章

  1. hessian c java_java和c#使用hessian通信的方法
  2. 机器学习让拍照翻译更简单:java+华为ML Kit
  3. OTP/eFuse的介绍
  4. 解决iOS开发中App启动广告的功能
  5. 什么是Bom?有哪些常用的Bom属性
  6. BPMN流程图在线制作-支持flowable,activit,camunda三种工作流引擎
  7. javascript 保留小数点后2位
  8. 浙里办单点登录-PHP-TP5-轻松上手
  9. 认识EMC Unity 存储设备的控制器SP
  10. 思维导图 XMind 闯关之路(第06关)插入备注标签