(新型事件相机有关的论文解读)Single Image Optical Flow Estimationwith an Event Camera

新型事件相机有关的论文解读之:

Single Image Optical Flow Estimationwith an Event Camera

关于事件相机:
事件相机是一个新型的类脑相机,是一个待开发的大领域。希望通过我的分享,能够有更多人来研究并将它更好地运用在我们的生活中~
对于事件相机还不了解的朋友们可以看我这一系列的另一篇博客:事件相机(Event Camera)及相关研究简介——新一代相机?新的计算机视觉领域?

本篇论文地址:https://arxiv.org/abs/2004.00347
本篇论文是发表在2020CVPR上的一篇论文,使用事件相机来做光流估计。
请添加图片描述

简介

总的来说,这是一篇运用经典方法估计光流的文章。
大致思路是:

  • 通过变分法设置一个去模糊图片作为隐变量。
  • 导出四个待优化函数。(包括事件的亮度恒定)
  • 分别优化光流和去模糊图片。

变分方法&符号定义

在估计时需要用到隐变量,这里设为 L L L,代表去模糊后的灰度图,那么传统的从时间f到时间t的亮度不变可以表示为:
L ( x ⃗ , f ) = L ( x ⃗ + u ⃗ ( x ⃗ ) , t ) (1) L(\vec x,f)=L(\vec x+\vec u(\vec x),t)\tag1 L(x ,f)=L(x +u (x ),t)(1)
其中 x ⃗ = ( x , y ) T \vec x=(x,y)^T x =(x,y)T是坐标, u ⃗ ( x ⃗ ) = ( u x , v x ) T \vec u(\vec x)=(u_x,v_x)^T u (x )=(ux,vx)T是光流。
可见 u ⃗ ∈ R H ∗ W ∗ 2 \vec u\in \mathbb{R}^{H*W*2} u RHW2 L ∈ R H ∗ W L\in \mathbb{R}^{H*W} LRHW

在前人的方法中,利用这样变分法的优化函数可以表示如下:
min ⁡ u ∫ Ω ∣ ∣ ∇ u ⃗ ( x ⃗ ) ∣ ∣ 2 d x + ∫ Ω ( L ( x ⃗ , f ) − L ( x ⃗ + u ⃗ ( x ⃗ ) , t ) ) 2 d x (2) \min_u \int_\Omega ||\nabla \vec u(\vec x)||^2dx+\int_\Omega (L(\vec x,f)-L(\vec x+\vec u(\vec x),t))^2dx\tag2 uminΩu (x )2dx+Ω(L(x ,f)L(x +u (x ),t))2dx(2)
其中 Ω \Omega Ω代表整个图片域,而 ∇ u ⃗ ( x ⃗ ) ∈ R H ∗ W ∗ 4 \nabla \vec u(\vec x)\in \mathbb{R}^{H*W*4} u (x )RHW4,其定义如下:
∇ u ⃗ ( x ⃗ ) = ( ∂ u ⃗ ( x ⃗ ) ∂ x , ∂ u ⃗ ( x ⃗ ) ∂ y , ∂ v ⃗ ( x ⃗ ) ∂ x , ∂ v ⃗ ( x ⃗ ) ∂ y ) T \nabla \vec u(\vec x)=(\frac{\partial \vec u(\vec x)}{\partial x},\frac{\partial \vec u(\vec x)}{\partial y},\frac{\partial \vec v(\vec x)}{\partial x},\frac{\partial \vec v(\vec x)}{\partial y})^T u (x )=(xu (x ),yu (x ),xv (x ),yv (x ))T
即,第一项是由于估计的光流图应该是光滑的而添加的正则项。第二项是传统的亮度恒定。

本文方法

直接上公式:
min ⁡ L , u ⃗ μ 1 ϕ e v e ( L , u ⃗ ) + μ 2 ϕ b l u r ( L , u ⃗ ) + ϕ f l o w ( ∇ u ⃗ ) + ϕ i m ( ∇ L ) (3) \min_{L,\vec u} \mu_1\phi_{eve}(L,\vec u)+\mu_2\phi_{blur}(L,\vec u)+\phi_{flow}(\nabla \vec u)+\phi_{im}(\nabla L)\tag3 L,u minμ1ϕeve(L,u )+μ2ϕblur(L,u )+ϕflow(u )+ϕim(L)(3)
其中 ϕ e v e \phi_{eve} ϕeve保证亮度不变, ϕ b l u r \phi_{blur} ϕblur是去模糊过程, ϕ f l o w \phi_{flow} ϕflow ϕ i m \phi_{im} ϕim是类似于之前的光滑正则项。
文章的方法就是分步优化两个变量,L和u,根据上述优化公式,前两项对两个变量都起作用,而第三项相当于u的光滑正则项,第四项相当于L的光滑正则项,下面分别介绍四个损失。

亮度不变 ϕ e v e \phi_{eve} ϕeve

我们知道,事件产生的条件是:
∣ l o g ( L ( x ⃗ , t ) ) − l o g ( L ( x ⃗ , t r e f ) ) ∣ ≥ c |log(L(\vec x,t))-log(L(\vec x,t_{ref}))|\ge c log(L(x ,t))log(L(x ,tref))c
其中c为阈值。
故从f时刻到t时刻,带入得:
L ( x ⃗ , t ) = L ( x ⃗ , f ) e x p ( c E ( x ⃗ , t ) ) L(\vec x,t)=L(\vec x,f)exp(cE(\vec x,t)) L(x ,t)=L(x ,f)exp(cE(x ,t))
其中 x ⃗ \vec x x 为这段时间中的事件极性的积分。
故假设 Δ t \Delta t Δt很小,那么可以将亮度不变约束泰勒展开:
L ( x ⃗ + u ⃗ ( x ⃗ ) , f + Δ t ) ≈ L ( x , f ) + u x L ( x , f ) ( x ) + v x L ( x , f ) ( y ) + Δ t L ( x , f ) ( t ) = u x L ( x , f ) ( x ) + v x L ( x , f ) ( y ) + L ( x , t ) L(\vec x+\vec u(\vec x),f+\Delta t)\approx L(x,f)+u_xL(x,f)^{(x)}+v_xL(x,f)^{(y)}+\Delta tL(x,f)^{(t)}\\ =u_xL(x,f)^{(x)}+v_xL(x,f)^{(y)}+L(x,t) L(x +u (x ),f+Δt)L(x,f)+uxL(x,f)(x)+vxL(x,f)(y)+ΔtL(x,f)(t)=uxL(x,f)(x)+vxL(x,f)(y)+L(x,t)
由亮度不变,则应该使得:
L ( x , f ) − ( u x L ( x , f ) ( x ) + v x L ( x , f ) ( y ) + L ( x , t ) ) = L ( x , f ) ( e x p ( c E ( x , t ) ) − 1 ) + [ u x , v x ] T ∇ L ( x , f ) L(x,f)-(u_xL(x,f)^{(x)}+v_xL(x,f)^{(y)}+L(x,t))\\ =L(x,f)(exp(cE(x,t))-1)+[u_x,v_x]^T\nabla L(x,f) L(x,f)(uxL(x,f)(x)+vxL(x,f)(y)+L(x,t))=L(x,f)(exp(cE(x,t))1)+[ux,vx]TL(x,f)
这里令 ∇ L ( x , f ) = ( L ( x , f ) ( x ) , L ( x , f ) ( y ) ) T \nabla L(x,f)=(L(x,f)^{(x)},L(x,f)^{(y)})^T L(x,f)=(L(x,f)(x),L(x,f)(y))T
故该损失表示为:
ϕ e v e ( L , u ) = ∑ x ∈ Ω ∣ ∣ L ( x , f ) ( e x p ( c E ( x , t ) ) − 1 ) + [ u x , v x ] T ∇ L ( x , f ) ∣ ∣ 1 \phi_{eve}(L,u)=\sum_{x\in \Omega}||L(x,f)(exp(cE(x,t))-1)+[u_x,v_x]^T\nabla L(x,f)||_1 ϕeve(L,u)=xΩL(x,f)(exp(cE(x,t))1)+[ux,vx]TL(x,f)1

