def __init__()

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))