Skip to content

Commit 0f9fa2e

Browse files
authored
Merge pull request #26 from gallantlab/totalmoten
totalmoten
2 parents 6fd403f + ee5301e commit 0f9fa2e

File tree

2 files changed

+77
-6
lines changed

2 files changed

+77
-6
lines changed

moten/extras.py

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,36 @@
1414
except ImportError:
1515
with_tqdm = False
1616

17+
def process_motion_energy_from_files(filenames,
18+
size=None,
19+
nimages=np.inf,
20+
batch_size=1000,
21+
dtype='float32',
22+
mask=None,
23+
):
24+
'''
25+
'''
26+
import moten.io
27+
if not isinstance(filenames, (list, tuple)):
28+
filenames = [filenames]
29+
30+
XTX = 0
31+
NFRAMES = 0
32+
for fl in filenames:
33+
generator = moten.io.generate_frame_difference_from_greyvideo(
34+
fl, size=size, nimages=nimages, dtype=dtype)
35+
36+
if mask is not None:
37+
generator = moten.io.apply_mask(mask, generator)
38+
39+
nframes, xtx = pixbypix_covariance_from_frames_generator(generator,
40+
batch_size=batch_size,
41+
mask=mask)
42+
XTX += xtx
43+
NFRAMES = nframes
44+
return NFRAMES, XTX
45+
46+
1747
def pixbypix_covariance_from_frames_generator(data_generator,
1848
batch_size=1000,
1949
output_nonlinearity=pointwise_square,
@@ -37,12 +67,13 @@ def pixbypix_covariance_from_frames_generator(data_generator,
3767
>>> fdiffgen = moten.io.generate_frame_difference_from_greyvideo(video_file, size=small_size, nimages=333)
3868
>>> nimages, XTX = moten.extras.pixbypix_covariance_from_frames_generator(fdiffgen) # doctest: +SKIP
3969
'''
40-
first_frame = data_generator.__next__()
70+
first_frame = next(data_generator)
71+
4172
vdim, hdim = first_frame.shape
4273
npixels = vdim*hdim
4374

4475
framediff_buffer = np.zeros((batch_size, npixels), dtype=dtype)
45-
XTX = np.zeros((npixels, npixels), dtype=np.float64)
76+
XTX = np.zeros((npixels, npixels), dtype=dtype)
4677
nframes = 0
4778

4879
if with_tqdm:
@@ -57,7 +88,8 @@ def pixbypix_covariance_from_frames_generator(data_generator,
5788
framediff_buffer *= 0.0 # clear buffer
5889
try:
5990
for batch_frame_idx in range(batch_size):
60-
frame_difference = data_generator.__next__().reshape(1, -1)
91+
frame_difference = next(data_generator).reshape(1, -1)
92+
6193
framediff_buffer[batch_frame_idx] = output_nonlinearity(frame_difference)
6294
except StopIteration:
6395
RUN = False
@@ -139,11 +171,14 @@ def __init__(self,
139171
video_file,
140172
size=None,
141173
nimages=np.inf,
142-
batch_size=100,
174+
batch_size=1000,
143175
output_nonlinearity=pointwise_square,
144-
dtype='float32'):
176+
dtype='float32',
177+
mask=None,
178+
):
145179
'''
146180
'''
181+
self.mask = mask
147182
self.size = size
148183
self.dtype = dtype
149184
self.nimages = nimages
@@ -159,6 +194,9 @@ def get_frame_difference_generator(self):
159194
generator = moten.io.generate_frame_difference_from_greyvideo(
160195
self.video_file, size=self.size, nimages=self.nimages, dtype=self.dtype)
161196

197+
if self.mask is not None:
198+
generator = moten.io.apply_mask(self.mask, generator)
199+
162200
return generator
163201

164202
def compute_pixel_by_pixel_covariance(self,
@@ -258,7 +296,7 @@ def compute_temporal_pcs(self, generator=None, skip_first=False):
258296
if skip_first:
259297
# drop the first frame b/c the difference is with 0's
260298
# and so projection is with itself
261-
generator.__next__()
299+
next(generator)
262300

263301
self.decomposition_temporal_pcs = []
264302
## TODO: batch for faster performance

moten/io.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,3 +297,36 @@ def load_image_luminance(image_files, hdim=None, vdim=None):
297297
stimulus = rgb2lab(stimulus/255.)[...,0]
298298
stimuli.append(stimulus)
299299
return np.asarray(stimuli)
300+
301+
302+
def apply_mask(mask, generator):
303+
'''
304+
Parameters
305+
----------
306+
mask : 2D np.ndarray
307+
generator : generator
308+
Yields a video frame
309+
310+
Yields
311+
------
312+
masked_image : 2D np.ndarray
313+
Masked image of each frame (i.e. ``original_image[mask]``)
314+
315+
Examples
316+
--------
317+
>>> import moten
318+
>>> video_file = 'http://anwarnunez.github.io/downloads/avsnr150s24fps_tiny.mp4'
319+
>>> small_size = (36, 64) # downsample to (vdim, hdim) 16:9 aspect ratio
320+
>>> oim = next(moten.io.generate_frame_difference_from_greyvideo(video_file, size=small_size))
321+
>>> mask = np.zeros(small_size, dtype=np.bool)
322+
>>> mask[16:, :40] = True
323+
>>> nim = next(moten.io.apply_mask(mask, moten.io.generate_frame_difference_from_greyvideo(video_file, size=small_size)))
324+
>>> np.allclose(oim[16:, :40], nim)
325+
'''
326+
assert mask.ndim == 2
327+
vshape = np.unique(mask.sum(0)).max()
328+
hshape = np.unique(mask.sum(1)).max()
329+
shape = (vshape, hshape)
330+
print('mask size:', shape)
331+
for im in generator:
332+
yield im[mask].reshape(shape)

0 commit comments

Comments
 (0)