Commit b6c19984 authored by dengjb's avatar dengjb
Browse files

update

parents
_BASE_: Base-naic.yml
MODEL:
BACKBONE:
NAME: build_resnet_backbone
DEPTH: 34x
FEAT_DIM: 512
WITH_IBN: True
PRETRAIN: True
OUTPUT_DIR: projects/NAIC20/logs/r34_ibn-128x256
\ No newline at end of file
_BASE_: Base-naic.yml
MODEL:
BACKBONE:
NAME: build_resnet_backbone
DEPTH: 34x
FEAT_DIM: 512
WITH_IBN: True
WEIGHTS: projects/NAIC20/logs/reproduce/r34-tripletx10/model_best.pth
DATASETS:
TESTS: ("NAIC20_R2A",)
TEST:
RERANK:
ENABLED: True
K1: 20
K2: 3
LAMBDA: 0.8
FLIP:
ENABLED: True
SAVE_DISTMAT: True
OUTPUT_DIR: projects/NAIC20/logs/r34_ibn-128x256-submit
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
# encoding: utf-8
"""
@author: l1aoxingyu
@contact: sherlockliao01@gmail.com
"""
from .naic_dataset import *
from .config import add_naic_config
from .naic_evaluator import NaicEvaluator
# encoding: utf-8
"""
@author: xingyu liao
@contact: sherlockliao01@gmail.com
"""
def add_naic_config(cfg):
_C = cfg
_C.DATASETS.RM_LT = True
_C.TEST.SAVE_DISTMAT = False
# encoding: utf-8
"""
@author: xingyu liao
@contact: sherlockliao01@gmail.com
"""
import glob
import os
from collections import defaultdict
from fastreid.data.datasets import DATASET_REGISTRY
from fastreid.data.datasets.bases import ImageDataset
__all__ = ["NAIC20_R2", "NAIC20_R2CNV", "NAIC20_R1", "NAIC20_R1CNV", "NAIC19", "NAIC20_R2A", ]
@DATASET_REGISTRY.register()
class NAIC20_R2(ImageDataset):
dataset_name = "naic20_r2"
dataset_dir = "naic/2020_NAIC/fusai/train"
def __init__(self, root="datasets", rm_lt=False, **kwargs):
self.root = root
self.data_path = os.path.join(self.root, self.dataset_dir, "images")
self.train_label = os.path.join(self.root, self.dataset_dir, "naic20r2_train_list_clean.txt")
self.query_label = os.path.join(self.root, self.dataset_dir, "val_query.txt")
self.gallery_label = os.path.join(self.root, self.dataset_dir, "val_gallery.txt")
required_files = [self.train_label, self.query_label, self.gallery_label]
self.check_before_run(required_files)
all_train = self.process_train(self.train_label)
# fmt: off
if rm_lt: train = self.remove_longtail(all_train)
else: train = all_train
# fmt: on
query, gallery = self.process_test(self.query_label, self.gallery_label)
super().__init__(train, query, gallery, **kwargs)
def process_train(self, label_path):
with open(label_path, 'r') as f:
data_list = [i.strip('\n') for i in f.readlines()]
img_paths = []
for data_info in data_list:
img_name, pid = data_info.split(":")
img_path = os.path.join(self.data_path, img_name)
pid = self.dataset_name + "_" + pid
camid = self.dataset_name + '_0'
img_paths.append([img_path, pid, camid])
return img_paths
def process_test(self, query_path, gallery_path):
with open(query_path, 'r') as f:
query_list = [i.strip('\n') for i in f.readlines()]
with open(gallery_path, 'r') as f:
gallery_list = [i.strip('\n') for i in f.readlines()]
query_paths = []
for data in query_list:
img_name, pid = data.split(':')
img_path = os.path.join(self.data_path, img_name)
camid = '0'
query_paths.append([img_path, int(pid), camid])
gallery_paths = []
for data in gallery_list:
img_name, pid = data.split(':')
img_path = os.path.join(self.data_path, img_name)
camid = '1'
gallery_paths.append([img_path, int(pid), camid])
return query_paths, gallery_paths
@classmethod
def remove_longtail(cls, all_train):
# 建立 id 到 image 的字典
pid2data = defaultdict(list)
for item in all_train:
pid2data[item[1]].append(item)
train = []
for pid, data in pid2data.items():
# 如果 id 只有一张图片,去掉这个 id
if len(data) == 1: continue
train.extend(data)
return train
@DATASET_REGISTRY.register()
class NAIC20_R2CNV(NAIC20_R2, ImageDataset):
dataset_name = 'naic20_r2cnv'
dataset_dir = "naic/2020_NAIC/fusai/train"
def __init__(self, root="datasets", rm_lt=False, **kwargs):
self.root = root
self.data_path = os.path.join(self.root, self.dataset_dir, "images_convert")
self.train_label = os.path.join(self.root, self.dataset_dir, "naic20r2_train_list_clean.txt")
self.query_label = os.path.join(self.root, self.dataset_dir, "val_query.txt")
self.gallery_label = os.path.join(self.root, self.dataset_dir, "val_gallery.txt")
required_files = [self.train_label, self.query_label, self.gallery_label]
self.check_before_run(required_files)
all_train = self.process_train(self.train_label)[:53000]
# fmt: off
if rm_lt: train = self.remove_longtail(all_train)
else: train = all_train
# fmt: on
ImageDataset.__init__(self, train, query=[], gallery=[], **kwargs)
@DATASET_REGISTRY.register()
class NAIC20_R1(NAIC20_R2):
dataset_name = "naic20_r1"
dataset_dir = 'naic/2020_NAIC/chusai/train'
def __init__(self, root="datasets", rm_lt=False, **kwargs):
self.root = root
self.data_path = os.path.join(self.root, self.dataset_dir, "images")
self.train_label = os.path.join(self.root, self.dataset_dir, "label.txt")
required_files = [self.train_label]
self.check_before_run(required_files)
all_train = self.process_train(self.train_label)[:40188]
# fmt: off
if rm_lt: train = self.remove_longtail(all_train)
else: train = all_train
# fmt: on
super(NAIC20_R2, self).__init__(train, [], [], **kwargs)
@DATASET_REGISTRY.register()
class NAIC20_R1CNV(NAIC20_R2):
dataset_name = 'naic20_r1cnv'
dataset_dir = "naic/2020_NAIC/chusai/train"
def __init__(self, root="datasets", rm_lt=False, **kwargs):
self.root = root
self.data_path = os.path.join(self.root, self.dataset_dir, "images_convert")
self.train_label = os.path.join(self.root, self.dataset_dir, "label.txt")
required_files = [self.train_label]
self.check_before_run(required_files)
all_train = self.process_train(self.train_label)[:40188]
# fmt: off
if rm_lt: train = self.remove_longtail(all_train)
else: train = all_train
# fmt: on
super(NAIC20_R2, self).__init__(train, [], [], **kwargs)
@DATASET_REGISTRY.register()
class NAIC19(NAIC20_R2):
dataset_name = "naic19"
dataset_dir = "naic/2019_NAIC/fusai"
def __init__(self, root='datasets', rm_lt=False, **kwargs):
self.root = root
self.data_path = os.path.join(self.root, self.dataset_dir)
self.train_label = os.path.join(self.root, self.dataset_dir, 'train_list_clean.txt')
required_files = [self.train_label]
self.check_before_run(required_files)
all_train = self.process_train(self.train_label)
# fmt: off
if rm_lt: train = self.remove_longtail(all_train)
else: train = all_train
# fmt: on
super(NAIC20_R2, self).__init__(train, [], [], **kwargs)
def process_train(self, label_path):
with open(label_path, 'r') as f:
data_list = [i.strip('\n') for i in f.readlines()]
img_paths = []
for data_info in data_list:
img_name, pid = data_info.split(" ")
img_path = os.path.join(self.data_path, img_name)
pid = self.dataset_name + "_" + pid
camid = self.dataset_name + '_0'
img_paths.append([img_path, pid, camid])
return img_paths
@DATASET_REGISTRY.register()
class NAIC20_R2A(ImageDataset):
dataset_name = "naic20_b"
dataset_dir = 'naic/round2/image_A'
def __init__(self, root='datasets', **kwargs):
self.root = root
self.query_path = os.path.join(self.root, self.dataset_dir, "query")
self.gallery_path = os.path.join(self.root, self.dataset_dir, "gallery")
query = self.process_test(self.query_path)
gallery = self.process_test(self.gallery_path)
super().__init__([], query, gallery)
def process_test(self, test_path):
img_paths = glob.glob(os.path.join(test_path, "*.png"))
data = []
for img_path in img_paths:
img_name = img_path.split("/")[-1]
data.append([img_path, img_name, "naic_0"])
return data
# encoding: utf-8
"""
@author: xingyu liao
@contact: sherlockliao01@gmail.com
"""
import json
import logging
import os
from collections import defaultdict
import numpy as np
import torch
import torch.nn.functional as F
from fastreid.evaluation import ReidEvaluator
from fastreid.evaluation.query_expansion import aqe
from fastreid.utils import comm
from fastreid.utils.compute_dist import build_dist
logger = logging.getLogger("fastreid.naic_submission")
def partition_arg_topK(matrix, K, axis=0):
"""
perform topK based on np.argpartition
:param matrix: to be sorted
:param K: select and sort the top K items
:param axis: 0 or 1. dimension to be sorted.
:return:
"""
a_part = np.argpartition(matrix, K, axis=axis)
if axis == 0:
row_index = np.arange(matrix.shape[1 - axis])
a_sec_argsort_K = np.argsort(matrix[a_part[0:K, :], row_index], axis=axis)
return a_part[0:K, :][a_sec_argsort_K, row_index]
else:
column_index = np.arange(matrix.shape[1 - axis])[:, None]
a_sec_argsort_K = np.argsort(matrix[column_index, a_part[:, 0:K]], axis=axis)
return a_part[:, 0:K][column_index, a_sec_argsort_K]
class NaicEvaluator(ReidEvaluator):
def process(self, inputs, outputs):
self.pids.extend(inputs["targets"])
self.camids.extend(inputs["camids"])
self.features.append(outputs.cpu())
def evaluate(self):
if comm.get_world_size() > 1:
comm.synchronize()
features = comm.gather(self.features)
features = sum(features, [])
pids = comm.gather(self.pids)
pids = sum(pids, [])
# fmt: off
if not comm.is_main_process(): return {}
# fmt: on
else:
features = self.features
pids = self.pids
features = torch.cat(features, dim=0)
# query feature, person ids and camera ids
query_features = features[:self._num_query]
query_pids = np.asarray(pids[:self._num_query])
# gallery features, person ids and camera ids
gallery_features = features[self._num_query:]
gallery_pids = np.asarray(pids[self._num_query:])
if self.cfg.TEST.AQE.ENABLED:
logger.info("Test with AQE setting")
qe_time = self.cfg.TEST.AQE.QE_TIME
qe_k = self.cfg.TEST.AQE.QE_K
alpha = self.cfg.TEST.AQE.ALPHA
query_features, gallery_features = aqe(query_features, gallery_features, qe_time, qe_k, alpha)
if self.cfg.TEST.METRIC == "cosine":
query_features = F.normalize(query_features, dim=1)
gallery_features = F.normalize(gallery_features, dim=1)
dist = build_dist(query_features, gallery_features, self.cfg.TEST.METRIC)
if self.cfg.TEST.RERANK.ENABLED:
logger.info("Test with rerank setting")
k1 = self.cfg.TEST.RERANK.K1
k2 = self.cfg.TEST.RERANK.K2
lambda_value = self.cfg.TEST.RERANK.LAMBDA
if self.cfg.TEST.METRIC == "cosine":
query_features = F.normalize(query_features, dim=1)
gallery_features = F.normalize(gallery_features, dim=1)
rerank_dist = build_dist(query_features, gallery_features, metric="jaccard", k1=k1, k2=k2)
dist = rerank_dist * (1 - lambda_value) + dist * lambda_value
if self.cfg.TEST.SAVE_DISTMAT:
np.save(os.path.join(self.cfg.OUTPUT_DIR, "distmat.npy"), dist)
results = defaultdict(list)
topk_indices = partition_arg_topK(dist, K=200, axis=1)[:, :200]
for i in range(topk_indices.shape[0]):
results[query_pids[i]].extend(gallery_pids[topk_indices[i]])
with open(os.path.join(self.cfg.OUTPUT_DIR, "submit.json"), 'w') as f:
json.dump(results, f)
return {}
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
# encoding: utf-8
"""
@author: sherlock
@contact: sherlockliao01@gmail.com
"""
import logging
import sys
sys.path.append('.')
from fastreid.config import get_cfg
from fastreid.engine import default_argument_parser, default_setup, launch
from fastreid.utils.checkpoint import Checkpointer
from fastreid.engine import DefaultTrainer
from fastreid.data import build_reid_train_loader
from naic import *
class Trainer(DefaultTrainer):
@classmethod
def build_train_loader(cls, cfg):
logger = logging.getLogger("fastreid.naic20")
logger.info("Prepare NAIC20 competition trainset")
return build_reid_train_loader(cfg, rm_lt=cfg.DATASETS.RM_LT)
class Committer(DefaultTrainer):
@classmethod
def build_evaluator(cls, cfg, dataset_name, output_dir=None):
data_loader, num_query = cls.build_test_loader(cfg, dataset_name)
return data_loader, NaicEvaluator(cfg, num_query, output_dir)
def setup(args):
"""
Create configs and perform basic setups.
"""
cfg = get_cfg()
add_naic_config(cfg)
cfg.merge_from_file(args.config_file)
cfg.merge_from_list(args.opts)
cfg.freeze()
default_setup(cfg, args)
return cfg
def main(args):
cfg = setup(args)
if args.eval_only:
cfg.defrost()
cfg.MODEL.BACKBONE.PRETRAIN = False
model = Trainer.build_model(cfg)
Checkpointer(model, save_dir=cfg.OUTPUT_DIR).load(cfg.MODEL.WEIGHTS) # load trained model
if args.commit:
res = Committer.test(cfg, model)
else:
res = Trainer.test(cfg, model)
return res
trainer = Trainer(cfg)
trainer.resume_or_load(resume=args.resume)
return trainer.train()
if __name__ == "__main__":
parser = default_argument_parser()
parser.add_argument("--commit", action="store_true", help="submission testing results")
args = parser.parse_args()
print("Command Line Args:", args)
launch(
main,
args.num_gpus,
num_machines=args.num_machines,
machine_rank=args.machine_rank,
dist_url=args.dist_url,
args=(args,),
)
This source diff could not be displayed because it is too large. You can view the blob instead.
00051678.png:836
00157560.png:4049
00100903.png:8360
00084036.png:1311
00187556.png:19172
00040480.png:15756
00214678.png:14671
00085683.png:13562
00109425.png:15213
00048168.png:6166
00184092.png:20796
00130870.png:23708
00203859.png:21910
00207172.png:14127
00164065.png:22727
00205570.png:7690
00062169.png:20101
00151257.png:9833
00150266.png:23289
00166594.png:9565
00004491.png:6922
00116069.png:7281
00166204.png:14998
00093527.png:28459
00207549.png:13143
00091601.png:1007
00192020.png:20426
00088494.png:15689
00131046.png:1393
00030322.png:25671
00116134.png:1256
00061779.png:20110
00061152.png:7235
00062448.png:9335
00122921.png:12324
00152228.png:466
00114958.png:23941
00170391.png:8635
00108584.png:16104
00124828.png:8271
00196962.png:24426
00044924.png:14026
00170163.png:26132
00155132.png:6125
00068517.png:4027
00224288.png:27880
00225312.png:1906
00007346.png:1104
00058218.png:21696
00190128.png:5413
00031166.png:16736
00225653.png:132
00135673.png:17852
00000247.png:813
00038611.png:6902
00183468.png:24672
00169140.png:13759
00028188.png:10001
00172533.png:29114
00046346.png:5203
00202127.png:1230
00116106.png:389
00120823.png:5610
00208986.png:10668
00123495.png:23317
00178645.png:17260
00158312.png:24673
00039291.png:14135
00065190.png:11735
00176841.png:14017
00061768.png:7620
00058944.png:8555
00112234.png:22525
00169918.png:29821
00179783.png:5930
00137025.png:21356
00170948.png:14146
00007968.png:8582
00109230.png:15807
00093274.png:3268
00076315.png:11035
00057003.png:14693
00082290.png:17098
00008836.png:17851
00166975.png:9755
00086380.png:103
00159760.png:6708
00078383.png:27037
00034752.png:6557
00039785.png:16220
00058771.png:4997
00111649.png:10121
00031318.png:13186
00026756.png:15289
00008979.png:19766
00144379.png:21424
00062683.png:6594
00218418.png:16683
00040024.png:2353
00012926.png:27171
00139886.png:1649
00101840.png:27964
00024363.png:15098
00039304.png:15637
00096173.png:7275
00179323.png:10833
00103110.png:4355
00042940.png:17075
00006286.png:9767
00154434.png:699
00206386.png:15540
00131566.png:16714
00049103.png:10928
00103687.png:6213
00146667.png:9853
00076072.png:26660
00182565.png:14447
00139942.png:10391
00117899.png:5567
00099911.png:20189
00107260.png:14375
00045411.png:27116
00049284.png:23101
00028170.png:14476
00005544.png:14605
00032714.png:19351
00140124.png:4373
00023111.png:24421
00065138.png:14272
00057613.png:9670
00088121.png:13575
00106926.png:18083
00079299.png:11640
00097234.png:29125
00117911.png:16134
00107750.png:9986
00078454.png:8856
00190655.png:22501
00179116.png:24953
00223239.png:4633
00117114.png:28916
00173903.png:14925
00058976.png:27481
00180937.png:10918
00025843.png:11446
00147730.png:10972
00098839.png:28500
00189548.png:25024
00034194.png:3163
00175309.png:17185
00128349.png:5324
00116515.png:2822
00082081.png:25028
00200063.png:13558
00192986.png:26149
00138834.png:12970
00008001.png:23546
00126738.png:29515
00097632.png:6128
00152332.png:11239
00105725.png:27749
00222564.png:27108
00025718.png:19240
00065519.png:12202
00142768.png:28301
00145367.png:19388
00039702.png:12483
00002463.png:13861
00035298.png:24271
00021509.png:11263
00221756.png:23845
00146505.png:23207
00164879.png:3187
00187948.png:19413
00194876.png:25976
00174819.png:7297
00017468.png:18540
00021808.png:14703
00178170.png:10180
00171695.png:20401
00077090.png:21535
00169763.png:1531
00114557.png:21458
00138183.png:20977
00200809.png:6214
00031873.png:17681
00079710.png:8240
00170535.png:804
00076936.png:28854
00147701.png:20805
00221022.png:21057
00054066.png:21682
00072198.png:20357
00086141.png:19779
00186630.png:23213
00145691.png:457
00189514.png:19668
00099511.png:7815
00007382.png:17989
00031664.png:12144
00215254.png:12040
00032527.png:7684
00142579.png:28362
00200113.png:12678
00172859.png:15130
00190530.png:3319
00046185.png:6604
00033681.png:6907
00029152.png:28846
00076713.png:5024
00191441.png:1302
00017141.png:18328
00163283.png:23149
00039288.png:25697
00219010.png:20563
00189010.png:24593
00086475.png:7384
00090727.png:16371
00093383.png:26514
00178385.png:19938
00150507.png:21314
00184076.png:26265
00211950.png:24153
00016435.png:28344
00014075.png:14791
00062976.png:2427
00093974.png:26836
00125902.png:18386
00214956.png:9970
00116019.png:23791
00059512.png:27176
00206831.png:10639
00059015.png:21355
00026562.png:18374
00087530.png:23367
00007783.png:12318
00144887.png:12892
00052712.png:11935
00099024.png:25927
00039551.png:384
00080573.png:2245
00106569.png:22248
00076554.png:7828
00216351.png:17269
00092772.png:1708
00171188.png:14239
00157487.png:12129
00030282.png:18365
00059847.png:12922
00058144.png:23787
00153057.png:20527
00076597.png:39
00128140.png:21452
00197562.png:13521
00051311.png:6569
00046794.png:20966
00064850.png:3069
00061546.png:18134
00043187.png:16131
00068248.png:3174
00195883.png:12698
00143058.png:17741
00011243.png:28692
00092603.png:11235
00049805.png:17340
00140209.png:1668
00004049.png:14904
00014210.png:2641
00217276.png:7089
00146916.png:24871
00013476.png:5293
00131844.png:2643
00224851.png:2105
00200119.png:18306
00090020.png:1313
00047350.png:10637
00068989.png:529
00046954.png:182
00224121.png:28995
00154763.png:2408
00007211.png:26030
00109565.png:5973
00077165.png:2528
00150327.png:16383
00061091.png:13944
00095710.png:5288
00182465.png:23898
00042544.png:4621
00027249.png:4523
00052768.png:9341
00214021.png:10656
00195757.png:2089
00221063.png:5818
00090129.png:5205
00210235.png:27788
00148923.png:27460
00090037.png:29363
00055710.png:27084
00044710.png:6988
00074022.png:16445
00035507.png:3910
00214769.png:27866
00036115.png:20663
00020244.png:12524
00052502.png:10025
00148412.png:3253
00005297.png:14916
00136777.png:13238
00009700.png:7565
00185673.png:10167
00104840.png:7961
00057646.png:185
00035374.png:8645
00038283.png:23536
00130048.png:18223
00221716.png:16673
00177338.png:1426
00154946.png:7654
00058672.png:9506
00033889.png:17486
00216537.png:15639
00139604.png:5016
00088190.png:19442
00212311.png:12068
00055361.png:16540
00207139.png:12341
00075644.png:10846
00189493.png:10717
00056314.png:15560
00084190.png:28290
00198894.png:6571
00048036.png:21862
00041766.png:17025
00056416.png:26848
00147310.png:4862
00103209.png:6896
00093542.png:14445
00204735.png:29727
00152705.png:3438
00123277.png:19955
00185982.png:22562
00149690.png:22241
00083908.png:29522
00067755.png:2693
00001898.png:13053
00086320.png:13069
00065982.png:4888
00215193.png:15824
00180162.png:23499
00112688.png:14454
00074105.png:10473
00178558.png:11595
00219206.png:20193
00156350.png:293
00121220.png:11406
00142465.png:16413
00196000.png:19501
00001179.png:28489
00158850.png:26040
00047528.png:25416
00103502.png:16057
00103577.png:4933
00143502.png:7210
00126713.png:24103
00059634.png:13751
00018645.png:9666
00123300.png:2683
00219827.png:21039
00193770.png:3487
00002301.png:1752
00112593.png:22696
00139069.png:13623
00036318.png:12708
00083178.png:2221
00087193.png:20914
00168390.png:4126
00216841.png:13450
00110769.png:17391
00112648.png:24061
00028117.png:21044
00040105.png:26985
00160576.png:10355
00023760.png:16208
00150475.png:22173
00006442.png:10341
00096819.png:21669
00055322.png:26850
00110732.png:23572
00159031.png:9683
00180888.png:17122
00149365.png:967
00071348.png:1998
00066586.png:10178
00008726.png:15935
00217131.png:6450
00194952.png:21564
00066834.png:20430
00032437.png:1193
00188797.png:6933
00065683.png:19221
00001141.png:27367
00002727.png:5498
00163189.png:20848
00218605.png:21263
00175305.png:17879
00027866.png:28829
00188204.png:21093
00173792.png:4082
00082834.png:14900
00102079.png:23372
00217397.png:16789
00192229.png:3907
00088475.png:725
00117160.png:27427
00142395.png:24571
00222154.png:10849
00082787.png:12738
00141645.png:7645
00103964.png:250
00206252.png:7080
00001599.png:11932
00080029.png:2332
00038396.png:13378
00168102.png:5043
00139266.png:25943
00085274.png:29472
00174885.png:6765
00101418.png:18121
00088399.png:23283
00063452.png:21655
00200747.png:17322
00086541.png:2689
00010364.png:24528
00108554.png:11902
00193061.png:11828
00068311.png:20476
00225138.png:2356
00054947.png:15388
00206412.png:27997
00050846.png:10826
00109345.png:28702
00067439.png:6853
00208451.png:14793
00025970.png:10129
00131496.png:24605
00125577.png:6244
00067566.png:10435
00094301.png:4448
00108150.png:27035
00130135.png:18052
00179021.png:28317
00124122.png:9938
00046935.png:2830
00121336.png:4930
00108357.png:20943
00113353.png:22494
00044377.png:9699
00128076.png:5030
00200623.png:7833
00182204.png:25705
00140914.png:25339
00169964.png:927
00057058.png:12997
00044958.png:25990
00026979.png:4674
00148014.png:10774
00143937.png:27596
00189334.png:23271
00175429.png:3238
00169301.png:17595
00002361.png:20464
00045101.png:22413
00054092.png:21306
00104423.png:22035
00176956.png:24082
00004002.png:11947
00118020.png:1410
00082426.png:18099
00167382.png:21550
00010486.png:976
00097605.png:21042
00161684.png:17725
00091906.png:25789
00018497.png:18123
00220279.png:9865
00066434.png:21563
00023942.png:12854
00025083.png:11405
00150282.png:6580
00087051.png:15324
00155730.png:6110
00098759.png:6100
00170144.png:19961
00028880.png:21326
00186451.png:1492
00154597.png:1213
00189472.png:23901
00053110.png:24262
00212716.png:5071
00159065.png:18122
00157236.png:28666
00183184.png:11573
00177642.png:18673
00188393.png:7835
00224033.png:26537
00048493.png:7781
00069583.png:17057
00122716.png:425
00026586.png:27152
00123744.png:24466
00149062.png:18410
00204465.png:2697
00052062.png:25804
00160512.png:26853
00033688.png:13870
00044946.png:6849
00110177.png:20535
00048286.png:26381
00159406.png:16689
00016870.png:10111
00041611.png:13901
00108195.png:14930
00064164.png:13930
00212079.png:23739
00085349.png:28497
00146517.png:26707
00089396.png:23586
00008308.png:29537
00046799.png:7087
00078952.png:15800
00077366.png:8923
00109850.png:15169
00095959.png:6258
00194365.png:27450
00029959.png:12559
00163915.png:3229
00126141.png:16726
00027134.png:28144
00052361.png:10686
00190014.png:4092
00188110.png:21443
00207900.png:13017
00194901.png:13980
00123003.png:20403
00130616.png:12581
00044712.png:16009
00084741.png:24824
00090113.png:4695
00050957.png:22508
00112902.png:19478
00150045.png:12531
00140734.png:5884
00194855.png:24565
00117260.png:28964
00083065.png:11869
00071093.png:2685
00157242.png:21280
00215640.png:25798
00218852.png:29423
00103572.png:29040
00064882.png:7708
00037001.png:8786
00225040.png:885
00213662.png:16899
00024313.png:18109
00048216.png:7834
00147297.png:3983
00091205.png:25283
00072233.png:2244
00105302.png:24023
00068041.png:20574
00099504.png:28743
00203908.png:8429
00156950.png:19628
00169440.png:4198
00032009.png:14225
00140931.png:1543
00015093.png:9916
00144458.png:11759
00137417.png:28416
00209220.png:26006
00004738.png:12930
00171986.png:8767
00079434.png:7628
00050993.png:9561
00217611.png:9901
00198554.png:20016
00052470.png:20134
00217325.png:1938
00062661.png:3877
00026584.png:18424
00072505.png:2504
00135500.png:10343
00142988.png:17561
00087489.png:6061
00032506.png:4868
00059548.png:12412
00103149.png:8536
00152136.png:18576
00125539.png:18104
00001292.png:22624
00025007.png:12383
00003380.png:21319
00142620.png:16945
00053843.png:25194
00199129.png:6705
00030832.png:9613
00186758.png:18492
00091443.png:21139
00099368.png:28350
00010799.png:7066
00053257.png:23121
00017068.png:4387
00179327.png:29505
00110695.png:9578
00024198.png:18675
00128970.png:28725
00172920.png:935
00026048.png:25554
00070562.png:4471
00029878.png:18456
00098765.png:29306
00189315.png:27379
00056636.png:316
00115193.png:10139
00074174.png:6454
00129732.png:22291
00140876.png:8722
00171538.png:2104
00038979.png:2094
00208449.png:25217
00132305.png:20675
00003176.png:26946
00125782.png:5020
00119721.png:8069
00169596.png:22137
00121185.png:8056
00189864.png:20099
00089289.png:15901
00062988.png:7635
00132792.png:28160
00102147.png:2619
00033396.png:21795
00110037.png:644
00051095.png:3099
00046103.png:24729
00039767.png:13513
00149306.png:20644
00122332.png:14451
00170817.png:6535
00081398.png:34
00179552.png:303
00023395.png:21053
00166532.png:24655
00165315.png:21205
00216356.png:10858
00106690.png:29658
00089776.png:20723
00012766.png:3463
00138710.png:4867
00156769.png:21301
00209061.png:18977
00130807.png:24200
00059498.png:29900
00029387.png:13566
00191829.png:24171
00019887.png:150
00110454.png:29415
00106350.png:19618
00088940.png:12647
00195180.png:2484
00035797.png:777
00177289.png:15816
00120093.png:3726
00146385.png:23513
00022450.png:27965
00205233.png:28790
00139841.png:22735
00075327.png:29162
00019179.png:26081
00209023.png:11245
00194429.png:25000
00072933.png:8957
00068151.png:8080
00140855.png:8140
00148185.png:10216
00049640.png:13359
00022741.png:28226
00057038.png:23320
00225736.png:11648
00199526.png:21770
00149024.png:12982
00002696.png:2630
00085614.png:15945
00110486.png:6067
00027778.png:27816
00118497.png:16625
00164495.png:21016
00168112.png:28587
00190561.png:16155
00100477.png:27649
00121495.png:17083
00131181.png:11205
00204898.png:19273
00147445.png:26587
00078479.png:25670
00024514.png:19354
00205452.png:27785
00204827.png:9905
00145419.png:21023
00077473.png:10494
00123567.png:842
00148723.png:13868
00177921.png:25195
00173100.png:3854
00088270.png:28872
00066371.png:28823
00095712.png:22074
00057044.png:11276
00190629.png:5826
00191918.png:18801
00180412.png:4602
00037915.png:26319
00063716.png:14245
00070423.png:28322
00174115.png:7024
00033547.png:29596
00118961.png:585
00077726.png:15734
00136579.png:24335
00170342.png:8306
00009265.png:15925
00145807.png:17182
00118486.png:27254
00058030.png:14881
00144047.png:1518
00067631.png:27010
00110066.png:6800
00187965.png:11045
00040621.png:27601
00215001.png:27390
00102031.png:13895
00224627.png:21660
00142961.png:22497
00135887.png:21727
00064687.png:18397
00101354.png:29668
00000514.png:15460
00167615.png:8893
00035958.png:4842
00202959.png:2031
00185114.png:1301
00200032.png:26007
00163235.png:27058
00207621.png:10658
00045329.png:11112
00130729.png:27038
00022031.png:25232
00180783.png:618
00079741.png:24120
00060499.png:1276
00153421.png:29436
00104461.png:242
00134461.png:23995
00077148.png:27769
00210757.png:19824
00138026.png:25464
00191380.png:5943
00087769.png:16862
00050715.png:26403
00195378.png:24649
00208518.png:16097
00204256.png:3283
00127954.png:8611
00036608.png:15054
00100494.png:21931
00125336.png:7926
00137371.png:15487
00116041.png:13041
00158550.png:24670
00120863.png:12572
00164441.png:15
00117237.png:4071
00081804.png:5932
00209131.png:11066
00108496.png:26885
00194770.png:27336
00025403.png:5415
00025267.png:12196
00105000.png:19856
00068120.png:528
00142347.png:16544
00030265.png:6937
00026379.png:10451
00121066.png:16512
00057461.png:21903
00145277.png:12598
00199030.png:14921
00170677.png:7291
00105442.png:4902
00004903.png:25
00109023.png:23373
00202358.png:14444
00040492.png:16081
00157808.png:24256
00114409.png:7295
00091812.png:11147
00056787.png:4716
00024798.png:27678
00016223.png:25289
00189447.png:28326
00003717.png:22128
00163380.png:18973
00139188.png:12974
00200244.png:17160
00096178.png:18166
00023827.png:27301
00224728.png:17109
00161838.png:16569
00086437.png:28643
00065650.png:7531
00196226.png:25567
00034570.png:22628
00119131.png:6595
00107554.png:4242
00016062.png:27501
00143479.png:19670
00050366.png:16687
00085765.png:4262
00035801.png:6980
00175756.png:10674
00079933.png:20529
00058532.png:14757
00143145.png:10291
00064400.png:20733
00079966.png:29078
00000309.png:27989
00141147.png:805
00081011.png:6455
00056168.png:8171
00029068.png:19921
00015840.png:29649
00163062.png:22643
00098349.png:6415
00224703.png:18452
00136832.png:2799
00215537.png:17151
00000552.png:9475
00075837.png:1723
00037226.png:14854
00208678.png:1551
00058578.png:12146
00020207.png:2514
00033222.png:6536
00086533.png:3240
00216199.png:25417
00205230.png:9567
00096945.png:2765
00159982.png:24460
00004146.png:10149
00182794.png:10
00172914.png:23481
00058786.png:15060
00010442.png:21179
00124294.png:24316
00147212.png:14646
00192003.png:10450
00135894.png:5619
00023181.png:22150
00130650.png:19031
00152663.png:1550
00059973.png:10461
00210009.png:16675
00184896.png:22294
00144569.png:4212
00107652.png:11754
00114636.png:4153
00204549.png:7107
00069952.png:21880
00131013.png:6136
00122238.png:15288
00104034.png:635
00190710.png:21688
00184001.png:17712
00193616.png:7423
00008103.png:10986
00006281.png:18928
00047533.png:26757
00002521.png:14728
00158129.png:17678
00108766.png:28400
00185823.png:21929
00179952.png:19851
00106359.png:10854
00120010.png:26523
00184729.png:18337
00074599.png:18037
00057998.png:739
00180810.png:22846
00075591.png:25991
00015233.png:11231
00216543.png:4645
00207181.png:29483
00204070.png:5605
00126307.png:22107
00046502.png:19585
00032303.png:12562
00016939.png:21900
00002005.png:330
00033453.png:22603
00189378.png:2534
00100866.png:8744
00023249.png:25666
00066923.png:29643
00060966.png:19425
00001208.png:12438
00015808.png:20847
00183947.png:12903
00107014.png:760
00086086.png:13553
00158155.png:28640
00008599.png:22547
00047845.png:9523
00102361.png:16977
00083990.png:15602
00095510.png:25669
00016893.png:16441
00071248.png:6117
00094722.png:23789
00135903.png:13854
00199534.png:7213
00111244.png:22543
00112218.png:26823
00120643.png:9443
00144051.png:336
00217001.png:9748
00144270.png:25888
00194982.png:3591
00122370.png:4374
00007702.png:3025
00152071.png:12988
00001401.png:5709
00175233.png:15129
00205109.png:28158
00115570.png:21730
00130987.png:3281
00144387.png:29698
00107913.png:4654
00018501.png:23600
00014409.png:24058
00049022.png:16571
00061071.png:24785
00096509.png:19140
00087408.png:14798
00042581.png:5804
00196495.png:18643
00106966.png:14505
00135946.png:11403
00175430.png:8884
00054299.png:14729
00098047.png:12203
00030851.png:15080
00098762.png:27050
00142979.png:7338
00177589.png:9987
00057167.png:27417
00200311.png:23545
00030044.png:26744
00191575.png:3369
00101357.png:20658
00066221.png:7466
00204248.png:13507
00024165.png:29621
00084784.png:20067
00186610.png:18669
00096866.png:7298
00192203.png:10317
00111386.png:490
00054119.png:13241
00198051.png:26763
00138511.png:14824
00069474.png:9521
00148796.png:28775
00150756.png:5054
00083848.png:16027
00194183.png:14562
00124704.png:271
00089333.png:5766
00066567.png:9135
00135928.png:5746
00069889.png:26153
00041920.png:29611
00070870.png:9233
00002225.png:24866
00081953.png:24733
00099554.png:11699
00093216.png:11075
00037281.png:14267
00108215.png:5236
00069076.png:15801
00130337.png:11981
00034858.png:15588
00188534.png:28399
00156689.png:1035
00064506.png:7211
00192545.png:8502
00107202.png:3993
00206407.png:26937
00141094.png:29819
00218489.png:4738
00026108.png:21656
00187138.png:9195
00044664.png:1681
00120301.png:28131
00147674.png:3590
00062269.png:4755
00159954.png:14518
00141256.png:5939
00149329.png:8614
00148606.png:7497
00179899.png:19337
00001222.png:26615
00167214.png:16975
00133501.png:17987
00069509.png:26875
00206660.png:29080
00146202.png:12521
00196126.png:19677
00164428.png:25158
00200852.png:9553
00121906.png:27815
00038322.png:4038
00047650.png:22716
00056817.png:1163
00177180.png:29591
00193338.png:1914
00002029.png:18700
00078392.png:2543
00178620.png:10773
00001249.png:16346
00159639.png:5461
00043938.png:24591
00169988.png:17542
00106336.png:2085
00118570.png:5599
00017163.png:11127
00025878.png:20314
00014505.png:27230
00021931.png:5728
00199676.png:1982
00121778.png:1383
00062029.png:25534
00080996.png:26508
00205314.png:18967
00166505.png:6804
00046668.png:14743
00164710.png:11788
00133803.png:8653
00005403.png:27478
00068610.png:17178
00027788.png:19091
00223067.png:9650
00009324.png:19776
00054567.png:4392
00136207.png:16319
00092707.png:25262
00071808.png:20603
00183601.png:9454
00030904.png:4980
00083302.png:13314
00210772.png:8381
00144580.png:20085
00092550.png:24730
00020844.png:1782
00059550.png:28393
00090781.png:9198
00086053.png:6991
00169064.png:6360
00069507.png:9735
00069939.png:26467
00215604.png:13340
00085697.png:23287
00050198.png:25951
00175724.png:22883
00168462.png:26171
00014799.png:14786
00192811.png:1899
00169823.png:12249
00210096.png:26032
00023109.png:12601
00062487.png:21430
00223704.png:8954
00216501.png:8796
00151916.png:19055
00188392.png:12241
00107399.png:1625
00077006.png:13922
00006670.png:7841
00140310.png:29431
00039410.png:12085
00074504.png:29499
00132313.png:18065
00070255.png:12873
00125235.png:26620
00149921.png:10734
00200042.png:21990
00201410.png:19988
00060720.png:22184
00134606.png:25367
00034374.png:16879
00114373.png:5096
00210709.png:1120
00155425.png:8737
00099323.png:24821
00027650.png:3542
00072452.png:29178
00105903.png:13631
00089132.png:27064
00084412.png:16052
00088894.png:14977
00154440.png:3808
00078254.png:16751
00093203.png:10284
00172394.png:16405
00091119.png:6272
00167990.png:3307
00183802.png:5790
00105660.png:19629
00153464.png:9802
00172137.png:13059
00045309.png:13201
00160397.png:971
00119568.png:26360
00111672.png:8930
00028537.png:25311
00169521.png:21601
00183388.png:13239
00187001.png:3491
00052818.png:4805
00089146.png:28523
00226226.png:9981
00091362.png:23903
00033237.png:13140
00217755.png:27694
00163549.png:9538
00026715.png:16519
00225449.png:11120
00223075.png:23135
00218528.png:20825
00103348.png:19937
00137670.png:14118
00070702.png:2930
00205415.png:21009
00180375.png:24692
00137127.png:12879
00135628.png:2944
00213474.png:22582
00133570.png:19701
00153832.png:8473
00031796.png:4788
00007910.png:1283
00074224.png:22876
00188932.png:16886
00213451.png:14924
00168434.png:11744
00151382.png:893
00163009.png:11055
00001088.png:20013
00130594.png:16953
00009035.png:4035
00169926.png:4017
00099918.png:22371
00048267.png:1774
00110014.png:10053
00116940.png:27929
00147848.png:22267
00057740.png:12547
00216114.png:7976
00048669.png:24204
00013204.png:14250
00028396.png:18241
00049911.png:15300
00131667.png:913
00112541.png:7824
00170630.png:3681
00202717.png:25672
00040859.png:28549
00178860.png:8305
00121711.png:26459
00055481.png:18120
00156491.png:28396
00126596.png:14529
00160871.png:10532
00068430.png:8715
00128610.png:8629
00215181.png:3791
00034265.png:6886
00150292.png:3615
00148867.png:20812
00170272.png:16196
00188003.png:18339
00063835.png:27337
00135314.png:11861
00085244.png:26960
00068161.png:16920
00179661.png:26412
00043239.png:2434
00201152.png:22819
00036082.png:12010
00166307.png:21684
00146766.png:26096
00012047.png:16686
00214893.png:22392
00204132.png:9621
00208166.png:6792
00133181.png:3441
00011612.png:6833
00205084.png:29894
00222064.png:14613
00093438.png:15464
00118516.png:21030
00009003.png:26168
00157512.png:5175
00000428.png:7353
00061039.png:21317
00204056.png:10932
00171514.png:3085
00144121.png:19160
00062424.png:6484
00130821.png:15682
00206489.png:20042
00161212.png:25353
00223802.png:14293
00089195.png:5159
00160415.png:10981
00095411.png:27402
00051057.png:29103
00031598.png:14347
00039032.png:5505
00139244.png:2990
00216572.png:24319
00082341.png:8813
00196632.png:27363
00208941.png:26313
00083403.png:21772
00023221.png:12793
00095597.png:57
00074882.png:17189
00017899.png:4202
00057904.png:6938
00160673.png:8347
00168566.png:18257
00030738.png:21421
00028866.png:13554
00142972.png:96
00145917.png:7871
00195393.png:29049
00176088.png:13027
00005010.png:23185
00112747.png:17292
00106829.png:16830
00181676.png:5792
00053170.png:19461
00097732.png:17117
00081618.png:20456
00034092.png:1033
00179184.png:5347
00180921.png:27942
00108121.png:6863
00003570.png:13885
00024300.png:27202
00007847.png:24198
00223666.png:11940
00089995.png:11934
00204645.png:27583
00203327.png:26788
00216970.png:27410
00176930.png:8144
00001425.png:25079
00015568.png:7827
00002473.png:16992
00194317.png:13808
00130296.png:17101
00214651.png:4488
00127186.png:20662
00080533.png:5233
00059712.png:9533
00127737.png:24898
00111755.png:14034
00208153.png:396
00025551.png:11524
00013048.png:25579
00191007.png:18628
00084480.png:19344
00181871.png:11431
00116819.png:26036
00190431.png:28668
00004207.png:9417
00042782.png:460
00048371.png:7109
00062534.png:24393
00096613.png:25745
00139374.png:11088
00111791.png:20579
00002129.png:13322
00161213.png:10728
00203218.png:24494
00200117.png:24293
00206324.png:10193
00170570.png:3668
00042756.png:18390
00071923.png:17332
00119061.png:17815
00212504.png:10258
00159579.png:3444
00176627.png:24607
00182152.png:22320
00005431.png:18859
00014466.png:16073
00041420.png:16607
00114674.png:22016
00123424.png:18874
00008174.png:359
00054243.png:22249
00070888.png:3528
00151863.png:8182
00114314.png:6066
00020426.png:1200
00151849.png:21352
00053881.png:25486
00071521.png:342
00184926.png:17131
00178238.png:11785
00027342.png:28966
00038814.png:17480
00095656.png:23194
00052907.png:4659
00172819.png:13593
00028686.png:865
00018507.png:10255
00105836.png:10418
00174726.png:21064
00016103.png:19830
00004698.png:23825
00040651.png:4678
00017410.png:10692
00070663.png:21958
00221507.png:21095
00076421.png:16801
00002071.png:9327
00193069.png:16401
00142905.png:9058
00193439.png:1879
00225366.png:21704
00123316.png:14644
00105132.png:9792
00136853.png:756
00081824.png:25892
00020608.png:3150
00041181.png:16192
00079120.png:14574
00022539.png:13283
00168108.png:17465
00176266.png:3101
00205055.png:3703
00173920.png:13957
00103683.png:19446
00184842.png:29771
00022847.png:20882
00210131.png:23907
00221333.png:6603
00181935.png:25448
00170779.png:24872
00048591.png:22488
00128544.png:1436
00161169.png:25906
00061115.png:28064
00016322.png:26797
00040186.png:27995
00009987.png:2961
00083201.png:24671
00012921.png:18474
00142115.png:10845
00058149.png:7634
00071974.png:2533
00143798.png:638
00039736.png:15836
00131110.png:22272
00219947.png:1048
00078098.png:11268
00000893.png:26285
00049685.png:9884
00019151.png:26293
00160455.png:18376
00212620.png:590
00101727.png:9668
00194424.png:29578
00109427.png:14902
00193329.png:28845
00020466.png:505
00176990.png:9711
00110684.png:3889
00148591.png:11197
00101084.png:26474
00078271.png:11837
00026111.png:27461
00190455.png:20019
00226142.png:13031
00143881.png:1105
00050357.png:21872
00208657.png:24227
00077957.png:11064
00067112.png:21526
00219696.png:19419
00080224.png:10421
00203603.png:26747
00003913.png:295
00173612.png:22613
00079904.png:23387
00031336.png:22474
00010300.png:666
00158946.png:17461
00211508.png:23242
00014860.png:9857
00018605.png:24786
00085959.png:21474
00215556.png:6249
00035689.png:3704
00203919.png:22278
00002422.png:27955
00123939.png:13279
00089565.png:27078
00135988.png:25319
00207062.png:1510
00019286.png:18584
00075990.png:24257
00072272.png:28428
00174522.png:25207
00090625.png:17716
00222492.png:3796
00110042.png:25648
00097784.png:1375
00072460.png:25333
00043373.png:3656
00128879.png:27668
00189212.png:16709
00177574.png:28952
00220198.png:16282
00143562.png:10015
00071861.png:22746
00048805.png:2604
00150052.png:28632
00163550.png:15133
00198165.png:1095
00081122.png:22146
00199616.png:12463
00106230.png:795
00108044.png:8985
00206992.png:8836
00135210.png:19672
00141526.png:11023
00024525.png:10431
00207013.png:14350
00138902.png:5704
00046241.png:9194
00085737.png:26140
00070405.png:25104
00066254.png:10174
00124614.png:22265
00127222.png:29464
00122056.png:9651
00156315.png:10172
00024912.png:10610
00047815.png:9956
00056185.png:29007
00057831.png:19874
00169285.png:10074
00093918.png:15341
00079639.png:2574
00143169.png:26445
00124777.png:28203
00017356.png:13981
00192649.png:25054
00175151.png:26177
00185411.png:13210
00041286.png:12386
00103415.png:1671
00146570.png:28046
00037798.png:20201
00052404.png:25561
00205309.png:15482
00050184.png:6728
00038428.png:19843
00207876.png:159
00160482.png:21705
00090424.png:3530
00170665.png:24110
00099853.png:28374
00124647.png:24542
00204950.png:10361
00040382.png:1367
00157640.png:6177
00095721.png:5436
00207987.png:4590
00035245.png:14356
00050153.png:22215
00193391.png:23741
00002835.png:6460
00154129.png:11825
00206132.png:19865
00147759.png:720
00072520.png:27745
00115427.png:13546
00082022.png:13771
00044928.png:10381
00123040.png:28323
00047547.png:23649
00069172.png:4486
00015342.png:4335
00002845.png:12788
00003522.png:3115
00173842.png:13867
00167737.png:26039
00085790.png:5455
00134234.png:5226
00195869.png:15123
00138201.png:26201
00222639.png:14413
00110674.png:26786
00033776.png:25358
00078293.png:6088
00108913.png:22243
00141849.png:8142
00218755.png:24025
00054282.png:9379
00184452.png:19297
00208537.png:12379
00162675.png:19873
00017117.png:10417
00221621.png:9014
00088897.png:29153
00087401.png:14231
00004043.png:180
00108165.png:6880
00198246.png:7508
00056112.png:13224
00151048.png:15542
00082527.png:11018
00134399.png:6276
00193518.png:16638
00046717.png:4981
00028742.png:8493
00132442.png:24432
00123400.png:12188
00131511.png:13935
00067837.png:17828
00131917.png:20941
00033978.png:29202
00138199.png:17037
00187349.png:22919
00030086.png:10387
00164767.png:1694
00070494.png:20301
00190286.png:1564
00021964.png:28480
00146717.png:2753
00046468.png:13348
00159341.png:1534
00074814.png:12937
00096686.png:5325
00088652.png:14775
00034893.png:16964
00104402.png:21153
00157045.png:25109
00149206.png:16708
00071778.png:19218
00137553.png:8017
00104360.png:3143
00222321.png:2997
00062785.png:6686
00172790.png:29376
00113541.png:3387
00137067.png:21836
00138323.png:23312
00097490.png:6549
00180189.png:12443
00221159.png:11984
00047852.png:2957
00147106.png:2645
00046327.png:27832
00137242.png:12798
00154079.png:18549
00027389.png:26162
00218219.png:28554
00054394.png:9002
00014861.png:8454
00223087.png:11318
00087169.png:14898
00188765.png:12450
00192917.png:14492
00003773.png:17638
00097936.png:15412
00224690.png:6544
00043153.png:16631
00134907.png:50
00195848.png:8038
00028502.png:19149
00219468.png:5768
00193612.png:11793
00078104.png:8065
00202687.png:13797
00219664.png:9709
00212304.png:1573
00152086.png:9069
00031229.png:2788
00200539.png:16724
00071531.png:14655
00176445.png:23868
00178896.png:26799
00041350.png:28875
00088663.png:23752
00165025.png:2871
00217469.png:20728
00111122.png:21606
00017810.png:26535
00185485.png:15338
00034599.png:748
00138386.png:6321
00044641.png:24579
00143712.png:21323
00216431.png:18485
00120686.png:13006
00220639.png:23362
00191669.png:29311
00051529.png:23050
00122998.png:12525
00103820.png:26329
00187275.png:1796
00146669.png:26808
00013662.png:27383
00019294.png:8914
00133617.png:20523
00069756.png:692
00195208.png:6225
00083596.png:16918
00204411.png:13170
00042331.png:19340
00197360.png:16711
00135749.png:8798
00141239.png:375
00130317.png:14875
00195581.png:10066
00107585.png:12128
00132912.png:9641
00087281.png:23206
00222254.png:21291
00139111.png:21637
00037047.png:3884
00067652.png:6564
00095761.png:21463
00172026.png:9452
00177931.png:21527
00177162.png:20060
00071502.png:28208
00005654.png:18259
00098215.png:29644
00144348.png:17181
00133036.png:21454
00113022.png:5285
00139844.png:22380
00092793.png:19309
00130195.png:18416
00068343.png:14048
00002725.png:28553
00130793.png:12557
00116166.png:21335
00081390.png:9080
00182158.png:3273
00106539.png:18668
00176992.png:29835
00034526.png:16985
00225310.png:11132
00008962.png:7518
00004965.png:3479
00044485.png:15918
00217923.png:29648
00176092.png:196
00114486.png:1413
00175273.png:21592
00211977.png:22364
00113085.png:8583
00084037.png:23019
00021689.png:8280
00079924.png:14248
00147477.png:2346
00168816.png:693
00195566.png:24314
00068592.png:3371
00214111.png:11792
00033349.png:27944
00098290.png:19422
00188171.png:6437
00089815.png:27661
00154555.png:4267
00115390.png:27883
00132407.png:3939
00102154.png:21340
00061618.png:27698
00129773.png:14395
00198437.png:5425
00220336.png:13952
00089382.png:13736
00076953.png:26882
00213753.png:24476
00147433.png:23955
00092278.png:4354
00201304.png:18305
00151832.png:9879
00191604.png:20645
00166300.png:5001
00112929.png:7857
00212543.png:15218
00046440.png:21307
00048118.png:3263
00215358.png:5585
00201676.png:20121
00158673.png:25847
00140550.png:24142
00026630.png:29273
00083565.png:7896
00007057.png:20767
00048637.png:13752
00014291.png:11519
00050214.png:18592
00112914.png:21413
00058223.png:23970
00209068.png:1747
00011622.png:22688
00042134.png:21345
00007993.png:28116
00143861.png:10138
00189011.png:13671
00108011.png:2491
00112608.png:28136
00134784.png:22996
00084496.png:2492
00149622.png:1709
00026094.png:13034
00005798.png:7325
00194254.png:16962
00119493.png:19497
00009404.png:11664
00143595.png:13050
00174277.png:26204
00146405.png:6367
00160586.png:25869
00026254.png:8649
00068575.png:3856
00144779.png:10635
00203868.png:26870
00169225.png:9707
00059502.png:29757
00163871.png:29421
00120826.png:6558
00090159.png:28682
00121669.png:21116
00220741.png:23508
00072856.png:8460
00082815.png:1081
00173783.png:21578
00122255.png:89
00214903.png:11436
00109144.png:5551
00030217.png:28405
00147948.png:24690
00008187.png:12596
00048434.png:19725
00167787.png:15630
00010408.png:28237
00143001.png:14812
00203151.png:21668
00120753.png:13942
00129434.png:29262
00062447.png:26645
00130783.png:18852
00094141.png:10882
00079879.png:21265
00216743.png:23620
00065806.png:21598
00141843.png:25468
00049467.png:390
00138761.png:28891
00100869.png:20317
00147696.png:2073
00157911.png:25791
00057655.png:7067
00168420.png:26936
00139270.png:4848
00043267.png:2002
00174847.png:4205
00040541.png:24281
00088248.png:29360
00195779.png:8407
00129129.png:11327
00088200.png:3973
00201497.png:28979
00020889.png:16141
00078330.png:22242
00171401.png:28417
00040001.png:19950
00103534.png:28645
00035925.png:4297
00002868.png:4697
00199460.png:5382
00176201.png:23631
00193185.png:23223
00116452.png:6299
00067638.png:15919
00219891.png:23350
00036251.png:25473
00218814.png:4924
00196704.png:25684
00145783.png:11363
00177320.png:14363
00057994.png:25191
00141851.png:12648
00026372.png:25773
00081623.png:24428
00055455.png:17082
00189595.png:13721
00053089.png:9690
00216665.png:8451
00109561.png:4691
00054777.png:11400
00060190.png:23081
00142924.png:176
00139738.png:23696
00031148.png:6365
00032960.png:4165
00220868.png:15833
00105577.png:2537
00211888.png:3157
00099369.png:2580
00071954.png:5050
00099980.png:11679
00178401.png:22732
00080689.png:28732
00057901.png:18530
00011205.png:12871
00151908.png:397
00072678.png:16922
00150412.png:18594
00148339.png:14618
00005254.png:22759
00164356.png:6794
00016005.png:4408
00190676.png:24797
00042824.png:13075
00069403.png:12382
00004013.png:18398
00220483.png:8951
00180886.png:8440
00027435.png:10524
00223637.png:15393
00215694.png:10906
00152271.png:947
00087710.png:12002
00165916.png:11102
00058675.png:13446
00174670.png:29823
00176224.png:26012
00016959.png:13005
00072919.png:22844
00007511.png:17225
00015710.png:21769
00104863.png:29726
00213518.png:7293
00093579.png:27542
00003042.png:7638
00123472.png:9842
00045858.png:12593
00162870.png:5477
00150949.png:25177
00213838.png:6864
00158054.png:4841
00167161.png:2365
00033787.png:4722
00063246.png:7106
00158411.png:21119
00211868.png:21566
00191856.png:18093
00213396.png:23984
00112557.png:22580
00078128.png:10303
00138488.png:19997
00041698.png:3308
00118054.png:17762
00148585.png:27107
00021696.png:19477
00124086.png:8487
00142842.png:9442
00049890.png:6583
00222701.png:16191
00166160.png:19593
00146394.png:10311
00066144.png:6388
00035142.png:2906
00139891.png:19979
00123638.png:11360
00028887.png:12413
00061623.png:7991
00056972.png:20152
00150278.png:502
00012186.png:5472
00115293.png:8670
00184167.png:153
00048587.png:28877
00057484.png:15962
00091098.png:15884
00182231.png:23837
00020659.png:27884
00020024.png:16312
00204865.png:24634
00121904.png:4290
00199496.png:26829
00133859.png:5964
00198328.png:17010
00211959.png:1878
00146064.png:26567
00166005.png:26345
00133455.png:28697
00200729.png:22130
00118085.png:19453
00128627.png:22933
00124988.png:23643
00105746.png:29848
00102322.png:24114
00148204.png:4762
00125492.png:3335
00014893.png:13946
00029399.png:6957
00031409.png:15159
00200099.png:5721
00071312.png:7826
00113440.png:11996
00116081.png:17857
00190620.png:29027
00217897.png:23410
00121935.png:14043
00027278.png:3915
00036187.png:7237
00181988.png:22434
00136786.png:8201
00173946.png:2124
00050065.png:11715
00060496.png:24366
00146033.png:20487
00128663.png:29046
00183681.png:4832
00090840.png:6395
00199591.png:4863
00016328.png:28027
00027519.png:15095
00200477.png:25063
00080213.png:24202
00044943.png:24799
00203100.png:25682
00013579.png:7185
00188679.png:5431
00224247.png:18091
00180973.png:533
00026146.png:26161
00112690.png:16513
00096628.png:18415
00114186.png:13657
00191035.png:12961
00127028.png:27727
00149354.png:14738
00070849.png:13235
00214969.png:12670
00013120.png:4885
00216369.png:11806
00152507.png:839
00218266.png:6824
00054774.png:9438
00095342.png:4149
00127073.png:6340
00101470.png:19926
00112681.png:21147
00024724.png:18706
00075126.png:17584
00138272.png:2756
00164818.png:24184
00173282.png:9862
00102014.png:12589
00011971.png:19742
00130999.png:10709
00076498.png:24389
00065094.png:20659
00192001.png:17276
00168110.png:2523
00025609.png:27616
00182090.png:7498
00018025.png:15890
00056628.png:15234
00032001.png:22815
00135390.png:5776
00179505.png:1807
00046813.png:21744
00124353.png:18991
00180876.png:24517
00200455.png:19064
00046060.png:17235
00190299.png:15969
00016446.png:15651
00109725.png:18716
00094388.png:27143
00152032.png:7982
00190518.png:24584
00023063.png:8361
00090777.png:11124
00169339.png:12756
00023018.png:17517
00079599.png:13203
00010346.png:18146
00006168.png:4882
00127038.png:1825
00132246.png:16565
00100567.png:2520
00199413.png:6639
00014275.png:18163
00086743.png:29294
00163548.png:24038
00142583.png:28172
00089401.png:11450
00095696.png:2992
00151497.png:17768
00023648.png:10497
00141201.png:23653
00174755.png:14182
00105789.png:24029
00076276.png:6866
00118348.png:11016
00199275.png:10869
00189847.png:14207
00043048.png:3556
00012211.png:20465
00045021.png:17242
00101588.png:27898
00008232.png:13686
00058927.png:850
00035390.png:22794
00126911.png:5123
00012137.png:16144
00164831.png:26214
00104921.png:5524
00064441.png:23610
00148369.png:25463
00000151.png:16101
00059175.png:8738
00172431.png:22999
00218663.png:23386
00036743.png:493
00206005.png:12418
00055360.png:4636
00213264.png:19581
00034539.png:16298
00145571.png:9875
00212914.png:27979
00080411.png:13019
00087410.png:13700
00128642.png:14837
00207689.png:3054
00117297.png:20294
00043340.png:10841
00095169.png:18743
00110517.png:19279
00077479.png:23291
00071643.png:9652
00217689.png:3984
00208983.png:11141
00006863.png:12796
00012122.png:29455
00225093.png:11604
00191117.png:18487
00032429.png:25989
00211436.png:23912
00186616.png:13579
00154257.png:3179
00141051.png:2115
00140046.png:12498
00193552.png:588
00220118.png:20556
00029926.png:22451
00151972.png:7630
00161566.png:29882
00170394.png:18722
00204975.png:21282
00007291.png:24113
00120684.png:1102
00157398.png:25205
00083068.png:14237
00005918.png:20
00129955.png:16154
00072474.png:10913
00186782.png:12567
00194305.png:24754
00117855.png:20959
00076446.png:29378
00182417.png:17264
00081982.png:14958
00114192.png:14202
00209782.png:11634
00067303.png:12183
00115584.png:25125
00077088.png:1323
00086625.png:25858
00206721.png:11852
00044484.png:12300
00063902.png:10719
00139234.png:15188
00189149.png:1947
00051303.png:22783
00105604.png:6688
00090469.png:27933
00132000.png:17023
00087216.png:4104
00174614.png:28622
00215704.png:12471
00205958.png:13983
00180731.png:27734
00155616.png:26957
00040530.png:11209
00003940.png:26613
00146832.png:18624
00053831.png:19371
00158502.png:5815
00129268.png:9283
00118246.png:18429
00067419.png:11857
00178000.png:7786
00008846.png:3806
00210977.png:8807
00104697.png:6942
00217535.png:24134
00103362.png:7471
00119735.png:1928
00194739.png:14607
00005135.png:11283
00028044.png:26150
00115323.png:28356
00220085.png:23254
00086557.png:2325
00023569.png:23853
00194251.png:1134
00104257.png:24107
00166919.png:5518
00211682.png:22190
00097516.png:28169
00225752.png:6146
00093225.png:1015
00141267.png:26094
00001872.png:24965
00102380.png:22064
00139732.png:21556
00191754.png:2749
00193702.png:23237
00102815.png:11795
00090186.png:26045
00115818.png:25014
00157627.png:11602
00072079.png:13049
00079304.png:6862
00026216.png:7111
00086858.png:15743
00002400.png:18516
00106465.png:12286
00205879.png:27732
00030256.png:901
00012135.png:17116
00159950.png:11442
00013654.png:20578
00202080.png:10953
00158598.png:4274
00064602.png:5809
00094559.png:9790
00011201.png:2345
00005277.png:22952
00152056.png:28015
00195621.png:21748
00124070.png:4916
00014010.png:18613
00224174.png:25196
00008162.png:25731
00109852.png:16120
00162881.png:10359
00118001.png:253
00104475.png:12950
00195668.png:2849
00146138.png:12923
00022944.png:20824
00103547.png:23621
00100996.png:17299
00009836.png:19229
00224619.png:3207
00060485.png:26452
00117590.png:17538
00104635.png:7952
00007909.png:6649
00145300.png:10804
00088625.png:22704
00142268.png:5154
00028576.png:28752
00133222.png:6038
00152771.png:5188
00061360.png:8750
00203575.png:23633
00144606.png:10611
00081815.png:5386
00183277.png:5516
00087715.png:3349
00182013.png:21006
00197673.png:17843
00045937.png:26941
00206056.png:24552
00136869.png:575
00185278.png:14779
00151099.png:262
00217233.png:498
00066877.png:27380
00090560.png:4614
00226143.png:14458
00136645.png:12345
00224681.png:2168
00178574.png:17618
00205686.png:22058
00127015.png:19324
00140109.png:21176
00134680.png:7374
00203894.png:25332
00001497.png:29043
00068298.png:5107
00207873.png:17733
00197428.png:12211
00078314.png:25710
00149555.png:25886
00083686.png:9876
00020027.png:22837
00131689.png:24629
00096513.png:23314
00196733.png:10277
00027230.png:19607
00151988.png:2816
00028230.png:780
00148501.png:7899
00219866.png:19394
00049420.png:11110
00067288.png:596
00069605.png:11697
00070862.png:12036
00087153.png:2596
00141653.png:1506
00086680.png:27512
00130581.png:8557
00137047.png:24687
00094880.png:22639
00054485.png:10143
00078151.png:23267
00205159.png:29232
00076722.png:24060
00008203.png:26989
00160146.png:25661
00026973.png:29365
00059134.png:11758
00102729.png:17203
00138874.png:1385
00098711.png:13897
00095963.png:29701
00130982.png:20620
00144785.png:3014
00221213.png:2973
00065552.png:28438
00026594.png:26419
00035681.png:22216
00154463.png:14024
00199040.png:6170
00039929.png:14348
00080749.png:13807
00194271.png:21588
00223997.png:3837
00061762.png:26024
00016095.png:15915
00154029.png:5360
00140730.png:9604
00054760.png:24538
00189799.png:15392
00152556.png:14291
00137382.png:29523
00197008.png:7539
00158303.png:21468
00226119.png:122
00068601.png:5877
00073093.png:28749
00021504.png:13732
00070477.png:29305
00150531.png:20686
00036483.png:28980
00134827.png:14016
00062348.png:2774
00049942.png:5422
00113359.png:22495
00052911.png:8376
00114110.png:21266
00082126.png:10769
00092553.png:9380
00030584.png:4068
00139619.png:2860
00051865.png:25539
00183854.png:13350
00070483.png:29485
00032733.png:12304
00058722.png:19435
00072724.png:19541
00199733.png:26298
00110691.png:5839
00036250.png:9356
00132789.png:23702
00158763.png:6799
00151889.png:19529
00179370.png:2763
00034520.png:24383
00146506.png:10455
00213571.png:313
00223890.png:12337
00147473.png:15103
00135553.png:16431
00071021.png:18934
00025936.png:8819
00113283.png:5678
00118715.png:19398
00219676.png:9989
00138980.png:3279
00063323.png:1488
00029866.png:19690
00121070.png:20385
00001530.png:17990
00152186.png:8675
00028210.png:5996
00138729.png:26979
00105456.png:9697
00083404.png:13438
00132762.png:10000
00157077.png:17076
00036657.png:18273
00105527.png:18980
00201063.png:21815
00085760.png:13067
00066814.png:10621
00019098.png:16786
00194209.png:27731
00086355.png:2153
00213934.png:27632
00128745.png:23443
00026559.png:3909
00219009.png:12009
00175121.png:21284
00129900.png:29589
00103329.png:27027
00031672.png:11108
00043401.png:25459
00056159.png:26047
00031998.png:10884
00224434.png:1291
00029059.png:23375
00104187.png:28011
00226197.png:5754
00049887.png:4002
00101722.png:1242
00131685.png:26100
00126267.png:13388
00175937.png:2097
00143867.png:1119
00034090.png:16707
00214015.png:14860
00209400.png:4960
00162460.png:18671
00155458.png:23166
00225021.png:12237
00071618.png:16325
00019569.png:8965
00099380.png:13443
00020462.png:23786
00173029.png:24407
00011043.png:24154
00201530.png:21675
00028874.png:4751
00152901.png:6132
00122993.png:17761
00225495.png:17881
00081931.png:5361
00200047.png:9659
00167535.png:17234
00046269.png:12602
00032420.png:14433
00092636.png:10758
00038442.png:14575
00224914.png:6582
00206520.png:26053
00016772.png:1919
00161660.png:11930
00168408.png:17850
00029991.png:21569
00022406.png:90
00179816.png:29385
00148389.png:6692
00223299.png:21723
00081106.png:18047
00009263.png:28008
00132260.png:25122
00199224.png:18368
00035249.png:12440
00156650.png:16215
00068717.png:5214
00147025.png:12714
00033600.png:5003
00113929.png:10397
00056396.png:28302
00086685.png:28503
00168440.png:9059
00108351.png:15022
00213043.png:9269
00121977.png:18633
00020638.png:7820
00191862.png:10574
00219267.png:7091
00142935.png:9608
00051316.png:8545
00056130.png:21681
00084506.png:14446
00191444.png:13088
00070474.png:6676
00168493.png:20976
00000991.png:17201
00085071.png:4564
00112228.png:18278
00203281.png:22927
00048114.png:29752
00129940.png:2890
00174832.png:19409
00031545.png:4059
00225142.png:538
00096689.png:17547
00173270.png:23148
00153046.png:2496
00148990.png:1195
00188816.png:21142
00088656.png:19
00097911.png:2661
00217555.png:25302
00019540.png:15755
00123365.png:19499
00200191.png:19281
00144566.png:5991
00005085.png:6671
00147803.png:1227
00133461.png:1929
00111691.png:15696
00031901.png:5021
00135601.png:24833
00167841.png:21201
00221134.png:22177
00028690.png:23466
00098780.png:28505
00045280.png:16451
00202384.png:8046
00135334.png:18838
00133118.png:10379
00009227.png:12691
00169592.png:20167
00020201.png:25376
00151171.png:17068
00052082.png:21171
00114695.png:1599
00214045.png:19169
00138216.png:526
00048630.png:28594
00057162.png:311
00183904.png:9378
00133671.png:21968
00049093.png:3105
00160292.png:19214
00096048.png:11352
00023824.png:22852
00042918.png:11916
00013534.png:6064
00003923.png:22489
00026364.png:9954
00144135.png:12526
00027974.png:5023
00213762.png:1352
00034743.png:22405
00078764.png:4984
00030912.png:1046
00222549.png:5410
00211686.png:6139
00154621.png:11599
00098685.png:15778
00140542.png:14428
00219227.png:18085
00146814.png:11006
00207625.png:16396
00009300.png:14947
00217324.png:11224
00122851.png:8399
00057157.png:26693
00204677.png:24506
00111697.png:3733
00032210.png:12260
00031319.png:20173
00180413.png:25145
00138364.png:19269
00148670.png:20519
00190139.png:21089
00201528.png:11206
00187540.png:25709
00182281.png:4401
00072293.png:7123
00076707.png:10900
00117621.png:12295
00188808.png:9844
00140538.png:21240
00059929.png:24884
00037209.png:19811
00017705.png:25263
00211171.png:24443
00059945.png:19700
00086401.png:8118
00044567.png:8129
00217939.png:1394
00186031.png:11034
00093502.png:16614
00118515.png:16046
00147957.png:19175
00190674.png:26835
00052934.png:6749
00112597.png:6422
00089309.png:15989
00087142.png:24342
00005787.png:28581
00221659.png:26778
00169941.png:14767
00027357.png:18898
00188097.png:14871
00195427.png:23103
00125150.png:13177
00134922.png:6301
00154831.png:5051
00132720.png:27398
00105256.png:15882
00203835.png:11453
00034457.png:24807
00139098.png:12023
00061563.png:26943
00074101.png:1695
00120847.png:2762
00128085.png:27653
00154068.png:7874
00132149.png:11598
00167468.png:1505
00133230.png:19878
00129440.png:19734
00036689.png:14886
00209256.png:5824
00171419.png:9124
00162152.png:581
00084447.png:6390
00203282.png:26063
00141590.png:4544
00202437.png:14466
00167286.png:12938
00183445.png:18031
00199831.png:23480
00159253.png:20634
# DSR in FastReID
**Deep Spatial Feature Reconstruction for Partial Person Re-identification**
Lingxiao He, Xingyu Liao
[[`CVPR2018`](http://openaccess.thecvf.com/content_cvpr_2018/papers/He_Deep_Spatial_Feature_CVPR_2018_paper.pdf)] [[`BibTeX`](#CitingDSR)]
**Foreground-aware Pyramid Reconstruction for Alignment-free Occluded Person Re-identification**
Lingxiao He, Xingyu Liao
[[`ICCV2019`](http://openaccess.thecvf.com/content_ICCV_2019/papers/He_Foreground-Aware_Pyramid_Reconstruction_for_Alignment-Free_Occluded_Person_Re-Identification_ICCV_2019_paper.pdf)] [[`BibTeX`](#CitingFPR)]
## News!
[1] The old_version code can be check in [old_version](https://github.com/JDAI-CV/Partial-Person-ReID), you can obtain the same result published in paper, and the new version code is updating, please waiting!
## Installation
First install FastReID, and then put Partial Datasets in directory datasets. The whole framework of FastReID-DSR is
<div align="center">
<img src="https://firebasestorage.googleapis.com/v0/b/firescript-577a2.appspot.com/o/imgs%2Fapp%2FSherlockWorkspace%2F1nVTE3Sn5c.jpg?alt=media&token=e7e9fcfc-4fc1-49c8-bcf4-c007028fdd25" width="700px" />
</div>
and the detail you can refer to
## Datasets
The datasets can find in [Google Drive](https://drive.google.com/file/d/1p7Jvo-RJhU_B6hf9eAhIEFNhvrzM5cdh/view?usp=sharing)
PartialREID---gallery: 300 images of 60 ids, query: 300 images of 60 ids
PartialiLIDS---gallery: 119 images of 119 ids, query: 119 images of 119 ids
OccludedREID---gallery: 1,000 images of 200 ids, query: 1,000 images of 200 ids
## Training and Evaluation
To train a model, run:
```bash
python3 projects/PartialReID/train_net.py --config-file <config.yaml>
```
For example, to train the re-id network with IBN-ResNet-50 Backbone
one should execute:
```bash
CUDA_VISIBLE_DEVICES='0,1,2,3' python3 projects/PartialReID/train_net.py --config-file 'projects/PartialReID/configs/partial_market.yml'
```
## Results
| Method | PartialREID | OccludedREID | PartialiLIDS |
|:--:|:--:|:--:|:--:|
| | Rank@1 (mAP)| Rank@1 (mAP)| Rank@1 (mAP)|
| DSR (CVPR’18) |73.7(68.1) |72.8(62.8)|64.3(58.1)|
| FPR (ICCV'19) | 81.0(76.6)|78.3(68.0)|68.1(61.8)|
| FastReID-DSR | 82.7(76.8)|81.6(70.9)|73.1(79.8) |
## <a name="CitingDSR"></a >Citing DSR and Citing FPR
If you use DSR or FPR, please use the following BibTeX entry.
```
@inproceedings{he2018deep,
title={Deep spatial feature reconstruction for partial person re-identification: Alignment-free approach},
author={He, Lingxiao and Liang, Jian and Li, Haiqing and Sun, Zhenan},
booktitle={IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
year={2018}
}
@inproceedings{he2019foreground,
title={Foreground-aware Pyramid Reconstruction for Alignment-free Occluded Person Re-identification},
author={He, Lingxiao and Wang, Yinggang and Liu, Wu and Zhao, He and Sun, Zhenan and Feng, Jiashi},
booktitle={IEEE International Conference on Computer Vision (ICCV)},
year={2019}
}
```
MODEL:
META_ARCHITECTURE: PartialBaseline
BACKBONE:
NAME: build_resnet_backbone
NORM: BN
DEPTH: 50x
LAST_STRIDE: 1
FEAT_DIM: 2048
WITH_IBN: True
PRETRAIN: True
HEADS:
NAME: DSRHead
POOL_LAYER: FastGlobalAvgPool
WITH_BNNECK: True
CLS_LAYER: Linear
LOSSES:
NAME: ("CrossEntropyLoss", "TripletLoss",)
CE:
EPSILON: 0.12
SCALE: 1.
TRI:
MARGIN: 0.3
SCALE: 1.0
HARD_MINING: False
DATASETS:
NAMES: ("Market1501",)
TESTS: ("PartialREID", "PartialiLIDS", "OccludedREID",)
INPUT:
SIZE_TRAIN: [384, 128]
SIZE_TEST: [384, 128]
FLIP:
ENABLED: True
DATALOADER:
SAMPLER_TRAIN: NaiveIdentitySampler
NUM_INSTANCE: 4
NUM_WORKERS: 8
SOLVER:
AMP:
ENABLED: False
OPT: Adam
MAX_EPOCH: 60
BASE_LR: 0.0007
BIAS_LR_FACTOR: 1.
WEIGHT_DECAY: 0.0005
WEIGHT_DECAY_BIAS: 0.0005
IMS_PER_BATCH: 256
SCHED: CosineAnnealingLR
DELAY_EPOCHS: 20
ETA_MIN_LR: 0.0000007
WARMUP_FACTOR: 0.1
WARMUP_ITERS: 500
CHECKPOINT_PERIOD: 20
TEST:
EVAL_PERIOD: 10
IMS_PER_BATCH: 128
CUDNN_BENCHMARK: True
OUTPUT_DIR: projects/PartialReID/logs/test_partial
\ No newline at end of file
# encoding: utf-8
"""
@author: xingyu liao
@contact: sherlockliao01@gmail.com
"""
from .partial_dataset import *
from .partialbaseline import PartialBaseline
from .dsr_head import DSRHead
from .config import add_partialreid_config
from .dsr_evaluation import DsrEvaluator
# encoding: utf-8
"""
@author: l1aoxingyu
@contact: sherlockliao01@gmail.com
"""
from fastreid.config import CfgNode as CN
def add_partialreid_config(cfg):
_C = cfg
_C.TEST.DSR = CN({"ENABLED": True})
"""Numpy version of euclidean distance, etc.
Notice the input/output shape of methods, so that you can better understand
the meaning of these methods."""
import numpy as np
import torch
def normalize(nparray, order=2, axis=0):
"""Normalize a N-D numpy array along the specified axis."""
norm = np.linalg.norm(nparray, ord=order, axis=axis, keepdims=True)
return nparray / (norm + np.finfo(np.float32).eps)
def compute_dsr_dist(array1, array2, distmat, scores):
""" Compute the sptial feature reconstruction of all pairs
array: [M, N, C] M: the number of query, N: the number of spatial feature, C: the dimension of each spatial feature
array2: [M, N, C] M: the number of gallery
:return:
numpy array with shape [m1, m2]
"""
dist = 100 * torch.ones(len(array1), len(array2))
dist = dist.cuda()
kappa = 0.001
index = np.argsort(distmat, axis=1)
T = kappa * torch.eye(110)
T = T.cuda()
M = []
for i in range(0, len(array2)):
g = array2[i]
g = torch.FloatTensor(g)
g = g.view(g.size(0), g.size(1))
g = g.cuda()
Proj_M1 = torch.matmul(torch.inverse(torch.matmul(g.t(), g) + T), g.t())
Proj_M1 = Proj_M1.cpu().numpy()
M.append(Proj_M1)
for i in range(0, len(array1)):
q = torch.FloatTensor(array1[i])
q = q.view(q.size(0), q.size(1))
q = q.cuda()
for j in range(0, 100):
g = array2[index[i, j]]
g = torch.FloatTensor(g)
g = g.view(g.size(0), g.size(1))
g = g.cuda()
Proj_M = torch.FloatTensor(M[index[i, j]])
Proj_M = Proj_M.cuda()
a = torch.matmul(g, torch.matmul(Proj_M, q)) - q
dist[i, index[i, j]] = ((torch.pow(a, 2).sum(0).sqrt()) * scores[i].cuda()).sum()
dist = dist.cpu()
dist = dist.numpy()
return dist
# encoding: utf-8
"""
@author: liaoxingyu
@contact: sherlockliao01@gmail.com
"""
import copy
import logging
from collections import OrderedDict
import numpy as np
import torch
import torch.nn.functional as F
from fastreid.evaluation.evaluator import DatasetEvaluator
from fastreid.evaluation.rank import evaluate_rank
from fastreid.utils import comm
from .dsr_distance import compute_dsr_dist
logger = logging.getLogger('fastreid.partialreid.dsr_evaluation')
class DsrEvaluator(DatasetEvaluator):
def __init__(self, cfg, num_query, output_dir=None):
self.cfg = cfg
self._num_query = num_query
self._output_dir = output_dir
self.features = []
self.spatial_features = []
self.scores = []
self.pids = []
self.camids = []
def reset(self):
self.features = []
self.spatial_features = []
self.scores = []
self.pids = []
self.camids = []
def process(self, inputs, outputs):
self.pids.extend(inputs["targets"])
self.camids.extend(inputs["camids"])
self.features.append(F.normalize(outputs[0]).cpu())
outputs1 = F.normalize(outputs[1].data).cpu()
self.spatial_features.append(outputs1)
self.scores.append(outputs[2].cpu())
def evaluate(self):
if comm.get_world_size() > 1:
comm.synchronize()
features = comm.gather(self.features)
features = sum(features, [])
spatial_features = comm.gather(self.spatial_features)
spatial_features = sum(spatial_features, [])
scores = comm.gather(self.scores)
scores = sum(scores, [])
pids = comm.gather(self.pids)
pids = sum(pids, [])
camids = comm.gather(self.camids)
camids = sum(camids, [])
# fmt: off
if not comm.is_main_process(): return {}
# fmt: on
else:
features = self.features
spatial_features = self.spatial_features
scores = self.scores
pids = self.pids
camids = self.camids
features = torch.cat(features, dim=0)
spatial_features = torch.cat(spatial_features, dim=0).numpy()
scores = torch.cat(scores, dim=0)
# query feature, person ids and camera ids
query_features = features[:self._num_query]
query_pids = np.asarray(pids[:self._num_query])
query_camids = np.asarray(camids[:self._num_query])
# gallery features, person ids and camera ids
gallery_features = features[self._num_query:]
gallery_pids = np.asarray(pids[self._num_query:])
gallery_camids = np.asarray(camids[self._num_query:])
if self.cfg.TEST.METRIC == "cosine":
query_features = F.normalize(query_features, dim=1)
gallery_features = F.normalize(gallery_features, dim=1)
dist = 1 - torch.mm(query_features, gallery_features.t()).numpy()
self._results = OrderedDict()
query_features = query_features.numpy()
gallery_features = gallery_features.numpy()
if self.cfg.TEST.DSR.ENABLED:
logger.info("Testing with DSR setting")
dsr_dist = compute_dsr_dist(spatial_features[:self._num_query], spatial_features[self._num_query:], dist,
scores[:self._num_query])
max_value = 0
k = 0
for i in range(0, 101):
lamb = 0.01 * i
dist1 = (1 - lamb) * dist + lamb * dsr_dist
cmc, all_AP, all_INP = evaluate_rank(dist1, query_pids, gallery_pids, query_camids, gallery_camids)
if (cmc[0] > max_value):
k = lamb
max_value = cmc[0]
dist1 = (1 - k) * dist + k * dsr_dist
cmc, all_AP, all_INP = evaluate_rank(dist1, query_pids, gallery_pids, query_camids, gallery_camids)
else:
cmc, all_AP, all_INP = evaluate_rank(dist, query_pids, gallery_pids, query_camids, gallery_camids)
mAP = np.mean(all_AP)
mINP = np.mean(all_INP)
for r in [1, 5, 10]:
self._results['Rank-{}'.format(r)] = cmc[r - 1] * 100
self._results['mAP'] = mAP * 100
self._results['mINP'] = mINP * 100
return copy.deepcopy(self._results)
# encoding: utf-8
"""
@author: lingxiao he
@contact: helingxiao3@jd.com
"""
import torch
import torch.nn.functional as F
from torch import nn
from fastreid.layers import *
from fastreid.modeling.heads import EmbeddingHead
from fastreid.modeling.heads.build import REID_HEADS_REGISTRY
from fastreid.layers.weight_init import weights_init_kaiming
class OcclusionUnit(nn.Module):
def __init__(self, in_planes=2048):
super(OcclusionUnit, self).__init__()
self.MaxPool1 = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)
self.MaxPool2 = nn.MaxPool2d(kernel_size=4, stride=2, padding=0)
self.MaxPool3 = nn.MaxPool2d(kernel_size=6, stride=2, padding=0)
self.MaxPool4 = nn.MaxPool2d(kernel_size=8, stride=2, padding=0)
self.mask_layer = nn.Linear(in_planes, 1, bias=True)
def forward(self, x):
SpaFeat1 = self.MaxPool1(x) # shape: [n, c, h, w]
SpaFeat2 = self.MaxPool2(x)
SpaFeat3 = self.MaxPool3(x)
SpaFeat4 = self.MaxPool4(x)
Feat1 = SpaFeat1.view(SpaFeat1.size(0), SpaFeat1.size(1), SpaFeat1.size(2) * SpaFeat1.size(3))
Feat2 = SpaFeat2.view(SpaFeat2.size(0), SpaFeat2.size(1), SpaFeat2.size(2) * SpaFeat2.size(3))
Feat3 = SpaFeat3.view(SpaFeat3.size(0), SpaFeat3.size(1), SpaFeat3.size(2) * SpaFeat3.size(3))
Feat4 = SpaFeat4.view(SpaFeat4.size(0), SpaFeat4.size(1), SpaFeat4.size(2) * SpaFeat4.size(3))
SpatialFeatAll = torch.cat((Feat1, Feat2, Feat3, Feat4), 2)
SpatialFeatAll = SpatialFeatAll.transpose(1, 2) # shape: [n, c, m]
y = self.mask_layer(SpatialFeatAll)
mask_weight = torch.sigmoid(y[:, :, 0])
# mask_score = torch.sigmoid(mask_weight[:, :48])
feat_dim = SpaFeat1.size(2) * SpaFeat1.size(3)
mask_score = F.normalize(mask_weight[:, :feat_dim], p=1, dim=1)
# mask_score_norm = mask_score
# mask_weight_norm = torch.sigmoid(mask_weight)
mask_weight_norm = F.normalize(mask_weight, p=1, dim=1)
mask_score = mask_score.unsqueeze(1)
SpaFeat1 = SpaFeat1.transpose(1, 2)
SpaFeat1 = SpaFeat1.transpose(2, 3) # shape: [n, h, w, c]
SpaFeat1 = SpaFeat1.view((SpaFeat1.size(0), SpaFeat1.size(1) * SpaFeat1.size(2), -1)) # shape: [n, h*w, c]
global_feats = mask_score.matmul(SpaFeat1).view(SpaFeat1.shape[0], -1, 1, 1)
return global_feats, mask_weight, mask_weight_norm
class Flatten(nn.Module):
def forward(self, input):
return input.view(input.size(0), -1)
@REID_HEADS_REGISTRY.register()
class DSRHead(EmbeddingHead):
def __init__(self, cfg):
super().__init__(cfg)
feat_dim = cfg.MODEL.BACKBONE.FEAT_DIM
with_bnneck = cfg.MODEL.HEADS.WITH_BNNECK
norm_type = cfg.MODEL.HEADS.NORM
num_classes = cfg.MODEL.HEADS.NUM_CLASSES
embedding_dim = cfg.MODEL.HEADS.EMBEDDING_DIM
self.occ_unit = OcclusionUnit(in_planes=feat_dim)
self.MaxPool1 = nn.MaxPool2d(kernel_size=2, stride=2, padding=0)
self.MaxPool2 = nn.MaxPool2d(kernel_size=4, stride=2, padding=0)
self.MaxPool3 = nn.MaxPool2d(kernel_size=6, stride=2, padding=0)
self.MaxPool4 = nn.MaxPool2d(kernel_size=8, stride=2, padding=0)
occ_neck = []
if embedding_dim > 0:
occ_neck.append(nn.Conv2d(feat_dim, embedding_dim, 1, 1, bias=False))
feat_dim = embedding_dim
if with_bnneck:
occ_neck.append(get_norm(norm_type, feat_dim, bias_freeze=True))
self.bnneck_occ = nn.Sequential(*occ_neck)
self.bnneck_occ.apply(weights_init_kaiming)
self.weight_occ = nn.Parameter(torch.normal(0, 0.01, (num_classes, feat_dim)))
def forward(self, features, targets=None):
"""
See :class:`ReIDHeads.forward`.
"""
SpaFeat1 = self.MaxPool1(features) # shape: [n, c, h, w]
SpaFeat2 = self.MaxPool2(features)
SpaFeat3 = self.MaxPool3(features)
SpaFeat4 = self.MaxPool4(features)
Feat1 = SpaFeat1.view(SpaFeat1.size(0), SpaFeat1.size(1), SpaFeat1.size(2) * SpaFeat1.size(3))
Feat2 = SpaFeat2.view(SpaFeat2.size(0), SpaFeat2.size(1), SpaFeat2.size(2) * SpaFeat2.size(3))
Feat3 = SpaFeat3.view(SpaFeat3.size(0), SpaFeat3.size(1), SpaFeat3.size(2) * SpaFeat3.size(3))
Feat4 = SpaFeat4.view(SpaFeat4.size(0), SpaFeat4.size(1), SpaFeat4.size(2) * SpaFeat4.size(3))
SpatialFeatAll = torch.cat((Feat1, Feat2, Feat3, Feat4), dim=2)
foreground_feat, mask_weight, mask_weight_norm = self.occ_unit(features)
# print(time.time() - st)
bn_foreground_feat = self.bnneck_occ(foreground_feat)
bn_foreground_feat = bn_foreground_feat[..., 0, 0]
# Evaluation
if not self.training:
return bn_foreground_feat, SpatialFeatAll, mask_weight_norm
# Training
global_feat = self.pool_layer(features)
bn_feat = self.bottleneck(global_feat)
bn_feat = bn_feat[..., 0, 0]
if self.cls_layer.__class__.__name__ == 'Linear':
pred_class_logits = F.linear(bn_feat, self.weight)
fore_pred_class_logits = F.linear(bn_foreground_feat, self.weight_occ)
else:
pred_class_logits = F.linear(F.normalize(bn_feat), F.normalize(self.weight))
fore_pred_class_logits = F.linear(F.normalize(bn_foreground_feat), F.normalize(self.weight_occ))
cls_outputs = self.cls_layer(pred_class_logits, targets)
fore_cls_outputs = self.cls_layer(fore_pred_class_logits, targets)
# pdb.set_trace()
return {
"cls_outputs": cls_outputs,
"fore_cls_outputs": fore_cls_outputs,
"pred_class_logits": pred_class_logits * self.cls_layer.s,
"features": global_feat[..., 0, 0],
"foreground_features": foreground_feat[..., 0, 0],
}
# encoding: utf-8
"""
@author: lingxiao he
@contact: helingxiao3@jd.com
"""
import glob
import os
import os.path as osp
import re
from fastreid.data.datasets import DATASET_REGISTRY
from fastreid.data.datasets.bases import ImageDataset
__all__ = ['PartialREID', 'PartialiLIDS', 'OccludedREID']
def process_test(query_path, gallery_path):
query_img_paths = glob.glob(os.path.join(query_path, '*.jpg'))
gallery_img_paths = glob.glob(os.path.join(gallery_path, '*.jpg'))
query_paths = []
pattern = re.compile(r'([-\d]+)_(\d*)')
for img_path in query_img_paths:
pid, camid = map(int, pattern.search(img_path).groups())
query_paths.append([img_path, pid, camid])
gallery_paths = []
for img_path in gallery_img_paths:
pid, camid = map(int, pattern.search(img_path).groups())
gallery_paths.append([img_path, pid, camid])
return query_paths, gallery_paths
@DATASET_REGISTRY.register()
class PartialREID(ImageDataset):
dataset_name = "partialreid"
def __init__(self, root='datasets',):
self.root = root
self.query_dir = osp.join(self.root, 'Partial_REID/partial_body_images')
self.gallery_dir = osp.join(self.root, 'Partial_REID/whole_body_images')
query, gallery = process_test(self.query_dir, self.gallery_dir)
ImageDataset.__init__(self, [], query, gallery)
@DATASET_REGISTRY.register()
class PartialiLIDS(ImageDataset):
dataset_name = "partialilids"
def __init__(self, root='datasets',):
self.root = root
self.query_dir = osp.join(self.root, 'PartialiLIDS/query')
self.gallery_dir = osp.join(self.root, 'PartialiLIDS/gallery')
query, gallery = process_test(self.query_dir, self.gallery_dir)
ImageDataset.__init__(self, [], query, gallery)
@DATASET_REGISTRY.register()
class OccludedREID(ImageDataset):
dataset_name = "occludereid"
def __init__(self, root='datasets',):
self.root = root
self.query_dir = osp.join(self.root, 'OccludedREID/query')
self.gallery_dir = osp.join(self.root, 'OccludedREID/gallery')
query, gallery = process_test(self.query_dir, self.gallery_dir)
ImageDataset.__init__(self, [], query, gallery)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment