in eft/datasets/base_dataset.py [0:0]
def __init__(self, options, dataset, ignore_3d=False, use_augmentation=True, is_train=True, bMiniTest=False, bEnforceUpperOnly= False):
super(BaseDataset, self).__init__()
self.datasetName = dataset
self.is_train = is_train
self.options = options
self.img_dir = config.DATASET_FOLDERS[dataset]
self.normalize_img = Normalize(mean=constants.IMG_NORM_MEAN, std=constants.IMG_NORM_STD)
#Upper body only test
self.bEnforceUpperOnly = False
if bEnforceUpperOnly or (self.options is not None and self.options.extCrop_bEnforceUpperBody):
print(">> Enforcing Upper body Crop always!!!!!!!!!!!!!!!!")
self.bEnforceUpperOnly = True
if options is not None:
if dataset=='coco3d' and options.db_coco3d_name is not None :
config.SetDBName(dataset, options.db_coco3d_name)
if dataset=='cocoall3d' and options.db_cocoall3d_name is not None :
config.SetDBName(dataset, options.db_cocoall3d_name)
if dataset=='mpii3d' and options.db_mpii3d_name is not None:
config.SetDBName(dataset, options.db_mpii3d_name)
if dataset=='lspet3d'and options.db_lspet3d_name is not None:
config.SetDBName(dataset, options.db_lspet3d_name)
if dataset=='posetrack3d' and options.db_posetrack3d_name is not None:
config.SetDBName(dataset, options.db_posetrack3d_name)
# if dataset=='cocoplus3d' and options.db_cocoplus3d_name is not None:
# config.SetDBName(dataset, options.db_cocoplus3d_name)
# self.data = np.load(config.DATASET_FILES[is_train][dataset])
self.data = np.load(config.DATASET_FILES[is_train][dataset],allow_pickle=True) #For multibbox
"""
The folling should have the same length
self.imgname
self.annotIds
self.scale
self.center
self.pose
self.keypoints
self.gender
self.has_smpl
self.maskname
self.partname
self.trackIds
This should reset: self.length
"""
self.imgname = self.data['imgname']
#COCO and Pose Track only
self.annotIds = None
if 'annotIds' in self.data.files:
self.annotIds = self.data['annotIds']
assert len(self.imgname)==len(self.annotIds)
#Sequence data only
self.subjectIds = None
if 'subjectid' in self.data.files:
# assert False #Old code... to know when this was used
# self.subjectIds = self.data['subjectid']
self.subjectIds = self.data['subjectid']
if 'subjectIds' in self.data.files:
self.subjectIds = self.data['subjectIds']
assert len(self.imgname)==len(self.subjectIds)
print(">>> BaseDataset:: Loading DB {}: {} samples: from {}".format(self.datasetName, len(self.imgname), config.DATASET_FILES[is_train][dataset]))
# Get paths to gt masks, if available
try:
self.maskname = self.data['maskname']
except KeyError:
pass
try:
self.partname = self.data['partname']
except KeyError:
pass
# Bounding boxes are assumed to be in the center and scale format
self.scale = self.data['scale']
self.center = self.data['center']
try:
self.cam_param = self.data['cam_param'] #Newrly added to check reprojection error
except KeyError:
pass
# If False, do not do augmentation
self.use_augmentation = use_augmentation
# Get gt SMPL parameters, if available
try:
self.pose = self.data['pose'].astype(np.float)
self.betas = self.data['shape'].astype(np.float)
if 'has_smpl' in self.data:
self.has_smpl = self.data['has_smpl']
else:
self.has_smpl = np.ones(len(self.imgname))
except KeyError:
self.has_smpl = np.zeros(len(self.imgname))
if ignore_3d:
self.has_smpl = np.zeros(len(self.imgname))
# Get gt 3D pose, if available
try:
self.pose_3d = self.data['S']
self.has_pose_3d = 1
except KeyError:
self.has_pose_3d = 0
if ignore_3d:
self.has_pose_3d = 0
# Get 2D keypoints
try:
keypoints_gt = self.data['part']
except KeyError:
keypoints_gt = np.zeros((len(self.imgname), 24, 3))
try:
keypoints_openpose = self.data['openpose']
except KeyError:
keypoints_openpose = np.zeros((len(self.imgname), 25, 3))
self.keypoints = np.concatenate([keypoints_openpose, keypoints_gt], axis=1)
# Get 2D hand keypoint (openpose order)
try:
self.kp_leftHand_gt = self.data['kp_leftHand']
except KeyError:
self.kp_leftHand_gt = None
try:
self.kp_rightHand_gt = self.data['kp_rightHand']
except KeyError:
self.kp_rightHand_gt = None
# Get 2D face keypoint (openpose order)
# Get hand data, if available... This if from 3D hand (e.g., Panoptic DB)
if self.options is not None and self.options.bUseHand3D:
try:
#Out dated
# self.rhand_2d = self.data['rhand_2d']
# self.lhand_2d = self.data['lhand_2d']
self.rhand_3d = self.data['rhand_3d']
self.lhand_3d = self.data['lhand_3d']
except KeyError:
pass
# Get gender data, if available
try:
gender = self.data['gender']
self.gender = np.array([0 if str(g) == 'm' else 1 for g in gender]).astype(np.int32)
except KeyError:
self.gender = -1*np.ones(len(self.imgname)).astype(np.int32)
self.length = self.scale.shape[0]
self.bLoadImage = True
#Multi-level bbox
# try:
# self.multilevel_cropinfo = self.data['multibbox']
# except KeyError:
# self.multilevel_cropinfo = None
if 'multibbox' in self.data.keys():
self.multilevel_cropinfo = self.data['multibbox']
print(f"Loading multilevel bbox crop info: {dataset}")
else:
self.multilevel_cropinfo = None
print(f"No multilevel bbox crop info: {dataset}")
# if self.is_train and (self.options.multilevel_crop>=0 or self.options.multilevel_crop_rand):
# assert self.multilevel_cropinfo is not None
# if self.options.multilevel_crop >=0:
# self.bMultiLevelCrop = True
# self.bMultiLevelCrop_level = self.options.multilevel_crop
if self.bEnforceUpperOnly or (self.options is not None and self.options.bUpperBodyTest):
scaleFactor = 1.2
self.scale_upperbody = np.zeros(self.scale.shape)
self.center_upperbody = np.zeros(self.center.shape)
for i in range(self.keypoints.shape[0]):
validity = self.keypoints[i,25:,2]==1 #(N, 24)
# validity[ [0,1,2,3,4,5]] = False #Disable lower bodies
validity[ [0,1,4,5]] = False #Disable lower bodies
if np.sum(validity)>=3:
min_pt = np.min(self.keypoints[i,25:,:2][validity], axis=0)
max_pt = np.max(self.keypoints[i,25:,:2][validity], axis=0)
# bbox= [ min_pt[0], min_pt[1], max_pt[0], max_pt[1] ]
bbox= [ min_pt[0], min_pt[1], max_pt[0] - min_pt[0], max_pt[1] - min_pt[1]]
center = [bbox[0] + bbox[2]/2, bbox[1] + bbox[3]/2]
scale = scaleFactor*max(bbox[2], bbox[3])/200
self.center_upperbody[i]= center
self.scale_upperbody[i]= scale
else:
# self.center_upperbody[i]= [0,0]
self.scale_upperbody[i]= -1 #Garbage should be ignored
self.center_facePart = np.zeros(self.center.shape)
self.scale_facePart = np.zeros(self.scale.shape) #More extreme case
for i in range(self.keypoints.shape[0]):
validity = self.keypoints[i,25:,2]==1 #(N, 24)
validity[ [0,1,2,3,4,5,1,14, 6,11 ]] = False #Disable, even hand, arms. Only consider shoulders
if np.sum(validity)>=3:
min_pt = np.min(self.keypoints[i,25:,:2][validity], axis=0)
max_pt = np.max(self.keypoints[i,25:,:2][validity], axis=0)
# bbox= [ min_pt[0], min_pt[1], max_pt[0], max_pt[1] ]
bbox= [ min_pt[0], min_pt[1], max_pt[0] - min_pt[0], max_pt[1] - min_pt[1]]
center = [bbox[0] + bbox[2]/2, bbox[1] + bbox[3]/2]
scale = scaleFactor*max(bbox[2], bbox[3])/200
self.center_facePart[i]= center
self.scale_facePart[i]= scale
else:
# self.center_upperbody[i]= [0,0]
self.scale_facePart[i]= -1 #Garbage should be ignored
if bMiniTest: #Sampling to 1/10 size
# validIdx = range(0,len(self.imgname),10)
if self.options.bExemplar_badsample_finder:
validIdx = range(0,len(self.imgname),100)
else:
validIdx = range(0,len(self.imgname),10)
print(">>> Debug: sampling originalSize {} -> miniSize {}".format(len(self.imgname), len(validIdx)))
self.imgname = self.imgname[validIdx]
try:
self.pose = self.pose[validIdx]
except:
pass
try:
self.betas = self.betas[validIdx]
except:
pass
try:
self.pose_3d = self.pose_3d[validIdx]
except:
pass
try:
self.keypoints = self.keypoints [validIdx]
except:
pass
try:
self.keypoints = self.keypoints [validIdx]
except:
pass
try:
self.scale_upperbody = self.scale_upperbody[validIdx]
except:
pass
try:
self.center_upperbody = self.center_upperbody[validIdx]
except:
pass
# try:
# self.scale_facePart = self.scale_facePart[validIdx]
# except:
# pass
# try:
# self.center_facePart = self.center_facePart[validIdx]
# except:
# pass
self.has_smpl = self.has_smpl[validIdx]
# self.has_pose_3d = self.has_pose_3d[validIdx]
self.scale =self.scale[validIdx]
self.center= self.center[validIdx]
self.gender= self.gender[validIdx]
if self.annotIds is not None:
self.annotIds = self.annotIds[validIdx]
test_3dpw = False
if test_3dpw:
#3DPW test
# validIdx = range(0,len(self.imgname),10)
validIdx =[]
for i, n in enumerate(self.imgname):
if 'downtown_upstairs_00' in n:
validIdx.append(i)
print(">>> Debug: sampling originalSize {} -> miniSize {}".format(len(self.imgname), len(validIdx)))
self.imgname = self.imgname[validIdx]
try:
self.pose = self.pose[validIdx]
except:
pass
try:
self.betas = self.betas[validIdx]
except:
pass
try:
self.pose_3d = self.pose_3d[validIdx]
except:
pass
try:
self.keypoints = self.keypoints [validIdx]
except:
pass
try:
self.keypoints = self.keypoints [validIdx]
except:
pass
try:
self.scale_upperbody = self.scale_upperbody[validIdx]
except:
pass
try:
self.center_upperbody = self.center_upperbody[validIdx]
except:
pass
self.has_smpl = self.has_smpl[validIdx]
# self.has_pose_3d = self.has_pose_3d[validIdx]
self.scale =self.scale[validIdx]
self.center= self.center[validIdx]
self.gender= self.gender[validIdx]
if self.annotIds is not None:
self.annotIds = self.annotIds[validIdx]
#Debug: choose specific range to run paralle (training code only)
if self.options is not None and\
is_train == True and\
self.options.bExemplar_dataLoaderStart >=0:# and self.options.bExemplar_dataLoaderEnd >=0:
startIdx = self.options.bExemplar_dataLoaderStart
print(">> {}".format( len(self.imgname)))
if self.options.bExemplar_dataLoaderEnd>=0:
endIdx = min( self.options.bExemplar_dataLoaderEnd, len(self.imgname))
else:
endIdx = len(self.imgname)
#Run only from bExemplar_dataLoaderStart ~ bExemplar_dataLoaderEnd
validIdx = range(startIdx,endIdx)
print(validIdx)
self.imgname = self.imgname[validIdx]
try:
self.pose = self.pose[validIdx]
except:
pass
try:
self.betas = self.betas[validIdx]
except:
pass
try:
self.pose_3d = self.pose_3d[validIdx]
except:
pass
try:
self.multilevel_cropinfo = self.multilevel_cropinfo[validIdx]
except:
pass
#Hand part (outdated)
# try:
# self.rhand_2d = self.rhand_2d[validIdx]
# except:
# pass
# try:
# self.lhand_2d = self.lhand_2d[validIdx]
# except:
# pass
try:
self.rhand_3d = self.rhand_3d[validIdx]
except:
pass
try:
self.lhand_3d = self.lhand_3d[validIdx]
except:
pass
# self.has_pose_3d = self.has_pose_3d[validIdx]
self.keypoints = self.keypoints [validIdx]
self.has_smpl = self.has_smpl[validIdx]
self.scale =self.scale[validIdx]
self.center= self.center[validIdx]
self.gender= self.gender[validIdx]
#Cam_param for EFT dataset only
try:
self.cam_param = self.cam_param[validIdx]
except:
pass
#COCO Whole Keypoint DB
try:
self.kp_leftHand_gt = self.kp_leftHand_gt[validIdx]
except:
pass
try:
self.kp_rightHand_gt = self.kp_rightHand_gt[validIdx]
except:
pass
if self.annotIds is not None: #bug fixed
self.annotIds = self.annotIds[validIdx]
if self.subjectIds is not None: #bug fixed
self.subjectIds = self.subjectIds[validIdx]
# self.dataset= self.dataset[validIdx]
# item['maskname'] = self.maskname[index]
# item['partname'] = ''
print("Selected IDx: {} - {}. Total number {}".format(startIdx, endIdx, self.__len__()))
#Debug: choose specific sequence
if False:
# seqName ='office_phoneCall_00'
seqName ='downtown'
validIdx =[]
for i in range(len(self.imgname)):
if seqName in self.imgname[i]:
validIdx.append(i)
self.imgname = self.imgname[validIdx]
self.pose = self.pose[validIdx]
self.betas = self.betas[validIdx]
# self.pose_3d = self.pose_3d[validIdx]
self.keypoints = self.keypoints [validIdx]
self.has_smpl = self.has_smpl[validIdx]
# self.has_pose_3d = self.has_pose_3d[validIdx]
self.scale =self.scale[validIdx]
self.center= self.center[validIdx]
self.gender= self.gender[validIdx]
# self.dataset= self.dataset[validIdx]
# item['maskname'] = self.maskname[index]
# item['partname'] = ''
#Check
dbLeng = len(self.imgname)
self.length = dbLeng
assert(dbLeng==len(self.scale)==len(self.center)==len(self.keypoints)==len(self.gender)==len(self.has_smpl))
if self.annotIds is not None: #Bug fixed
dbLeng = len(self.annotIds)
if hasattr(self,'subjectIds'): #Bug fixed
if self.subjectIds is not None:
assert(dbLeng ==len(self.subjectIds))
if hasattr(self,'cam_param'):
assert(dbLeng ==len(self.cam_param))
if hasattr(self,'pose'):
assert(dbLeng ==len(self.pose))
if hasattr(self,'betas'):
assert(dbLeng ==len(self.betas))
if hasattr(self,'pose_3d'):
assert(dbLeng ==len(self.pose_3d))
if hasattr(self,'maskname'):
assert(dbLeng ==len(self.maskname))
if hasattr(self,'partname'):
assert(dbLeng ==len(self.partname))
if self.multilevel_cropinfo is not None:
assert(dbLeng == len(self.multilevel_cropinfo))
#outdated
# if hasattr(self,'rhand_2d'):
# assert(dbLeng ==len(self.rhand_2d))
# if hasattr(self,'lhand_2d'):
# assert(dbLeng ==len(self.lhand_2d))
if self.kp_leftHand_gt is not None:
assert(dbLeng == len(self.kp_leftHand_gt))
if self.kp_rightHand_gt is not None:
assert(dbLeng == len(self.kp_rightHand_gt))