From b44c1bfb166a8a795a73a90418df43b559cfc1e2 Mon Sep 17 00:00:00 2001 From: zhanli <719901725@qq.com> Date: Tue, 10 Oct 2023 21:52:30 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0pvtv2-b2=E7=9A=84=E5=88=86?= =?UTF-8?q?=E6=94=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- coat-pvtv2-b2/.gitignore | 3 + coat-pvtv2-b2/COAT_pt171.yml | 26 + coat-pvtv2-b2/README.md | 150 + coat-pvtv2-b2/configs/cuhk_sysu-local.yaml | 15 + coat-pvtv2-b2/configs/cuhk_sysu.yaml | 15 + coat-pvtv2-b2/configs/prw-local.yaml | 13 + coat-pvtv2-b2/configs/prw.yaml | 13 + coat-pvtv2-b2/datasets/__init__.py | 5 + coat-pvtv2-b2/datasets/base.py | 42 + coat-pvtv2-b2/datasets/build.py | 104 + coat-pvtv2-b2/datasets/cuhk_sysu.py | 121 + coat-pvtv2-b2/datasets/prw.py | 97 + coat-pvtv2-b2/defaults.py | 219 + coat-pvtv2-b2/doc/framework.png | Bin 0 -> 1500202 bytes coat-pvtv2-b2/engine.py | 179 + coat-pvtv2-b2/eval_func.py | 488 + coat-pvtv2-b2/loss/oim.py | 76 + coat-pvtv2-b2/loss/softmax_loss.py | 62 + coat-pvtv2-b2/models/coat.py | 765 + coat-pvtv2-b2/models/resnet.py | 53 + coat-pvtv2-b2/models/transformer.py | 300 + coat-pvtv2-b2/train.py | 154 + coat-pvtv2-b2/utils/km.py | 150 + coat-pvtv2-b2/utils/mask.py | 325 + coat-pvtv2-b2/utils/transforms.py | 144 + coat-pvtv2-b2/utils/utils.py | 436 + coat-pvtv2-b2/vis/results.json | 25115 +++++++++++++++++++ 27 files changed, 29070 insertions(+) create mode 100644 coat-pvtv2-b2/.gitignore create mode 100644 coat-pvtv2-b2/COAT_pt171.yml create mode 100644 coat-pvtv2-b2/README.md create mode 100644 coat-pvtv2-b2/configs/cuhk_sysu-local.yaml create mode 100644 coat-pvtv2-b2/configs/cuhk_sysu.yaml create mode 100644 coat-pvtv2-b2/configs/prw-local.yaml create mode 100644 coat-pvtv2-b2/configs/prw.yaml create mode 100644 coat-pvtv2-b2/datasets/__init__.py create mode 100644 coat-pvtv2-b2/datasets/base.py create mode 100644 coat-pvtv2-b2/datasets/build.py create mode 100644 coat-pvtv2-b2/datasets/cuhk_sysu.py create mode 100644 coat-pvtv2-b2/datasets/prw.py create mode 100644 coat-pvtv2-b2/defaults.py create mode 100644 coat-pvtv2-b2/doc/framework.png create mode 100644 coat-pvtv2-b2/engine.py create mode 100644 coat-pvtv2-b2/eval_func.py create mode 100644 coat-pvtv2-b2/loss/oim.py create mode 100644 coat-pvtv2-b2/loss/softmax_loss.py create mode 100644 coat-pvtv2-b2/models/coat.py create mode 100644 coat-pvtv2-b2/models/resnet.py create mode 100644 coat-pvtv2-b2/models/transformer.py create mode 100644 coat-pvtv2-b2/train.py create mode 100644 coat-pvtv2-b2/utils/km.py create mode 100644 coat-pvtv2-b2/utils/mask.py create mode 100644 coat-pvtv2-b2/utils/transforms.py create mode 100644 coat-pvtv2-b2/utils/utils.py create mode 100644 coat-pvtv2-b2/vis/results.json diff --git a/coat-pvtv2-b2/.gitignore b/coat-pvtv2-b2/.gitignore new file mode 100644 index 0000000..16f4529 --- /dev/null +++ b/coat-pvtv2-b2/.gitignore @@ -0,0 +1,3 @@ +**/__pycache__ +*.pth +**/logs \ No newline at end of file diff --git a/coat-pvtv2-b2/COAT_pt171.yml b/coat-pvtv2-b2/COAT_pt171.yml new file mode 100644 index 0000000..a9318fc --- /dev/null +++ b/coat-pvtv2-b2/COAT_pt171.yml @@ -0,0 +1,26 @@ +name: coat +channels: + - pytorch + - conda-forge + - defaults +dependencies: + - cudatoolkit=11.0 + - numpy=1.19.2 + - pillow=8.2.0 + - pip=21.0.1 + - python=3.8.8 + - pytorch=1.7.1 + - scipy=1.6.2 + - torchvision=0.8.2 + - tqdm=4.60.0 + - scikit-learn=0.24.1 + - black=21.5b0 + - flake8=3.9.0 + - isort=5.8.0 + - tabulate=0.8.9 + - future=0.18.2 + - tensorboard=2.4.1 + - tensorboardx=2.2 + - pip: + - ipython==7.5.0 + - yacs==0.1.8 diff --git a/coat-pvtv2-b2/README.md b/coat-pvtv2-b2/README.md new file mode 100644 index 0000000..0146213 --- /dev/null +++ b/coat-pvtv2-b2/README.md @@ -0,0 +1,150 @@ +# **COAT代码使用说明** + +​ 这个存储库托管了论文的源代码:[[CVPR 2022] Cascade Transformers for End-to-End Person Search](https://arxiv.org/abs/2203.09642)。在这项工作中,我们开发了一种新颖的级联遮挡感知Transformer(COAT)模型,用于端到端的人物搜索。COAT模型在PRW基准数据集上以显著的优势胜过了最先进的方法,并在CUHK-SYSU数据集上取得了最先进的性能。 + +| 数据集(Datasets) | mAP | Top-1 | Model | +| ---------------- | ---- | ----- | ------------------------------------------------------------ | +| CUHK-SYSU | 94.2 | 94.7 | [model](https://drive.google.com/file/d/1LkEwXYaJg93yk4Kfhyk3m6j8v3i9s1B7/view?usp=sharing) | +| PRW | 53.3 | 87.4 | [model](https://drive.google.com/file/d/1vEd_zzFN88RgxbRMG5-WfJZgD3vmP0Xg/view?usp=sharing) | + +**Abstract**: The goal of person search is to localize a target person from a gallery set of scene images, which is extremely challenging due to large scale variations, pose/viewpoint changes, and occlusions. In this paper, we propose the Cascade Occluded Attention Transformer (COAT) for end-to-end person search. Specifically, our three-stage cascade design focuses on detecting people at the first stage, then progressively refines the representation for person detection and re-identification simultaneously at the following stages. The occluded attention transformer at each stage applies tighter intersection over union thresholds, forcing the network to learn coarse-to-fine pose/scale invariant features. Meanwhile, we calculate the occluded attention across instances in a mini-batch to differentiate tokens from other people or the background. In this way, we simulate the effect of other objects occluding a person of interest at the token-level. Through comprehensive experiments, we demonstrate the benefits of our method by achieving state-of-the-art performance on two benchmark datasets. + +![COAT](doc/framework.png) + + +## Installation +1. Download the datasets in your path `$DATA_DIR`. Change the dataset paths in L4 in [cuhk_sysu.yaml](configs/cuhk_sysu.yaml) and [prw.yaml](configs/prw.yaml). + +**PRW**: + +``` +cd $DATA_DIR +pip install gdown +gdown https://drive.google.com/uc?id=0B6tjyrV1YrHeYnlhNnhEYTh5MUU +unzip PRW-v16.04.20.zip +mv PRW-v16.04.20 PRW +``` + +**CUHK-SYSU**: + +``` +cd $DATA_DIR +gdown https://drive.google.com/uc?id=1z3LsFrJTUeEX3-XjSEJMOBrslxD2T5af +tar -xzvf cuhk_sysu.tar.gz +mv cuhk_sysu CUHK-SYSU +``` + +2. Our method is tested with PyTorch 1.7.1. You can install the required packages by anaconda/miniconda with the following commands: + +``` +cd COAT +conda env create -f COAT_pt171.yml +conda activate coat +``` + +If you want to install another version of PyTorch, you can modify the versions in `coat_pt171.yml`. Just make sure the dependencies have the appropriate version. + + +## CUHK-SYSU数据集实验 +**训练**: 目前代码只支持单GPU. The default training script for CUHK-SYSU is as follows: + +**在本地GTX4090训练**: + +``` bash +cd COAT +# 说明:4090显存较小,所以batchsize只能设置为2, 实测可以运行 +python train.py --cfg configs/cuhk_sysu-local.yaml INPUT.BATCH_SIZE_TRAIN 2 SOLVER.BASE_LR 0.003 SOLVER.MAX_EPOCHS 14 SOLVER.LR_DECAY_MILESTONES [11] MODEL.LOSS.USE_SOFTMAX True SOLVER.LW_RCNN_SOFTMAX_2ND 0.1 SOLVER.LW_RCNN_SOFTMAX_3RD 0.1 OUTPUT_DIR ./logs/cuhk-sysu +``` + +**在本地UESTC训练**: + +```bash +cd COAT +# 说明:RTX8000显存48G,所以batchsize只能设置为3 +python train.py --cfg configs/cuhk_sysu.yaml INPUT.BATCH_SIZE_TRAIN 2 SOLVER.BASE_LR 0.003 SOLVER.MAX_EPOCHS 14 SOLVER.LR_DECAY_MILESTONES [11] MODEL.LOSS.USE_SOFTMAX True SOLVER.LW_RCNN_SOFTMAX_2ND 0.1 SOLVER.LW_RCNN_SOFTMAX_3RD 0.1 OUTPUT_DIR ./logs/cuhk-sysu +``` + +Note that the dataset-specific parameters are defined in `configs/cuhk_sysu.yaml`. When the batch size (`INPUT.BATCH_SIZE_TRAIN`) is 3, the training will take about 23GB GPU memory, being suitable for GPUs like RTX6000. When the batch size is 5, the training will take about 38GB GPU memory, being able to run on A100 GPU. The larger batch size usually results in better performance on CUHK-SYSU. + +For the CUHK-SYSU dataset, we use a relative low weight for softmax loss (`SOLVER.LW_RCNN_SOFTMAX_2ND` 0.1 and `SOLVER.LW_RCNN_SOFTMAX_3RD` 0.1). The trained models and TF logs will be saved in the folder `OUTPUT_DIR`. Other important training parameters can be found in the file `COAT/defaults.py`. For example, `CKPT_PERIOD` is the frequency of saving a checkpoint model. + +**Testing**: The test script is very simple. You just need to add the flag `--eval` and provide the folder `--ckpt` where the [model](https://drive.google.com/file/d/1LkEwXYaJg93yk4Kfhyk3m6j8v3i9s1B7/view?usp=sharing) was saved. + +测试:这个测试脚本非常简单,你只需要添加flag --eval以及对应提供--ckpt当模型已经保存的时候 + +``` +python train.py --cfg ./configs/cuhk-sysu/config.yaml --eval --ckpt ./logs/cuhk-sysu/cuhk_COAT.pth +``` + +**Testing with CBGM**: Context Bipartite Graph Matching ([CBGM](https://github.com/serend1p1ty/SeqNet)) is an optimized matching algorithm in test phase. The detail can be found in the paper [[AAAI 2021] Sequential End-to-end Network for Efficient Person Search](https://arxiv.org/abs/2103.10148). We can use CBGM to further improve the person search accuracy. In test script, we just set the flag `EVAL_USE_CBGM` to True (default is False). + +``` +python train.py --cfg ./configs/cuhk-sysu/config.yaml --eval --ckpt ./logs/cuhk-sysu/cuhk_COAT.pth EVAL_USE_CB GM True +``` + +**Testing with different gallery sizes on CUHK-SYSU**: The default gallery size for evaluating CUHK-SYSU is 100. If you want to test with other pre-defined gallery sizes (50, 100, 500, 1000, 2000, 4000) for drawing the CUHK-SYSU gallery size curve, please set the parameter `EVAL_GALLERY_SIZE` with a gallery size. + +``` +python train.py --cfg ./configs/cuhk-sysu/config.yaml --eval --ckpt ./logs/cuhk-sysu/cuhk_COAT.pth EVAL_GALLER Y_SIZE 500 +``` + +## Experiments on PRW +**Training**: The script is similar to CUHK-SYSU. The code currently only supports single GPU. The default training script for PRW is as follows: + +**在本地GTX4090训练**: + +```bash +cd COAT +# PRW数据集较小,可以RTX4090的bs可以设置为3 +python train.py --cfg ./configs/prw-local.yaml INPUT.BATCH_SIZE_TRAIN 3 SOLVER.BASE_LR 0.003 SOLVER.MAX_EPOCHS 13 MODEL.LOSS.USE_SOFTMAX True OUTPUT_DIR ./logs/prw +``` + +**在本地UESTC训练**: + +```bash +cd COAT +# PRW数据集较小,可以RTX4090的bs可以设置为3 +python train.py --cfg ./configs/prw.yaml INPUT.BATCH_SIZE_TRAIN 3 SOLVER.BASE_LR 0.003 SOLVER.MAX_EPOCHS 13 MODEL.LOSS.USE_SOFTMAX True OUTPUT_DIR ./logs/prw +``` + +The dataset-specific parameters are defined in `configs/prw.yaml`. When the batch size (`INPUT.BATCH_SIZE_TRAIN`) is 3, the training will take about 19GB GPU memory, being suitable for GPUs like RTX6000. The larger batch size does not necessarily result in better accuracy on the PRW dataset. +Softmax loss is effective on PRW. The default weights of softmax loss at Stage 2 and Stage 3 (`SOLVER.LW_RCNN_SOFTMAX_2ND` and `SOLVER.LW_RCNN_SOFTMAX_3RD`) are 0.5, which can be found in the file `COAT/defaults.py`. If you want to run a model without Softmax loss for comparison, just set `MODEL.LOSS.USE_SOFTMAX` to False in the script. + + +**Testing**: The test script is similar to CUHK-SYSU. Make sure the path of pre-trained model [model](https://drive.google.com/file/d/1vEd_zzFN88RgxbRMG5-WfJZgD3vmP0Xg/view?usp=sharing) is correct. + +``` +python train.py --cfg ./logs/prw/config.yaml --eval --ckpt ./logs/prw/prw_COAT.pth + +``` + +**Testing with CBGM**: Similar to CUHK-SYSU, set the flag `EVAL_USE_CBGM` to True (default is False). + +``` +python train.py --cfg ./logs/prw/config.yaml --eval --ckpt ./logs/prw/prw_COAT.pth EVAL_USE_CBGM True +``` + + +## Acknowledgement +This code borrows from [SeqNet](https://github.com/serend1p1ty/SeqNet), [TransReID](https://github.com/damo-cv/TransReID), and [DSTT](https://github.com/ruiliu-ai/DSTT). + +## Citation +If you use this code in your research, please cite this project as follows: + +``` +@inproceedings{yu2022coat, + title = {Cascade Transformers for End-to-End Person Search}, + author = {Rui Yu and + Dawei Du and + Rodney LaLonde and + Daniel Davila and + Christopher Funk and + Anthony Hoogs and + Brian Clipp}, + booktitle = {{IEEE} Conference on Computer Vision and Pattern Recognition}, + year = {2022} +} +``` + +## License +This work is distributed under the OSI-approved BSD 3-Clause [License](https://github.com/Kitware/COAT/blob/master/LICENSE). diff --git a/coat-pvtv2-b2/configs/cuhk_sysu-local.yaml b/coat-pvtv2-b2/configs/cuhk_sysu-local.yaml new file mode 100644 index 0000000..0830c43 --- /dev/null +++ b/coat-pvtv2-b2/configs/cuhk_sysu-local.yaml @@ -0,0 +1,15 @@ +OUTPUT_DIR: "./logs/cuhk_coat" +INPUT: + DATASET: "CUHK-SYSU" + DATA_ROOT: "E:/DeepLearning/PersonSearch/COAT/datasets/CUHK-SYSU" + BATCH_SIZE_TRAIN: 3 +SOLVER: + MAX_EPOCHS: 14 + BASE_LR: 0.003 + LW_RCNN_SOFTMAX_2ND: 0.1 + LW_RCNN_SOFTMAX_3RD: 0.1 +MODEL: + LOSS: + LUT_SIZE: 5532 + CQ_SIZE: 5000 +DISP_PERIOD: 100 diff --git a/coat-pvtv2-b2/configs/cuhk_sysu.yaml b/coat-pvtv2-b2/configs/cuhk_sysu.yaml new file mode 100644 index 0000000..c28a480 --- /dev/null +++ b/coat-pvtv2-b2/configs/cuhk_sysu.yaml @@ -0,0 +1,15 @@ +OUTPUT_DIR: "./logs/cuhk_coat" +INPUT: + DATASET: "CUHK-SYSU" + DATA_ROOT: "/home/logzhan/datasets/CUHK-SYSU" + BATCH_SIZE_TRAIN: 4 +SOLVER: + MAX_EPOCHS: 14 + BASE_LR: 0.003 + LW_RCNN_SOFTMAX_2ND: 0.1 + LW_RCNN_SOFTMAX_3RD: 0.1 +MODEL: + LOSS: + LUT_SIZE: 5532 + CQ_SIZE: 5000 +DISP_PERIOD: 100 diff --git a/coat-pvtv2-b2/configs/prw-local.yaml b/coat-pvtv2-b2/configs/prw-local.yaml new file mode 100644 index 0000000..c5b1331 --- /dev/null +++ b/coat-pvtv2-b2/configs/prw-local.yaml @@ -0,0 +1,13 @@ +OUTPUT_DIR: "./logs/prw_coat" +INPUT: + DATASET: "PRW" + DATA_ROOT: "E:/DeepLearning/PersonSearch/COAT/datasets/PRW" + BATCH_SIZE_TRAIN: 3 +SOLVER: + MAX_EPOCHS: 13 + BASE_LR: 0.003 +MODEL: + LOSS: + LUT_SIZE: 482 + CQ_SIZE: 500 +DISP_PERIOD: 100 diff --git a/coat-pvtv2-b2/configs/prw.yaml b/coat-pvtv2-b2/configs/prw.yaml new file mode 100644 index 0000000..70a26f3 --- /dev/null +++ b/coat-pvtv2-b2/configs/prw.yaml @@ -0,0 +1,13 @@ +OUTPUT_DIR: "./logs/prw_coat" +INPUT: + DATASET: "PRW" + DATA_ROOT: "../../datasets/PRW" + BATCH_SIZE_TRAIN: 3 +SOLVER: + MAX_EPOCHS: 13 + BASE_LR: 0.003 +MODEL: + LOSS: + LUT_SIZE: 482 + CQ_SIZE: 500 +DISP_PERIOD: 100 diff --git a/coat-pvtv2-b2/datasets/__init__.py b/coat-pvtv2-b2/datasets/__init__.py new file mode 100644 index 0000000..58a3459 --- /dev/null +++ b/coat-pvtv2-b2/datasets/__init__.py @@ -0,0 +1,5 @@ +# This file is part of COAT, and is distributed under the +# OSI-approved BSD 3-Clause License. See top-level LICENSE file or +# https://github.com/Kitware/COAT/blob/master/LICENSE for details. + +from .build import build_test_loader, build_train_loader diff --git a/coat-pvtv2-b2/datasets/base.py b/coat-pvtv2-b2/datasets/base.py new file mode 100644 index 0000000..1a61cad --- /dev/null +++ b/coat-pvtv2-b2/datasets/base.py @@ -0,0 +1,42 @@ +# This file is part of COAT, and is distributed under the +# OSI-approved BSD 3-Clause License. See top-level LICENSE file or +# https://github.com/Kitware/COAT/blob/master/LICENSE for details. + +import torch +from PIL import Image + +class BaseDataset: + """ + Base class of person search dataset. + """ + + def __init__(self, root, transforms, split): + self.root = root + self.transforms = transforms + self.split = split + assert self.split in ("train", "gallery", "query") + self.annotations = self._load_annotations() + + def _load_annotations(self): + """ + For each image, load its annotation that is a dictionary with the following keys: + img_name (str): image name + img_path (str): image path + boxes (np.array[N, 4]): ground-truth boxes in (x1, y1, x2, y2) format + pids (np.array[N]): person IDs corresponding to these boxes + cam_id (int): camera ID (only for PRW dataset) + """ + raise NotImplementedError + + def __getitem__(self, index): + anno = self.annotations[index] + img = Image.open(anno["img_path"]).convert("RGB") + boxes = torch.as_tensor(anno["boxes"], dtype=torch.float32) + labels = torch.as_tensor(anno["pids"], dtype=torch.int64) + target = {"img_name": anno["img_name"], "boxes": boxes, "labels": labels} + if self.transforms is not None: + img, target = self.transforms(img, target) + return img, target + + def __len__(self): + return len(self.annotations) diff --git a/coat-pvtv2-b2/datasets/build.py b/coat-pvtv2-b2/datasets/build.py new file mode 100644 index 0000000..29ab278 --- /dev/null +++ b/coat-pvtv2-b2/datasets/build.py @@ -0,0 +1,104 @@ +# This file is part of COAT, and is distributed under the +# OSI-approved BSD 3-Clause License. See top-level LICENSE file or +# https://github.com/Kitware/COAT/blob/master/LICENSE for details. + +import torch +from utils.transforms import build_transforms +from utils.utils import create_small_table +from .cuhk_sysu import CUHKSYSU +from .prw import PRW + +def print_statistics(dataset): + """ + Print dataset statistics. + """ + num_imgs = len(dataset.annotations) + num_boxes = 0 + pid_set = set() + for anno in dataset.annotations: + num_boxes += anno["boxes"].shape[0] + for pid in anno["pids"]: + pid_set.add(pid) + statistics = { + "dataset": dataset.name, + "split": dataset.split, + "num_images": num_imgs, + "num_boxes": num_boxes, + } + if dataset.name != "CUHK-SYSU" or dataset.split != "query": + pid_list = sorted(list(pid_set)) + if dataset.split == "query": + num_pids, min_pid, max_pid = len(pid_list), min(pid_list), max(pid_list) + statistics.update( + { + "num_labeled_pids": num_pids, + "min_labeled_pid": int(min_pid), + "max_labeled_pid": int(max_pid), + } + ) + else: + unlabeled_pid = pid_list[-1] + pid_list = pid_list[:-1] # remove unlabeled pid + num_pids, min_pid, max_pid = len(pid_list), min(pid_list), max(pid_list) + statistics.update( + { + "num_labeled_pids": num_pids, + "min_labeled_pid": int(min_pid), + "max_labeled_pid": int(max_pid), + "unlabeled_pid": int(unlabeled_pid), + } + ) + print(f"=> {dataset.name}-{dataset.split} loaded:\n" + create_small_table(statistics)) + + +def build_dataset(dataset_name, root, transforms, split, verbose=True): + if dataset_name == "CUHK-SYSU": + dataset = CUHKSYSU(root, transforms, split) + elif dataset_name == "PRW": + dataset = PRW(root, transforms, split) + else: + raise NotImplementedError(f"Unknow dataset: {dataset_name}") + if verbose: + print_statistics(dataset) + return dataset + + +def collate_fn(batch): + return tuple(zip(*batch)) + + +def build_train_loader(cfg): + transforms = build_transforms(cfg, is_train=True) + dataset = build_dataset(cfg.INPUT.DATASET, cfg.INPUT.DATA_ROOT, transforms, "train") + return torch.utils.data.DataLoader( + dataset, + batch_size=cfg.INPUT.BATCH_SIZE_TRAIN, + shuffle=True, + num_workers=cfg.INPUT.NUM_WORKERS_TRAIN, + pin_memory=True, + drop_last=True, + collate_fn=collate_fn, + ) + + +def build_test_loader(cfg): + transforms = build_transforms(cfg, is_train=False) + gallery_set = build_dataset(cfg.INPUT.DATASET, cfg.INPUT.DATA_ROOT, transforms, "gallery") + query_set = build_dataset(cfg.INPUT.DATASET, cfg.INPUT.DATA_ROOT, transforms, "query") + gallery_loader = torch.utils.data.DataLoader( + gallery_set, + batch_size=cfg.INPUT.BATCH_SIZE_TEST, + shuffle=False, + num_workers=cfg.INPUT.NUM_WORKERS_TEST, + pin_memory=True, + collate_fn=collate_fn, + ) + query_loader = torch.utils.data.DataLoader( + query_set, + batch_size=cfg.INPUT.BATCH_SIZE_TEST, + shuffle=False, + num_workers=cfg.INPUT.NUM_WORKERS_TEST, + pin_memory=True, + collate_fn=collate_fn, + ) + return gallery_loader, query_loader diff --git a/coat-pvtv2-b2/datasets/cuhk_sysu.py b/coat-pvtv2-b2/datasets/cuhk_sysu.py new file mode 100644 index 0000000..bdf45bd --- /dev/null +++ b/coat-pvtv2-b2/datasets/cuhk_sysu.py @@ -0,0 +1,121 @@ +# This file is part of COAT, and is distributed under the +# OSI-approved BSD 3-Clause License. See top-level LICENSE file or +# https://github.com/Kitware/COAT/blob/master/LICENSE for details. + +import os.path as osp +import numpy as np +from scipy.io import loadmat +from .base import BaseDataset + +class CUHKSYSU(BaseDataset): + def __init__(self, root, transforms, split): + self.name = "CUHK-SYSU" + self.img_prefix = osp.join(root, "Image", "SSM") + super(CUHKSYSU, self).__init__(root, transforms, split) + + def _load_queries(self): + # TestG50: a test protocol, 50 gallery images per query + protoc = loadmat(osp.join(self.root, "annotation/test/train_test/TestG50.mat")) + protoc = protoc["TestG50"].squeeze() + queries = [] + for item in protoc["Query"]: + img_name = str(item["imname"][0, 0][0]) + roi = item["idlocate"][0, 0][0].astype(np.int32) + roi[2:] += roi[:2] + queries.append( + { + "img_name": img_name, + "img_path": osp.join(self.img_prefix, img_name), + "boxes": roi[np.newaxis, :], + "pids": np.array([-100]), # dummy pid + } + ) + return queries + + def _load_split_img_names(self): + """ + Load the image names for the specific split. + """ + assert self.split in ("train", "gallery") + # gallery images + gallery_imgs = loadmat(osp.join(self.root, "annotation", "pool.mat")) + gallery_imgs = gallery_imgs["pool"].squeeze() + gallery_imgs = [str(a[0]) for a in gallery_imgs] + if self.split == "gallery": + return gallery_imgs + # all images + all_imgs = loadmat(osp.join(self.root, "annotation", "Images.mat")) + all_imgs = all_imgs["Img"].squeeze() + all_imgs = [str(a[0][0]) for a in all_imgs] + # training images = all images - gallery images + training_imgs = sorted(list(set(all_imgs) - set(gallery_imgs))) + return training_imgs + + def _load_annotations(self): + if self.split == "query": + return self._load_queries() + + # load all images and build a dict from image to boxes + all_imgs = loadmat(osp.join(self.root, "annotation", "Images.mat")) + all_imgs = all_imgs["Img"].squeeze() + name_to_boxes = {} + name_to_pids = {} + unlabeled_pid = 5555 # default pid for unlabeled people + for img_name, _, boxes in all_imgs: + img_name = str(img_name[0]) + boxes = np.asarray([b[0] for b in boxes[0]]) + boxes = boxes.reshape(boxes.shape[0], 4) # (x1, y1, w, h) + valid_index = np.where((boxes[:, 2] > 0) & (boxes[:, 3] > 0))[0] + assert valid_index.size > 0, "Warning: {} has no valid boxes.".format(img_name) + boxes = boxes[valid_index] + name_to_boxes[img_name] = boxes.astype(np.int32) + name_to_pids[img_name] = unlabeled_pid * np.ones(boxes.shape[0], dtype=np.int32) + + def set_box_pid(boxes, box, pids, pid): + for i in range(boxes.shape[0]): + if np.all(boxes[i] == box): + pids[i] = pid + return + + # assign a unique pid from 1 to N for each identity + if self.split == "train": + train = loadmat(osp.join(self.root, "annotation/test/train_test/Train.mat")) + train = train["Train"].squeeze() + for index, item in enumerate(train): + scenes = item[0, 0][2].squeeze() + for img_name, box, _ in scenes: + img_name = str(img_name[0]) + box = box.squeeze().astype(np.int32) + set_box_pid(name_to_boxes[img_name], box, name_to_pids[img_name], index + 1) + else: + protoc = loadmat(osp.join(self.root, "annotation/test/train_test/TestG50.mat")) + protoc = protoc["TestG50"].squeeze() + for index, item in enumerate(protoc): + # query + im_name = str(item["Query"][0, 0][0][0]) + box = item["Query"][0, 0][1].squeeze().astype(np.int32) + set_box_pid(name_to_boxes[im_name], box, name_to_pids[im_name], index + 1) + # gallery + gallery = item["Gallery"].squeeze() + for im_name, box, _ in gallery: + im_name = str(im_name[0]) + if box.size == 0: + break + box = box.squeeze().astype(np.int32) + set_box_pid(name_to_boxes[im_name], box, name_to_pids[im_name], index + 1) + + annotations = [] + imgs = self._load_split_img_names() + for img_name in imgs: + boxes = name_to_boxes[img_name] + boxes[:, 2:] += boxes[:, :2] # (x1, y1, w, h) -> (x1, y1, x2, y2) + pids = name_to_pids[img_name] + annotations.append( + { + "img_name": img_name, + "img_path": osp.join(self.img_prefix, img_name), + "boxes": boxes, + "pids": pids, + } + ) + return annotations diff --git a/coat-pvtv2-b2/datasets/prw.py b/coat-pvtv2-b2/datasets/prw.py new file mode 100644 index 0000000..738c6d3 --- /dev/null +++ b/coat-pvtv2-b2/datasets/prw.py @@ -0,0 +1,97 @@ +# This file is part of COAT, and is distributed under the +# OSI-approved BSD 3-Clause License. See top-level LICENSE file or +# https://github.com/Kitware/COAT/blob/master/LICENSE for details. + +import os.path as osp +import re + +import numpy as np +from scipy.io import loadmat + +from .base import BaseDataset + + +class PRW(BaseDataset): + def __init__(self, root, transforms, split): + self.name = "PRW" + self.img_prefix = osp.join(root, "frames") + super(PRW, self).__init__(root, transforms, split) + + def _get_cam_id(self, img_name): + match = re.search(r"c\d", img_name).group().replace("c", "") + return int(match) + + def _load_queries(self): + query_info = osp.join(self.root, "query_info.txt") + with open(query_info, "rb") as f: + raw = f.readlines() + + queries = [] + for line in raw: + linelist = str(line, "utf-8").split(" ") + pid = int(linelist[0]) + x, y, w, h = ( + float(linelist[1]), + float(linelist[2]), + float(linelist[3]), + float(linelist[4]), + ) + roi = np.array([x, y, x + w, y + h]).astype(np.int32) + roi = np.clip(roi, 0, None) # several coordinates are negative + img_name = linelist[5][:-2] + ".jpg" + queries.append( + { + "img_name": img_name, + "img_path": osp.join(self.img_prefix, img_name), + "boxes": roi[np.newaxis, :], + "pids": np.array([pid]), + "cam_id": self._get_cam_id(img_name), + } + ) + return queries + + def _load_split_img_names(self): + """ + Load the image names for the specific split. + """ + assert self.split in ("train", "gallery") + if self.split == "train": + imgs = loadmat(osp.join(self.root, "frame_train.mat"))["img_index_train"] + else: + imgs = loadmat(osp.join(self.root, "frame_test.mat"))["img_index_test"] + return [img[0][0] + ".jpg" for img in imgs] + + def _load_annotations(self): + if self.split == "query": + return self._load_queries() + + annotations = [] + imgs = self._load_split_img_names() + for img_name in imgs: + anno_path = osp.join(self.root, "annotations", img_name) + anno = loadmat(anno_path) + box_key = "box_new" + if box_key not in anno.keys(): + box_key = "anno_file" + if box_key not in anno.keys(): + box_key = "anno_previous" + + rois = anno[box_key][:, 1:] + ids = anno[box_key][:, 0] + rois = np.clip(rois, 0, None) # several coordinates are negative + + assert len(rois) == len(ids) + + rois[:, 2:] += rois[:, :2] + ids[ids == -2] = 5555 # assign pid = 5555 for unlabeled people + annotations.append( + { + "img_name": img_name, + "img_path": osp.join(self.img_prefix, img_name), + "boxes": rois.astype(np.int32), + # (training pids) 1, 2,..., 478, 480, 481, 482, 483, 932, 5555 + "pids": ids.astype(np.int32), + "cam_id": self._get_cam_id(img_name), + } + ) + return annotations diff --git a/coat-pvtv2-b2/defaults.py b/coat-pvtv2-b2/defaults.py new file mode 100644 index 0000000..54910f7 --- /dev/null +++ b/coat-pvtv2-b2/defaults.py @@ -0,0 +1,219 @@ +# This file is part of COAT, and is distributed under the +# OSI-approved BSD 3-Clause License. See top-level LICENSE file or +# https://github.com/Kitware/COAT/blob/master/LICENSE for details. + +from yacs.config import CfgNode as CN + +_C = CN() + +# -------------------------------------------------------- # +# Input # +# -------------------------------------------------------- # +_C.INPUT = CN() +_C.INPUT.DATASET = "CUHK-SYSU" +_C.INPUT.DATA_ROOT = "data/CUHK-SYSU" + +# Size of the smallest side of the image +_C.INPUT.MIN_SIZE = 900 +# Maximum size of the side of the image +_C.INPUT.MAX_SIZE = 1500 + +# Number of images per batch +_C.INPUT.BATCH_SIZE_TRAIN = 5 +_C.INPUT.BATCH_SIZE_TEST = 1 + +# Number of data loading threads +_C.INPUT.NUM_WORKERS_TRAIN = 5 +_C.INPUT.NUM_WORKERS_TEST = 1 + +# Image augmentation +_C.INPUT.IMAGE_CUTOUT = False +_C.INPUT.IMAGE_ERASE = False +_C.INPUT.IMAGE_MIXUP = False + +# -------------------------------------------------------- # +# GRID # +# -------------------------------------------------------- # +_C.INPUT.IMAGE_GRID = False +_C.GRID = CN() +_C.GRID.ROTATE = 1 +_C.GRID.OFFSET = 0 +_C.GRID.RATIO = 0.5 +_C.GRID.MODE = 1 +_C.GRID.PROB = 0.5 + +# -------------------------------------------------------- # +# Solver # +# -------------------------------------------------------- # +_C.SOLVER = CN() +_C.SOLVER.MAX_EPOCHS = 13 + +# Learning rate settings +_C.SOLVER.BASE_LR = 0.003 + +# The epoch milestones to decrease the learning rate by GAMMA +_C.SOLVER.LR_DECAY_MILESTONES = [10, 14] +_C.SOLVER.GAMMA = 0.1 + +_C.SOLVER.WEIGHT_DECAY = 0.0005 +_C.SOLVER.SGD_MOMENTUM = 0.9 + +# Loss weight of RPN regression +_C.SOLVER.LW_RPN_REG = 1 +# Loss weight of RPN classification +_C.SOLVER.LW_RPN_CLS = 1 + +# Loss weight of Cascade R-CNN and Re-ID (OIM) +_C.SOLVER.LW_RCNN_REG_1ST = 10 +_C.SOLVER.LW_RCNN_CLS_1ST = 1 +_C.SOLVER.LW_RCNN_REG_2ND = 10 +_C.SOLVER.LW_RCNN_CLS_2ND = 1 +_C.SOLVER.LW_RCNN_REG_3RD = 10 +_C.SOLVER.LW_RCNN_CLS_3RD = 1 +_C.SOLVER.LW_RCNN_REID_2ND = 0.5 +_C.SOLVER.LW_RCNN_REID_3RD = 0.5 +# Loss weight of box reid, softmax loss +_C.SOLVER.LW_RCNN_SOFTMAX_2ND = 0.5 +_C.SOLVER.LW_RCNN_SOFTMAX_3RD = 0.5 + +# Set to negative value to disable gradient clipping +_C.SOLVER.CLIP_GRADIENTS = 10.0 + +# -------------------------------------------------------- # +# RPN # +# -------------------------------------------------------- # +_C.MODEL = CN() +_C.MODEL.RPN = CN() +# NMS threshold used on RoIs +_C.MODEL.RPN.NMS_THRESH = 0.7 +# Number of anchors per image used to train RPN +_C.MODEL.RPN.BATCH_SIZE_TRAIN = 256 +# Target fraction of foreground examples per RPN minibatch +_C.MODEL.RPN.POS_FRAC_TRAIN = 0.5 +# Overlap threshold for an anchor to be considered foreground (if >= POS_THRESH_TRAIN) +_C.MODEL.RPN.POS_THRESH_TRAIN = 0.7 +# Overlap threshold for an anchor to be considered background (if < NEG_THRESH_TRAIN) +_C.MODEL.RPN.NEG_THRESH_TRAIN = 0.3 +# Number of top scoring RPN RoIs to keep before applying NMS +_C.MODEL.RPN.PRE_NMS_TOPN_TRAIN = 12000 +_C.MODEL.RPN.PRE_NMS_TOPN_TEST = 6000 +# Number of top scoring RPN RoIs to keep after applying NMS +_C.MODEL.RPN.POST_NMS_TOPN_TRAIN = 2000 +_C.MODEL.RPN.POST_NMS_TOPN_TEST = 300 + +# -------------------------------------------------------- # +# RoI head # +# -------------------------------------------------------- # +_C.MODEL.ROI_HEAD = CN() +# Whether to use bn neck (i.e. batch normalization after linear) +_C.MODEL.ROI_HEAD.BN_NECK = True +# Number of RoIs per image used to train RoI head +_C.MODEL.ROI_HEAD.BATCH_SIZE_TRAIN = 128 +# Target fraction of foreground examples per RoI minibatch +_C.MODEL.ROI_HEAD.POS_FRAC_TRAIN = 0.25 # 0.5 + +_C.MODEL.ROI_HEAD.USE_DIFF_THRESH = True +# Overlap threshold for an RoI to be considered foreground (if >= POS_THRESH_TRAIN) +_C.MODEL.ROI_HEAD.POS_THRESH_TRAIN = 0.5 +_C.MODEL.ROI_HEAD.POS_THRESH_TRAIN_2ND = 0.6 +_C.MODEL.ROI_HEAD.POS_THRESH_TRAIN_3RD = 0.7 +# Overlap threshold for an RoI to be considered background (if < NEG_THRESH_TRAIN) +_C.MODEL.ROI_HEAD.NEG_THRESH_TRAIN = 0.5 +_C.MODEL.ROI_HEAD.NEG_THRESH_TRAIN_2ND = 0.6 +_C.MODEL.ROI_HEAD.NEG_THRESH_TRAIN_3RD = 0.7 +# Minimum score threshold +_C.MODEL.ROI_HEAD.SCORE_THRESH_TEST = 0.5 +# NMS threshold used on boxes +_C.MODEL.ROI_HEAD.NMS_THRESH_TEST = 0.4 +_C.MODEL.ROI_HEAD.NMS_THRESH_TEST_1ST = 0.4 +_C.MODEL.ROI_HEAD.NMS_THRESH_TEST_2ND = 0.4 +_C.MODEL.ROI_HEAD.NMS_THRESH_TEST_3RD = 0.5 +# Maximum number of detected objects +_C.MODEL.ROI_HEAD.DETECTIONS_PER_IMAGE_TEST = 300 + +# -------------------------------------------------------- # +# Transformer head # +# -------------------------------------------------------- # +_C.MODEL.TRANSFORMER = CN() +_C.MODEL.TRANSFORMER.DIM_MODEL = 512 +_C.MODEL.TRANSFORMER.ENCODER_LAYERS = 1 +_C.MODEL.TRANSFORMER.N_HEAD = 8 +_C.MODEL.TRANSFORMER.USE_OUTPUT_LAYER = False +_C.MODEL.TRANSFORMER.DROPOUT = 0. +_C.MODEL.TRANSFORMER.USE_LOCAL_SHORTCUT = True +_C.MODEL.TRANSFORMER.USE_GLOBAL_SHORTCUT = True + +_C.MODEL.TRANSFORMER.USE_DIFF_SCALE = True +_C.MODEL.TRANSFORMER.NAMES_1ST = ['scale1','scale2'] +_C.MODEL.TRANSFORMER.NAMES_2ND = ['scale1','scale2'] +_C.MODEL.TRANSFORMER.NAMES_3RD = ['scale1','scale2'] +_C.MODEL.TRANSFORMER.KERNEL_SIZE_1ST = [(1,1),(3,3)] +_C.MODEL.TRANSFORMER.KERNEL_SIZE_2ND = [(1,1),(3,3)] +_C.MODEL.TRANSFORMER.KERNEL_SIZE_3RD = [(1,1),(3,3)] +_C.MODEL.TRANSFORMER.USE_MASK_1ST = False +_C.MODEL.TRANSFORMER.USE_MASK_2ND = True +_C.MODEL.TRANSFORMER.USE_MASK_3RD = True +_C.MODEL.TRANSFORMER.USE_PATCH2VEC = True + +#### +_C.MODEL.USE_FEATURE_MASK = True +_C.MODEL.FEATURE_AUG_TYPE = 'exchange_token' # 'exchange_token', 'jigsaw_token', 'cutout_patch', 'erase_patch', 'mixup_patch', 'jigsaw_patch' +_C.MODEL.FEATURE_MASK_SIZE = 4 +_C.MODEL.MASK_SHAPE = 'stripe' # 'square', 'random' +_C.MODEL.MASK_SIZE = 1 +_C.MODEL.MASK_MODE = 'random_direction' # 'horizontal', 'vertical' for stripe; 'random_size' for square +_C.MODEL.MASK_PERCENT = 0.1 +#### +_C.MODEL.EMBEDDING_DIM = 256 + +# -------------------------------------------------------- # +# Loss # +# -------------------------------------------------------- # +_C.MODEL.LOSS = CN() +# Size of the lookup table in OIM +_C.MODEL.LOSS.LUT_SIZE = 5532 +# Size of the circular queue in OIM +_C.MODEL.LOSS.CQ_SIZE = 5000 +_C.MODEL.LOSS.OIM_MOMENTUM = 0.5 +_C.MODEL.LOSS.OIM_SCALAR = 30.0 + +_C.MODEL.LOSS.USE_SOFTMAX = True + +# -------------------------------------------------------- # +# Evaluation # +# -------------------------------------------------------- # +# The period to evaluate the model during training +_C.EVAL_PERIOD = 1 +# Evaluation with GT boxes to verify the upper bound of person search performance +_C.EVAL_USE_GT = False +# Fast evaluation with cached features +_C.EVAL_USE_CACHE = False +# Evaluation with Context Bipartite Graph Matching (CBGM) algorithm +_C.EVAL_USE_CBGM = False +# Gallery size in evaluation, only for CUHK-SYSU +_C.EVAL_GALLERY_SIZE = 100 +# Feature used for evaluation +_C.EVAL_FEATURE = 'concat' # 'stage2', 'stage3' + +# -------------------------------------------------------- # +# Miscs # +# -------------------------------------------------------- # +# Save a checkpoint after every this number of epochs +_C.CKPT_PERIOD = 1 +# The period (in terms of iterations) to display training losses +_C.DISP_PERIOD = 10 +# Whether to use tensorboard for visualization +_C.TF_BOARD = True +# The device loading the model +_C.DEVICE = "cuda:0" +# Set seed to negative to fully randomize everything +_C.SEED = 1 +# Directory where output files are written +_C.OUTPUT_DIR = "./output" + + +def get_default_cfg(): + """ + Get a copy of the default config. + """ + return _C.clone() diff --git a/coat-pvtv2-b2/doc/framework.png b/coat-pvtv2-b2/doc/framework.png new file mode 100644 index 0000000000000000000000000000000000000000..1903b5412950a81a4fd7f4ea6658b687fb09a7bc GIT binary patch literal 1500202 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 =SWYXG(^3_P@S{sXQCu!bnNyC<{J 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 P7Kp9owm!YQ5fcZpYE120@JhS=^X&6Y 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