Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
S
SemiSmoothNewton.jl
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Stephan Hilb
SemiSmoothNewton.jl
Commits
cf4aa0e6
Commit
cf4aa0e6
authored
3 years ago
by
Stephan Hilb
Browse files
Options
Downloads
Patches
Plain Diff
refactor optflow examples
parent
bbca8365
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
scripts/run_experiments.jl
+54
-44
54 additions, 44 deletions
scripts/run_experiments.jl
with
54 additions
and
44 deletions
scripts/run_experiments.jl
+
54
−
44
View file @
cf4aa0e6
...
...
@@ -1051,6 +1051,7 @@ function optflow(ctx)
size
(
ctx
.
params
.
imgf0
)
==
size
(
ctx
.
params
.
imgf1
)
||
throw
(
ArgumentError
(
"non-matching image sizes"
))
project_image!
=
project_l2_lagrange!
tol_newton
=
1e-5
# cauchy criterion for inner newton loop
m
=
2
# range dim of vector field
...
...
@@ -1073,14 +1074,15 @@ function optflow(ctx)
ctx
.
params
.
gamma1
,
ctx
.
params
.
gamma2
)
function
warp!
()
println
(
"warp and reproject ..."
)
# warp image into imgfw / fw
imgfw
=
warp_backwards
(
imgf1
,
sample
(
st
.
u
))
project_
l2_pixel
!
(
fw
,
imgfw
)
project_
image
!
(
fw
,
imgfw
)
# recompute optflow operator T based on u0 and fw
# TODO: investigate what julia does for singular matrices here
function
tdata_optflow
(
x
;
u0_deriv
,
nablafw
)
res
=
nablafw
/
(
I
+
u0_deriv
'
)
#res = nablafw / (I + u0_deriv')
res
=
nablafw
all
(
isfinite
,
res
)
||
throw
(
DivideError
(
"singular optflow matrix"
))
return
res
end
...
...
@@ -1088,15 +1090,17 @@ function optflow(ctx)
u0_deriv
=
nabla
(
st
.
u
),
nablafw
=
nabla
(
fw
))
# recompute optflow data g
# note that it is important here that the space of g is general enough
# to avoid any information loss that could screw up image warping
g_optflow
(
x
;
u0
,
f0
,
fw
,
tdata
)
=
#-(fw - f0)
st
.
T
(
tdata
,
u0
)
-
(
fw
-
f0
)
interpolate!
(
st
.
g
,
g_optflow
;
u0
=
st
.
u
,
f0
,
fw
,
st
.
tdata
)
end
function
interpolate_image_data!
()
project_l2_pixel!
(
f0
,
imgf0
)
project_l2_pixel!
(
f1
,
imgf1
)
println
(
"interpolate image data ..."
)
project_image!
(
f0
,
imgf0
)
project_image!
(
f1
,
imgf1
)
end
...
...
@@ -1104,55 +1108,59 @@ function optflow(ctx)
output
(
st
,
joinpath
(
ctx
.
outdir
,
"output_
$
(lpad(i, 5, '0')).vtu"
),
st
.
g
,
st
.
u
,
st
.
p1
,
st
.
p2
,
st
.
est
,
f0
,
f1
,
fw
)
i
=
0
pvd
=
paraview_collection
(
joinpath
(
ctx
.
outdir
,
"output.pvd"
))
do
pvd
pvd
[
i
]
=
save_step
(
i
)
interpolate_image_data!
()
warp!
()
# in the first step just to fill st.g
pvd
[
0
]
=
save_step
(
0
)
#norm_g_old = norm_l2(st.g)
for
j
in
1
:
5
println
(
"interpolate image data ..."
)
interpolate_image_data!
()
println
(
"warp ..."
)
warp!
()
# in the first step just to fill st.g
i
+=
1
i
=
0
k
=
0
while
true
step!
(
st
)
k
+=
1
#estimate_pd!(st)
# interior newton loop
norm_step_
=
Inf
k
=
0
while
norm_step_
>
tol_newton
&&
k
<
20
k
+=
1
println
()
step!
(
st
)
#estimate_pd!(st)
norm_step_
=
norm_step
(
st
)
/
sqrt
(
mesh_area
)
println
(
"norm_step =
$
norm_step_"
)
norm_step_
=
norm_step
(
st
)
/
sqrt
(
mesh_area
)
println
(
"norm_step =
$
norm_step_"
)
# residual is basically unusable: takes long to compute and
# oscillates
#norm_residual_ = norm_residual(st) / sqrt(mesh_area)
#println("norm_residual = $norm_residual_")
# residual is basically unusable: takes long to compute and
# oscillates
#norm_residual_ = norm_residual(st) / sqrt(mesh_area)
#println("norm_residual = $norm_residual_")
#display(plot(colorflow(to_img(sample(st.u)); ctx.params.maxflow)))
#display(plot(colorflow(to_img(sample(st.u)); ctx.params.maxflow)))
end
# interior newton stop criterion
norm_step_
>
tol_newton
&&
k
<
10
&&
continue
k
=
0
display
(
plot
(
colorflow
(
to_img
(
sample
(
st
.
u
));
ctx
.
params
.
maxflow
)))
estimate_res!
(
st
)
i
+=
1
pvd
[
i
]
=
save_step
(
i
)
println
(
"refine ..."
)
marked_cells
=
mark
(
st
;
theta
=
0.5
)
#marked_cells = Set(axes(mesh.cells, 2))
mesh
,
fs
=
refine
(
mesh
,
marked_cells
;
st
.
est
,
st
.
g
,
st
.
u
,
st
.
p1
,
st
.
p2
,
st
.
du
,
st
.
dp1
,
st
.
dp2
,
st
.
tdata
,
f0
,
f1
,
fw
)
st
=
L1L2TVState
(
mesh
,
st
.
d
,
st
.
m
,
st
.
T
,
fs
.
tdata
,
st
.
S
,
st
.
alpha1
,
st
.
alpha2
,
st
.
beta
,
st
.
lambda
,
st
.
gamma1
,
st
.
gamma2
,
fs
.
est
,
fs
.
g
,
fs
.
u
,
fs
.
p1
,
fs
.
p2
,
fs
.
du
,
fs
.
dp1
,
fs
.
dp2
)
f0
,
f1
,
fw
=
(
fs
.
f0
,
fs
.
f1
,
fs
.
fw
)
# warping stop criterion
warp!
()
if
i
>
10
break
end
# refinement stop criterion
if
false
println
(
"refine ..."
)
estimate_res!
(
st
)
marked_cells
=
mark
(
st
;
theta
=
0.5
)
#marked_cells = Set(axes(mesh.cells, 2))
mesh
,
fs
=
refine
(
mesh
,
marked_cells
;
st
.
est
,
st
.
g
,
st
.
u
,
st
.
p1
,
st
.
p2
,
st
.
du
,
st
.
dp1
,
st
.
dp2
,
st
.
tdata
,
f0
,
f1
,
fw
)
st
=
L1L2TVState
(
mesh
,
st
.
d
,
st
.
m
,
st
.
T
,
fs
.
tdata
,
st
.
S
,
st
.
alpha1
,
st
.
alpha2
,
st
.
beta
,
st
.
lambda
,
st
.
gamma1
,
st
.
gamma2
,
fs
.
est
,
fs
.
g
,
fs
.
u
,
fs
.
p1
,
fs
.
p2
,
fs
.
du
,
fs
.
dp1
,
fs
.
dp2
)
f0
,
f1
,
fw
=
(
fs
.
f0
,
fs
.
f1
,
fs
.
fw
)
interpolate_image_data!
()
end
end
end
#display(plot(colorflow(to_img(sample(st.u)); ctx.params.maxflow)))
...
...
@@ -1167,9 +1175,11 @@ end
function
experiment_optflow_middlebury
(
ctx
)
imgf0
=
loadimg
(
joinpath
(
ctx
.
indir
,
"frame10.png"
))
imgf1
=
loadimg
(
joinpath
(
ctx
.
indir
,
"frame11.png"
))
maxflow
=
4.6157
# Dimetrodon
gtflow
=
FileIO
.
load
(
joinpath
(
ctx
.
indir
,
"flow10.flo"
))
maxflow
=
OpticalFlowUtils
.
maxflow
(
gtflow
)
ctx
=
Util
.
Context
(
ctx
;
imgf0
,
imgf1
,
maxflow
)
mkpath
(
ctx
.
outdir
)
return
optflow
(
ctx
)
end
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment