File size: 3,920 Bytes
21aecfa
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import os
import os.path
import torch
import numpy as np
import pandas
from glob import glob
import random
from collections import OrderedDict
import cv2
import numpy as np

def X2Cube(img, cellSize=4):

    B = [cellSize, cellSize]
    skip = [cellSize, cellSize]
    # Parameters
    M, N = img.shape
    col_extent = N - B[1] + 1
    row_extent = M - B[0] + 1

    # Get Starting block indices
    start_idx = np.arange(B[0])[:, None] * N + np.arange(B[1])

    # Generate Depth indeces
    didx = M * N * np.arange(1)
    start_idx = (didx[:, None] + start_idx.ravel()).reshape((-1, B[0], B[1]))

    # Get offsetted indices across the height and width of input array
    offset_idx = np.arange(row_extent)[:, None] * N + np.arange(col_extent)

    # Get all actual indices & index into input array for final output
    out = np.take(img, start_idx.ravel()[:, None] + offset_idx[::skip[0], ::skip[1]].ravel())
    out = np.transpose(out)
    DataCube = out.reshape(M//cellSize, N//cellSize, cellSize*cellSize)

    hsi_min = np.min(DataCube, axis=(0,1), keepdims=True)
    hsi_max = np.max(DataCube, axis=(0,1), keepdims=True)
    hsi_normed = (DataCube - hsi_min) / ((hsi_max - hsi_min) + 1e-6) * 255
    hsi_normed = hsi_normed.astype(np.uint8)
    return hsi_normed


def X2Cube_fast(img, cellSize=4):
    M, N = img.shape
    if (M % cellSize) != 0 or (N % cellSize) != 0:
        raise ValueError(f"Image shape {(M, N)} must be divisible by cellSize {cellSize}")

    cubes = (
        img.reshape(M // cellSize, cellSize, N // cellSize, cellSize)
        .swapaxes(1, 2)
        .reshape(M // cellSize, N // cellSize, cellSize * cellSize)
    )

    hsi_min = np.min(cubes, axis=(0, 1), keepdims=True)
    hsi_max = np.max(cubes, axis=(0, 1), keepdims=True)
    hsi_normed = (cubes - hsi_min) / ((hsi_max - hsi_min) + 1e-6) * 255
    return hsi_normed.astype(np.uint8)


def get_image_loader(img_file: str, cellSize=-1) -> np.array:
    if cellSize > 0:
        img = cv2.imread(img_file, cv2.IMREAD_ANYCOLOR | cv2.IMREAD_ANYDEPTH)
        img = X2Cube(img, cellSize)
    elif cellSize == -1:
        img = cv2.imread(img_file, cv2.IMREAD_COLOR)
    else:
        raise Exception
    return img


def _get_frames(self, seq_id, frame_ids):
    frame_list = []
    for frame_id in frame_ids:
        frame_name = '%04d.png' % (frame_id+1)
        image_path = os.path.join(self.RGBHDataRootDir, self.sequence_list[seq_id], 'img', frame_name)
        if self.cur_modalName == 'NIR':
            hsi_image = self.get_image_loader(image_path, cellSize=5)
        elif self.cur_modalName == 'VIS':
            hsi_image = self.get_image_loader(image_path, cellSize=4)
        elif self.cur_modalName == 'RedNIR':
            hsi_image = self.get_image_loader(image_path, cellSize=4)
            hsi_image = hsi_image[:,:,:-1]

        frame_name = '%04d.jpg' % (frame_id+1)

        image_path = os.path.join(self.RGBHDataRootDir.replace('HSI-'+self.cur_modalName, 'HSI-'+self.cur_modalName+'-FalseColor'), self.sequence_list[seq_id], 'img', frame_name)
        hsi_fc_image = self.get_image_loader(image_path, cellSize=-1)
        frame_list.append(np.concatenate((hsi_fc_image, hsi_image), axis=2))

    return frame_list 


def get_frames(self, seq_id, frame_ids, anno=None):
    frame_list = self._get_frames(seq_id, frame_ids)

    if anno is None:
        anno = self.get_sequence_info(seq_id)

    anno_frames = {}
    for key, value in anno.items():
        if key == 'seq_belong_mask':
            continue
        anno_frames[key] = [value[f_id, ...].clone() for f_id in frame_ids]

    object_meta = OrderedDict({'object_class_name': None,
                                'motion_class': None,
                                'major_class': None,
                                'root_class': None,
                                'motion_adverb': None})

    return frame_list, anno_frames, object_meta