VIT_ZSL 코드 분석 1부 데이터로더

이준석·2022년 6월 16일
0

VIT_ZSL

목록 보기
1/9

코드 있는 곳
VIT 참고

라이브로리 가져오기

import timm
import numpy as np
import matplotlib.pyplot as plt                        
import torch
import torchvision.models as models
import torch.nn as nn
import os,sys
import scipy.io as sio
import pdb
from time import time
from torch.utils.data import DataLoader
from sklearn.model_selection import train_test_split
from torch.utils.data import Dataset
from PIL import Image
from torchvision import transforms
from torch.utils.data import Dataset
import random
import torchvision.transforms.functional as TF
from tqdm.notebook import tqdm
from scipy import spatial
from scipy.special import softmax
import torch.nn.functional as F

Load Data

if DATASET == 'AWA2':
  ROOT='./data/AWA2/Animals_with_Attributes2/JPEGImages/'
elif DATASET == 'CUB':
  ROOT='./data/CUB/CUB_200_2011/CUB_200_2011/images/'
elif DATASET == 'SUN':
  ROOT='./data/SUN/images/'
else:
  print("Please specify the dataset")

데이터 셋 선택

DATA_DIR = f'./data/xlsa17/data/{DATASET}'
data = sio.loadmat(f'{DATA_DIR}/res101.mat') 
# data consists of files names 
attrs_mat = sio.loadmat(f'{DATA_DIR}/att_splits.mat')
# attrs_mat is the attributes (class-level information)
image_files = data['image_files']

데이터 위치

if DATASET == 'AWA2':
  image_files = np.array([im_f[0][0].split('JPEGImages/')[-1] for im_f in image_files])
else:
  image_files = np.array([im_f[0][0].split('images/')[-1] for im_f in image_files])

AWA2 만 데이터 다른 형식임

데이터 형식 확인

# labels are indexed from 1 as it was done in Matlab, so 1 subtracted for Python
labels = data['labels'].squeeze().astype(np.int64) - 1
train_idx = attrs_mat['train_loc'].squeeze() - 1
val_idx = attrs_mat['val_loc'].squeeze() - 1
trainval_idx = attrs_mat['trainval_loc'].squeeze() - 1
test_seen_idx = attrs_mat['test_seen_loc'].squeeze() - 1
test_unseen_idx = attrs_mat['test_unseen_loc'].squeeze() - 1

Matlab 형식과 파이썬 형식이 달라서 -1를 해서 순서를 맞춰줌
Labels : 레이블이 따로 되어 있어서 label에 가져와야 됨

  • Matlap 한번 확인하기

tain_idx, val_idx 형식으로 index 가져옴

  • rainval_idx : ?? 코드 분석후 체우기

test_seen, test_unseen : 나중에 GZSL 학습하기 위해 필요

# consider the train_labels and val_labels
train_labels = labels[train_idx]
val_labels = labels[val_idx]

label 에서 가져 온거 train_idx, val_idx 이용하여 train_label, val_label 에 배정함.

# split train_idx to train_idx (used for training) and val_seen_idx
train_idx, val_seen_idx = train_test_split(train_idx, test_size=0.2, stratify=train_labels)
# split val_idx to val_idx (not useful) and val_unseen_idx
val_unseen_idx = train_test_split(val_idx, test_size=0.2, stratify=val_labels)[1]
# attribute matrix
attrs_mat = attrs_mat["att"].astype(np.float32).T

사이킷 런을 이용해서 train_idx, val_seen_idx 로 나눔

stratify=train_label
stratify : train /validataion 유지, 데이터셋 균형 유지, 한쪽으로 몰리는거 방지

val_unseen_idx = train_test_split(val_idx, test_size=0.2, stratify=val_labels)[1]
[1] 의 의미는 train_test_split 썻을 때 val_unseen_idx 만 씀.

attrs_mat : 이용시 matlab의 "att" 만 이용함.

### used for validation
# train files and labels
train_files = image_files[train_idx]
train_labels = labels[train_idx]
uniq_train_labels, train_labels_based0, counts_train_labels = np.unique(train_labels, return_inverse=True, return_counts=True)
# val seen files and labels
val_seen_files = image_files[val_seen_idx]
val_seen_labels = labels[val_seen_idx]
uniq_val_seen_labels = np.unique(val_seen_labels)
# val unseen files and labels
val_unseen_files = image_files[val_unseen_idx]
val_unseen_labels = labels[val_unseen_idx]
uniq_val_unseen_labels = np.unique(val_unseen_labels)

matlab 파일이 이미 사진 이미지 순서랑 매칭이 된거라서 그냥 이렇게 이용해도 된다.

train_fiels, train_labels : 파일 업로드 준비 및 label 준비
uniq_train_labels, train_labels_based0, counts_train_labels = np.unique(train_labels, return_inverse=True, return_counts=True)

unique : 설명

np.unique : 주어진 numpy 배열의 모든 고유 값을 검색하고 이러한 고유 값을 정렬한다. 또한 np.unique 는 평면화된 입력 배열의 정렬된 고유 값을 반환한다.
return_index = True : 평탄화 된 입력 배열에서 정렬 된 고유 값 배열의 튜플과 각 고유 값의 첫번째 발생 인덱스 배열을 제공.
return_counts=True : 평면화 되 입력 배열에서 정렬된 고유 값 배열의 튜플과 입력 배열에 각 고유 값의 개수 배렬을 제공.
return_inverse = True : 평면화된 입력 배열에서 정렬된 고유 값 배열의 튜플과 고유 배열의 인덱스 배열을 제공

val seen files and labels, val unseen files and labels 동일


### used for testing
# trainval files and labels
trainval_files = image_files[trainval_idx]
trainval_labels = labels[trainval_idx]
uniq_trainval_labels, trainval_labels_based0, counts_trainval_labels = np.unique(trainval_labels, return_inverse=True, return_counts=True)
# test seen files and labels
test_seen_files = image_files[test_seen_idx]
test_seen_labels = labels[test_seen_idx]
uniq_test_seen_labels = np.unique(test_seen_labels)
# test unseen files and labels
test_unseen_files = image_files[test_unseen_idx]
test_unseen_labels = labels[test_unseen_idx]
uniq_test_unseen_labels = np.unique(test_unseen_labels)

위와 동일

profile
인공지능 전문가가 될레요

0개의 댓글