Torchreid
Torchreid 是一个用于深度学习行人再识别的库,用 PyTorch <https://pytorch.org/>
_ 编写,并为我们 ICCV'19 项目 Omni-Scale Feature Learning for Person Re-Identification <https://arxiv.org/abs/1905.00953>
_ 开发。
它具有以下特点:
- 多 GPU 训练
- 支持图像和视频再识别
- 端到端的训练和评估
- 极其简单的再识别数据集准备
- 多数据集训练
- 跨数据集评估
- 大多数研究论文中使用的标准协议
- 高度可拓展(容易添加模型、数据集、训练方法等)
- 先进的深度再识别模型实现
- 访问预训练的再识别模型
- 先进的训练技术
- 可视化工具(tensorboard、ranks 等)
代码: https://github.com/KaiyangZhou/deep-person-reid
文档: https://kaiyangzhou.github.io/deep-person-reid
操作指南: https://kaiyangzhou.github.io/deep-person-reid/user_guide
模型库: https://kaiyangzhou.github.io/deep-person-reid/MODEL_ZOO
技术报告: https://arxiv.org/abs/1910.10093
你可以在 这里 <https://github.com/KaiyangZhou/deep-person-reid/tree/master/projects>
_ 找到一些基于 Torchreid 构建的研究项目。
最新动态
- [2022年8月] 我们添加了模型导出功能,支持以下框架: ONNX, OpenVINO 和 TFLite. 导出脚本可以在
这里 <https://github.com/KaiyangZhou/deep-person-reid/blob/master/tools/export.py>
_ 找到 - [2021年8月] 我们发布了
osnet_ain_x0_75
,osnet_ain_x0_5
和osnet_ain_x0_25
的 ImageNet 预训练模型。预训练设置遵循pycls <https://github.com/facebookresearch/pycls/blob/master/configs/archive/imagenet/resnet/R-50-1x64d_step_8gpu.yaml>
_. - [2021年4月] 我们更新了
TPAMI 版本的 OSNet <https://arxiv.org/abs/1910.06827v5>
_ 的附录,加入了多源域泛化设置下的结果。训练好的模型可以在Model Zoo <https://kaiyangzhou.github.io/deep-person-reid/MODEL_ZOO.html>
_ 中找到。 - [2021年4月] 我们增加了一个脚本,自动化计算多个分割平均结果的过程。详情请见
tools/parse_test_res.py
。 - [2021年4月]
v1.4.0
: 我们增加了行人搜索数据集CUHK-SYSU <http://www.ee.cuhk.edu.hk/~xgwang/PS/dataset.html>
。请参考文档 <https://kaiyangzhou.github.io/deep-person-reid/>
以了解如何下载数据集(它包含裁剪过的行人图像)。 - [2021年4月] 所有模型已移至 Google Drive。如果某个模型的性能与模型库页面显示的数值不一致(可能是错误链接导致的),请提交 issue。
- [2021年3月]
OSNet <https://arxiv.org/abs/1910.06827>
_ 将在 TPAMI 期刊上发表! 与专注于使用全尺度构建模块来学习判别特征的会议版本相比,该期刊扩展版通过将实例归一化层 <https://arxiv.org/abs/1607.08022>
_ 融入 OSNet 架构,进一步考虑了通用特征学习。我们希望这篇期刊论文能激励更多未来的工作,解决跨数据集再识别中的泛化问题。 - [2021年3月] 在现实应用中,跨域(数据集)的通用性在行人再识别中至关重要,这与“域泛化”主题密切相关。想了解过去十年域泛化领域的发展吗?查看我们在此主题上的最近综述 https://arxiv.org/abs/2103.02503,涵盖了历史、数据集、相关问题、方法、潜在方向等内容(*也涵盖了通用再识别设计的方法*!)。
- [2021年2月]
v1.3.6
添加了University-1652 <https://dl.acm.org/doi/abs/10.1145/3394171.3413896>
,这是一个新的多视角多源地理定位数据集(感谢Zhedong Zheng <https://github.com/layumi>
)。 - [2021年2月]
v1.3.5
: 现在cython 代码 <https://github.com/KaiyangZhou/deep-person-reid/pull/412>
_ 可以在 Windows 上运行(感谢lablabla <https://github.com/lablabla>
_)。 - [2021年1月] 我们最近的工作
MixStyle <https://openreview.net/forum?id=6xHJ37MVxxp>
_(混合不同域样本的实例级特征统计以提高域泛化),已被 ICLR'21 接受。代码已在 https://github.com/KaiyangZhou/mixstyle-release 发布,其中行人再识别部分基于 Torchreid。 - [2021年1月] 引入了一种新的行人再识别评价指标
平均反负惩罚 (mINP)
,在Deep Learning for Person Re-identification: A Survey and Outlook (TPAMI 2021) <https://arxiv.org/abs/2001.04193>
_ 中介绍。他们的代码可以在<https://github.com/mangye16/ReID-Survey>
_ 访问。 - [2020年8月]
v1.3.3
: 修复了visrank
的错误(由未解包dsetid
引起)。 - [2020年8月]
v1.3.2
: 将_junk_pids
添加到grid
和prid
。这可以避免在设置combineall=True
时使用误标的图库图像进行训练。 - [2020年8月]
v1.3.0
: (1) 将dsetid
添加到现有的三元组数据源中,结果为(impath, pid, camid, dsetid)
。该变量表示数据集 ID,当组合多个数据集进行训练时(作为数据集指示符)非常有用。例如,当结合market1501
和cuhk03
时,前者将分配dsetid=0
而后者将分配dsetid=1
。(2) 添加了RandomDatasetSampler
。类似于RandomDomainSampler
,RandomDatasetSampler
从每个指定的数据集中抽取一定数量的图像(batch_size // num_datasets
)以组成一个小批量(数量由num_datasets
决定)。 - [2020年8月]
v1.2.6
: 添加了RandomDomainSampler
(它从每个指定摄像头中抽取一定数量的图像(batch_size // num_cams
)以形成一个小批量)。 - [2020年6月]
v1.2.5
: (1) 更改了 Dataloader 中__getitem__
的输出,从list
改为dict
。以前,用imgs=data[0]
来获取图像张量,现在应该用imgs=data['img']
。详见该提交 <https://github.com/KaiyangZhou/deep-person-reid/commit/aefe335d68f39a20160860e6d14c2d34f539b8a5>
_ 。(2)添加了k_tfm
作为图像数据加载器的选项,允许数据增广对图像独立地应用k_tfm
次。如果k_tfm > 1
,imgs=data['img']
返回一个具有k_tfm
个图像张量的列表。 - [2020年5月] 添加了
Omni-Scale Feature Learning for Person Re-Identification (ICCV'19) <https://arxiv.org/abs/1905.00953>
_ 中使用的行人属性识别代码。详见projects/attribute_recognition/
。 - [2020年5月]
v1.2.1
: 添加了一个简单的 API 用于特征提取(torchreid/utils/feature_extractor.py
)。详见文档 <https://kaiyangzhou.github.io/deep-person-reid/user_guide.html>
_ 中的说明。 - [2020年4月] 代码用于
深度互学习 <https://zpascal.net/cvpr2018/Zhang_Deep_Mutual_Learning_CVPR_2018_paper.pdf>
_ 中实验的重现,已在OSNet 论文 <https://arxiv.org/pdf/1905.00953v6.pdf>
__ (补编 B)中发布详见projects/DML
。 - [2020年4月] 升级至
v1.2.0
。引擎类已变得更加模型无关,以提高扩展性。详见Engine <torchreid/engine/engine.py>
_ 和ImageSoftmaxEngine <torchreid/engine/image/softmax.py>
_ 详情。感谢Dassl.pytorch <https://github.com/KaiyangZhou/Dassl.pytorch>
_。 - [2019年12月] 我们的
OSNet 论文 <https://arxiv.org/pdf/1905.00953v6.pdf>
_ 已更新,附加实验(在补充材料 B 部分)展示了一些在实践中提高 OSNet 性能的有用技术。 - [2019年11月]
ImageDataManager
可以通过设置load_train_targets=True
来从目标数据集中加载训练数据,且可以通过train_loader_t = datamanager.train_loader_t
访问。该功能对域适应研究很有用。
安装
确保已安装 conda <https://www.anaconda.com/distribution/>
_。
.. code-block:: bash
# cd 到你喜欢的目录并克隆此仓库
git clone https://github.com/KaiyangZhou/deep-person-reid.git
# 创建环境
cd deep-person-reid/
conda create --name torchreid python=3.7
conda activate torchreid
# 安装依赖
# 确保 `which python` 和 `which pip` 指向正确路径
pip install -r requirements.txt
# 安装 torch 和 torchvision(选择合适的 cuda 版本以适应机器)
conda install pytorch torchvision cudatoolkit=9.0 -c pytorch
# 安装 torchreid(如果修改源代码,无需重新构建)
python setup.py develop
另一种安装方法是在 docker 容器内运行:
- 构建:
make build-image
- 运行:
make run
快速入门:30 秒到 Torchreid
- 导入
torchreid
.. code-block:: python
import torchreid
2. 加载数据管理器
.. code-block:: python
datamanager = torchreid.data.ImageDataManager(
root="reid-data",
sources="market1501",
targets="market1501",
height=256,
width=128,
batch_size_train=32,
batch_size_test=100,
transforms=["random_flip", "random_crop"]
)
3. 构建模型、优化器和 lr_scheduler
.. code-block:: python
model = torchreid.models.build_model(
name="resnet50",
num_classes=datamanager.num_train_pids,
loss="softmax",
pretrained=True
)
model = model.cuda()
optimizer = torchreid.optim.build_optimizer(
model,
optim="adam",
lr=0.0003
)
scheduler = torchreid.optim.build_lr_scheduler(
optimizer,
lr_scheduler="single_step",
stepsize=20
)
4. 构建引擎
.. code-block:: python
engine = torchreid.engine.ImageSoftmaxEngine(
datamanager,
model,
optimizer=optimizer,
scheduler=scheduler,
label_smooth=True
)
5. 运行训练和测试
.. code-block:: python
engine.run(
save_dir="log/resnet50",
max_epoch=60,
eval_freq=10,
print_freq=10,
test_only=False
)
统一接口
在 "deep-person-reid/scripts/" 文件夹中,我们提供了一个统一的接口来训练和测试模型。详见 "scripts/main.py" 和 "scripts/default_config.py",文件夹 "configs/" 中包含一些预定义配置,您可以使用它们作为起点。
下面我们提供一个例子来训练和测试 OSNet (Zhou et al. ICCV'19) <https://arxiv.org/abs/1905.00953>
_。假设 :code:PATH_TO_DATA
是包含再识别数据集的目录。环境变量 :code:CUDA_VISIBLE_DEVICES
被省略,您需要指定它,如果您有一组 gpu 并且想使用其中的一部分。
传统设置 ^^^^^^^^^^^^^^^^^^^^^
在 Market1501 上训练 OSNet,执行
.. code-block:: bash
python scripts/main.py \
--config-file configs/im_osnet_x1_0_softmax_256x128_amsgrad_cosine.yaml \
--transforms random_flip random_erase \
--root $PATH_TO_DATA
配置文件将 Market1501 设置为默认数据集。如果您想使用 DukeMTMC-reID,执行
.. code-block:: bash
python scripts/main.py \
--config-file configs/im_osnet_x1_0_softmax_256x128_amsgrad_cosine.yaml \
-s dukemtmcreid \
-t dukemtmcreid \
--transforms random_flip random_erase \
--root $PATH_TO_DATA \
data.save_dir log/osnet_x1_0_dukemtmcreid_softmax_cosinelr
代码将自动(下载并)加载 ImageNet 预训练权重。训练完成后,模型将保存为 "log/osnet_x1_0_market1501_softmax_cosinelr/model.pth.tar-250"。在同一文件夹中,您可以找到 tensorboard <https://pytorch.org/docs/stable/tensorboard.html>
_ 文件。要使用 tensorboard 可视化学习曲线,可以在终端中运行: tensorboard --logdir=log/osnet_x1_0_market1501_softmax_cosinelr
并在您的浏览器中访问:http://localhost:6006/
。
在训练结束时会自动进行评估。要使用训练好的模型再次运行测试,执行
.. code-block:: bash
python scripts/main.py \
--config-file configs/im_osnet_x1_0_softmax_256x128_amsgrad_cosine.yaml \
--root $PATH_TO_DATA \
model.load_weights log/osnet_x1_0_market1501_softmax_cosinelr/model.pth.tar-250 \
test.evaluate True
跨域设置 ^^^^^^^^^^^^^^^^^^^^^
假设您想在 DukeMTMC-reID 上训练 OSNet 并测试其在 Market1501 上的性能,可以执行
.. code-block:: bash
python scripts/main.py
--config-file configs/im_osnet_x1_0_softmax_256x128_amsgrad.yaml
-s dukemtmcreid
-t market1501
--transforms random_flip color_jitter
--root $PATH_TO_DATA
这里我们仅测试跨域性能。然而,如果你也想测试源数据集,即DukeMTMC-reID上的性能,你可以设置:-t dukemtmcreid market1501
,这将分别评估模型在这两个数据集上的表现。
不同于同域设置,这里我们用 color_jitter
取代 random_erase
。这可以提高模型在未见过的目标数据集上的泛化性能。
预训练模型可在 Model Zoo <https://kaiyangzhou.github.io/deep-person-reid/MODEL_ZOO.html>
_ 中找到。
数据集
图像行人重识别数据集 ^^^^^^^^^^^^^^^^^^^^^^^
Market1501 <https://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Zheng_Scalable_Person_Re-Identification_ICCV_2015_paper.pdf>
_CUHK03 <https://www.cv-foundation.org/openaccess/content_cvpr_2014/papers/Li_DeepReID_Deep_Filter_2014_CVPR_paper.pdf>
_DukeMTMC-reID <https://arxiv.org/abs/1701.07717>
_MSMT17 <https://arxiv.org/abs/1711.08565>
_VIPeR <http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.331.7285&rep=rep1&type=pdf>
_GRID <http://www.eecs.qmul.ac.uk/~txiang/publications/LoyXiangGong_cvpr_2009.pdf>
_CUHK01 <http://www.ee.cuhk.edu.hk/~xgwang/papers/liZWaccv12.pdf>
_SenseReID <http://openaccess.thecvf.com/content_cvpr_2017/papers/Zhao_Spindle_Net_Person_CVPR_2017_paper.pdf>
_QMUL-iLIDS <http://www.eecs.qmul.ac.uk/~sgg/papers/ZhengGongXiang_BMVC09.pdf>
_PRID <https://pdfs.semanticscholar.org/4c1b/f0592be3e535faf256c95e27982db9b3d3d3.pdf>
_
地理定位数据集 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
University-1652 <https://dl.acm.org/doi/abs/10.1145/3394171.3413896>
_
视频行人重识别数据集 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
MARS <http://www.liangzheng.org/1320.pdf>
_iLIDS-VID <https://www.eecs.qmul.ac.uk/~sgg/papers/WangEtAl_ECCV14.pdf>
_PRID2011 <https://pdfs.semanticscholar.org/4c1b/f0592be3e535faf256c95e27982db9b3d3d3.pdf>
_DukeMTMC-VideoReID <http://openaccess.thecvf.com/content_cvpr_2018/papers/Wu_Exploit_the_Unknown_CVPR_2018_paper.pdf>
_
模型
ImageNet 分类模型 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
ResNet <https://arxiv.org/abs/1512.03385>
_ResNeXt <https://arxiv.org/abs/1611.05431>
_SENet <https://arxiv.org/abs/1709.01507>
_DenseNet <https://arxiv.org/abs/1608.06993>
_Inception-ResNet-V2 <https://arxiv.org/abs/1602.07261>
_Inception-V4 <https://arxiv.org/abs/1602.07261>
_Xception <https://arxiv.org/abs/1610.02357>
_IBN-Net <https://arxiv.org/abs/1807.09441>
_
轻量级模型 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
NASNet <https://arxiv.org/abs/1707.07012>
_MobileNetV2 <https://arxiv.org/abs/1801.04381>
_ShuffleNet <https://arxiv.org/abs/1707.01083>
_ShuffleNetV2 <https://arxiv.org/abs/1807.11164>
_SqueezeNet <https://arxiv.org/abs/1602.07360>
_
ReID 专用模型 ^^^^^^^^^^^^^^^^^^^^^^^^^^
MuDeep <https://arxiv.org/abs/1709.05165>
_ResNet-mid <https://arxiv.org/abs/1711.08106>
_HACNN <https://arxiv.org/abs/1802.08122>
_PCB <https://arxiv.org/abs/1711.09349>
_MLFN <https://arxiv.org/abs/1803.09132>
_OSNet <https://arxiv.org/abs/1905.00953>
_OSNet-AIN <https://arxiv.org/abs/1910.06827>
_
有用链接
OSNet-IBN1-Lite (仅测试代码及精简版 docker 容器) <https://github.com/RodMech/OSNet-IBN1-Lite>
_行人重识别的深度学习:综述和展望 <https://github.com/mangye16/ReID-Survey>
_
引用
如果你在研究中使用了此代码或模型,请引用以下论文:
.. code-block:: bash
@article{torchreid,
title={Torchreid: A Library for Deep Learning Person Re-Identification in Pytorch},
author={Zhou, Kaiyang and Xiang, Tao},
journal={arXiv preprint arXiv:1910.10093},
year={2019}
}
@inproceedings{zhou2019osnet,
title={Omni-Scale Feature Learning for Person Re-Identification},
author={Zhou, Kaiyang and Yang, Yongxin and Cavallaro, Andrea and Xiang, Tao},
booktitle={ICCV},
year={2019}
}
@article{zhou2021osnet,
title={Learning Generalisable Omni-Scale Representations for Person Re-Identification},
author={Zhou, Kaiyang and Yang, Yongxin and Cavallaro, Andrea and Xiang, Tao},
journal={TPAMI},
year={2021}
}