philippendres's picture
Upload folder using huggingface_hub
907462b verified
Raw
History Blame Contribute Delete
2.78 kB
from pathlib import Path
import pickle
import random
import numpy as np
import json
import cv2
from copy import deepcopy
from isegm.data.base import ISDataset
from isegm.data.sample import DSample
class CocoLvisDataset(ISDataset):
def __init__(self, dataset_path, split='train', stuff_prob=0.0,
allow_list_name=None, anno_file='hannotation.pickle', **kwargs):
super(CocoLvisDataset, self).__init__(**kwargs)
dataset_path = Path(dataset_path)
self._split_path = dataset_path / split
self.split = split
self._images_path = self._split_path / 'images'
self._masks_path = self._split_path / 'masks'
self.stuff_prob = stuff_prob
with open(self._split_path / anno_file, 'rb') as f:
self.dataset_samples = sorted(pickle.load(f).items())
if allow_list_name is not None:
allow_list_path = self._split_path / allow_list_name
with open(allow_list_path, 'r') as f:
allow_images_ids = json.load(f)
allow_images_ids = set(allow_images_ids)
self.dataset_samples = [sample for sample in self.dataset_samples
if sample[0] in allow_images_ids]
def get_sample(self, index) -> DSample:
image_id, sample = self.dataset_samples[index]
image_path = self._images_path / f'{image_id}.jpg'
image = cv2.imread(str(image_path))
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
packed_masks_path = self._masks_path / f'{image_id}.pickle'
with open(packed_masks_path, 'rb') as f:
encoded_layers, objs_mapping = pickle.load(f)
layers = [cv2.imdecode(x, cv2.IMREAD_UNCHANGED) for x in encoded_layers]
layers = np.stack(layers, axis=2)
instances_info = deepcopy(sample['hierarchy'])
for inst_id, inst_info in list(instances_info.items()):
if inst_info is None:
inst_info = {'children': [], 'parent': None, 'node_level': 0}
instances_info[inst_id] = inst_info
inst_info['mapping'] = objs_mapping[inst_id]
if self.stuff_prob > 0 and random.random() < self.stuff_prob:
for inst_id in range(sample['num_instance_masks'], len(objs_mapping)):
instances_info[inst_id] = {
'mapping': objs_mapping[inst_id],
'parent': None,
'children': []
}
else:
for inst_id in range(sample['num_instance_masks'], len(objs_mapping)):
layer_indx, mask_id = objs_mapping[inst_id]
layers[:, :, layer_indx][layers[:, :, layer_indx] == mask_id] = 0
return DSample(image, layers, objects=instances_info)