Spaces:
Sleeping
Sleeping
# coding=utf-8 | |
# Copyleft 2019 Project LXRT | |
import sys | |
import csv | |
import base64 | |
import time | |
import numpy as np | |
csv.field_size_limit(sys.maxsize) | |
FIELDNAMES = ["img_id", "img_h", "img_w", "objects_id", "objects_conf", | |
"attrs_id", "attrs_conf", "num_boxes", "boxes", "features"] | |
def load_obj_tsv(fname, topk=None): | |
"""Load object features from tsv file. | |
:param fname: The path to the tsv file. | |
:param topk: Only load features for top K images (lines) in the tsv file. | |
Will load all the features if topk is either -1 or None. | |
:return: A list of image object features where each feature is a dict. | |
See FILENAMES above for the keys in the feature dict. | |
""" | |
data = [] | |
start_time = time.time() | |
print("Start to load Faster-RCNN detected objects from %s" % fname) | |
with open(fname) as f: | |
reader = csv.DictReader(f, FIELDNAMES, delimiter="\t") | |
for i, item in enumerate(reader): | |
for key in ['img_h', 'img_w', 'num_boxes']: | |
item[key] = int(item[key]) | |
boxes = item['num_boxes'] | |
decode_config = [ | |
('objects_id', (boxes, ), np.int64), | |
('objects_conf', (boxes, ), np.float32), | |
('attrs_id', (boxes, ), np.int64), | |
('attrs_conf', (boxes, ), np.float32), | |
('boxes', (boxes, 4), np.float32), | |
('features', (boxes, -1), np.float32), | |
] | |
for key, shape, dtype in decode_config: | |
item[key] = np.frombuffer(base64.b64decode(item[key]), dtype=dtype) | |
item[key] = item[key].reshape(shape) | |
item[key].setflags(write=False) | |
data.append(item) | |
if topk is not None and len(data) == topk: | |
break | |
elapsed_time = time.time() - start_time | |
print("Loaded %d images in file %s in %d seconds." % (len(data), fname, elapsed_time)) | |
return data | |