Ejemplo n.º 1
0
def load_data():
    import cv2
    from zca import ZCA
    zca = ZCA()

    # load dataset
    dataset = np.load('dataset/{}.npy'.format(dataset_name)).item()
    data = dataset['data']
    data_map = dataset['label']
    global nch, ncls
    nch = data.shape[2]
    ncls = len(np.unique(data_map)) - 1

    # partition the training and test data
    train_coord = np.empty(
        (0, 2)).astype(np.int8)  # coordinates of the training data
    test_coord = np.empty(
        (0, 2)).astype(np.int8)  # coordinates of the test data
    for cls in range(ncls):
        coord_class = np.transpose(np.nonzero(data_map == cls + 1))
        rng.shuffle(coord_class)
        # count = int(np.round(len(coord_class) * percent))
        samples_per_class = count
        train_coord = np.concatenate(
            (train_coord, coord_class[:samples_per_class]))
        test_coord = np.concatenate(
            (test_coord, coord_class[samples_per_class:]))
    rng.shuffle(train_coord)
    rng.shuffle(test_coord)
    print(train_coord.shape, test_coord.shape)
    train_map = np.zeros_like(data_map)
    test_map = np.zeros_like(data_map)
    for i in range(train_coord.shape[0]):
        train_map[train_coord[i, 0],
                  train_coord[i, 1]] = data_map[train_coord[i, 0],
                                                train_coord[i, 1]]
    for i in range(test_coord.shape[0]):
        test_map[test_coord[i, 0],
                 test_coord[i, 1]] = data_map[test_coord[i, 0], test_coord[i,
                                                                           1]]

    # data preprocessin
    data = (
        (data - np.min(data[train_map != 0])) /
        np.max(data[train_map != 0] - np.min(data[train_map != 0])) - 0.5) * 2
    zca.fit(data[train_map != 0])
    data = zca.transform(data.reshape(-1,
                                      nch)).reshape(data.shape[0],
                                                    data.shape[1],
                                                    data.shape[2])

    # padding the HSI scene and the label map
    data = cv2.copyMakeBorder(data, patch_size // 2, patch_size // 2,
                              patch_size // 2, patch_size // 2,
                              cv2.BORDER_REPLICATE)
    train_map = cv2.copyMakeBorder(train_map, patch_size // 2, patch_size // 2,
                                   patch_size // 2, patch_size // 2,
                                   cv2.BORDER_REPLICATE)
    test_map = cv2.copyMakeBorder(test_map, patch_size // 2, patch_size // 2,
                                  patch_size // 2, patch_size // 2,
                                  cv2.BORDER_REPLICATE)

    train_coord += patch_size // 2
    test_coord += patch_size // 2
    return data, train_map, train_coord, test_map, test_coord