Nadine Rueegg
initial commit for barc
7629b39
raw
history blame
3.99 kB
import os
from matplotlib import pyplot as plt
import glob
import json
import numpy as np
from scipy.io import loadmat
from csv import DictReader
from collections import OrderedDict
from pycocotools.mask import decode as decode_RLE
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..'))
from configs.dataset_path_configs import IMG_V12_DIR, JSON_V12_DIR, STAN_V12_TRAIN_LIST_DIR, STAN_V12_VAL_LIST_DIR, STAN_V12_TEST_LIST_DIR
def get_img_dir(V12):
if V12:
return IMG_V12_DIR
else:
return IMG_DIR
def get_seg_from_entry(entry):
"""Given a .json entry, returns the binary mask as a numpy array"""
rle = {
"size": [entry['img_height'], entry['img_width']],
"counts": entry['seg']}
decoded = decode_RLE(rle)
return decoded
def full_animal_visible(seg_data):
if seg_data[0, :].sum() == 0 and seg_data[seg_data.shape[0]-1, :].sum() == 0 and seg_data[:, 0].sum() == 0 and seg_data[:, seg_data.shape[1]-1].sum() == 0:
return True
else:
return False
def load_train_and_test_lists(train_list_dir=None , test_list_dir=None):
""" returns sets containing names such as 'n02085620-Chihuahua/n02085620_5927.jpg' """
# train data
train_list_mat = loadmat(train_list_dir)
train_list = []
for ind in range(0, train_list_mat['file_list'].shape[0]):
name = train_list_mat['file_list'][ind, 0][0]
train_list.append(name)
# test data
test_list_mat = loadmat(test_list_dir)
test_list = []
for ind in range(0, test_list_mat['file_list'].shape[0]):
name = test_list_mat['file_list'][ind, 0][0]
test_list.append(name)
return train_list, test_list
def _filter_dict(t_list, j_dict, n_kp_min=4):
""" should only be used by load_stanext_json_as_dict() """
out_dict = {}
for sample in t_list:
if sample in j_dict.keys():
n_kp = np.asarray(j_dict[sample]['joints'])[:, 2].sum()
if n_kp >= n_kp_min:
out_dict[sample] = j_dict[sample]
return out_dict
def load_stanext_json_as_dict(split_train_test=True, V12=True):
# load json into memory
if V12:
with open(JSON_V12_DIR) as infile:
json_data = json.load(infile)
# with open(JSON_V12_DIR) as infile: json_data = json.load(infile, object_pairs_hook=OrderedDict)
else:
with open(JSON_DIR) as infile:
json_data = json.load(infile)
# convert json data to a dictionary of img_path : all_data, for easy lookup
json_dict = {i['img_path']: i for i in json_data}
if split_train_test:
if V12:
train_list_numbers = np.load(STAN_V12_TRAIN_LIST_DIR)
val_list_numbers = np.load(STAN_V12_VAL_LIST_DIR)
test_list_numbers = np.load(STAN_V12_TEST_LIST_DIR)
train_list = [json_data[i]['img_path'] for i in train_list_numbers]
val_list = [json_data[i]['img_path'] for i in val_list_numbers]
test_list = [json_data[i]['img_path'] for i in test_list_numbers]
train_dict = _filter_dict(train_list, json_dict, n_kp_min=4)
val_dict = _filter_dict(val_list, json_dict, n_kp_min=4)
test_dict = _filter_dict(test_list, json_dict, n_kp_min=4)
return train_dict, test_dict, val_dict
else:
train_list, test_list = load_train_and_test_lists(train_list_dir=STAN_ORIG_TRAIN_LIST_DIR , test_list_dir=STAN_ORIG_TEST_LIST_DIR)
train_dict = _filter_dict(train_list, json_dict)
test_dict = _filter_dict(test_list, json_dict)
return train_dict, test_dict, None
else:
return json_dict
def get_dog(json_dict, name, img_dir=None): # (json_dict, name, img_dir=IMG_DIR)
""" takes the name of a dog, and loads in all the relevant information as a dictionary:
dict_keys(['img_path', 'img_width', 'img_height', 'joints', 'img_bbox',
'is_multiple_dogs', 'seg', 'img_data', 'seg_data'])
img_bbox: [x0, y0, width, height] """
data = json_dict[name]
# load img
img_data = plt.imread(os.path.join(img_dir, data['img_path']))
# load seg
seg_data = get_seg_from_entry(data)
# add to output
data['img_data'] = img_data # 0 to 255
data['seg_data'] = seg_data # 0: bg, 1: fg
return data