def loadvideo_decord(self, sample, sample_rate_scale=1): """Load video content using Decord""" # pylint: disable=line-too-long, bare-except, unnecessary-comprehension fname = self.data_path + sample if not (os.path.exists(fname)): return [] # avoid hanging issue if os.path.getsize(fname) < 1 * 1024: print('SKIP: ', fname, " - ", os.path.getsize(fname)) return [] try: if self.keep_aspect_ratio: vr = VideoReader(fname, num_threads=1, ctx=cpu(0)) else: vr = VideoReader(fname, width=self.new_width, height=self.new_height, num_threads=1, ctx=cpu(0)) except: print("video cannot be loaded by decord: ", fname) return [] if self.mode == 'test': all_index = [x for x in range(0, len(vr), self.frame_sample_rate)] while len(all_index) < self.clip_len: all_index.append(all_index[-1]) vr.seek(0) buffer = vr.get_batch(all_index).asnumpy() return buffer # handle temporal segments converted_len = int(self.clip_len * self.frame_sample_rate) seg_len = len(vr) // self.num_segment all_index = [] for i in range(self.num_segment): if seg_len <= converted_len: index = np.linspace(0, seg_len, num=seg_len // self.frame_sample_rate) index = np.concatenate( (index, np.ones(self.clip_len - seg_len // self.frame_sample_rate) * seg_len)) index = np.clip(index, 0, seg_len - 1).astype(np.int64) else: end_idx = np.random.randint(converted_len, seg_len) str_idx = end_idx - converted_len index = np.linspace(str_idx, end_idx, num=self.clip_len) index = np.clip(index, str_idx, end_idx - 1).astype(np.int64) index = index + i * seg_len all_index.extend(list(index)) all_index = all_index[::int(sample_rate_scale)] vr.seek(0) buffer = vr.get_batch(all_index).asnumpy() return buffer
shuffle=1) ex = vl.next() vr = VideoReader(path, ctx=cpu(0)) # a file like object works as well, for in-memory decoding with open(path, 'rb') as f: vr = VideoReader(f, ctx=cpu(0)) print('video frames:', len(vr)) # 1. the simplest way is to directly access frames for i in range(len(vr)): # the video reader will handle seeking and skipping in the most efficient manner frame = vr[i] print(frame.shape) # To get multiple frames at once, use get_batch # this is the efficient way to obtain a long list of frames frames = vr.get_batch([1, 3, 5, 7, 9]) print(frames.shape) # (5, 240, 320, 3) # duplicate frame indices will be accepted and handled internally to avoid duplicate decoding frames2 = vr.get_batch([1, 2, 3, 2, 3, 4, 3, 4, 5]) print(frames2.shape) # (9, 240, 320, 3) # 2. you can do cv2 style reading as well # skip 100 frames vr.skip_frames(100) # seek to start vr.seek(0) batch = vr.next() print('frame shape:', batch.shape)
def loadvideo_decord(self, sample, sample_rate_scale=1): """Load video content using Decord""" # pylint: disable=line-too-long, bare-except, unnecessary-comprehension fname = self.data_path + sample if not (os.path.exists(fname)): return [] # avoid hanging issue if os.path.getsize(fname) < 1 * 1024: print('SKIP: ', fname, " - ", os.path.getsize(fname)) return [] try: if self.keep_aspect_ratio: vr = VideoReader(fname, num_threads=1, ctx=cpu(0)) else: vr = VideoReader(fname, width=self.new_width, height=self.new_height, num_threads=1, ctx=cpu(0)) except: print("video cannot be loaded by decord: ", fname) return [] if self.mode == 'test': all_index = [x for x in range(0, len(vr), self.frame_sample_rate)] while len(all_index) < self.clip_len: all_index.append(all_index[-1]) vr.seek(0) buffer = vr.get_batch(all_index).asnumpy() return buffer # handle temporal segments converted_len = int(self.clip_len * self.frame_sample_rate) seg_len = len(vr) // self.num_segment all_index = [] for i in range(self.num_segment): if seg_len <= converted_len: index = list(range(1, seg_len))[::self.frame_sample_rate] diff = self.clip_len - len(index) if diff > 0: temp = int(seg_len / 2) for j in range(diff): while (temp in index): temp += 1 index.append(temp) if temp >= seg_len: temp = 0 index.sort() '''if len(index) == self.clip_len: print('success') else: print('no')''' # index = np.linspace(0, seg_len, num=seg_len // self.frame_sample_rate) # index = np.concatenate((index, np.ones(self.clip_len - seg_len // self.frame_sample_rate) * seg_len)) # index = np.clip(index, 0, seg_len - 1).astype(np.int64) # elif seg_len == self.clip_len: # index = list(range(seg_len)) else: index = list(range(1, seg_len))[::self.frame_sample_rate] diff = len(index) - self.clip_len if diff > 0: front = 0 back = seg_len - 1 start_front = True for j in range(diff): if start_front: while (front not in index): front += 1 index.remove(front) start_front = False else: while (back not in index): back -= 1 index.remove(back) start_front = True index.sort() '''if len(index) == self.clip_len: print('success') else: print('no')''' # end_idx = np.random.randint(converted_len, seg_len) # str_idx = end_idx - converted_len # index = np.linspace(str_idx, end_idx, num=self.clip_len) # index = np.clip(index, str_idx, end_idx - 1).astype(np.int64) index = np.array(index) + i * seg_len # print(len(index)) all_index.extend(list(index)) all_index = all_index[::int(sample_rate_scale)] vr.seek(0) if all_index[-1] >= seg_len: print(all_index) # print('error') t = 0 while (t in all_index): t += 1 if t == seg_len: t = int(seg_len / 2) break all_index[-1] = t all_index.sort() print(all_index) print(fname) print(len(all_index)) print(seg_len) buffer = vr.get_batch(all_index).asnumpy() return buffer