├── README.md ├── cluster_im ├── 081.jpg ├── 082.jpg ├── 083.jpg ├── 084.jpg ├── 085.jpg ├── 303.jpg ├── 304.jpg ├── 305.jpg ├── 306.jpg ├── 307.jpg ├── b1.png ├── b2.png ├── b3.png ├── b4.png └── b5.png ├── cluster_ims.py ├── cluster_ims_visualise.py ├── demo_eval ├── gallery │ ├── 0000166 │ │ └── 263.jpg │ ├── 0000168 │ │ └── 488.jpg │ ├── 0000169 │ │ └── 213.jpg │ ├── 0000170 │ │ └── 310.jpg │ ├── 0000174 │ │ └── 187.jpg │ ├── 0000177 │ │ └── 150.jpg │ ├── 0000183 │ │ └── 019.jpg │ ├── 0000185 │ │ └── 087.jpg │ ├── 0000186 │ │ └── 068.jpg │ └── 0000188 │ │ └── 254.jpg └── probe │ ├── 0000166 │ ├── 258.jpg │ ├── 260.jpg │ ├── 261.jpg │ ├── 262.jpg │ ├── 263.jpg │ ├── 264.jpg │ ├── 265.jpg │ ├── 266.jpg │ ├── 268.jpg │ └── 269.jpg │ ├── 0000168 │ ├── 474.jpg │ ├── 475.jpg │ ├── 478.jpg │ ├── 482.jpg │ ├── 483.jpg │ ├── 485.jpg │ ├── 487.jpg │ ├── 488.jpg │ ├── 490.jpg │ └── 491.jpg │ ├── 0000169 │ ├── 206.jpg │ ├── 207.jpg │ ├── 208.jpg │ ├── 209.jpg │ ├── 210.jpg │ ├── 211.jpg │ ├── 212.jpg │ ├── 213.jpg │ ├── 214.jpg │ └── 216.jpg │ ├── 0000170 │ ├── 303.jpg │ ├── 304.jpg │ ├── 305.jpg │ ├── 306.jpg │ ├── 307.jpg │ ├── 310.jpg │ ├── 311.jpg │ ├── 312.jpg │ ├── 313.jpg │ └── 328.jpg │ ├── 0000174 │ ├── 174.jpg │ ├── 175.jpg │ ├── 177.jpg │ ├── 179.jpg │ ├── 185.jpg │ ├── 186.jpg │ ├── 187.jpg │ ├── 188.jpg │ ├── 189.jpg │ └── 190.jpg │ ├── 0000177 │ ├── 146.jpg │ ├── 147.jpg │ ├── 148.jpg │ ├── 149.jpg │ ├── 150.jpg │ ├── 152.jpg │ ├── 155.jpg │ ├── 159.jpg │ ├── 160.jpg │ └── 162.jpg │ ├── 0000183 │ ├── 014.jpg │ ├── 015.jpg │ ├── 016.jpg │ ├── 017.jpg │ ├── 019.jpg │ ├── 021.jpg │ ├── 023.jpg │ ├── 026.jpg │ ├── 027.jpg │ └── 029.jpg │ ├── 0000185 │ ├── 081.jpg │ ├── 082.jpg │ ├── 083.jpg │ ├── 084.jpg │ ├── 085.jpg │ ├── 086.jpg │ ├── 087.jpg │ ├── 088.jpg │ ├── 089.jpg │ └── 090.jpg │ ├── 0000186 │ ├── 059.jpg │ ├── 061.jpg │ ├── 062.jpg │ ├── 063.jpg │ ├── 064.jpg │ ├── 065.jpg │ ├── 066.jpg │ ├── 067.jpg │ ├── 068.jpg │ └── 070.jpg │ └── 0000188 │ ├── 247.jpg │ ├── 248.jpg │ ├── 249.jpg │ ├── 250.jpg │ ├── 251.jpg │ ├── 252.jpg │ ├── 253.jpg │ ├── 254.jpg │ ├── 256.jpg │ └── 257.jpg ├── demo_ims ├── 0000166 │ ├── 258.jpg │ ├── 260.jpg │ ├── 261.jpg │ ├── 262.jpg │ ├── 263.jpg │ ├── 264.jpg │ ├── 265.jpg │ ├── 266.jpg │ ├── 268.jpg │ └── 269.jpg ├── 0000168 │ ├── 474.jpg │ ├── 475.jpg │ ├── 478.jpg │ ├── 482.jpg │ ├── 483.jpg │ ├── 485.jpg │ ├── 487.jpg │ ├── 488.jpg │ ├── 490.jpg │ └── 491.jpg ├── 0000169 │ ├── 206.jpg │ ├── 207.jpg │ ├── 208.jpg │ ├── 209.jpg │ ├── 210.jpg │ ├── 211.jpg │ ├── 212.jpg │ ├── 213.jpg │ ├── 214.jpg │ └── 216.jpg ├── 0000170 │ ├── 303.jpg │ ├── 304.jpg │ ├── 305.jpg │ ├── 306.jpg │ ├── 307.jpg │ ├── 310.jpg │ ├── 311.jpg │ ├── 312.jpg │ ├── 313.jpg │ └── 328.jpg ├── 0000174 │ ├── 174.jpg │ ├── 175.jpg │ ├── 177.jpg │ ├── 179.jpg │ ├── 185.jpg │ ├── 186.jpg │ ├── 187.jpg │ ├── 188.jpg │ ├── 189.jpg │ └── 190.jpg ├── 0000177 │ ├── 146.jpg │ ├── 147.jpg │ ├── 148.jpg │ ├── 149.jpg │ ├── 150.jpg │ ├── 152.jpg │ ├── 155.jpg │ ├── 159.jpg │ ├── 160.jpg │ └── 162.jpg ├── 0000183 │ ├── 014.jpg │ ├── 015.jpg │ ├── 016.jpg │ ├── 017.jpg │ ├── 019.jpg │ ├── 021.jpg │ ├── 023.jpg │ ├── 026.jpg │ ├── 027.jpg │ └── 029.jpg ├── 0000185 │ ├── 081.jpg │ ├── 082.jpg │ ├── 083.jpg │ ├── 084.jpg │ ├── 085.jpg │ ├── 086.jpg │ ├── 087.jpg │ ├── 088.jpg │ ├── 089.jpg │ └── 090.jpg ├── 0000186 │ ├── 059.jpg │ ├── 061.jpg │ ├── 062.jpg │ ├── 063.jpg │ ├── 064.jpg │ ├── 065.jpg │ ├── 066.jpg │ ├── 067.jpg │ ├── 068.jpg │ └── 070.jpg └── 0000188 │ ├── 247.jpg │ ├── 248.jpg │ ├── 249.jpg │ ├── 250.jpg │ ├── 251.jpg │ ├── 252.jpg │ ├── 253.jpg │ ├── 254.jpg │ ├── 256.jpg │ └── 257.jpg ├── loss └── arcface_loss.py ├── models ├── frelu.py ├── group_face.py └── resnet.py ├── system ├── argumentation.py ├── cos_lr.py ├── data_loader.py └── system_funcs.py ├── train.log ├── train.py └── trainAtdocker.sh /README.md: -------------------------------------------------------------------------------- 1 | # GroupFacePytorch 2 | Pytorch implementation of CVPR2020 GroupFace , Any issue or star will be appreciated. 3 | 4 | > This repository give you a easy way to quick look through the all training process of Group Face 5 | 6 | 7 | ``` 8 | paper is avaliable at https://arxiv.org/abs/2005.10497 9 | some code is ported from https://github.com/SeungyounShin/GroupFace 10 | thanks for contributing 11 | ``` 12 | 13 | > python train.py to launch training after 5 epochs u will found the demo set top1 acc increase obivously 14 | 15 | # TODO List 16 | - [x] dataloader , sample ims, 17 | - [x] implement loss 18 | - [x] main process of training a demo set 19 | - [x] image clustering 20 | - [x] implement partial FC 21 | - [x] make backbone resNet50 and use Frelu as activation 22 | - [ ] learning from scratch of MS1M 85K ids 23 | - [ ] learning DGN 24 | -------------------------------------- 25 | - [ ] train at MSCeleb[cleaned] 26 | - [ ] eval at MegaFace LFW YTF CFP-TP AgeDB IJB-B IJB-C 27 | -------------------------------------- 28 | - [ ] hard or soft GroupFace probability study 29 | - [ ] group ablation study 30 | - [ ] feature aggregation or concatenate study 31 | - [ ] group aware similarity study 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /cluster_im/081.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/cluster_im/081.jpg -------------------------------------------------------------------------------- /cluster_im/082.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/cluster_im/082.jpg -------------------------------------------------------------------------------- /cluster_im/083.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/cluster_im/083.jpg -------------------------------------------------------------------------------- /cluster_im/084.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/cluster_im/084.jpg -------------------------------------------------------------------------------- /cluster_im/085.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/cluster_im/085.jpg -------------------------------------------------------------------------------- /cluster_im/303.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/cluster_im/303.jpg -------------------------------------------------------------------------------- /cluster_im/304.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/cluster_im/304.jpg -------------------------------------------------------------------------------- /cluster_im/305.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/cluster_im/305.jpg -------------------------------------------------------------------------------- /cluster_im/306.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/cluster_im/306.jpg -------------------------------------------------------------------------------- /cluster_im/307.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/cluster_im/307.jpg -------------------------------------------------------------------------------- /cluster_im/b1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/cluster_im/b1.png -------------------------------------------------------------------------------- /cluster_im/b2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/cluster_im/b2.png -------------------------------------------------------------------------------- /cluster_im/b3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/cluster_im/b3.png -------------------------------------------------------------------------------- /cluster_im/b4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/cluster_im/b4.png -------------------------------------------------------------------------------- /cluster_im/b5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/cluster_im/b5.png -------------------------------------------------------------------------------- /cluster_ims.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | import random 3 | import shutil 4 | import threading 5 | import time 6 | from os import cpu_count 7 | 8 | import numpy as np 9 | import sys, os, cv2 10 | 11 | import threadpool 12 | import torch 13 | import torch.utils.data 14 | from skimage.feature import local_binary_pattern 15 | from kmeans_pytorch import kmeans, kmeans_predict 16 | from tqdm import tqdm 17 | import jpeg4py 18 | 19 | root_path = "./cluster_im/" 20 | groups = 3 21 | batch_size = 8 22 | 23 | 24 | def ThreadPool(PoolCnt): 25 | pool = threadpool.ThreadPool(PoolCnt) 26 | return pool 27 | 28 | 29 | def ThreadSchedule(pool, enter_func, param_list): 30 | requests = threadpool.makeRequests(enter_func, param_list) 31 | [pool.putRequest(req) for req in requests] 32 | 33 | 34 | def GetFeat(path, feat_all, mutex, idx): 35 | try: 36 | # try: 37 | # image = jpeg4py.JPEG(path).decode() 38 | # except Exception as ex: 39 | image = cv2.imread(path) 40 | image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) 41 | lbp = local_binary_pattern(image, 8, 1) 42 | feat = np.histogram(lbp, 128)[0] 43 | feat = torch.tensor(feat).unsqueeze(0) 44 | if torch.cuda.is_available(): 45 | feat = feat.cuda() 46 | CatFeat(mutex, feat, feat_all, idx) 47 | except Exception as ex: 48 | print(str(ex)) 49 | print("loading Error: {}".format(path)) 50 | 51 | 52 | def CatFeat(mutex, feat, feat_all, idx): 53 | # 锁定 54 | mutex.acquire() 55 | feat_all[idx] = feat 56 | # 释放 57 | mutex.release() 58 | 59 | 60 | def CheckFinished(mutex, feat_all, len): 61 | ret = False 62 | # 锁定 63 | mutex.acquire() 64 | cur_len = feat_all.__len__() 65 | if cur_len < len: 66 | ret = False 67 | else: 68 | ret = True 69 | # 释放 70 | mutex.release() 71 | return ret 72 | 73 | 74 | def BatchLBPGenerater(pathes, batch_size, pool): 75 | start_idx, end_idx = 0, 0 76 | mutex = threading.Lock() 77 | feat_all = {} 78 | feat_batch = {} 79 | ts = [] 80 | cur_batch_len = 0 81 | while start_idx < len(pathes) - 1: 82 | ts.clear() 83 | feat_all.clear() 84 | end_idx = batch_size + start_idx if (batch_size + start_idx) < len(pathes) else len(pathes) 85 | for i, path in enumerate(pathes[start_idx:end_idx]): 86 | # t = threading.Thread(target=GetFeat, args=(path, feat_all, mutex, i,)) 87 | ThreadSchedule(pool, GetFeat, [((path, feat_all, mutex, i), None)]) 88 | 89 | cur_batch_len = len(pathes[start_idx:end_idx]) 90 | sleepCnt = 0 91 | while CheckFinished(mutex, feat_all, cur_batch_len) is False: 92 | time.sleep(0.01) 93 | sleepCnt += 1 94 | if sleepCnt > 100: 95 | print("check finish > 1s : idx: {}".format(start_idx)) 96 | sleepCnt = 0 97 | for i in range(cur_batch_len): 98 | if i == 0: 99 | feat_batch = feat_all[i] 100 | else: 101 | feat_batch = torch.cat((feat_batch, feat_all[i]), 0) 102 | 103 | start_idx = end_idx 104 | yield feat_batch 105 | 106 | 107 | def GetAllFilesFeat(file_paths): 108 | file_feats = {} 109 | pool = ThreadPool(batch_size) 110 | lbp_loader = BatchLBPGenerater(file_paths, batch_size, pool) 111 | 112 | cnt = 0 113 | wholeLen = int(len(file_paths) / batch_size) 114 | for feat in lbp_loader: 115 | cnt += 1 116 | if isinstance(file_feats, dict) is True: 117 | file_feats = feat 118 | else: 119 | file_feats = torch.cat((file_feats, feat), 0) 120 | s = time.time() 121 | torch.cuda.empty_cache() 122 | sys.stdout.write( 123 | "\r >> {}/{} clearCacheCost: {} ".format(cnt, wholeLen, time.time() - s)) 124 | sys.stdout.flush() 125 | return file_feats 126 | 127 | 128 | if __name__ == '__main__': 129 | torch.multiprocessing.set_start_method('spawn') 130 | dims, num_clusters = 128, groups 131 | 132 | file_paths = [] 133 | for root, dirs, files in os.walk(root_path, followlinks=True): 134 | for file in files: 135 | if os.path.splitext(file)[1] in ['.jpg', '.png']: 136 | full_path = os.path.join(root, file) 137 | if os.path.getsize(full_path) > 0: 138 | file_paths.append(full_path) 139 | else: 140 | print("drop file :{}".format(full_path)) 141 | 142 | print("file path len: {}".format(len(file_paths))) 143 | file_feats = GetAllFilesFeat(file_paths) 144 | 145 | if torch.cuda.is_available(): 146 | device = torch.device('cuda') 147 | else: 148 | device = torch.device('cpu') 149 | 150 | # k-means 151 | cluster_ids_x, cluster_centers = kmeans( 152 | X=file_feats, num_clusters=num_clusters, distance='euclidean', device=device 153 | ) 154 | assert (cluster_ids_x.shape[0] == file_feats.shape[0]) 155 | 156 | file_group_dict = {} 157 | 158 | for i, file in enumerate(file_paths): 159 | file_group_dict[file] = int(cluster_ids_x[i]) 160 | 161 | with open("kmeanGroups.pkl", "wb") as f: 162 | pickle.dump(file_group_dict, f) 163 | print("DONE") 164 | -------------------------------------------------------------------------------- /cluster_ims_visualise.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | import shutil 3 | 4 | import cv2, sys, os 5 | 6 | if __name__ == '__main__': 7 | out_path = "out" 8 | 9 | with open("kmeanGroups.pkl", "rb") as f: 10 | file_group_dict = pickle.load(f) 11 | 12 | group_file_dict = {} 13 | for k, v in file_group_dict.items(): 14 | if group_file_dict.get(v) is None: 15 | group_file_dict[v] = [k] 16 | else: 17 | group_file_dict[v].append(k) 18 | 19 | max_group_show_cnt = 50 20 | for k, v in group_file_dict.items(): 21 | cnt = 0 22 | for im in v: 23 | out_full_path = os.path.join(out_path, str(k), os.path.basename(im)) 24 | if os.path.exists(os.path.dirname(out_full_path)) is False: 25 | os.makedirs(os.path.dirname(out_full_path)) 26 | shutil.copy(im, out_full_path) 27 | cnt += 1 28 | if cnt > 5: 29 | break 30 | -------------------------------------------------------------------------------- /demo_eval/gallery/0000166/263.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/gallery/0000166/263.jpg -------------------------------------------------------------------------------- /demo_eval/gallery/0000168/488.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/gallery/0000168/488.jpg -------------------------------------------------------------------------------- /demo_eval/gallery/0000169/213.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/gallery/0000169/213.jpg -------------------------------------------------------------------------------- /demo_eval/gallery/0000170/310.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/gallery/0000170/310.jpg -------------------------------------------------------------------------------- /demo_eval/gallery/0000174/187.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/gallery/0000174/187.jpg -------------------------------------------------------------------------------- /demo_eval/gallery/0000177/150.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/gallery/0000177/150.jpg -------------------------------------------------------------------------------- /demo_eval/gallery/0000183/019.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/gallery/0000183/019.jpg -------------------------------------------------------------------------------- /demo_eval/gallery/0000185/087.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/gallery/0000185/087.jpg -------------------------------------------------------------------------------- /demo_eval/gallery/0000186/068.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/gallery/0000186/068.jpg -------------------------------------------------------------------------------- /demo_eval/gallery/0000188/254.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/gallery/0000188/254.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000166/258.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000166/258.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000166/260.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000166/260.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000166/261.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000166/261.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000166/262.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000166/262.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000166/263.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000166/263.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000166/264.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000166/264.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000166/265.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000166/265.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000166/266.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000166/266.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000166/268.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000166/268.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000166/269.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000166/269.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000168/474.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000168/474.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000168/475.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000168/475.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000168/478.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000168/478.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000168/482.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000168/482.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000168/483.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000168/483.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000168/485.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000168/485.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000168/487.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000168/487.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000168/488.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000168/488.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000168/490.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000168/490.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000168/491.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000168/491.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000169/206.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000169/206.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000169/207.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000169/207.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000169/208.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000169/208.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000169/209.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000169/209.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000169/210.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000169/210.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000169/211.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000169/211.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000169/212.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000169/212.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000169/213.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000169/213.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000169/214.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000169/214.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000169/216.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000169/216.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000170/303.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000170/303.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000170/304.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000170/304.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000170/305.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000170/305.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000170/306.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000170/306.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000170/307.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000170/307.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000170/310.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000170/310.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000170/311.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000170/311.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000170/312.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000170/312.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000170/313.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000170/313.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000170/328.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000170/328.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000174/174.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000174/174.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000174/175.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000174/175.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000174/177.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000174/177.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000174/179.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000174/179.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000174/185.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000174/185.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000174/186.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000174/186.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000174/187.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000174/187.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000174/188.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000174/188.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000174/189.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000174/189.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000174/190.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000174/190.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000177/146.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000177/146.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000177/147.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000177/147.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000177/148.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000177/148.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000177/149.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000177/149.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000177/150.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000177/150.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000177/152.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000177/152.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000177/155.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000177/155.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000177/159.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000177/159.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000177/160.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000177/160.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000177/162.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000177/162.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000183/014.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000183/014.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000183/015.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000183/015.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000183/016.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000183/016.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000183/017.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000183/017.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000183/019.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000183/019.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000183/021.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000183/021.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000183/023.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000183/023.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000183/026.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000183/026.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000183/027.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000183/027.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000183/029.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000183/029.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000185/081.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000185/081.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000185/082.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000185/082.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000185/083.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000185/083.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000185/084.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000185/084.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000185/085.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000185/085.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000185/086.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000185/086.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000185/087.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000185/087.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000185/088.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000185/088.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000185/089.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000185/089.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000185/090.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000185/090.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000186/059.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000186/059.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000186/061.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000186/061.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000186/062.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000186/062.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000186/063.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000186/063.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000186/064.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000186/064.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000186/065.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000186/065.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000186/066.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000186/066.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000186/067.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000186/067.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000186/068.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000186/068.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000186/070.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000186/070.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000188/247.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000188/247.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000188/248.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000188/248.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000188/249.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000188/249.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000188/250.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000188/250.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000188/251.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000188/251.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000188/252.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000188/252.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000188/253.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000188/253.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000188/254.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000188/254.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000188/256.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000188/256.jpg -------------------------------------------------------------------------------- /demo_eval/probe/0000188/257.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_eval/probe/0000188/257.jpg -------------------------------------------------------------------------------- /demo_ims/0000166/258.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000166/258.jpg -------------------------------------------------------------------------------- /demo_ims/0000166/260.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000166/260.jpg -------------------------------------------------------------------------------- /demo_ims/0000166/261.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000166/261.jpg -------------------------------------------------------------------------------- /demo_ims/0000166/262.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000166/262.jpg -------------------------------------------------------------------------------- /demo_ims/0000166/263.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000166/263.jpg -------------------------------------------------------------------------------- /demo_ims/0000166/264.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000166/264.jpg -------------------------------------------------------------------------------- /demo_ims/0000166/265.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000166/265.jpg -------------------------------------------------------------------------------- /demo_ims/0000166/266.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000166/266.jpg -------------------------------------------------------------------------------- /demo_ims/0000166/268.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000166/268.jpg -------------------------------------------------------------------------------- /demo_ims/0000166/269.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000166/269.jpg -------------------------------------------------------------------------------- /demo_ims/0000168/474.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000168/474.jpg -------------------------------------------------------------------------------- /demo_ims/0000168/475.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000168/475.jpg -------------------------------------------------------------------------------- /demo_ims/0000168/478.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000168/478.jpg -------------------------------------------------------------------------------- /demo_ims/0000168/482.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000168/482.jpg -------------------------------------------------------------------------------- /demo_ims/0000168/483.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000168/483.jpg -------------------------------------------------------------------------------- /demo_ims/0000168/485.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000168/485.jpg -------------------------------------------------------------------------------- /demo_ims/0000168/487.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000168/487.jpg -------------------------------------------------------------------------------- /demo_ims/0000168/488.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000168/488.jpg -------------------------------------------------------------------------------- /demo_ims/0000168/490.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000168/490.jpg -------------------------------------------------------------------------------- /demo_ims/0000168/491.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000168/491.jpg -------------------------------------------------------------------------------- /demo_ims/0000169/206.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000169/206.jpg -------------------------------------------------------------------------------- /demo_ims/0000169/207.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000169/207.jpg -------------------------------------------------------------------------------- /demo_ims/0000169/208.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000169/208.jpg -------------------------------------------------------------------------------- /demo_ims/0000169/209.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000169/209.jpg -------------------------------------------------------------------------------- /demo_ims/0000169/210.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000169/210.jpg -------------------------------------------------------------------------------- /demo_ims/0000169/211.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000169/211.jpg -------------------------------------------------------------------------------- /demo_ims/0000169/212.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000169/212.jpg -------------------------------------------------------------------------------- /demo_ims/0000169/213.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000169/213.jpg -------------------------------------------------------------------------------- /demo_ims/0000169/214.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000169/214.jpg -------------------------------------------------------------------------------- /demo_ims/0000169/216.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000169/216.jpg -------------------------------------------------------------------------------- /demo_ims/0000170/303.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000170/303.jpg -------------------------------------------------------------------------------- /demo_ims/0000170/304.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000170/304.jpg -------------------------------------------------------------------------------- /demo_ims/0000170/305.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000170/305.jpg -------------------------------------------------------------------------------- /demo_ims/0000170/306.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000170/306.jpg -------------------------------------------------------------------------------- /demo_ims/0000170/307.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000170/307.jpg -------------------------------------------------------------------------------- /demo_ims/0000170/310.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000170/310.jpg -------------------------------------------------------------------------------- /demo_ims/0000170/311.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000170/311.jpg -------------------------------------------------------------------------------- /demo_ims/0000170/312.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000170/312.jpg -------------------------------------------------------------------------------- /demo_ims/0000170/313.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000170/313.jpg -------------------------------------------------------------------------------- /demo_ims/0000170/328.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000170/328.jpg -------------------------------------------------------------------------------- /demo_ims/0000174/174.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000174/174.jpg -------------------------------------------------------------------------------- /demo_ims/0000174/175.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000174/175.jpg -------------------------------------------------------------------------------- /demo_ims/0000174/177.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000174/177.jpg -------------------------------------------------------------------------------- /demo_ims/0000174/179.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000174/179.jpg -------------------------------------------------------------------------------- /demo_ims/0000174/185.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000174/185.jpg -------------------------------------------------------------------------------- /demo_ims/0000174/186.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000174/186.jpg -------------------------------------------------------------------------------- /demo_ims/0000174/187.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000174/187.jpg -------------------------------------------------------------------------------- /demo_ims/0000174/188.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000174/188.jpg -------------------------------------------------------------------------------- /demo_ims/0000174/189.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000174/189.jpg -------------------------------------------------------------------------------- /demo_ims/0000174/190.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000174/190.jpg -------------------------------------------------------------------------------- /demo_ims/0000177/146.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000177/146.jpg -------------------------------------------------------------------------------- /demo_ims/0000177/147.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000177/147.jpg -------------------------------------------------------------------------------- /demo_ims/0000177/148.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000177/148.jpg -------------------------------------------------------------------------------- /demo_ims/0000177/149.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000177/149.jpg -------------------------------------------------------------------------------- /demo_ims/0000177/150.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000177/150.jpg -------------------------------------------------------------------------------- /demo_ims/0000177/152.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000177/152.jpg -------------------------------------------------------------------------------- /demo_ims/0000177/155.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000177/155.jpg -------------------------------------------------------------------------------- /demo_ims/0000177/159.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000177/159.jpg -------------------------------------------------------------------------------- /demo_ims/0000177/160.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000177/160.jpg -------------------------------------------------------------------------------- /demo_ims/0000177/162.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000177/162.jpg -------------------------------------------------------------------------------- /demo_ims/0000183/014.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000183/014.jpg -------------------------------------------------------------------------------- /demo_ims/0000183/015.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000183/015.jpg -------------------------------------------------------------------------------- /demo_ims/0000183/016.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000183/016.jpg -------------------------------------------------------------------------------- /demo_ims/0000183/017.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000183/017.jpg -------------------------------------------------------------------------------- /demo_ims/0000183/019.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000183/019.jpg -------------------------------------------------------------------------------- /demo_ims/0000183/021.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000183/021.jpg -------------------------------------------------------------------------------- /demo_ims/0000183/023.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000183/023.jpg -------------------------------------------------------------------------------- /demo_ims/0000183/026.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000183/026.jpg -------------------------------------------------------------------------------- /demo_ims/0000183/027.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000183/027.jpg -------------------------------------------------------------------------------- /demo_ims/0000183/029.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000183/029.jpg -------------------------------------------------------------------------------- /demo_ims/0000185/081.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000185/081.jpg -------------------------------------------------------------------------------- /demo_ims/0000185/082.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000185/082.jpg -------------------------------------------------------------------------------- /demo_ims/0000185/083.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000185/083.jpg -------------------------------------------------------------------------------- /demo_ims/0000185/084.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000185/084.jpg -------------------------------------------------------------------------------- /demo_ims/0000185/085.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000185/085.jpg -------------------------------------------------------------------------------- /demo_ims/0000185/086.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000185/086.jpg -------------------------------------------------------------------------------- /demo_ims/0000185/087.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000185/087.jpg -------------------------------------------------------------------------------- /demo_ims/0000185/088.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000185/088.jpg -------------------------------------------------------------------------------- /demo_ims/0000185/089.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000185/089.jpg -------------------------------------------------------------------------------- /demo_ims/0000185/090.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000185/090.jpg -------------------------------------------------------------------------------- /demo_ims/0000186/059.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000186/059.jpg -------------------------------------------------------------------------------- /demo_ims/0000186/061.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000186/061.jpg -------------------------------------------------------------------------------- /demo_ims/0000186/062.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000186/062.jpg -------------------------------------------------------------------------------- /demo_ims/0000186/063.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000186/063.jpg -------------------------------------------------------------------------------- /demo_ims/0000186/064.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000186/064.jpg -------------------------------------------------------------------------------- /demo_ims/0000186/065.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000186/065.jpg -------------------------------------------------------------------------------- /demo_ims/0000186/066.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000186/066.jpg -------------------------------------------------------------------------------- /demo_ims/0000186/067.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000186/067.jpg -------------------------------------------------------------------------------- /demo_ims/0000186/068.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000186/068.jpg -------------------------------------------------------------------------------- /demo_ims/0000186/070.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000186/070.jpg -------------------------------------------------------------------------------- /demo_ims/0000188/247.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000188/247.jpg -------------------------------------------------------------------------------- /demo_ims/0000188/248.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000188/248.jpg -------------------------------------------------------------------------------- /demo_ims/0000188/249.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000188/249.jpg -------------------------------------------------------------------------------- /demo_ims/0000188/250.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000188/250.jpg -------------------------------------------------------------------------------- /demo_ims/0000188/251.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000188/251.jpg -------------------------------------------------------------------------------- /demo_ims/0000188/252.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000188/252.jpg -------------------------------------------------------------------------------- /demo_ims/0000188/253.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000188/253.jpg -------------------------------------------------------------------------------- /demo_ims/0000188/254.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000188/254.jpg -------------------------------------------------------------------------------- /demo_ims/0000188/256.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000188/256.jpg -------------------------------------------------------------------------------- /demo_ims/0000188/257.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leoluopy/GroupFacePytorch/f9aba87fa9b8f3d0cd2303ca43be39436932b0a5/demo_ims/0000188/257.jpg -------------------------------------------------------------------------------- /loss/arcface_loss.py: -------------------------------------------------------------------------------- 1 | import math 2 | import random 3 | 4 | import torch 5 | import torch.nn as nn 6 | import numpy as np 7 | 8 | 9 | class CrossEntropyLabelSmooth(nn.Module): 10 | """Cross entropy loss with label smoothing regularizer. 11 | Reference: 12 | Szegedy et al. Rethinking the Inception Architecture for Computer Vision. CVPR 2016. 13 | Equation: y = (1 - epsilon) * y + epsilon / K. 14 | Args: 15 | num_classes (int): number of classes. 16 | epsilon (float): weight. 17 | """ 18 | 19 | def __init__(self, num_classes, epsilon=0.1, use_gpu=True): 20 | super(CrossEntropyLabelSmooth, self).__init__() 21 | self.num_classes = num_classes 22 | self.epsilon = epsilon 23 | self.use_gpu = use_gpu 24 | self.logsoftmax = nn.LogSoftmax(dim=1) 25 | 26 | # partial fc 时,类中心个数会发生变化, label数值也要对应发生变化。 27 | def forward(self, inputs, targets, use_label_smoothing=True): 28 | """ 29 | Args: 30 | inputs: prediction matrix (before softmax) with shape (batch_size, num_classes) 31 | targets: ground truth labels with shape (num_classes) 32 | """ 33 | log_probs = self.logsoftmax(inputs) 34 | targets = torch.zeros(log_probs.size()).scatter_(1, targets.unsqueeze(1).data.cpu(), 1) 35 | if self.use_gpu: targets = targets.to(torch.device('cuda')) 36 | if use_label_smoothing: 37 | targets = (1 - self.epsilon) * targets + self.epsilon / self.num_classes 38 | loss = (- targets * log_probs).mean(0).sum() 39 | return loss 40 | 41 | 42 | class ArcFaceLoss(nn.Module): 43 | def __init__(self, m=0.1, s=1.0, d=256, num_classes=10, use_gpu=True, partial_fc_rate=0.1): 44 | super(ArcFaceLoss, self).__init__() 45 | self.m = m 46 | self.s = s 47 | self.num_classes = num_classes 48 | self.partial_fc_rate = partial_fc_rate 49 | 50 | self.weight = torch.nn.Linear(d, num_classes, bias=False) 51 | if use_gpu: 52 | self.weight = self.weight.cuda() 53 | bound = 1 / math.sqrt(d) 54 | nn.init.uniform_(self.weight.weight, -bound, bound) 55 | self.CrossEntropy = CrossEntropyLabelSmooth(self.num_classes, use_gpu=use_gpu) 56 | 57 | def get_center_subscript(self, center_Idxs, plabel): 58 | idx = 0 59 | for centerId in center_Idxs: 60 | if centerId == plabel: 61 | if torch.cuda.is_available(): 62 | return torch.tensor([idx]).cuda() 63 | else: 64 | return torch.tensor([idx]) 65 | idx += 1 66 | return -1 67 | 68 | def dilate_centers2samplerate(self, positeve_centerIdxs): 69 | expected_len_centers = int(self.num_classes * self.partial_fc_rate) 70 | generated_len = int(expected_len_centers - positeve_centerIdxs.shape[0]) 71 | 72 | selected = positeve_centerIdxs.detach().cpu().numpy() 73 | target_classes = np.arange(0, self.num_classes, 1) 74 | target_classes = np.delete(target_classes, selected) 75 | 76 | # rand_idxs = np.random.randint(0, target_classes.shape[0], [generated_len]) 77 | rand_idxs = random.sample(range(0, target_classes.shape[0]), generated_len) 78 | negative_centers = target_classes[rand_idxs] 79 | 80 | if torch.cuda.is_available(): 81 | positeve_centerIdxs = torch.cat((positeve_centerIdxs, torch.from_numpy(negative_centers).cuda())) 82 | else: 83 | positeve_centerIdxs = torch.cat((positeve_centerIdxs, torch.from_numpy(negative_centers))) 84 | return positeve_centerIdxs 85 | 86 | def partial_sample(self, positive_labels): 87 | centers_Idxs = {} 88 | new_labels = {} 89 | p_num = positive_labels.shape[0] 90 | for i in range(p_num): 91 | if isinstance(centers_Idxs, dict): 92 | centers_Idxs = positive_labels[i].reshape(-1) 93 | elif positive_labels[i] not in centers_Idxs: 94 | centers_Idxs = torch.cat((centers_Idxs, positive_labels[i].reshape(-1))) 95 | if isinstance(new_labels, dict): 96 | new_labels = self.get_center_subscript(centers_Idxs, positive_labels[i]) 97 | else: 98 | new_labels = torch.cat((new_labels, self.get_center_subscript(centers_Idxs, positive_labels[i]))) 99 | 100 | centers_Idxs = self.dilate_centers2samplerate(centers_Idxs) 101 | choosed_centers = self.weight.weight[centers_Idxs] 102 | return choosed_centers, new_labels 103 | 104 | def forward(self, x, labels): 105 | ''' 106 | x : feature vector : (b x d) b= batch size d = dimension 107 | labels : (b,) 108 | ''' 109 | raw_label = labels 110 | choosed_centers, new_labels = self.partial_sample(labels) 111 | labels = new_labels 112 | with torch.no_grad(): 113 | # self.weight.weight.div_(torch.norm(self.weight.weight, dim=1, keepdim=True)) 114 | choosed_centers.div_(torch.norm(choosed_centers, dim=1, keepdim=True)) 115 | 116 | x = nn.functional.normalize(x, p=2, dim=1) # normalize the features 117 | 118 | b = x.size(0) 119 | n = self.num_classes 120 | 121 | # cos_angle = self.weight(x) 122 | cos_angle = torch.matmul(x, choosed_centers.t()) 123 | cos_angle = torch.clamp(cos_angle, min=-1, max=1) 124 | for i in range(b): 125 | # cos_angle[i][labels[i]] = torch.cos(torch.acos(cos_angle[i][labels[i]]) + self.m) 126 | with torch.no_grad(): 127 | delta_cos = torch.cos(torch.acos(cos_angle[i][labels[i]]) + self.m) - cos_angle[i][labels[i]] 128 | cos_angle[i][labels[i]] = cos_angle[i][labels[i]] + delta_cos 129 | pass 130 | weighted_cos_angle = self.s * cos_angle 131 | log_probs = self.CrossEntropy(weighted_cos_angle, labels) 132 | return log_probs 133 | 134 | 135 | def case2(): 136 | criteria = ArcFaceLoss() 137 | 138 | label = torch.tensor( 139 | [0]).cuda() 140 | x = torch.rand((1, 3, 224, 224)).cuda() 141 | 142 | from models.group_face import GroupFace 143 | model = GroupFace(resnet=18) 144 | if torch.cuda.is_available(): 145 | model = torch.nn.DataParallel(model).cuda() 146 | optimizer = torch.optim.Adam(model.parameters(), lr=1e-4) 147 | optimizer_center = torch.optim.Adam(criteria.weight.parameters(), lr=1e-4) 148 | 149 | group_inter, final, group_prob, group_label = model(x) 150 | loss = criteria(final, label) 151 | 152 | optimizer.zero_grad() 153 | loss.backward() 154 | optimizer.step() 155 | optimizer_center.step() 156 | 157 | print("END") 158 | 159 | 160 | def case1(): 161 | criteria = ArcFaceLoss(num_classes=10000) 162 | # x = torch.rand(32, 2048).cuda() 163 | # label = torch.tensor( 164 | # [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, ]).cuda() 165 | 166 | x = torch.rand(1, 256, requires_grad=True).cuda() 167 | label = torch.tensor( 168 | [0]).cuda() 169 | 170 | loss = criteria(x, label) 171 | print(loss) 172 | 173 | 174 | if __name__ == '__main__': 175 | case1() 176 | # case2() 177 | 178 | pass 179 | -------------------------------------------------------------------------------- /models/frelu.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.nn.functional as F 4 | 5 | 6 | class FReLU(nn.Module): 7 | r""" FReLU formulation. The funnel condition has a window size of kxk. (k=3 by default) 8 | """ 9 | 10 | def __init__(self, in_channels): 11 | super().__init__() 12 | self.conv_frelu = nn.Conv2d(in_channels, in_channels, 3, 1, 1, groups=in_channels) 13 | self.bn_frelu = nn.BatchNorm2d(in_channels) 14 | 15 | def forward(self, x): 16 | x1 = self.conv_frelu(x) 17 | x1 = self.bn_frelu(x1) 18 | x = torch.max(x, x1) 19 | return x 20 | -------------------------------------------------------------------------------- /models/group_face.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | from models.resnet import * 4 | 5 | backbone = {18: resnet_face18(), 6 | 50: resnet_face50(), 7 | 101: resnet_face101()} 8 | 9 | 10 | class FC(nn.Module): 11 | def __init__(self, inplanes, outplanes): 12 | super(FC, self).__init__() 13 | self.fc = nn.Linear(inplanes, outplanes) 14 | self.bn = nn.BatchNorm1d(outplanes) 15 | self.act = nn.PReLU() 16 | 17 | def forward(self, x): 18 | x = self.fc(x) 19 | # x = self.bn(x) 20 | return self.act(x) 21 | 22 | 23 | class GDN(nn.Module): 24 | def __init__(self, inplanes, outplanes, intermediate_dim=256): 25 | super(GDN, self).__init__() 26 | self.fc1 = FC(inplanes, intermediate_dim) 27 | self.fc2 = FC(intermediate_dim, outplanes) 28 | self.softmax = nn.Softmax() 29 | 30 | def forward(self, x): 31 | intermediate = self.fc1(x) 32 | out = self.fc2(intermediate) 33 | # return intermediate, self.softmax(out) 34 | return intermediate, torch.softmax(out, dim=1) 35 | 36 | 37 | class GroupFace(nn.Module): 38 | def __init__(self, resnet=18, feature_dim=256, groups=4, mode='S', backbone_fc_dim=1024): 39 | super(GroupFace, self).__init__() 40 | self.mode = mode 41 | self.groups = groups 42 | self.Backbone = backbone[resnet] 43 | self.instance_fc = FC(backbone_fc_dim, feature_dim) 44 | self.GDN = GDN(feature_dim, groups) 45 | self.group_fc = nn.ModuleList([FC(backbone_fc_dim, feature_dim) for i in range(groups)]) 46 | self.feature_dim = feature_dim 47 | 48 | def forward(self, x): 49 | B = x.shape[0] 50 | x = self.Backbone(x) # (B,4096) 51 | instacne_representation = self.instance_fc(x) 52 | 53 | # GDN 54 | group_inter, group_prob = self.GDN(instacne_representation) 55 | # print(group_prob) 56 | # group aware repr 57 | v_G = [Gk(x) for Gk in self.group_fc] # (B,512) 58 | 59 | # self distributed labeling 60 | group_label_p = group_prob.data 61 | group_label_E = group_label_p.mean(dim=0) 62 | group_label_u = (group_label_p - group_label_E.unsqueeze(dim=-1).expand(self.groups, B).T) / self.groups + ( 63 | 1 / self.groups) 64 | group_label = torch.argmax(group_label_u, dim=1).data 65 | 66 | # group ensemble 67 | group_mul_p_vk = list() 68 | if self.mode == 'S': 69 | for k in range(self.groups): 70 | Pk = group_prob[:, k].unsqueeze(dim=-1).expand(B, self.feature_dim) 71 | group_mul_p_vk.append(torch.mul(v_G[k], Pk)) 72 | group_ensembled = torch.stack(group_mul_p_vk).sum(dim=0) 73 | # instance , group aggregation 74 | final = instacne_representation + group_ensembled 75 | return group_inter, final, group_prob, group_label 76 | 77 | 78 | if __name__ == "__main__": 79 | x = torch.randn(1, 3, 224, 224) 80 | model = GroupFace(resnet=50) 81 | model.eval() 82 | out = model(x) 83 | print("==output==") 84 | print(out[0].shape, out[1].shape, out[2].shape, out[3].shape) 85 | print(torch.argmax(out[2], dim=1), '\n', out[3]) 86 | print("END") 87 | -------------------------------------------------------------------------------- /models/resnet.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | Created on 18-5-21 下午5:26 4 | @author: ronghuaiyang 5 | """ 6 | import torch 7 | import torch.nn as nn 8 | import math 9 | import torch.utils.model_zoo as model_zoo 10 | import torch.nn.utils.weight_norm as weight_norm 11 | import torch.nn.functional as F 12 | from models.frelu import FReLU 13 | 14 | # __all__ = ['ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101', 15 | # 'resnet152'] 16 | 17 | 18 | model_urls = { 19 | 'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth', 20 | 'resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth', 21 | 'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth', 22 | 'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth', 23 | 'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth', 24 | } 25 | 26 | 27 | def conv3x3(in_planes, out_planes, stride=1): 28 | """3x3 convolution with padding""" 29 | return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, 30 | padding=1, bias=False) 31 | 32 | 33 | class BasicBlock(nn.Module): 34 | expansion = 1 35 | 36 | def __init__(self, inplanes, planes, stride=1, downsample=None): 37 | super(BasicBlock, self).__init__() 38 | self.conv1 = conv3x3(inplanes, planes, stride) 39 | self.bn1 = nn.BatchNorm2d(planes) 40 | self.relu = nn.ReLU(inplace=True) 41 | self.conv2 = conv3x3(planes, planes) 42 | self.bn2 = nn.BatchNorm2d(planes) 43 | self.downsample = downsample 44 | self.stride = stride 45 | 46 | def forward(self, x): 47 | residual = x 48 | 49 | out = self.conv1(x) 50 | out = self.bn1(out) 51 | out = self.relu(out) 52 | 53 | out = self.conv2(out) 54 | out = self.bn2(out) 55 | 56 | if self.downsample is not None: 57 | residual = self.downsample(x) 58 | 59 | out += residual 60 | out = self.relu(out) 61 | 62 | return out 63 | 64 | 65 | class IRBlock(nn.Module): 66 | expansion = 1 67 | 68 | def __init__(self, inplanes, planes, stride=1, downsample=None, use_se=True): 69 | super(IRBlock, self).__init__() 70 | # self.bn0 = nn.BatchNorm2d(inplanes) 71 | self.conv1 = conv3x3(inplanes, inplanes) 72 | # self.bn1 = nn.BatchNorm2d(inplanes) 73 | # self.prelu = nn.PReLU() 74 | self.frelu1 = FReLU(inplanes) 75 | self.frelu2 = FReLU(planes) 76 | self.conv2 = conv3x3(inplanes, planes, stride) 77 | # self.bn2 = nn.BatchNorm2d(planes) 78 | self.downsample = downsample 79 | self.stride = stride 80 | self.use_se = use_se 81 | if self.use_se: 82 | self.se = SEBlock(planes) 83 | 84 | def forward(self, x): 85 | residual = x 86 | # out = self.bn0(x) 87 | out = self.conv1(x) 88 | # out = self.bn1(out) 89 | # out = self.prelu(out) 90 | out = self.frelu1(out) 91 | 92 | out = self.conv2(out) 93 | # out = self.bn2(out) 94 | if self.use_se: 95 | out = self.se(out) 96 | 97 | if self.downsample is not None: 98 | residual = self.downsample(x) 99 | 100 | out += residual 101 | # out = self.prelu(out) 102 | out = self.frelu2(out) 103 | 104 | return out 105 | 106 | 107 | class Bottleneck(nn.Module): 108 | expansion = 4 109 | 110 | def __init__(self, inplanes, planes, stride=1, downsample=None): 111 | super(Bottleneck, self).__init__() 112 | self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) 113 | self.bn1 = nn.BatchNorm2d(planes) 114 | self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, 115 | padding=1, bias=False) 116 | self.bn2 = nn.BatchNorm2d(planes) 117 | self.conv3 = nn.Conv2d(planes, planes * self.expansion, kernel_size=1, bias=False) 118 | self.bn3 = nn.BatchNorm2d(planes * self.expansion) 119 | self.relu = nn.ReLU(inplace=True) 120 | self.downsample = downsample 121 | self.stride = stride 122 | 123 | def forward(self, x): 124 | residual = x 125 | 126 | out = self.conv1(x) 127 | out = self.bn1(out) 128 | out = self.relu(out) 129 | 130 | out = self.conv2(out) 131 | out = self.bn2(out) 132 | out = self.relu(out) 133 | 134 | out = self.conv3(out) 135 | out = self.bn3(out) 136 | 137 | if self.downsample is not None: 138 | residual = self.downsample(x) 139 | 140 | out += residual 141 | out = self.relu(out) 142 | 143 | return out 144 | 145 | 146 | class SEBlock(nn.Module): 147 | def __init__(self, channel, reduction=16): 148 | super(SEBlock, self).__init__() 149 | self.avg_pool = nn.AdaptiveAvgPool2d(1) 150 | self.fc = nn.Sequential( 151 | nn.Linear(channel, channel // reduction), 152 | nn.PReLU(), 153 | nn.Linear(channel // reduction, channel), 154 | nn.Sigmoid() 155 | ) 156 | 157 | def forward(self, x): 158 | b, c, _, _ = x.size() 159 | y = self.avg_pool(x).view(b, c) 160 | y = self.fc(y).view(b, c, 1, 1) 161 | return x * y 162 | 163 | 164 | class ResNetFace(nn.Module): 165 | def __init__(self, block, layers, use_se=True): 166 | self.inplanes = 64 167 | self.use_se = use_se 168 | super(ResNetFace, self).__init__() 169 | self.conv1 = nn.Conv2d(3, 64, kernel_size=3, padding=1, bias=False) 170 | # self.bn1 = nn.BatchNorm2d(64) 171 | # self.prelu = nn.PReLU() 172 | self.frelu = FReLU(64) 173 | self.maxpool = nn.MaxPool2d(kernel_size=2, stride=2) 174 | self.layer1 = self._make_layer(block, 64, layers[0]) 175 | self.layer2 = self._make_layer(block, 128, layers[1], stride=2) 176 | self.layer3 = self._make_layer(block, 256, layers[2], stride=2) 177 | self.layer4 = self._make_layer(block, 512, layers[3], stride=2) 178 | # self.bn4 = nn.BatchNorm2d(512) 179 | self.dropout = nn.Dropout() 180 | # self.fc5 = nn.Linear(112*112*2, 4096) 181 | self.fc5 = nn.Linear(224 * 224 * 2, 1024) 182 | # self.bn5 = nn.BatchNorm1d(4096) 183 | 184 | for m in self.modules(): 185 | if isinstance(m, nn.Conv2d): 186 | nn.init.xavier_normal_(m.weight) 187 | elif isinstance(m, nn.BatchNorm2d) or isinstance(m, nn.BatchNorm1d): 188 | nn.init.constant_(m.weight, 1) 189 | nn.init.constant_(m.bias, 0) 190 | elif isinstance(m, nn.Linear): 191 | nn.init.xavier_normal_(m.weight) 192 | nn.init.constant_(m.bias, 0) 193 | 194 | def _make_layer(self, block, planes, blocks, stride=1): 195 | downsample = None 196 | if stride != 1 or self.inplanes != planes * block.expansion: 197 | downsample = nn.Sequential( 198 | nn.Conv2d(self.inplanes, planes * block.expansion, 199 | kernel_size=1, stride=stride, bias=False), 200 | nn.BatchNorm2d(planes * block.expansion), 201 | ) 202 | layers = [] 203 | layers.append(block(self.inplanes, planes, stride, downsample, use_se=self.use_se)) 204 | self.inplanes = planes 205 | for i in range(1, blocks): 206 | layers.append(block(self.inplanes, planes, use_se=self.use_se)) 207 | 208 | return nn.Sequential(*layers) 209 | 210 | def forward(self, x): 211 | x = self.conv1(x) 212 | # x = self.bn1(x) 213 | # x = self.prelu(x) 214 | x = self.frelu(x) 215 | x = self.maxpool(x) 216 | 217 | x = self.layer1(x) 218 | x = self.layer2(x) 219 | x = self.layer3(x) 220 | x = self.layer4(x) 221 | # x = self.bn4(x) 222 | x = self.dropout(x) 223 | x = x.view(x.size(0), -1) 224 | # print(x.shape) 225 | x = self.fc5(x) 226 | # x = self.bn5(x) 227 | 228 | return x 229 | 230 | 231 | class ResNet(nn.Module): 232 | 233 | def __init__(self, block, layers): 234 | self.inplanes = 64 235 | super(ResNet, self).__init__() 236 | # self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, 237 | # bias=False) 238 | self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, 239 | bias=False) 240 | self.bn1 = nn.BatchNorm2d(64) 241 | self.relu = nn.ReLU(inplace=True) 242 | # self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) 243 | self.layer1 = self._make_layer(block, 64, layers[0], stride=2) 244 | self.layer2 = self._make_layer(block, 128, layers[1], stride=2) 245 | self.layer3 = self._make_layer(block, 256, layers[2], stride=2) 246 | self.layer4 = self._make_layer(block, 512, layers[3], stride=2) 247 | # self.avgpool = nn.AvgPool2d(8, stride=1) 248 | # self.fc = nn.Linear(512 * block.expansion, num_classes) 249 | self.fc5 = nn.Linear(512 * 8 * 8, 512) 250 | 251 | for m in self.modules(): 252 | if isinstance(m, nn.Conv2d): 253 | nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu') 254 | elif isinstance(m, nn.BatchNorm2d): 255 | nn.init.constant_(m.weight, 1) 256 | nn.init.constant_(m.bias, 0) 257 | 258 | def _make_layer(self, block, planes, blocks, stride=1): 259 | downsample = None 260 | if stride != 1 or self.inplanes != planes * block.expansion: 261 | downsample = nn.Sequential( 262 | nn.Conv2d(self.inplanes, planes * block.expansion, 263 | kernel_size=1, stride=stride, bias=False), 264 | nn.BatchNorm2d(planes * block.expansion), 265 | ) 266 | 267 | layers = [] 268 | layers.append(block(self.inplanes, planes, stride, downsample)) 269 | self.inplanes = planes * block.expansion 270 | for i in range(1, blocks): 271 | layers.append(block(self.inplanes, planes)) 272 | 273 | return nn.Sequential(*layers) 274 | 275 | def forward(self, x): 276 | x = self.conv1(x) 277 | x = self.bn1(x) 278 | x = self.relu(x) 279 | # x = self.maxpool(x) 280 | 281 | x = self.layer1(x) 282 | x = self.layer2(x) 283 | x = self.layer3(x) 284 | x = self.layer4(x) 285 | # x = nn.AvgPool2d(kernel_size=x.size()[2:])(x) 286 | # x = self.avgpool(x) 287 | x = x.view(x.size(0), -1) 288 | x = self.fc5(x) 289 | 290 | return x 291 | 292 | 293 | def resnet18(pretrained=False, **kwargs): 294 | """Constructs a ResNet-18 model. 295 | Args: 296 | pretrained (bool): If True, returns a model pre-trained on ImageNet 297 | """ 298 | model = ResNet(BasicBlock, [2, 2, 2, 2], **kwargs) 299 | if pretrained: 300 | model.load_state_dict(model_zoo.load_url(model_urls['resnet18'])) 301 | return model 302 | 303 | 304 | def resnet34(pretrained=False, **kwargs): 305 | """Constructs a ResNet-34 model. 306 | Args: 307 | pretrained (bool): If True, returns a model pre-trained on ImageNet 308 | """ 309 | model = ResNet(BasicBlock, [3, 4, 6, 3], **kwargs) 310 | if pretrained: 311 | model.load_state_dict(model_zoo.load_url(model_urls['resnet34'])) 312 | return model 313 | 314 | 315 | def resnet50(pretrained=False, **kwargs): 316 | """Constructs a ResNet-50 model. 317 | Args: 318 | pretrained (bool): If True, returns a model pre-trained on ImageNet 319 | """ 320 | model = ResNet(Bottleneck, [3, 4, 6, 3], **kwargs) 321 | if pretrained: 322 | model.load_state_dict(model_zoo.load_url(model_urls['resnet50'])) 323 | return model 324 | 325 | 326 | def resnet101(pretrained=False, **kwargs): 327 | """Constructs a ResNet-101 model. 328 | Args: 329 | pretrained (bool): If True, returns a model pre-trained on ImageNet 330 | """ 331 | model = ResNet(Bottleneck, [3, 4, 23, 3], **kwargs) 332 | if pretrained: 333 | model.load_state_dict(model_zoo.load_url(model_urls['resnet101'])) 334 | return model 335 | 336 | 337 | def resnet152(pretrained=False, **kwargs): 338 | """Constructs a ResNet-152 model. 339 | Args: 340 | pretrained (bool): If True, returns a model pre-trained on ImageNet 341 | """ 342 | model = ResNet(Bottleneck, [3, 8, 36, 3], **kwargs) 343 | if pretrained: 344 | model.load_state_dict(model_zoo.load_url(model_urls['resnet152'])) 345 | return model 346 | 347 | 348 | def resnet_face18(use_se=True, **kwargs): 349 | model = ResNetFace(IRBlock, [2, 2, 2, 2], use_se=use_se, **kwargs) 350 | return model 351 | 352 | 353 | def resnet_face50(use_se=True, **kwargs): 354 | model = ResNetFace(IRBlock, [3, 4, 6, 3], use_se=use_se, **kwargs) 355 | return model 356 | 357 | 358 | def resnet_face101(use_se=True, **kwargs): 359 | model = ResNetFace(IRBlock, [3, 4, 23, 3], use_se=use_se, **kwargs) 360 | return model 361 | 362 | 363 | if __name__ == "__main__": 364 | x = torch.randn(4, 3, 112, 112) 365 | model = resnet_face18() 366 | out = model(x) 367 | 368 | print(out.shape) 369 | -------------------------------------------------------------------------------- /system/argumentation.py: -------------------------------------------------------------------------------- 1 | import os 2 | import random 3 | 4 | from PIL import Image 5 | import numpy as np 6 | import torchvision 7 | import cv2 8 | 9 | 10 | def Argumentation_RandomNoise(image, noise_num=300): 11 | ''' 12 | 添加随机噪点(实际上就是随机在图像上将像素点的灰度值变为255即白色) 13 | :param image: 需要加噪的图片 14 | :param noise_num: 添加的噪音点数目,一般是上千级别的 15 | :return: img_noise 16 | ''' 17 | # 18 | # 参数image:,noise_num: 19 | # img = cv2.imread(image) 20 | img_noise = image 21 | # cv2.imshow("src", img) 22 | rows, cols, chn = img_noise.shape 23 | # 加噪声 24 | for i in range(noise_num): 25 | x = np.random.randint(0, rows) # 随机生成指定范围的整数 26 | y = np.random.randint(0, cols) 27 | img_noise[x, y, :] = 255 28 | return img_noise 29 | 30 | 31 | def Argumentation_SaltPepperNoise(image, prob=0.003): 32 | ''' 33 | 添加椒盐噪声 34 | image:原始图片 35 | prob:噪声比例 36 | ''' 37 | # image = cv2.imread(image) 38 | output = np.zeros(image.shape, np.uint8) 39 | noise_out = np.zeros(image.shape, np.uint8) 40 | thres = 1 - prob 41 | for i in range(image.shape[0]): 42 | for j in range(image.shape[1]): 43 | rdn = random.random() # 随机生成0-1之间的数字 44 | if rdn < prob: # 如果生成的随机数小于噪声比例则将该像素点添加黑点,即椒噪声 45 | output[i][j] = 0 46 | noise_out[i][j] = 0 47 | elif rdn > thres: # 如果生成的随机数大于(1-噪声比例)则将该像素点添加白点,即盐噪声 48 | output[i][j] = 255 49 | noise_out[i][j] = 255 50 | else: 51 | output[i][j] = image[i][j] # 其他情况像素点不变 52 | noise_out[i][j] = 100 53 | return output 54 | 55 | 56 | def Argumentation_GasussNoise(image, mean=0, var=1e-2): 57 | ''' 58 | 添加高斯噪声 59 | image:原始图像 60 | mean : 均值 61 | var : 方差,越大,噪声越大 62 | ''' 63 | # image = cv2.imread(image) 64 | image = np.array(image / 255, dtype=float) # 将原始图像的像素值进行归一化,除以255使得像素值在0-1之间 65 | mean = np.mean(image) 66 | noise = np.random.normal(mean, var ** 0.5, image.shape) # 创建一个均值为mean,方差为var呈高斯分布的图像矩阵 67 | out = image + noise # 将噪声和原始图像进行相加得到加噪后的图像 68 | if out.min() < 0: 69 | low_clip = -1. 70 | else: 71 | low_clip = 0. 72 | out = np.clip(out, low_clip, 1.0) # clip函数将元素的大小限制在了low_clip和1之间了,小于的用low_clip代替,大于1的用1代替 73 | out = np.uint8(out * 255) # 解除归一化,乘以255将加噪后的图像的像素值恢复 74 | # cv.imshow("gasuss", out) 75 | noise = noise * 255 76 | return out 77 | 78 | 79 | def Argumentation_MotionBlur(img): 80 | random_s = int(np.random.normal(1, 0.1, 1)[0] * 10) 81 | if random_s < 0: 82 | random_s = 0 83 | random_size = int(np.random.normal(1, 0.5, 1)[0] * 50) 84 | if random_size < 40: 85 | random_size = 40 86 | random_degree = int(np.random.uniform(-180, 180, 1)[0]) 87 | 88 | size = random_s 89 | img_resize = random_size 90 | degree = random_degree 91 | 92 | center = (size // 2, size // 2) 93 | 94 | M = cv2.getRotationMatrix2D(center, degree, 1.0) 95 | 96 | kernel_motion_blur = np.zeros((size, size)) 97 | kernel_motion_blur[int((size - 1) / 2), :] = np.ones(size) 98 | kernel_motion_blur = kernel_motion_blur / size 99 | 100 | if np.random.normal(0, 0.1, 1)[0] < 0: 101 | kernel_motion_blur = cv2.warpAffine(kernel_motion_blur, M, (size, size)) 102 | # print("rotated") 103 | 104 | output = cv2.filter2D(img, -1, kernel_motion_blur) 105 | return output 106 | 107 | 108 | def Argumentation_HorizontalFlip(img): 109 | horizon_flip = torchvision.transforms.RandomHorizontalFlip(1.0) 110 | img = horizon_flip(Image.fromarray(img)) 111 | return np.array(img) 112 | 113 | 114 | def Argumentation_CenterCrop(img): 115 | ratio = 0.83 116 | h = img.shape[0] 117 | w = img.shape[1] 118 | center_cro = torchvision.transforms.Compose([ 119 | torchvision.transforms.CenterCrop((int(h * ratio), int(w * ratio))), 120 | torchvision.transforms.Resize((h, w)) 121 | ]) 122 | img = center_cro(Image.fromarray(img)) 123 | return np.array(img) 124 | 125 | 126 | def Argumentation_randomRotate(img): 127 | rotate = torchvision.transforms.Compose([ 128 | torchvision.transforms.RandomRotation((-5, 5)) 129 | ]) 130 | img = rotate(Image.fromarray(img)) 131 | return np.array(img) 132 | 133 | 134 | def Argumentation_randomAffine(img): 135 | affine = torchvision.transforms.Compose([ 136 | torchvision.transforms.RandomAffine(0, translate=(0.1, 0.1)) 137 | ]) 138 | img = affine(Image.fromarray(img)) 139 | return np.array(img) 140 | 141 | 142 | def Argumentation_ColorJit(img): 143 | colorJit = torchvision.transforms.ColorJitter(brightness=0.3, contrast=0.3) 144 | img = colorJit(Image.fromarray(img)) 145 | return np.array(img) 146 | 147 | 148 | def Argumentation_RandomBlack(image, block_size=30, block_num=4): 149 | for i in range(random.randint(1, block_num)): 150 | c_x = random.randint(0, image.shape[1]) 151 | c_y = random.randint(0, image.shape[0]) 152 | size = random.randint(0, block_size) 153 | 154 | start_x = max(0, c_x - int(size / 2)) 155 | end_x = min(image.shape[1], c_x + int(size / 2)) 156 | 157 | start_y = max(0, c_y - int(size / 2)) 158 | end_y = min(image.shape[0], c_y + int(size / 2)) 159 | 160 | image[start_y:end_y, start_x:end_x] = 0 161 | return image 162 | 163 | 164 | def ArgumentationSchedule(img, seed): 165 | # print("choosing seed:{}".format(seed)) 166 | fun = { 167 | 0: Argumentation_MotionBlur, 168 | 1: Argumentation_randomRotate, 169 | 2: Argumentation_CenterCrop, 170 | 3: Argumentation_ColorJit, 171 | 4: Argumentation_HorizontalFlip, 172 | 5: Argumentation_randomAffine, 173 | 6: Argumentation_RandomBlack, 174 | 7: Argumentation_RandomNoise, 175 | 8: Argumentation_SaltPepperNoise, 176 | 9: Argumentation_GasussNoise, 177 | }.get(seed) 178 | return fun(img) 179 | 180 | 181 | def case_testLoader(): 182 | while True: 183 | # img = Image.open("../../ims/head1_17.jpg") 184 | img = cv2.imread("../../ims/head1_17.jpg") 185 | img = ArgumentationSchedule(np.array(img), random.randint(0, 9)) 186 | img = np.array(img, dtype=np.uint8) 187 | # cv2.imshow("dataSetWindow", img[:, :, ::-1]) 188 | cv2.imshow("dataSetWindow", img) 189 | cv2.waitKey(0) 190 | 191 | 192 | if __name__ == '__main__': 193 | case_testLoader() 194 | -------------------------------------------------------------------------------- /system/cos_lr.py: -------------------------------------------------------------------------------- 1 | import sys, os 2 | import math 3 | import torch 4 | from pylab import plt 5 | 6 | PI = 3.1415926 7 | 8 | 9 | def get_target_lr(epoch, epoch_stride=20): 10 | return (math.cos(PI * (float(epoch % epoch_stride) / float(epoch_stride))) + 1) / 2 11 | 12 | 13 | def adjust_learning_rate(optimizer, epoch, leak_lr, bottom_lr): 14 | set_lr = get_target_lr(epoch) * (leak_lr - bottom_lr) + bottom_lr 15 | for param_group in optimizer.param_groups: 16 | param_group['lr'] = set_lr 17 | return set_lr 18 | 19 | 20 | if __name__ == '__main__': 21 | from torchvision.models import resnet18 22 | 23 | model = resnet18(pretrained=False) 24 | 25 | leak_lr = 1e-4 26 | bottom_lr = 1e-6 27 | 28 | optimizer = torch.optim.Adam(model.parameters(), lr=leak_lr) 29 | 30 | x = [] 31 | y = [] 32 | for epoch in range(200): 33 | adjust_learning_rate(optimizer, epoch, leak_lr, bottom_lr) 34 | for param_group in optimizer.param_groups: 35 | print("epoch: {} lr set to : {}".format(epoch, param_group['lr'])) 36 | 37 | lr = get_target_lr(epoch) * leak_lr 38 | y.append(lr) 39 | x.append(epoch) 40 | plt.plot(x, y) 41 | plt.show() 42 | -------------------------------------------------------------------------------- /system/data_loader.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | import random 3 | import sys, os 4 | 5 | import cv2 6 | import torch 7 | import numpy as np 8 | import torch.utils.data.dataset 9 | from tqdm import tqdm 10 | from system.argumentation import ArgumentationSchedule 11 | 12 | 13 | def default_loader(bgrImg224): 14 | input = torch.zeros(1, 3, 224, 224) 15 | img = bgrImg224 16 | img = img.transpose(2, 0, 1) 17 | img = np.ascontiguousarray(img, dtype=np.float32) 18 | img = torch.from_numpy(img).float() 19 | input[0, :, :, :] = img 20 | return input 21 | 22 | 23 | def torch_loader(bgrImg224, dimension=224): 24 | if bgrImg224.shape[0] != bgrImg224.shape[1]: 25 | raise (" input picture not a square") 26 | if bgrImg224.shape[0] != dimension: 27 | bgrImg224 = cv2.resize(bgrImg224, (dimension, dimension)) 28 | 29 | if torch.cuda.is_available(): 30 | img = torch.from_numpy(bgrImg224).cuda().float() 31 | else: 32 | img = torch.from_numpy(bgrImg224).float() 33 | img = img.transpose(2, 0).transpose(1, 2) / 255. 34 | # img = img.unsqueeze(0) eval 时候需要,train 时候不需要 35 | return img 36 | 37 | 38 | class IDDataSet(): 39 | def __init__(self, root_dir, cache_file=""): 40 | self.root_dir = root_dir 41 | self.file_paths = [] 42 | self.file_IDs = [] 43 | self.file_labels = [] 44 | 45 | self.IDs = [] 46 | self.IDsLabels = {} 47 | 48 | if os.path.exists(cache_file) is False: 49 | for dir in tqdm(os.listdir(self.root_dir)): 50 | if os.path.isdir(os.path.join(self.root_dir, dir)) is False: 51 | raise ("DIR Error") 52 | self.IDs.append(dir) 53 | 54 | label_idx = 0 55 | for ID in self.IDs: 56 | self.IDsLabels[ID] = label_idx 57 | label_idx += 1 58 | 59 | for dir in tqdm(os.listdir(self.root_dir)): 60 | if os.path.isdir(os.path.join(self.root_dir, dir)) is False: 61 | raise ("DIR Error") 62 | for file in os.listdir(os.path.join(self.root_dir, dir)): 63 | if os.path.splitext(file)[1] in [".jpg", ".bmp", ".png"]: 64 | self.file_paths.append(os.path.join(self.root_dir, dir, file)) 65 | self.file_IDs.append(dir) 66 | self.file_labels.append(self.IDsLabels[dir]) 67 | print("data set loaded from scratch len: {}".format(len(self.file_paths))) 68 | sys.stdout.flush() 69 | with open(cache_file, "wb") as f: 70 | pickle.dump([self.file_paths, 71 | self.file_IDs, 72 | self.file_labels, 73 | self.IDs, 74 | self.IDsLabels], f) 75 | else: 76 | print("start loading from cache") 77 | sys.stdout.flush() 78 | with open(cache_file, "rb") as f: 79 | self.file_paths, self.file_IDs, self.file_labels, self.IDs, self.IDsLabels = pickle.load(f) 80 | print("data set loaded from cache len: {}".format(len(self.file_paths))) 81 | sys.stdout.flush() 82 | return 83 | 84 | def __getitem__(self, idx): 85 | file_path = self.file_paths[idx] 86 | file_id = self.file_IDs[idx] 87 | file_label = self.file_labels[idx] 88 | 89 | bgrIm = cv2.imread(file_path) 90 | # bgrIm_argu = ArgumentationSchedule(bgrIm, random.randint(0, 9)) 91 | return torch_loader(bgrIm), file_path, file_id, file_label 92 | 93 | def __len__(self): 94 | return len(self.file_paths) 95 | 96 | 97 | if __name__ == '__main__': 98 | # img = default_loader(cv2.imread("../demo_ims/0000166/260.jpg")) 99 | # img = torch_loader(cv2.imread("../demo_ims/0000166/260.jpg")) 100 | 101 | dataset = IDDataSet("../demo_ims/") 102 | 103 | data_loader = torch.utils.data.DataLoader(dataset, batch_size=8, shuffle=True, num_workers=0) 104 | 105 | for img, file_path, id, label in tqdm(data_loader): 106 | bgrIm = (img[0] * 255.0).detach().cpu().numpy().transpose(1, 2, 0).astype(np.uint8) 107 | cv2.imshow("x", bgrIm) 108 | cv2.waitKey(0) 109 | pass 110 | pass 111 | -------------------------------------------------------------------------------- /system/system_funcs.py: -------------------------------------------------------------------------------- 1 | import sys, os, cv2 2 | import numpy as np 3 | 4 | 5 | def visualise(path1, path2, predicted_id, GT_id, score, timeElapse=0): 6 | im1 = cv2.imread(path1) 7 | im2 = cv2.imread(path2) 8 | 9 | im1 = cv2.resize(im1, (224, 224)) 10 | im2 = cv2.resize(im2, (224, 224)) 11 | 12 | im = np.concatenate((im1, im2), 1) 13 | 14 | cv2.putText(im, "similarity:{:.2f}".format(score), (20, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) 15 | cv2.putText(im, "predicted:{}".format(predicted_id), (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) 16 | cv2.putText(im, "ground truth:{}".format(GT_id), (20, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) 17 | cv2.imshow("result", im) 18 | cv2.waitKey(timeElapse) 19 | -------------------------------------------------------------------------------- /train.log: -------------------------------------------------------------------------------- 1 | /home/leo/.pyenv/versions/anaconda3-2019.03/bin/python /home/leo/workspace/PycharmProjects/GroupFacePytorch/train.py 2 | >> LoadGallery[9/10] 3 | 4 | EpochEval[-1] >> 100.0/100.0 acc:33.0/100.0=0.3300 5 | 6 | 7 | START Training 8 | Epoch: 0 [0/13] loss:2.38 9 | Epoch: 0 [1/13] loss:2.45 10 | Epoch: 0 [2/13] loss:2.45 11 | Epoch: 0 [3/13] loss:2.48 12 | Epoch: 0 [4/13] loss:2.49 13 | Epoch: 0 [5/13] loss:2.36 14 | Epoch: 0 [6/13] loss:2.42 15 | Epoch: 0 [7/13] loss:2.40 16 | Epoch: 0 [8/13] loss:2.45 17 | Epoch: 0 [9/13] loss:2.38 18 | Epoch: 0 [10/13] loss:2.37 19 | Epoch: 0 [11/13] loss:2.41 20 | Epoch: 0 [12/13] loss:2.35 21 | Epoch 0 Trained Loss_Sum:2.41533 22 | >> LoadGallery[9/10] 23 | 24 | EpochEval[0] >> 100.0/100.0 acc:34.0/100.0=0.3400 25 | 26 | Epoch: 1 [0/13] loss:2.33 27 | Epoch: 1 [1/13] loss:2.34 28 | Epoch: 1 [2/13] loss:2.32 29 | Epoch: 1 [3/13] loss:2.28 30 | Epoch: 1 [4/13] loss:2.31 31 | Epoch: 1 [5/13] loss:2.23 32 | Epoch: 1 [6/13] loss:2.25 33 | Epoch: 1 [7/13] loss:2.29 34 | Epoch: 1 [8/13] loss:2.24 35 | Epoch: 1 [9/13] loss:2.30 36 | Epoch: 1 [10/13] loss:2.30 37 | Epoch: 1 [11/13] loss:2.28 38 | Epoch: 1 [12/13] loss:2.20 39 | Epoch 1 Trained Loss_Sum:2.28303 40 | >> LoadGallery[9/10] 41 | 42 | EpochEval[1] >> 100.0/100.0 acc:40.0/100.0=0.4000 43 | 44 | Epoch: 2 [0/13] loss:2.10 45 | Epoch: 2 [1/13] loss:2.20 46 | Epoch: 2 [2/13] loss:2.12 47 | Epoch: 2 [3/13] loss:2.10 48 | Epoch: 2 [4/13] loss:2.12 49 | Epoch: 2 [5/13] loss:2.07 50 | Epoch: 2 [6/13] loss:2.16 51 | Epoch: 2 [7/13] loss:2.03 52 | Epoch: 2 [8/13] loss:2.09 53 | Epoch: 2 [9/13] loss:2.12 54 | Epoch: 2 [10/13] loss:1.99 55 | Epoch: 2 [11/13] loss:1.94 56 | Epoch: 2 [12/13] loss:1.96 57 | Epoch 2 Trained Loss_Sum:2.07692 58 | >> LoadGallery[9/10] 59 | 60 | EpochEval[2] >> 100.0/100.0 acc:44.0/100.0=0.4400 61 | 62 | Epoch: 3 [0/13] loss:1.96 63 | Epoch: 3 [1/13] loss:1.90 64 | Epoch: 3 [2/13] loss:1.92 65 | Epoch: 3 [3/13] loss:1.86 66 | Epoch: 3 [4/13] loss:1.95 67 | Epoch: 3 [5/13] loss:1.79 68 | Epoch: 3 [6/13] loss:1.82 69 | Epoch: 3 [7/13] loss:1.87 70 | Epoch: 3 [8/13] loss:1.80 71 | Epoch: 3 [9/13] loss:1.85 72 | Epoch: 3 [10/13] loss:1.89 73 | Epoch: 3 [11/13] loss:1.87 74 | Epoch: 3 [12/13] loss:1.79 75 | Epoch 3 Trained Loss_Sum:1.86672 76 | >> LoadGallery[9/10] 77 | 78 | EpochEval[3] >> 100.0/100.0 acc:72.0/100.0=0.7200 79 | 80 | Epoch: 4 [0/13] loss:1.77 81 | Epoch: 4 [1/13] loss:1.73 82 | Epoch: 4 [2/13] loss:1.77 83 | Epoch: 4 [3/13] loss:1.77 84 | Epoch: 4 [4/13] loss:1.78 85 | Epoch: 4 [5/13] loss:1.75 86 | Epoch: 4 [6/13] loss:1.75 87 | Epoch: 4 [7/13] loss:1.74 88 | Epoch: 4 [8/13] loss:1.76 89 | Epoch: 4 [9/13] loss:1.73 90 | Epoch: 4 [10/13] loss:1.72 91 | Epoch: 4 [11/13] loss:1.74 92 | Epoch: 4 [12/13] loss:1.74 93 | Epoch 4 Trained Loss_Sum:1.74953 94 | >> LoadGallery[9/10] 95 | 96 | EpochEval[4] >> 100.0/100.0 acc:96.0/100.0=0.9600 97 | 98 | Epoch: 5 [0/13] loss:1.69 99 | Epoch: 5 [1/13] loss:1.70 100 | Epoch: 5 [2/13] loss:1.70 101 | Epoch: 5 [3/13] loss:1.69 102 | Epoch: 5 [4/13] loss:1.68 103 | Epoch: 5 [5/13] loss:1.68 104 | Epoch: 5 [6/13] loss:1.66 105 | Epoch: 5 [7/13] loss:1.71 106 | Epoch: 5 [8/13] loss:1.67 107 | Epoch: 5 [9/13] loss:1.67 108 | Epoch: 5 [10/13] loss:1.66 109 | Epoch: 5 [11/13] loss:1.70 110 | Epoch: 5 [12/13] loss:1.65 111 | Epoch 5 Trained Loss_Sum:1.68148 112 | >> LoadGallery[9/10] 113 | 114 | EpochEval[5] >> 100.0/100.0 acc:100.0/100.0=1.0000 115 | 116 | Epoch: 6 [0/13] loss:1.66 117 | Epoch: 6 [1/13] loss:1.67 118 | Epoch: 6 [2/13] loss:1.64 119 | Epoch: 6 [3/13] loss:1.66 120 | Epoch: 6 [4/13] loss:1.65 121 | Epoch: 6 [5/13] loss:1.66 122 | Epoch: 6 [6/13] loss:1.64 123 | Epoch: 6 [7/13] loss:1.66 124 | Epoch: 6 [8/13] loss:1.63 125 | Epoch: 6 [9/13] loss:1.64 126 | Epoch: 6 [10/13] loss:1.63 127 | Epoch: 6 [11/13] loss:1.65 128 | Epoch: 6 [12/13] loss:1.65 129 | Epoch 6 Trained Loss_Sum:1.65054 130 | >> LoadGallery[9/10] 131 | 132 | EpochEval[6] >> 100.0/100.0 acc:100.0/100.0=1.0000 133 | 134 | Epoch: 7 [0/13] loss:1.63 135 | Epoch: 7 [1/13] loss:1.62 136 | Epoch: 7 [2/13] loss:1.63 137 | Epoch: 7 [3/13] loss:1.63 138 | Epoch: 7 [4/13] loss:1.62 139 | Epoch: 7 [5/13] loss:1.62 140 | Epoch: 7 [6/13] loss:1.63 141 | Epoch: 7 [7/13] loss:1.63 142 | Epoch: 7 [8/13] loss:1.62 143 | Epoch: 7 [9/13] loss:1.63 144 | Epoch: 7 [10/13] loss:1.62 145 | Epoch: 7 [11/13] loss:1.62 146 | Epoch: 7 [12/13] loss:1.64 147 | Epoch 7 Trained Loss_Sum:1.62562 148 | >> LoadGallery[9/10] 149 | 150 | EpochEval[7] >> 100.0/100.0 acc:100.0/100.0=1.0000 151 | 152 | Epoch: 8 [0/13] loss:1.61 153 | Epoch: 8 [1/13] loss:1.62 154 | Epoch: 8 [2/13] loss:1.62 155 | Epoch: 8 [3/13] loss:1.61 156 | Epoch: 8 [4/13] loss:1.61 157 | Epoch: 8 [5/13] loss:1.61 158 | Epoch: 8 [6/13] loss:1.61 159 | Epoch: 8 [7/13] loss:1.60 160 | Epoch: 8 [8/13] loss:1.62 161 | Epoch: 8 [9/13] loss:1.62 162 | Epoch: 8 [10/13] loss:1.60 163 | Epoch: 8 [11/13] loss:1.62 164 | Epoch: 8 [12/13] loss:1.60 165 | Epoch 8 Trained Loss_Sum:1.61249 166 | >> LoadGallery[9/10] 167 | 168 | EpochEval[8] >> 100.0/100.0 acc:100.0/100.0=1.0000 169 | 170 | Epoch: 9 [0/13] loss:1.61 171 | Epoch: 9 [1/13] loss:1.61 172 | Epoch: 9 [2/13] loss:1.61 173 | Epoch: 9 [3/13] loss:1.61 174 | Epoch: 9 [4/13] loss:1.61 175 | Epoch: 9 [5/13] loss:1.60 176 | Epoch: 9 [6/13] loss:1.60 177 | Epoch: 9 [7/13] loss:1.61 178 | Epoch: 9 [8/13] loss:1.60 179 | Epoch: 9 [9/13] loss:1.60 180 | Epoch: 9 [10/13] loss:1.60 181 | Epoch: 9 [11/13] loss:1.60 182 | Epoch: 9 [12/13] loss:1.60 183 | Epoch 9 Trained Loss_Sum:1.60482 184 | >> LoadGallery[9/10] 185 | 186 | EpochEval[9] >> 100.0/100.0 acc:100.0/100.0=1.0000 187 | 188 | Epoch: 10 [0/13] loss:1.60 189 | Epoch: 10 [1/13] loss:1.60 190 | Epoch: 10 [2/13] loss:1.61 191 | Epoch: 10 [3/13] loss:1.60 192 | Epoch: 10 [4/13] loss:1.59 193 | Epoch: 10 [5/13] loss:1.60 194 | Epoch: 10 [6/13] loss:1.60 195 | Epoch: 10 [7/13] loss:1.60 196 | Epoch: 10 [8/13] loss:1.60 197 | Epoch: 10 [9/13] loss:1.59 198 | Epoch: 10 [10/13] loss:1.60 199 | Epoch: 10 [11/13] loss:1.60 200 | Epoch: 10 [12/13] loss:1.61 201 | Epoch 10 Trained Loss_Sum:1.59959 202 | >> LoadGallery[9/10] 203 | 204 | EpochEval[10] >> 100.0/100.0 acc:100.0/100.0=1.0000 205 | 206 | Epoch: 11 [0/13] loss:1.60 207 | Epoch: 11 [1/13] loss:1.60 208 | Epoch: 11 [2/13] loss:1.59 209 | Epoch: 11 [3/13] loss:1.59 210 | Epoch: 11 [4/13] loss:1.60 211 | Epoch: 11 [5/13] loss:1.59 212 | Epoch: 11 [6/13] loss:1.60 213 | Epoch: 11 [7/13] loss:1.59 214 | Epoch: 11 [8/13] loss:1.60 215 | Epoch: 11 [9/13] loss:1.59 216 | Epoch: 11 [10/13] loss:1.59 217 | Epoch: 11 [11/13] loss:1.59 218 | Epoch: 11 [12/13] loss:1.60 219 | Epoch 11 Trained Loss_Sum:1.59485 220 | >> LoadGallery[9/10] 221 | 222 | EpochEval[11] >> 100.0/100.0 acc:100.0/100.0=1.0000 223 | 224 | Epoch: 12 [0/13] loss:1.59 225 | Epoch: 12 [1/13] loss:1.59 226 | Epoch: 12 [2/13] loss:1.59 227 | Epoch: 12 [3/13] loss:1.59 228 | Epoch: 12 [4/13] loss:1.60 229 | Epoch: 12 [5/13] loss:1.60 230 | Epoch: 12 [6/13] loss:1.59 231 | Epoch: 12 [7/13] loss:1.59 232 | Epoch: 12 [8/13] loss:1.59 233 | Epoch: 12 [9/13] loss:1.59 234 | Epoch: 12 [10/13] loss:1.59 235 | Epoch: 12 [11/13] loss:1.59 236 | Epoch: 12 [12/13] loss:1.60 237 | Epoch 12 Trained Loss_Sum:1.59293 238 | >> LoadGallery[9/10] 239 | 240 | EpochEval[12] >> 100.0/100.0 acc:100.0/100.0=1.0000 241 | 242 | Epoch: 13 [0/13] loss:1.59 243 | Epoch: 13 [1/13] loss:1.59 244 | Epoch: 13 [2/13] loss:1.59 245 | Epoch: 13 [3/13] loss:1.60 246 | Epoch: 13 [4/13] loss:1.58 247 | Epoch: 13 [5/13] loss:1.59 248 | Epoch: 13 [6/13] loss:1.59 249 | Epoch: 13 [7/13] loss:1.59 250 | Epoch: 13 [8/13] loss:1.59 251 | Epoch: 13 [9/13] loss:1.59 252 | Epoch: 13 [10/13] loss:1.59 253 | Epoch: 13 [11/13] loss:1.59 254 | Epoch: 13 [12/13] loss:1.59 255 | Epoch 13 Trained Loss_Sum:1.58940 256 | >> LoadGallery[9/10] 257 | 258 | EpochEval[13] >> 100.0/100.0 acc:100.0/100.0=1.0000 259 | 260 | Epoch: 14 [0/13] loss:1.59 261 | Epoch: 14 [1/13] loss:1.58 262 | Epoch: 14 [2/13] loss:1.58 263 | Epoch: 14 [3/13] loss:1.59 264 | Epoch: 14 [4/13] loss:1.58 265 | Epoch: 14 [5/13] loss:1.58 266 | Epoch: 14 [6/13] loss:1.59 267 | Epoch: 14 [7/13] loss:1.59 268 | Epoch: 14 [8/13] loss:1.59 269 | Epoch: 14 [9/13] loss:1.60 270 | Epoch: 14 [10/13] loss:1.59 271 | Epoch: 14 [11/13] loss:1.58 272 | Epoch: 14 [12/13] loss:1.59 273 | Epoch 14 Trained Loss_Sum:1.58774 274 | >> LoadGallery[9/10] 275 | 276 | EpochEval[14] >> 100.0/100.0 acc:100.0/100.0=1.0000 277 | 278 | Epoch: 15 [0/13] loss:1.59 279 | Epoch: 15 [1/13] loss:1.58 280 | Epoch: 15 [2/13] loss:1.59 281 | Epoch: 15 [3/13] loss:1.59 282 | Epoch: 15 [4/13] loss:1.59 283 | Epoch: 15 [5/13] loss:1.58 284 | Epoch: 15 [6/13] loss:1.59 285 | Epoch: 15 [7/13] loss:1.59 286 | Epoch: 15 [8/13] loss:1.58 287 | Epoch: 15 [9/13] loss:1.58 288 | Epoch: 15 [10/13] loss:1.59 289 | Epoch: 15 [11/13] loss:1.58 290 | Epoch: 15 [12/13] loss:1.58 291 | Epoch 15 Trained Loss_Sum:1.58598 292 | >> LoadGallery[9/10] 293 | 294 | EpochEval[15] >> 100.0/100.0 acc:100.0/100.0=1.0000 295 | 296 | Epoch: 16 [0/13] loss:1.58 297 | Epoch: 16 [1/13] loss:1.58 298 | Epoch: 16 [2/13] loss:1.58 299 | Epoch: 16 [3/13] loss:1.58 300 | Epoch: 16 [4/13] loss:1.59 301 | Epoch: 16 [5/13] loss:1.59 302 | Epoch: 16 [6/13] loss:1.58 303 | Epoch: 16 [7/13] loss:1.58 304 | Epoch: 16 [8/13] loss:1.58 305 | Epoch: 16 [9/13] loss:1.59 306 | Epoch: 16 [10/13] loss:1.58 307 | Epoch: 16 [11/13] loss:1.58 308 | Epoch: 16 [12/13] loss:1.58 309 | Epoch 16 Trained Loss_Sum:1.58288 310 | >> LoadGallery[9/10] 311 | 312 | EpochEval[16] >> 100.0/100.0 acc:100.0/100.0=1.0000 313 | 314 | Epoch: 17 [0/13] loss:1.58 315 | Epoch: 17 [1/13] loss:1.58 316 | Epoch: 17 [2/13] loss:1.58 317 | Epoch: 17 [3/13] loss:1.58 318 | Epoch: 17 [4/13] loss:1.58 319 | Epoch: 17 [5/13] loss:1.58 320 | Epoch: 17 [6/13] loss:1.59 321 | Epoch: 17 [7/13] loss:1.58 322 | Epoch: 17 [8/13] loss:1.59 323 | Epoch: 17 [9/13] loss:1.58 324 | Epoch: 17 [10/13] loss:1.59 325 | Epoch: 17 [11/13] loss:1.58 326 | Epoch: 17 [12/13] loss:1.58 327 | Epoch 17 Trained Loss_Sum:1.58173 328 | >> LoadGallery[9/10] 329 | 330 | EpochEval[17] >> 100.0/100.0 acc:100.0/100.0=1.0000 331 | 332 | Epoch: 18 [0/13] loss:1.58 333 | Epoch: 18 [1/13] loss:1.58 334 | Epoch: 18 [2/13] loss:1.58 335 | Epoch: 18 [3/13] loss:1.58 336 | Epoch: 18 [4/13] loss:1.58 337 | Epoch: 18 [5/13] loss:1.58 338 | Epoch: 18 [6/13] loss:1.58 339 | Epoch: 18 [7/13] loss:1.58 340 | Epoch: 18 [8/13] loss:1.58 341 | Epoch: 18 [9/13] loss:1.58 342 | Epoch: 18 [10/13] loss:1.58 343 | Epoch: 18 [11/13] loss:1.58 344 | Epoch: 18 [12/13] loss:1.58 345 | Epoch 18 Trained Loss_Sum:1.57940 346 | >> LoadGallery[9/10] 347 | 348 | EpochEval[18] >> 100.0/100.0 acc:100.0/100.0=1.0000 349 | 350 | Epoch: 19 [0/13] loss:1.58 351 | Epoch: 19 [1/13] loss:1.57 352 | Epoch: 19 [2/13] loss:1.58 353 | Epoch: 19 [3/13] loss:1.58 354 | Epoch: 19 [4/13] loss:1.58 355 | Epoch: 19 [5/13] loss:1.58 356 | Epoch: 19 [6/13] loss:1.58 357 | Epoch: 19 [7/13] loss:1.58 358 | Epoch: 19 [8/13] loss:1.58 359 | Epoch: 19 [9/13] loss:1.58 360 | Epoch: 19 [10/13] loss:1.58 361 | Epoch: 19 [11/13] loss:1.58 362 | Epoch: 19 [12/13] loss:1.58 363 | Epoch 19 Trained Loss_Sum:1.57826 364 | >> LoadGallery[9/10] 365 | 366 | EpochEval[19] >> 100.0/100.0 acc:100.0/100.0=1.0000 367 | 368 | Epoch: 20 [0/13] loss:1.58 369 | Epoch: 20 [1/13] loss:1.58 370 | Epoch: 20 [2/13] loss:1.58 371 | Epoch: 20 [3/13] loss:1.58 372 | Epoch: 20 [4/13] loss:1.57 373 | Epoch: 20 [5/13] loss:1.58 374 | Epoch: 20 [6/13] loss:1.58 375 | Epoch: 20 [7/13] loss:1.58 376 | Epoch: 20 [8/13] loss:1.58 377 | Epoch: 20 [9/13] loss:1.57 378 | Epoch: 20 [10/13] loss:1.58 379 | Epoch: 20 [11/13] loss:1.58 380 | Epoch: 20 [12/13] loss:1.58 381 | Epoch 20 Trained Loss_Sum:1.57710 382 | >> LoadGallery[9/10] 383 | 384 | EpochEval[20] >> 100.0/100.0 acc:100.0/100.0=1.0000 385 | 386 | Epoch: 21 [0/13] loss:1.58 387 | Epoch: 21 [1/13] loss:1.57 388 | Epoch: 21 [2/13] loss:1.58 389 | Epoch: 21 [3/13] loss:1.57 390 | Epoch: 21 [4/13] loss:1.57 391 | Epoch: 21 [5/13] loss:1.57 392 | Epoch: 21 [6/13] loss:1.57 393 | Epoch: 21 [7/13] loss:1.58 394 | Epoch: 21 [8/13] loss:1.58 395 | Epoch: 21 [9/13] loss:1.58 396 | Epoch: 21 [10/13] loss:1.57 397 | Epoch: 21 [11/13] loss:1.58 398 | Epoch: 21 [12/13] loss:1.58 399 | Epoch 21 Trained Loss_Sum:1.57589 400 | >> LoadGallery[9/10] 401 | 402 | EpochEval[21] >> 100.0/100.0 acc:100.0/100.0=1.0000 403 | 404 | Epoch: 22 [0/13] loss:1.57 405 | Epoch: 22 [1/13] loss:1.57 406 | Epoch: 22 [2/13] loss:1.58 407 | Epoch: 22 [3/13] loss:1.57 408 | Epoch: 22 [4/13] loss:1.58 409 | Epoch: 22 [5/13] loss:1.57 410 | Epoch: 22 [6/13] loss:1.57 411 | Epoch: 22 [7/13] loss:1.57 412 | Epoch: 22 [8/13] loss:1.58 413 | Epoch: 22 [9/13] loss:1.57 414 | Epoch: 22 [10/13] loss:1.58 415 | Epoch: 22 [11/13] loss:1.58 416 | Epoch: 22 [12/13] loss:1.58 417 | Epoch 22 Trained Loss_Sum:1.57549 418 | >> LoadGallery[9/10] 419 | 420 | EpochEval[22] >> 100.0/100.0 acc:100.0/100.0=1.0000 421 | 422 | Epoch: 23 [0/13] loss:1.58 423 | Epoch: 23 [1/13] loss:1.58 424 | Epoch: 23 [2/13] loss:1.57 425 | Epoch: 23 [3/13] loss:1.58 426 | Epoch: 23 [4/13] loss:1.57 427 | Epoch: 23 [5/13] loss:1.57 428 | Epoch: 23 [6/13] loss:1.57 429 | Epoch: 23 [7/13] loss:1.58 430 | Epoch: 23 [8/13] loss:1.57 431 | Epoch: 23 [9/13] loss:1.57 432 | Epoch: 23 [10/13] loss:1.57 433 | Epoch: 23 [11/13] loss:1.57 434 | Epoch: 23 [12/13] loss:1.58 435 | Epoch 23 Trained Loss_Sum:1.57500 436 | >> LoadGallery[9/10] 437 | 438 | EpochEval[23] >> 100.0/100.0 acc:100.0/100.0=1.0000 439 | 440 | Epoch: 24 [0/13] loss:1.57 441 | Epoch: 24 [1/13] loss:1.57 442 | Epoch: 24 [2/13] loss:1.57 443 | Epoch: 24 [3/13] loss:1.57 444 | Epoch: 24 [4/13] loss:1.57 445 | Epoch: 24 [5/13] loss:1.58 446 | Epoch: 24 [6/13] loss:1.58 447 | Epoch: 24 [7/13] loss:1.57 448 | Epoch: 24 [8/13] loss:1.58 449 | Epoch: 24 [9/13] loss:1.58 450 | Epoch: 24 [10/13] loss:1.57 451 | Epoch: 24 [11/13] loss:1.57 452 | Epoch: 24 [12/13] loss:1.57 453 | Epoch 24 Trained Loss_Sum:1.57358 454 | >> LoadGallery[9/10] 455 | 456 | EpochEval[24] >> 100.0/100.0 acc:100.0/100.0=1.0000 457 | 458 | Epoch: 25 [0/13] loss:1.58 459 | Epoch: 25 [1/13] loss:1.57 460 | Epoch: 25 [2/13] loss:1.57 461 | Epoch: 25 [3/13] loss:1.57 462 | Epoch: 25 [4/13] loss:1.57 463 | Epoch: 25 [5/13] loss:1.57 464 | Epoch: 25 [6/13] loss:1.57 465 | Epoch: 25 [7/13] loss:1.57 466 | Epoch: 25 [8/13] loss:1.57 467 | Epoch: 25 [9/13] loss:1.57 468 | Epoch: 25 [10/13] loss:1.57 469 | Epoch: 25 [11/13] loss:1.58 470 | Epoch: 25 [12/13] loss:1.58 471 | Epoch 25 Trained Loss_Sum:1.57268 472 | >> LoadGallery[9/10] 473 | 474 | EpochEval[25] >> 100.0/100.0 acc:100.0/100.0=1.0000 475 | 476 | Epoch: 26 [0/13] loss:1.58 477 | Epoch: 26 [1/13] loss:1.57 478 | Epoch: 26 [2/13] loss:1.57 479 | Epoch: 26 [3/13] loss:1.57 480 | Epoch: 26 [4/13] loss:1.57 481 | Epoch: 26 [5/13] loss:1.57 482 | Epoch: 26 [6/13] loss:1.57 483 | Epoch: 26 [7/13] loss:1.57 484 | Epoch: 26 [8/13] loss:1.57 485 | Epoch: 26 [9/13] loss:1.57 486 | Epoch: 26 [10/13] loss:1.57 487 | Epoch: 26 [11/13] loss:1.57 488 | Epoch: 26 [12/13] loss:1.57 489 | Epoch 26 Trained Loss_Sum:1.57165 490 | >> LoadGallery[9/10] 491 | 492 | EpochEval[26] >> 100.0/100.0 acc:100.0/100.0=1.0000 493 | 494 | Epoch: 27 [0/13] loss:1.57 495 | Epoch: 27 [1/13] loss:1.57 496 | Epoch: 27 [2/13] loss:1.57 497 | Epoch: 27 [3/13] loss:1.57 498 | Epoch: 27 [4/13] loss:1.57 499 | Epoch: 27 [5/13] loss:1.57 500 | Epoch: 27 [6/13] loss:1.57 501 | Epoch: 27 [7/13] loss:1.57 502 | Epoch: 27 [8/13] loss:1.57 503 | Traceback (most recent call last): 504 | File "/home/leo/workspace/PycharmProjects/GroupFacePytorch/train.py", line 115, in 505 | train(model, epoch) 506 | File "/home/leo/workspace/PycharmProjects/GroupFacePytorch/train.py", line 79, in train 507 | loss = criteria_arc(final, label) 508 | File "/home/leo/.pyenv/versions/anaconda3-2019.03/lib/python3.7/site-packages/torch/nn/modules/module.py", line 541, in __call__ 509 | result = self.forward(*input, **kwargs) 510 | File "/home/leo/workspace/PycharmProjects/GroupFacePytorch/loss/arcface_loss.py", line 70, in forward 511 | cos_angle[i][labels[i]] = cos_angle[i][labels[i]] - self.m 512 | KeyboardInterrupt 513 | 514 | Process finished with exit code 137 (interrupted by signal 9: SIGKILL) 515 | -------------------------------------------------------------------------------- /train.py: -------------------------------------------------------------------------------- 1 | import sys, os 2 | import torch, cv2 3 | import numpy as np 4 | from models.group_face import GroupFace 5 | from loss.arcface_loss import ArcFaceLoss 6 | from system.data_loader import IDDataSet, torch_loader 7 | from system.system_funcs import visualise 8 | from system.cos_lr import adjust_learning_rate 9 | 10 | from sklearn.metrics.pairwise import cosine_similarity 11 | 12 | 13 | def load_gallery(model, gallery_path): 14 | gallery_files = [] 15 | gallery_ids = [] 16 | gallery_feats = {} 17 | gallery_len = len(os.listdir(gallery_path)) 18 | for i, dir in enumerate(os.listdir(gallery_path)): 19 | for file in os.listdir(os.path.join(gallery_path, dir)): 20 | file_path = os.path.join(gallery_path, dir, file) 21 | gallery_files.append(file_path) 22 | gallery_ids.append(dir) 23 | 24 | group_inter, final, group_prob, group_label = model(torch_loader(cv2.imread(file_path)).unsqueeze(0)) 25 | feat = final / torch.norm(final, p=2, keepdim=False) 26 | feat = feat.detach().cpu().reshape(1, 256).numpy() 27 | 28 | if isinstance(gallery_feats, dict) is True: 29 | gallery_feats = feat 30 | else: 31 | gallery_feats = np.concatenate((gallery_feats, feat), 0) 32 | pass 33 | sys.stdout.write( 34 | "\r>> LoadGallery[{}/{}] ".format(i, gallery_len)) 35 | sys.stdout.flush() 36 | 37 | print("\n") 38 | return gallery_files, gallery_ids, gallery_feats 39 | 40 | 41 | def eval(model, gallery_path, probe_root_path, epoch): 42 | model.eval() 43 | gallery_files, gallery_ids, gallery_feats = load_gallery(model, gallery_path) 44 | 45 | whole_cnt = 0.0 46 | for dir in os.listdir(probe_root_path): 47 | for file in os.listdir(os.path.join(probe_root_path, dir)): 48 | whole_cnt += 1.0 49 | 50 | evaled_cnt = 0.0 51 | right_cnt = 0.0 52 | sum_right_top1_score = 0.0 53 | for dir in os.listdir(probe_root_path): 54 | for file in os.listdir(os.path.join(probe_root_path, dir)): 55 | evaled_cnt += 1 56 | file_path = os.path.join(probe_root_path, dir, file) 57 | GT_id = dir 58 | 59 | group_inter, final, group_prob, group_label = model(torch_loader(cv2.imread(file_path)).unsqueeze(0)) 60 | feat = final / torch.norm(final, p=2, keepdim=False) 61 | feat = feat.detach().cpu().reshape(1, 256).numpy() 62 | 63 | scores = cosine_similarity(feat, gallery_feats) 64 | max_idx = np.argmax(scores) 65 | predicted_id = gallery_ids[max_idx] 66 | if predicted_id == GT_id: 67 | right_cnt += 1.0 68 | sum_right_top1_score += scores[0][max_idx] 69 | 70 | # visualise(file_path, gallery_files[max_idx], predicted_id, GT_id, scores[0][max_idx], timeElapse=500) 71 | 72 | sys.stdout.write( 73 | "\r EpochEval[{}] >> {}/{} acc:{}/{}={:.4f} avgRscore: {:.2f}".format(epoch, evaled_cnt, whole_cnt, 74 | right_cnt, evaled_cnt, 75 | right_cnt / evaled_cnt, 76 | sum_right_top1_score / float( 77 | right_cnt + 1e-10))) 78 | sys.stdout.flush() 79 | 80 | print("\n") 81 | return right_cnt / evaled_cnt 82 | 83 | 84 | def train(model, epoch): 85 | adjust_learning_rate(optimizer, epoch, learning_rate, 86 | float(learning_rate) / 100.0) 87 | for param_group in optimizer.param_groups: 88 | print("epoch: {} lr set to : {}".format(epoch, param_group['lr'])) 89 | model.train() 90 | batch_len = len(train_data_loader) 91 | loss_sum = 0.0 92 | for i, (img, file_path, id, label) in enumerate(train_data_loader): 93 | img = img.cuda() 94 | label = label.cuda() 95 | group_inter, final, group_prob, group_label = model(img) 96 | loss = criteria_arc(final, label) 97 | 98 | optimizer.zero_grad() 99 | loss.backward() 100 | optimizer.step() 101 | optimizer_center.step() 102 | 103 | loss_sum += float(loss) 104 | print("Epoch: {} [{}/{}] loss:{:.2f}".format(epoch, i, batch_len, float(loss))) 105 | sys.stdout.flush() 106 | 107 | print("Epoch {} Trained Loss_Sum:{:.5f}".format(epoch, loss_sum / float(batch_len))) 108 | sys.stdout.flush() 109 | 110 | 111 | if __name__ == '__main__': 112 | 113 | epoch_whole = 400 114 | learning_rate = 1e-4 115 | gallery_path = "./demo_eval/gallery/" 116 | probe_root_path = "./demo_eval/probe/" 117 | train_root_path = "./demo_ims/" 118 | # gallery_path = "/home/leo/samba107/lpy/dataset/MS1M/imgs_split/gallery/" 119 | # probe_root_path = "/home/leo/samba107/lpy/dataset/MS1M/imgs_split/probe/" 120 | # train_root_path = "/home/leo/samba107/lpy/dataset/MS1M/imgs_split/train/" 121 | 122 | batch_size = 16 123 | # batch_size = 96 124 | 125 | # pretrained_model = "choosed/Epoch_35_acc_1.00.pth" 126 | # pretrained_centers = "choosed/Epoch_35_centers.pth" 127 | pretrained_model = "" 128 | pretrained_centers = "" 129 | save_checkpoints_every_epoch = False 130 | 131 | checkpoints_save_path = "checkpoints" 132 | if os.path.exists(checkpoints_save_path) is False: 133 | os.makedirs(checkpoints_save_path) 134 | 135 | train_dataset = IDDataSet(train_root_path, "dataset.pk") 136 | train_data_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=0) 137 | 138 | model = GroupFace(resnet=50) 139 | if os.path.exists(pretrained_model) is True: 140 | print("loading weights {}".format(pretrained_model)) 141 | sys.stdout.flush() 142 | model.load_state_dict(torch.load(pretrained_model)) 143 | 144 | if torch.cuda.is_available(): 145 | model = torch.nn.DataParallel(model).cuda() 146 | 147 | # criteria_arc = ArcFaceLoss(num_classes=len(train_dataset.IDs), m=0.5, partial_fc_rate=0.1) 148 | criteria_arc = ArcFaceLoss(num_classes=10, m=0.5, partial_fc_rate=1) 149 | if os.path.exists(pretrained_centers) is True: 150 | print("loading centers {}".format(pretrained_centers)) 151 | sys.stdout.flush() 152 | criteria_arc.weight.load_state_dict(torch.load(pretrained_centers)) 153 | 154 | optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate) 155 | optimizer_center = torch.optim.Adam(criteria_arc.weight.parameters(), lr=learning_rate) 156 | # criteria_arc = torch.nn.CrossEntropyLoss() 157 | 158 | eval(model, gallery_path, probe_root_path, -1) 159 | print(" \n START Training") 160 | for epoch in range(epoch_whole): 161 | train(model, epoch) 162 | acc = eval(model, gallery_path, probe_root_path, epoch) 163 | if save_checkpoints_every_epoch is True: 164 | out_path = os.path.join(checkpoints_save_path, "Epoch_{}_acc_{:.2f}.pth".format(epoch, acc)) 165 | torch.save(model.module.state_dict(), out_path) 166 | out_path_centers = os.path.join(checkpoints_save_path, "Epoch_{}_centers.pth".format(epoch)) 167 | torch.save(criteria_arc.weight.state_dict(), out_path_centers) 168 | 169 | out_path = os.path.join(checkpoints_save_path, "Epoch_Final_acc_{:.2f}.pth".format(acc)) 170 | torch.save(model.module.state_dict(), out_path) 171 | out_path_centers = os.path.join(checkpoints_save_path, "Epoch_Final_centers.pth") 172 | torch.save(criteria_arc.weight.state_dict(), out_path_centers) 173 | pass 174 | -------------------------------------------------------------------------------- /trainAtdocker.sh: -------------------------------------------------------------------------------- 1 | 2 | #/opt/conda/bin/python main.py 2>&1 | tee log_trainDocker.txt & 3 | /opt/conda/bin/python train.py 2>&1 | tee log_train_groupface_Docker.txt & 4 | --------------------------------------------------------------------------------