Skip to content

Commit 19c91b2

Browse files
committed
motion was missing ndata updates for full-field integration
1 parent 9b72afc commit 19c91b2

File tree

2 files changed

+49
-47
lines changed

2 files changed

+49
-47
lines changed

motion/motion.go

Lines changed: 43 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -73,47 +73,49 @@ func (pr *Params) Defaults() {
7373
// Resulting integ tensor is 4 values (2x2) with left, right, bottom, top units.
7474
// integ = integrated full-field values over time
7575
// visNormInteg = integrated visNorm, actually used for normalization
76-
func (pr *Params) FullFieldInteg(scalars, integ *tensor.Float32) {
77-
visNorm := scalars.Value1D(pr.DoGSumScalarIndex)
78-
integ.SetShapeSizes(2, 2)
76+
func (pr *Params) FullFieldInteg(ndata int, scalars, integ *tensor.Float32) {
7977
idt := 1.0 / pr.IntegTau
80-
if pr.NormInteg == 0 {
81-
pr.NormInteg = visNorm
82-
} else {
83-
pr.NormInteg += idt * (visNorm - pr.NormInteg)
78+
integ.SetShapeSizes(ndata, 2, 2)
79+
for di := range ndata {
80+
visNorm := scalars.Value(pr.DoGSumScalarIndex, di)
81+
if pr.NormInteg == 0 {
82+
pr.NormInteg = visNorm
83+
} else {
84+
pr.NormInteg += idt * (visNorm - pr.NormInteg)
85+
}
86+
vnf := pr.FullGain
87+
if pr.NormInteg > 0 {
88+
vnf /= pr.NormInteg
89+
}
90+
91+
act := func(v float32) float32 { return vnf * v }
92+
l := scalars.Value(pr.FFScalarIndex+0, di)
93+
r := scalars.Value(pr.FFScalarIndex+1, di)
94+
if l > r {
95+
l = act(l - r)
96+
r = 0
97+
} else {
98+
r = act(r - l)
99+
l = 0
100+
}
101+
b := scalars.Value(pr.FFScalarIndex+2, di)
102+
u := scalars.Value(pr.FFScalarIndex+3, di)
103+
if b > u {
104+
b = act(b - u)
105+
u = 0
106+
} else {
107+
u = act(u - b)
108+
b = 0
109+
}
110+
111+
integf := func(y, x int, v float32) {
112+
vi := integ.Value(di, y, x)
113+
vi += idt * (v - vi)
114+
integ.Set(vi, di, y, x)
115+
}
116+
integf(0, 0, l)
117+
integf(0, 1, r)
118+
integf(1, 0, b)
119+
integf(1, 1, u)
84120
}
85-
vnf := pr.FullGain
86-
if pr.NormInteg > 0 {
87-
vnf /= pr.NormInteg
88-
}
89-
90-
act := func(v float32) float32 { return vnf * v }
91-
l := scalars.Value1D(pr.FFScalarIndex + 0)
92-
r := scalars.Value1D(pr.FFScalarIndex + 1)
93-
if l > r {
94-
l = act(l - r)
95-
r = 0
96-
} else {
97-
r = act(r - l)
98-
l = 0
99-
}
100-
b := scalars.Value1D(pr.FFScalarIndex + 2)
101-
u := scalars.Value1D(pr.FFScalarIndex + 3)
102-
if b > u {
103-
b = act(b - u)
104-
u = 0
105-
} else {
106-
u = act(u - b)
107-
b = 0
108-
}
109-
110-
integf := func(i int, v float32) {
111-
vi := integ.Value1D(i)
112-
vi += idt * (v - vi)
113-
integ.Set1D(vi, i)
114-
}
115-
integf(0, l)
116-
integf(1, r)
117-
integf(2, b)
118-
integf(3, u)
119121
}

v1std/motion_dog.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ type MotionDoG struct {
3434
// Geom is geometry of input, output.
3535
Geom v1vision.Geom `edit:"-"`
3636

37-
// FullField has the integrated FullField output (1D).
37+
// FullField has the integrated FullField output: [NData, 2, 2].
3838
// Use [motion.Directions] for 1D indexes (is 2x2 for [L,R][D,U]).
3939
FullField tensor.Float32 `display:"no-inline"`
4040

@@ -46,7 +46,7 @@ type MotionDoG struct {
4646

4747
// Star has the star values, if GetStar is true,
4848
// pointing to Values in V1.
49-
// [Y, X, Polarity, 4], where Polarity is DoG polarity, and 4 is for
49+
// [NData, Y, X, Polarity, 4], where Polarity is DoG polarity, and 4 is for
5050
// Left, Right, Down, Up.
5151
Star *tensor.Float32 `display:"no-inline"`
5252
}
@@ -73,7 +73,7 @@ func (vi *MotionDoG) SetSize(sz, spc int) {
7373
// ndata = number of data-parallel inputs to process in parallel.
7474
func (vi *MotionDoG) Config(ndata int, imageSize image.Point) {
7575
vi.Geom.SetImageSize(imageSize)
76-
vi.FullField.SetShapeSizes(2, 2)
76+
vi.FullField.SetShapeSizes(ndata, 2, 2)
7777

7878
fn := 1 // number of filters in DoG
7979

@@ -93,7 +93,7 @@ func (vi *MotionDoG) Config(ndata int, imageSize image.Point) {
9393

9494
if vi.GetStar {
9595
out4 := vi.V1.NewValues4D(int(vi.Geom.Out.Y), int(vi.Geom.Out.X), 2, 4)
96-
vi.Star.SetShapeSizes(int(vi.Geom.Out.Y), int(vi.Geom.Out.X), 2, 4)
96+
vi.Star.SetShapeSizes(ndata, int(vi.Geom.Out.Y), int(vi.Geom.Out.X), 2, 4)
9797
vi.V1.NewTo4D(starIdx, out4, 2, 4, 0, &vi.Geom)
9898
}
9999

@@ -129,8 +129,8 @@ func (vi *MotionDoG) Run() {
129129
vals = append(vals, v1vision.Values4DVar)
130130
}
131131
vi.V1.Run(vals...)
132-
vi.Motion.FullFieldInteg(vi.V1.Scalars, &vi.FullField)
133-
if vi.GetStar {
132+
vi.Motion.FullFieldInteg(vi.V1.NData, vi.V1.Scalars, &vi.FullField)
133+
if vi.GetStar { // assumes star at 0
134134
vi.Star = vi.V1.Values4D.SubSpace(0).(*tensor.Float32)
135135
}
136136
}

0 commit comments

Comments
 (0)