图片模糊方程 ϕ b l u r \phi_{blur} ϕblur

传统模糊就是一个卷积,而在动态环境中时,我们把卷积核大小缩减为1,即一个逐点的卷积:
B = k ( x ) ⊗ L ( x ) B=k(x)\otimes L(x) B=k(x)L(x)
其中k为卷积核,L为去模糊的图片,B为模糊图片。 B ∈ R H ∗ W B\in \mathbb{R}^{H*W} BRHW
卷积展开为:
B ( x ) = ∑ y ∈ Ω k ( x ) L ( x − y ) = ∑ y ∈ Ω k u ′ ( x ) ( y ) L ( x − y ) B(x)=\sum_{y\in \Omega}k(x)L(x-y)\\=\sum_{y\in \Omega}k_{u'(x)}(y)L(x-y) B(x)=yΩk(x)L(xy)=yΩku(x)(y)L(xy)
这里 x , y ∈ Ω x,y\in\Omega x,yΩ k u ′ ( x ) ∈ R H ∗ W k_{u'(x)}\in \mathbb{R}^{H*W} ku(x)RHW就是每个像素的卷积核。
在这里插入图片描述

可以用下图来理解:
在这里插入图片描述

最终模糊损失定义为:
ϕ b l u r ( L , u ) = ∑ x , y ∈ Ω ∣ ∣ k u ′ ( x ) ( y ) L ( x − y ) − B ( x ) ∣ ∣ 2 \phi_{blur}(L,u)=\sum_{x,y\in \Omega}||k_{u'(x)}(y)L(x-y)-B(x)||^2 ϕblur(L,u)=x,yΩku(x)(y)L(xy)B(x)2

正则项 ϕ f l o w ϕ i m \phi_{flow}\phi_{im} ϕflowϕim

1、 ϕ f l o w \phi_{flow} ϕflow光流的正则项
按照传统方法,应该使 ∇ u \nabla u u尽可能小,设定x、y方向的系数w(x),最小化量变为:
w ( x ) ∇ u ⃗ ( x ) = ( w X x u X ( x ) , w X y u X ( y ) , w X x v X ( x ) , w X y v X ( y ) ) T w(x)\nabla \vec u(x)=(w_X^xu_X^{(x)},w_X^yu_X^{(y)},w_X^xv_X^{(x)},w_X^yv_X^{(y)})^T w(x)u (x)=(wXxuX(x),wXyuX(y),wXxvX(x),wXyvX(y))T
则:
ϕ f l o w ( ∇ u ) = ∣ ∣ w ∇ u ∣ ∣ 1 , 2 = ∑ x ∈ Ω ∣ ∣ w ( x ) ∇ u ( x ) ∣ ∣ \phi_{flow}(\nabla u)=||w\nabla u||_{1,2}=\sum_{x\in \Omega}||w(x)\nabla u(x)|| ϕflow(u)=wu1,2=xΩw(x)u(x)
这里的系数由下面的公式得到:
w x = μ 3 e x p ( − ( L ^ ( x ) μ 4 ) 2 ) w^x=\mu_3exp(-(\frac{\hat L^{(x)}}{\mu_4})^2) wx=μ3exp((μ4L^(x))2)
w y = μ 3 e x p ( − ( L ^ ( y ) μ 4 ) 2 ) w^y=\mu_3exp(-(\frac{\hat L^{(y)}}{\mu_4})^2) wy=μ3exp((μ4L^(y))2)
其中 L ^ \hat L L^为原灰度图,也就是说,在原图亮度变化较大的地方系数小一些,亮度变化小的地方系数大一些。
2、 ϕ i m \phi_{im} ϕim去模糊图的正则项
直接将其梯度的一范数作为正则项。
ϕ i m ( ∇ L ) = ∑ x ∈ Ω ∣ ∣ ∇ L ( x ) ∣ ∣ 1 \phi_{im}(\nabla L)=\sum_{x\in\Omega}||\nabla L(x)||_1 ϕim(L)=xΩL(x)1

优化

由于要优化两个变量,采取分步优化的方式。

优化光流

在优化光流时,固定隐变量L,令 L = L ^ L=\hat L L=L^。优化函数变为:
在这里插入图片描述
G(u)为是凸的,F(Ku)是非凸的。
令: K u = w ∇ u Ku=w\nabla u Ku=wu u ∈ X = R 2 N u\in X=\mathbb{R}^{2N} uX=R2N ∇ u ∈ Y = R 4 N \nabla u\in Y=\mathbb{R}^{4N} uY=R4N,所以: G : X → R , F : Y → R G:X\rightarrow \mathbb{R},F:Y\rightarrow \mathbb{R} G:XR,F:YR
使用对偶法求解,对F取两次共轭:
min ⁡ u ∈ X ( G ( u ) + max ⁡ p ∈ Y < K u , p > X − F ∗ ( p ) ) F ∗ ( q ) = sup ⁡ p ∈ Y ( < p , q > − F ( p ) ) \min_{u\in X}(G(u)+\max_{p\in Y}<Ku,p>_X-F^*(p))\\ F^*(q)=\sup_{p\in Y}(<p,q>-F(p)) uXmin(G(u)+pYmax<Ku,p>XF(p))F(q)=pYsup(<p,q>F(p))
得到优化公式:
p n + 1 = P F ∗ ( p n + σ K u ˉ n ) u n + 1 = P G ( u n − τ K ∗ p n + 1 ) u ˉ n + 1 = u n + 1 + θ ( u n + 1 − u n ) p^{n+1}=\mathcal{P}_{F^*}(p^n+\sigma K\bar u^n)\\ u^{n+1}=\mathcal{P}_G(u^n-\tau K^*p^{n+1})\\ \bar u^{n+1}=u^{n+1}+\theta(u^{n+1}-u^n) pn+1=PF(pn+σKuˉn)un+1=PG(unτKpn+1)uˉn+1=un+1+θ(un+1un)
其中:
P g ( x ) = a r g min ⁡ y ( 2 g ( y ) + ∣ ∣ y − x ∣ ∣ 2 ) \mathcal{P}_g(x)=arg\min_y(2g(y)+||y-x||^2) Pg(x)=argymin(2g(y)+yx2)
代表在离散集合中找到使函数值最小且距离x最近的点。

优化去模糊图

此时固定光流,优化函数为:
在这里插入图片描述

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Panoramic stitching is the process of combining multiple images to create a single panoramic image. Optical flow tracing is a technique used to track the movement of pixels between consecutive frames in a video or between multiple images. Here's an example of how you can implement panoramic stitching using the optical flow tracing principle in Python: 1. Start by importing the necessary libraries, such as OpenCV, Numpy, and Matplotlib. ``` import cv2 import numpy as np import matplotlib.pyplot as plt ``` 2. Load the images that you want to stitch into a list. ``` images = [cv2.imread('image1.jpg'), cv2.imread('image2.jpg'), ... ] ``` 3. Use the Lucas-Kanade optical flow method to track the movement of pixels between the images. ``` gray_images = [cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) for img in images] prev_gray = gray_images[0] flow = None for i in range(1, len(gray_images)): curr_gray = gray_images[i] flow = cv2.calcOpticalFlowFarneback(prev_gray, curr_gray, flow, 0.5, 3, 15, 3, 5, 1.2, 0) prev_gray = curr_gray ``` 4. Use the optical flow information to warp the images and align them. ``` warped_images = [] for i in range(len(images)): H = np.eye(3) for j in range(i): H = np.dot(H, cv2.estimateRigidTransform(gray_images[j], gray_images[i], False)) warped = cv2.warpPerspective(images[i], H, (images[i].shape[1] + int(H[0,2]), images[i].shape[0] + int(H[1,2]))) warped_images.append(warped) ``` 5. Finally, use the aligned images to create a single panoramic image. ``` panorama = warped_images[0] for i in range(1, len(warped_images)): panorama = cv2.addWeighted(panorama, 1, warped_images[i], 1, 0) ``` This is just a basic example, and you may need to adjust the parameters or use a different approach depending on your specific use case. But I hope it gives you an idea of how to implement panoramic stitching using the optical flow tracing principle in Python.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值