A Torchreid é uma biblioteca para a pessoa de aprendizado profundo, escrito em Pytorch e desenvolvido para o nosso projeto ICCV'19, Omni-Scale Feature Learning for Pessoa re-identificação.
Apresenta:
Código: https://github.com/kaiyangzhou/deep-person-reid.
Documentação: https://kaiyangzhou.github.io/deep-person-reid/.
Instruções de instruções: https://kaiyangzhou.github.io/deep-person-reid/user_guide.
Modelo ZOO: https://kaiyangzhou.github.io/deep-person-reid/model_zoo.
Relatório de tecnologia: https://arxiv.org/abs/1910.10093.
Você pode encontrar alguns projetos de pesquisa construídos sobre o Torchreid aqui.
osnet_ain_x0_75 , osnet_ain_x0_5 e osnet_ain_x0_25 . A configuração pré -treinamento segue Pycls.tools/parse_test_res.py .v1.4.0 : Adicionamos o conjunto de dados de pesquisa de pessoa, CuHK-SYSU. Consulte a documentação sobre como baixar o conjunto de dados (ele contém imagens de pessoa cortada).v1.3.6 Adicionado University-1652, um novo conjunto de dados para a localização geográfica de várias saídas com várias vistas (crédito a Zhedong Zheng).v1.3.5 : Agora o código do Cython funciona no Windows (crédito para lablabla).v1.3.3 : corrigido o bug no visrank (causado por não descompactar dsetid ).v1.3.2 : Adicionado _junk_pids à grid e prid . Isso evita o uso de imagens de galeria de roteiros errôneos para treinamento ao definir combineall=True .v1.3.0 : (1) Adicionado dsetid à fonte de dados de 3 tuple existente, resultando em (impath, pid, camid, dsetid) . Essa variável indica o ID do conjunto de dados e é útil ao combinar vários conjuntos de dados para treinamento (como um indicador de conjunto de dados). Por exemplo, ao combinar market1501 e cuhk03 , o primeiro receberá dsetid=0 enquanto este receberá dsetid=1 . (2) Adicionado RandomDatasetSampler . Análogo ao RandomDomainSampler , RandomDatasetSampler amostra um certo número de imagens ( batch_size // num_datasets ) de cada um dos conjuntos de dados especificados (a quantidade é determinada por num_datasets ).v1.2.6 : Adicionado RandomDomainSampler (amostra de câmeras num_cams cada uma com batch_size // num_cams imagens para formar um mini-lote).v1.2.5 : (1) A saída do Dataloader de __getitem__ foi alterada de list para dict . Anteriormente, um elemento, por exemplo, o tensor de imagem, era buscado com imgs=data[0] . Agora deve ser obtido por imgs=data['img'] . Veja esse compromisso para alterações detalhadas. (2) Adicionado k_tfm como uma opção para o carregador de dados da imagem, que permite que o aumento de dados seja aplicado k_tfm vezes independentemente a uma imagem. Se k_tfm > 1 , imgs=data['img'] retornará uma lista com tensores de imagem k_tfm .projects/attribute_recognition/ .v1.2.1 : Adicionado uma API simples para extração de recursos ( torchreid/utils/feature_extractor.py ). Veja a documentação para a instrução.projects/DML .v1.2.0 . A classe do motor foi tornada mais agnóstica para melhorar a extensibilidade. Consulte o motor e o ImagesOftMaxEngine para obter mais detalhes. Crédito para Dassl.pytorch.ImageDataManager pode carregar dados de treinamento dos conjuntos de dados de destino definindo load_train_targets=True , e o carregador de trem pode ser acessado com train_loader_t = datamanager.train_loader_t . Esse recurso é útil para a pesquisa de adaptação de domínio. Verifique se o CONDA está instalado.
# cd to your preferred directory and clone this repo
git clone https://github.com/KaiyangZhou/deep-person-reid.git
# create environment
cd deep-person-reid/
conda create --name torchreid python=3.7
conda activate torchreid
# install dependencies
# make sure `which python` and `which pip` point to the correct path
pip install -r requirements.txt
# install torch and torchvision (select the proper cuda version to suit your machine)
conda install pytorch torchvision cudatoolkit=9.0 -c pytorch
# install torchreid (don't need to re-build it if you modify the source code)
python setup.py developOutra maneira de instalar é executar tudo dentro do Docker Container:
make build-imagemake run torchreid import torchreid 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 Modelo de construção, otimizador e lr_scheduler
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
) engine = torchreid . engine . ImageSoftmaxEngine (
datamanager ,
model ,
optimizer = optimizer ,
scheduler = scheduler ,
label_smooth = True
) engine . run (
save_dir = "log/resnet50" ,
max_epoch = 60 ,
eval_freq = 10 ,
print_freq = 10 ,
test_only = False
)Em "Pessoa profunda-reid/scripts/", fornecemos uma interface unificada para treinar e testar um modelo. Consulte "scripts/main.py" e "scripts/default_config.py" para obter mais detalhes. A pasta "Configs/" contém algumas configurações predefinidas que você pode usar como ponto de partida.
Abaixo, fornecemos um exemplo para treinar e testar osnet (Zhou et al. ICCV'19). Suponha que PATH_TO_DATA seja o diretório que contém conjuntos de dados REID. A variável ambiental CUDA_VISIBLE_DEVICES é omitida, que você precisa especificar se possui um pool de GPUs e deseja usar um conjunto específico deles.
Para treinar Osnet no Market1501, faça
python scripts/main.py
--config-file configs/im_osnet_x1_0_softmax_256x128_amsgrad_cosine.yaml
--transforms random_flip random_erase
--root $PATH_TO_DATAO arquivo de configuração define o mercado1501 como o conjunto de dados padrão. Se você quiser usar dukemtmc-reid, faça
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 O código será automaticamente (baixar e) carregar os pesos pré -terenciados ImageNet. Após o treinamento, o modelo será salvo como "log/osnet_x1_0_market1501_softmax_cosinelr/model.pth.tar-250". Sob a mesma pasta, você pode encontrar o arquivo Tensorboard. Para visualizar as curvas de aprendizado usando o Tensorboard, você pode executar tensorboard --logdir=log/osnet_x1_0_market1501_softmax_cosinelr no terminal e visite http://localhost:6006/ no seu navegador da web.
A avaliação é realizada automaticamente no final do treinamento. Para executar o teste novamente usando o modelo treinado, faça
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 TrueSuponha que você queira treinar Osnet no Dukemtmc-Reid e testar seu desempenho no Market1501, você pode fazer
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 Aqui, testamos apenas o desempenho do domínio cruzado. No entanto, se você também deseja testar o desempenho no conjunto de dados de origem, ou seja, Dukemtmc -Reid, você pode definir -t dukemtmcreid market1501 , que avaliará o modelo nos dois conjuntos de dados separadamente.
Diferente da configuração do mesmo domínio, aqui substituímos random_erase por color_jitter . Isso pode melhorar o desempenho da generalização no conjunto de dados de destino invisível.
Modelos pré -treinados estão disponíveis no zoológico do modelo.
Se você usar este código ou os modelos em sua pesquisa, dê crédito aos seguintes trabalhos:
@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}
}