Skip to content
Snippets Groups Projects
Commit 2e5565de authored by Stephan Hilb's avatar Stephan Hilb
Browse files

implement optical flow

parent 02afebd2
No related branches found
No related tags found
No related merge requests found
...@@ -8,15 +8,22 @@ function myrun() ...@@ -8,15 +8,22 @@ function myrun()
name = "test" name = "test"
mesh = init_grid(50) mesh = init_grid(50)
d = 2 d = 2
m = 1 m = 2
Vg = FeSpace(mesh, DP0(), (1,)) Vg = FeSpace(mesh, P1(), (1,))
Vu = FeSpace(mesh, P1(), (m,)) Vu = FeSpace(mesh, P1(), (m,))
Vp1 = FeSpace(mesh, DP0(), (1,)) Vp1 = FeSpace(mesh, DP0(), (1,))
Vp2 = FeSpace(mesh, DP1(), (m, d)) Vp2 = FeSpace(mesh, DP1(), (m, d))
g = FeFunction(Vg, name="g") # inpainting
mask = FeFunction(Vg, name="mask") mask = FeFunction(Vg, name="mask")
# optflow
f0 = FeFunction(Vg, name="f0")
f1 = FeFunction(Vg, name="f1")
fw = FeFunction(Vg, name="fw")
nablafw = nabla(fw)
g = FeFunction(Vg, name="g")
u = FeFunction(Vu, name="u") u = FeFunction(Vu, name="u")
p1 = FeFunction(Vp1, name="p1") p1 = FeFunction(Vp1, name="p1")
p2 = FeFunction(Vp2, name="p2") p2 = FeFunction(Vp2, name="p2")
...@@ -36,7 +43,7 @@ function myrun() ...@@ -36,7 +43,7 @@ function myrun()
alpha1 = 0. alpha1 = 0.
alpha2 = 10. alpha2 = 10.
beta = 0. beta = 1e-3
lambda = 0.01 lambda = 0.01
gamma1 = 1e-3 gamma1 = 1e-3
gamma2 = 1e-3 gamma2 = 1e-3
...@@ -44,16 +51,24 @@ function myrun() ...@@ -44,16 +51,24 @@ function myrun()
interpolate!(g, x -> norm(x - SA[0.5, 0.5]) < 0.3) interpolate!(g, x -> norm(x - SA[0.5, 0.5]) < 0.3)
interpolate!(mask, x -> abs(x[2] - 0.5) > 0.1) interpolate!(mask, x -> abs(x[2] - 0.5) > 0.1)
interpolate!(f0, x -> x[1])
interpolate!(f1, x -> x[1] - 0.01)
fw.data .= f1.data
g_optflow(x; u, f0, fw, nablafw) =
nablafw * u - (fw - f0)
interpolate!(g, g_optflow; u, f0, fw, nablafw)
#T(data, u) = u #T(data, u) = u
#tdata = u # FIXME #tdata = u # FIXME
@inline T(data, u) = iszero(data) ? zero(u) : u #T(data, u) = iszero(data) ? zero(u) : u
tdata = mask #tdata = mask
#T(data, u) = dot(data, u) T(data, u) = data * u
#tdata = nabla(fw) tdata = nabla(fw)
S(u) = u #S(u, nablau) = u
S(u, nablau) = nablau
function dp1_update(x; g, u, p1, du, tdata) function dp1_update(x; g, u, p1, du, tdata)
m1 = max(gamma1, norm(T(tdata, u) - g)) m1 = max(gamma1, norm(T(tdata, u) - g))
...@@ -88,7 +103,7 @@ function myrun() ...@@ -88,7 +103,7 @@ function myrun()
end end
end end
@inline function du_a(x, du, nabladu, phi, nablaphi; g, u, nablau, p1, p2, tdata) function du_a(x, du, nabladu, phi, nablaphi; g, u, nablau, p1, p2, tdata)
m1 = max(gamma1, norm(T(tdata, u) - g)) m1 = max(gamma1, norm(T(tdata, u) - g))
cond1 = norm(T(tdata, u) - g) > gamma1 ? cond1 = norm(T(tdata, u) - g) > gamma1 ?
dot(T(tdata, u) - g, T(tdata, du)) / norm(T(tdata, u) - g)^2 * p1 : dot(T(tdata, u) - g, T(tdata, du)) / norm(T(tdata, u) - g)^2 * p1 :
...@@ -104,14 +119,14 @@ function myrun() ...@@ -104,14 +119,14 @@ function myrun()
dot(cond2, nablaphi) dot(cond2, nablaphi)
aB = alpha2 * dot(T(tdata, du), T(tdata, phi)) + aB = alpha2 * dot(T(tdata, du), T(tdata, phi)) +
beta * dot(S(du), S(phi)) beta * dot(S(du, nabladu), S(phi, nablaphi))
return a1 + a2 + aB return a1 + a2 + aB
end end
@inline function du_l(x, phi, nablaphi; g, u, nablau, tdata) function du_l(x, phi, nablaphi; g, u, nablau, tdata)
aB = alpha2 * dot(T(tdata, u), T(tdata, phi)) + aB = alpha2 * dot(T(tdata, u), T(tdata, phi)) +
beta * dot(S(u), S(phi)) beta * dot(S(u, nablau), S(phi, nablaphi))
m1 = max(gamma1, norm(T(tdata, u) - g)) m1 = max(gamma1, norm(T(tdata, u) - g))
p1part = alpha1 / m1 * dot(T(tdata, u) - g, T(tdata, phi)) p1part = alpha1 / m1 * dot(T(tdata, u) - g, T(tdata, phi))
m2 = max(gamma2, norm(nablau)) m2 = max(gamma2, norm(nablau))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment