Exemplo n.º 1
0
    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)
Exemplo n.º 3
0
    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