diff --git a/README.md b/README.md index e8e64cf..a3d72eb 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ The designed architecture follows this guide [PyTorch-Project-Template](https:// See [GETTING_STARTED.md](https://github.com/JDAI-CV/fast-reid/blob/master/GETTING_STARTED.md). -Learn more at out [documentation](). And see [projects/](https://github.com/JDAI-CV/fast-reid/tree/master/projects) for some projects that are build on top of fastreid. +Learn more at out [documentation](https://fast-reid.readthedocs.io/). And see [projects/](https://github.com/JDAI-CV/fast-reid/tree/master/projects) for some projects that are build on top of fastreid. ## Model Zoo and Baselines diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..9c5f578 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1 @@ +_build \ No newline at end of file diff --git a/fastreid/data/__init__.py b/fastreid/data/__init__.py index d138908..dc3b6e1 100644 --- a/fastreid/data/__init__.py +++ b/fastreid/data/__init__.py @@ -4,4 +4,14 @@ @contact: sherlockliao01@gmail.com """ -from .build import build_reid_train_loader, build_reid_test_loader +from . import transforms # isort:skip +from .build import ( + build_reid_train_loader, + build_reid_test_loader +) +from .common import CommDataset + +# ensure the builtin datasets are registered +from . import datasets, samplers # isort:skip + +__all__ = [k for k in globals().keys() if not k.startswith("_")] diff --git a/fastreid/data/build.py b/fastreid/data/build.py index 8d6bdc5..6b48271 100644 --- a/fastreid/data/build.py +++ b/fastreid/data/build.py @@ -16,10 +16,25 @@ from .common import CommDataset from .datasets import DATASET_REGISTRY from .transforms import build_transforms +__all__ = [ + "build_reid_train_loader", + "build_reid_test_loader" +] + _root = os.getenv("FASTREID_DATASETS", "datasets") def build_reid_train_loader(cfg, mapper=None, **kwargs): + """ + Build reid train loader + + Args: + cfg : image file path + mapper : one of the supported image modes in PIL, or "BGR" + + Returns: + torch.utils.data.DataLoader: a dataloader. + """ cfg = cfg.clone() train_items = list() @@ -60,6 +75,19 @@ def build_reid_train_loader(cfg, mapper=None, **kwargs): def build_reid_test_loader(cfg, dataset_name, mapper=None, **kwargs): + """ + Build reid test loader + + Args: + cfg: + dataset_name: + mapper: + **kwargs: + + Returns: + + """ + cfg = cfg.clone() dataset = DATASET_REGISTRY.get(dataset_name)(root=_root, **kwargs) diff --git a/fastreid/data/data_utils.py b/fastreid/data/data_utils.py index 449c305..6c0b79b 100644 --- a/fastreid/data/data_utils.py +++ b/fastreid/data/data_utils.py @@ -13,6 +13,7 @@ def read_image(file_name, format=None): """ Read an image into the given format. Will apply rotation and flipping if the image has such exif information. + Args: file_name (str): image file path format (str): one of the supported image modes in PIL, or "BGR" diff --git a/fastreid/data/datasets/AirportALERT.py b/fastreid/data/datasets/AirportALERT.py index 8ccb7d4..72ecc2e 100644 --- a/fastreid/data/datasets/AirportALERT.py +++ b/fastreid/data/datasets/AirportALERT.py @@ -14,6 +14,9 @@ __all__ = ['AirportALERT', ] @DATASET_REGISTRY.register() class AirportALERT(ImageDataset): + """Airport + + """ dataset_dir = "AirportALERT" dataset_name = "airport" diff --git a/fastreid/data/datasets/bases.py b/fastreid/data/datasets/bases.py index 79846c9..732533e 100644 --- a/fastreid/data/datasets/bases.py +++ b/fastreid/data/datasets/bases.py @@ -7,6 +7,7 @@ import copy import logging import os + from tabulate import tabulate from termcolor import colored @@ -16,6 +17,7 @@ logger = logging.getLogger(__name__) class Dataset(object): """An abstract class representing a Dataset. This is the base class for ``ImageDataset`` and ``VideoDataset``. + Args: train (list): contains tuples of (img_path(s), pid, camid). query (list): contains tuples of (img_path(s), pid, camid). diff --git a/fastreid/data/datasets/caviara.py b/fastreid/data/datasets/caviara.py index 9403671..bb4e4ca 100644 --- a/fastreid/data/datasets/caviara.py +++ b/fastreid/data/datasets/caviara.py @@ -19,6 +19,8 @@ __all__ = ['CAVIARa',] @DATASET_REGISTRY.register() class CAVIARa(ImageDataset): + """CAVIARa + """ dataset_dir = "CAVIARa" dataset_name = "caviara" diff --git a/fastreid/data/datasets/cuhk_sysu.py b/fastreid/data/datasets/cuhk_sysu.py index 75a1488..23b3029 100644 --- a/fastreid/data/datasets/cuhk_sysu.py +++ b/fastreid/data/datasets/cuhk_sysu.py @@ -15,7 +15,7 @@ from ..datasets import DATASET_REGISTRY @DATASET_REGISTRY.register() class cuhkSYSU(ImageDataset): - r"""CUHK SYSU datasets. + """CUHK SYSU datasets. The dataset is collected from two sources: street snap and movie. In street snap, 12,490 images and 6,057 query persons were collected diff --git a/fastreid/data/datasets/iLIDS.py b/fastreid/data/datasets/iLIDS.py index 9d9a412..25b2c3d 100644 --- a/fastreid/data/datasets/iLIDS.py +++ b/fastreid/data/datasets/iLIDS.py @@ -15,6 +15,8 @@ __all__ = ['iLIDS', ] @DATASET_REGISTRY.register() class iLIDS(ImageDataset): + """iLIDS + """ dataset_dir = "iLIDS" dataset_name = "ilids" diff --git a/fastreid/data/datasets/lpw.py b/fastreid/data/datasets/lpw.py index a7f6117..41080a1 100644 --- a/fastreid/data/datasets/lpw.py +++ b/fastreid/data/datasets/lpw.py @@ -15,7 +15,9 @@ __all__ = ['LPW', ] @DATASET_REGISTRY.register() class LPW(ImageDataset): - dataset_dir = "pep_256x128" + """LPW + """ + dataset_dir = "pep_256x128/data_slim" dataset_name = "lpw" def __init__(self, root='datasets', **kwargs): diff --git a/fastreid/data/datasets/pes3d.py b/fastreid/data/datasets/pes3d.py index ae9d762..b187a24 100644 --- a/fastreid/data/datasets/pes3d.py +++ b/fastreid/data/datasets/pes3d.py @@ -15,6 +15,8 @@ __all__ = ['PeS3D',] @DATASET_REGISTRY.register() class PeS3D(ImageDataset): + """3Dpes + """ dataset_dir = "3DPeS" dataset_name = "pes3d" diff --git a/fastreid/data/datasets/pku.py b/fastreid/data/datasets/pku.py index 0082d29..99220bb 100644 --- a/fastreid/data/datasets/pku.py +++ b/fastreid/data/datasets/pku.py @@ -15,6 +15,8 @@ __all__ = ['PKU', ] @DATASET_REGISTRY.register() class PKU(ImageDataset): + """PKU + """ dataset_dir = "PKUv1a_128x48" dataset_name = 'pku' diff --git a/fastreid/data/datasets/prai.py b/fastreid/data/datasets/prai.py index 42a0223..956c22f 100644 --- a/fastreid/data/datasets/prai.py +++ b/fastreid/data/datasets/prai.py @@ -5,18 +5,18 @@ """ import os -from scipy.io import loadmat from glob import glob from fastreid.data.datasets import DATASET_REGISTRY from fastreid.data.datasets.bases import ImageDataset -import pdb -__all__ = ['PRAI',] +__all__ = ['PRAI', ] @DATASET_REGISTRY.register() class PRAI(ImageDataset): + """PRAI + """ dataset_dir = "PRAI-1581" dataset_name = 'prai' @@ -41,4 +41,3 @@ class PRAI(ImageDataset): camid = self.dataset_name + "_" + img_info[1] data.append([img_path, pid, camid]) return data - diff --git a/fastreid/data/datasets/saivt.py b/fastreid/data/datasets/saivt.py index c1f2d07..6dd82cc 100644 --- a/fastreid/data/datasets/saivt.py +++ b/fastreid/data/datasets/saivt.py @@ -15,6 +15,8 @@ __all__ = ['SAIVT', ] @DATASET_REGISTRY.register() class SAIVT(ImageDataset): + """SAIVT + """ dataset_dir = "SAIVT-SoftBio" dataset_name = "saivt" diff --git a/fastreid/data/datasets/sensereid.py b/fastreid/data/datasets/sensereid.py index 92d2c16..fc3a742 100644 --- a/fastreid/data/datasets/sensereid.py +++ b/fastreid/data/datasets/sensereid.py @@ -15,6 +15,8 @@ __all__ = ['SenseReID', ] @DATASET_REGISTRY.register() class SenseReID(ImageDataset): + """Sense reid + """ dataset_dir = "SenseReID" dataset_name = "senseid" diff --git a/fastreid/data/datasets/shinpuhkan.py b/fastreid/data/datasets/shinpuhkan.py index ae240c1..67b8f8f 100644 --- a/fastreid/data/datasets/shinpuhkan.py +++ b/fastreid/data/datasets/shinpuhkan.py @@ -14,6 +14,8 @@ __all__ = ['Shinpuhkan', ] @DATASET_REGISTRY.register() class Shinpuhkan(ImageDataset): + """shinpuhkan + """ dataset_dir = "shinpuhkan" dataset_name = 'shinpuhkan' diff --git a/fastreid/data/datasets/sysu_mm.py b/fastreid/data/datasets/sysu_mm.py index bf67fff..06c598c 100644 --- a/fastreid/data/datasets/sysu_mm.py +++ b/fastreid/data/datasets/sysu_mm.py @@ -17,6 +17,8 @@ __all__ = ['SYSU_mm', ] @DATASET_REGISTRY.register() class SYSU_mm(ImageDataset): + """sysu mm + """ dataset_dir = "SYSU-MM01" dataset_name = "sysumm01" diff --git a/fastreid/data/datasets/thermalworld.py b/fastreid/data/datasets/thermalworld.py index b6df954..4c52fd1 100644 --- a/fastreid/data/datasets/thermalworld.py +++ b/fastreid/data/datasets/thermalworld.py @@ -19,6 +19,8 @@ __all__ = ['Thermalworld',] @DATASET_REGISTRY.register() class Thermalworld(ImageDataset): + """thermal world + """ dataset_dir = "thermalworld_rgb" dataset_name = "thermalworld" diff --git a/fastreid/data/samplers/__init__.py b/fastreid/data/samplers/__init__.py index d049456..bc34533 100644 --- a/fastreid/data/samplers/__init__.py +++ b/fastreid/data/samplers/__init__.py @@ -6,3 +6,10 @@ from .triplet_sampler import BalancedIdentitySampler, NaiveIdentitySampler from .data_sampler import TrainingSampler, InferenceSampler + +__all__ = [ + "BalancedIdentitySampler", + "NaiveIdentitySampler", + "TrainingSampler", + "InferenceSampler" +] diff --git a/fastreid/data/transforms/__init__.py b/fastreid/data/transforms/__init__.py index 7131a3b..a685154 100644 --- a/fastreid/data/transforms/__init__.py +++ b/fastreid/data/transforms/__init__.py @@ -4,6 +4,8 @@ @contact: sherlockliao01@gmail.com """ -from .autoaugment import * +from .autoaugment import AutoAugment from .build import build_transforms from .transforms import * + +__all__ = [k for k in globals().keys() if not k.startswith("_")] diff --git a/fastreid/data/transforms/transforms.py b/fastreid/data/transforms/transforms.py index 14ab4f7..fe1e8ee 100644 --- a/fastreid/data/transforms/transforms.py +++ b/fastreid/data/transforms/transforms.py @@ -149,13 +149,9 @@ class AugMix(object): np.random.dirichlet([self.aug_prob_coeff] * self.mixture_width)) m = np.float32(np.random.beta(self.aug_prob_coeff, self.aug_prob_coeff)) - # image = np.asarray(image, dtype=np.float32).copy() - # mix = np.zeros_like(image) mix = np.zeros([image.size[1], image.size[0], 3]) - # h, w = image.shape[0], image.shape[1] for i in range(self.mixture_width): image_aug = image.copy() - # image_aug = Image.fromarray(image.copy().astype(np.uint8)) depth = self.mixture_depth if self.mixture_depth > 0 else np.random.randint(1, 4) for _ in range(depth): op = np.random.choice(self.augmentations) diff --git a/fastreid/modeling/__init__.py b/fastreid/modeling/__init__.py index 71a2e7d..bfa62fa 100644 --- a/fastreid/modeling/__init__.py +++ b/fastreid/modeling/__init__.py @@ -4,4 +4,20 @@ @contact: sherlockliao01@gmail.com """ -from .meta_arch import build_model +from . import losses +from .backbones import ( + BACKBONE_REGISTRY, + build_resnet_backbone, + build_backbone, +) +from .heads import ( + REID_HEADS_REGISTRY, + build_heads, + EmbeddingHead, +) +from .meta_arch import ( + build_model, + META_ARCH_REGISTRY, +) + +__all__ = [k for k in globals().keys() if k not in k.startswith("_")] diff --git a/fastreid/modeling/backbones/build.py b/fastreid/modeling/backbones/build.py index 8786238..2ba1f72 100644 --- a/fastreid/modeling/backbones/build.py +++ b/fastreid/modeling/backbones/build.py @@ -10,8 +10,7 @@ BACKBONE_REGISTRY = Registry("BACKBONE") BACKBONE_REGISTRY.__doc__ = """ Registry for backbones, which extract feature maps from images The registered object must be a callable that accepts two arguments: -1. A :class:`detectron2.config.CfgNode` -2. A :class:`detectron2.layers.ShapeSpec`, which contains the input shape specification. +1. A :class:`fastreid.config.CfgNode` It must returns an instance of :class:`Backbone`. """ diff --git a/fastreid/modeling/heads/build.py b/fastreid/modeling/heads/build.py index 50fd367..fac00ff 100644 --- a/fastreid/modeling/heads/build.py +++ b/fastreid/modeling/heads/build.py @@ -8,7 +8,8 @@ from ...utils.registry import Registry REID_HEADS_REGISTRY = Registry("HEADS") REID_HEADS_REGISTRY.__doc__ = """ -Registry for ROI heads in a generalized R-CNN model. +Registry for reid heads in a baseline model. + ROIHeads take feature maps and region proposals, and perform per-region computation. The registered object will be called with `obj(cfg, input_shape)`. diff --git a/fastreid/modeling/losses/__init__.py b/fastreid/modeling/losses/__init__.py index 4f71f1d..c760405 100644 --- a/fastreid/modeling/losses/__init__.py +++ b/fastreid/modeling/losses/__init__.py @@ -4,7 +4,9 @@ @contact: sherlockliao01@gmail.com """ +from .circle_loss import * from .cross_entroy_loss import cross_entropy_loss, log_accuracy from .focal_loss import focal_loss from .triplet_loss import triplet_loss -from .circle_loss import * + +__all__ = [k for k in globals().keys() if k not in k.startswith("_")]