Il s'agit d'une boîte à outils Python qui met en œuvre la formation et les tests de l'approche décrite dans nos articles:
Retalie d'image CNN à réglage fin sans annotation humaine ,
Radenović F., Tolias G., Chum O., Tpami 2018 [Arxiv]
CNN Image Retrieval apprend de l'arc: un réglage fin non supervisé avec des exemples difficiles ,
Radenović F., Tolias G., Chum O., ECCV 2016 [Arxiv]
Ce code implémente:
Pour exécuter cette boîte à outils, vous aurez besoin:
Naviguez ( cd ) vers la racine de la boîte à outils [YOUR_CIRTORCH_ROOT] . Vous pouvez installer le package avec pip3 install . Si vous en avez besoin. Assurez-vous que les packages Pytorch et TorchVision souhaités sont installés.
Exemple de script de formation est situé dans YOUR_CIRTORCH_ROOT/cirtorch/examples/train.py
python3 -m cirtorch.examples.train [-h] [--training-dataset DATASET] [--no-val]
[--test-datasets DATASETS] [--test-whiten DATASET]
[--test-freq N] [--arch ARCH] [--pool POOL]
[--local-whitening] [--regional] [--whitening]
[--not-pretrained] [--loss LOSS] [--loss-margin LM]
[--image-size N] [--neg-num N] [--query-size N]
[--pool-size N] [--gpu-id N] [--workers N] [--epochs N]
[--batch-size N] [--optimizer OPTIMIZER] [--lr LR]
[--momentum M] [--weight-decay W] [--print-freq N]
[--resume FILENAME]
EXPORT_DIR
Pour une explication détaillée des options exécutées:
python3 -m cirtorch.examples.train -h
Remarque : les données et les réseaux utilisés pour la formation et les tests sont automatiquement téléchargés lors de l'utilisation de l'exemple de script.
Exemple de script de test est situé dans YOUR_CIRTORCH_ROOT/cirtorch/examples/test.py
python3 -m cirtorch.examples.test [-h] (--network-path NETWORK | --network-offtheshelf NETWORK)
[--datasets DATASETS] [--image-size N]
[--multiscale MULTISCALE] [--whitening WHITENING] [--gpu-id N]
Pour une explication détaillée des options exécutées:
python3 -m cirtorch.examples.test -h
Remarque : les données utilisées pour les tests sont automatiquement téléchargées lors de l'utilisation de l'exemple de script.
Par exemple, pour former notre meilleur réseau décrit dans le papier TPAMI 2018, exécutez la commande suivante. Après chaque époque, le réseau affiné sera testé sur les références Revisited Oxford et Paris:
python3 -m cirtorch.examples.train YOUR_EXPORT_DIR --gpu-id '0' --training-dataset 'retrieval-SfM-120k'
--test-datasets 'roxford5k,rparis6k' --arch 'resnet101' --pool 'gem' --loss 'contrastive'
--loss-margin 0.85 --optimizer 'adam' --lr 5e-7 --neg-num 5 --query-size=2000
--pool-size=22000 --batch-size 5 --image-size 362
Les réseaux peuvent être évalués avec un blanchiment appris après chaque époque (le blanchiment est estimé à la fin de l'époque). Pour y parvenir, exécutez la commande suivante. Notez que cela ralentira considérablement toute la procédure de formation, et vous pouvez évaluer les réseaux avec un blanchiment appris plus tard en utilisant l'exemple de script de test.
python3 -m cirtorch.examples.train YOUR_EXPORT_DIR --gpu-id '0' --training-dataset 'retrieval-SfM-120k'
--test-datasets 'roxford5k,rparis6k' --test-whiten 'retrieval-SfM-30k'
--arch 'resnet101' --pool 'gem' --loss 'contrastive' --loss-margin 0.85
--optimizer 'adam' --lr 5e-7 --neg-num 5 --query-size=2000 --pool-size=22000
--batch-size 5 --image-size 362
Remarque : Le taux d'apprentissage ajusté (inférieur) est défini pour obtenir des performances similaires à celles de MatConVnet et Pytorch-0.3.0 de la mise en œuvre de la formation.
Des réseaux pré-entraînés formés en utilisant les mêmes paramètres que dans notre article TPAMI 2018 sont fournis, avec une étape de blanchiment post-traitement précompattée. Pour les évaluer, exécutez:
python3 -m cirtorch.examples.test --gpu-id '0' --network-path 'retrievalSfM120k-resnet101-gem'
--datasets 'oxford5k,paris6k,roxford5k,rparis6k'
--whitening 'retrieval-SfM-120k'
--multiscale '[1, 1/2**(1/2), 1/2]'
ou
python3 -m cirtorch.examples.test --gpu-id '0' --network-path 'retrievalSfM120k-vgg16-gem'
--datasets 'oxford5k,paris6k,roxford5k,rparis6k'
--whitening 'retrieval-SfM-120k'
--multiscale '[1, 1/2**(1/2), 1/2]'
Le tableau ci-dessous montre la comparaison des performances des réseaux formés avec ce cadre et les réseaux utilisés dans le papier qui ont été formés avec notre récupération d'image CNN dans MatConVnet:
| Modèle | Oxford | Paris | Roxf (m) | RPAR (M) | Roxf (h) | RPAR (H) |
|---|---|---|---|---|---|---|
| VGG16-GEM (matConvnet) | 87.9 | 87.7 | 61.9 | 69.3 | 33.7 | 44.3 |
| VGG16-GEM (Pytorch) | 87.3 | 87.8 | 60.9 | 69.3 | 32.9 | 44.2 |
| Resnet101-gem (matConvnet) | 87.8 | 92.7 | 64.7 | 77.2 | 38.5 | 56.3 |
| RESNET101-GEM (Pytorch) | 88.2 | 92.5 | 65.4 | 76.7 | 40.1 | 55.2 |
Remarque (juin 2022): Nous avons mis à jour des fichiers de téléchargement pour les images d'Oxford 5K et Paris 6K pour utiliser des images avec des visages floues comme suggéré par les propriétaires de jeux de données originaux. Gardez à l'esprit que "les expériences ont montré que l'on peut utiliser la version brouillée contre le visage pour l'analyse comparative de la récupération avec une perte de précision négligeable".
Pour évaluer votre réseau formé à l'aide d'une seule échelle et sans apprentissage du blanchiment:
python3 -m cirtorch.examples.test --gpu-id '0' --network-path YOUR_NETWORK_PATH
--datasets 'oxford5k,paris6k,roxford5k,rparis6k'
Pour évaluer le réseau formé en utilisant l'évaluation multi-échelles et avec le blanchiment appris comme post-traitement:
python3 -m cirtorch.examples.test --gpu-id '0' --network-path YOUR_NETWORK_PATH
--datasets 'oxford5k,paris6k,roxford5k,rparis6k'
--whitening 'retrieval-SfM-120k'
--multiscale '[1, 1/2**(1/2), 1/2]'
Les réseaux standard peuvent également être évalués, par exemple:
python3 -m cirtorch.examples.test --gpu-id '0' --network-offtheshelf 'resnet101-gem'
--datasets 'oxford5k,paris6k,roxford5k,rparis6k'
--whitening 'retrieval-SfM-120k'
--multiscale '[1, 1/2**(1/2), 1/2]'
Une architecture alternative comprend une couche FC (projection) apprenable après la mise en commun mondiale. Il est important d'initialiser les paramètres de cette couche avec le résultat d'un blanchiment appris. Pour former une telle configuration, vous devez exécuter les commandes suivantes (les performances seront évaluées toutes les 5 époques sur roxford5k et rparis6k ):
python3 -m cirtorch.examples.train YOUR_EXPORT_DIR --gpu-id '0' --training-dataset 'retrieval-SfM-120k'
--loss 'triplet' --loss-margin 0.5 --optimizer 'adam' --lr 1e-6
--arch 'resnet50' --pool 'gem' --whitening
--neg-num 5 --query-size=2000 --pool-size=20000
--batch-size 5 --image-size 1024 --epochs 100
--test-datasets 'roxford5k,rparis6k' --test-freq 5
ou
python3 -m cirtorch.examples.train YOUR_EXPORT_DIR --gpu-id '0' --training-dataset 'retrieval-SfM-120k'
--loss 'triplet' --loss-margin 0.5 --optimizer 'adam' --lr 5e-7
--arch 'resnet101' --pool 'gem' --whitening
--neg-num 4 --query-size=2000 --pool-size=20000
--batch-size 5 --image-size 1024 --epochs 100
--test-datasets 'roxford5k,rparis6k' --test-freq 5
ou
python3 -m cirtorch.examples.train YOUR_EXPORT_DIR --gpu-id '0' --training-dataset 'retrieval-SfM-120k'
--loss 'triplet' --loss-margin 0.5 --optimizer 'adam' --lr 5e-7
--arch 'resnet152' --pool 'gem' --whitening
--neg-num 3 --query-size=2000 --pool-size=20000
--batch-size 5 --image-size 900 --epochs 100
--test-datasets 'roxford5k,rparis6k' --test-freq 5
pour ResNet50 , ResNet101 ou ResNet152 , respectivement.
Détails de la mise en œuvre:
--neg-num et --image-size sont choisis de telle sorte que la formation peut être effectuée sur un seul GPU avec 16 GB de mémoire. Des réseaux pré-entraînés avec couche de projection sont fournis, formés à la fois sur retrieval-SfM-120k (rSfM120k) et les ensembles de données de train google-landmarks-2018 (gl18) . Pour cette architecture, il n'est pas nécessaire de calculer le blanchiment comme étape post-traitement (généralement le boost de performances est insignifiant), bien que l'on puisse également le faire. Par exemple, l'évaluation à plusieurs échelles de RESNET101 avec GEM avec une couche de projection formée sur google-landmarks-2018 (gl18) Ensemble de données à l'aide d'images haute résolution et une perte de triplet, est effectuée avec le script suivant:
python3 -m cirtorch.examples.test_e2e --gpu-id '0' --network 'gl18-tl-resnet101-gem-w'
--datasets 'roxford5k,rparis6k' --multiscale '[1, 2**(1/2), 1/2**(1/2)]'
Les performances à plusieurs échelles de tous les réseaux pré-formés disponibles sont donnés dans le tableau suivant:
| Modèle | Roxf (m) | RPAR (M) | Roxf (h) | RPAR (H) |
|---|---|---|---|---|
| RSFM120K-TL-RESNET50-GEM-W | 64.7 | 76.3 | 39.0 | 54.9 |
| RSFM120K-TL-RESNET101-GEM-W | 67.8 | 77.6 | 41.7 | 56.3 |
| RSFM120K-TL-RESNET152-GEM-W | 68.8 | 78.0 | 41.3 | 57.2 |
| GL18-TL-RESNET50-GEM-W | 63.6 | 78.0 | 40.9 | 57.5 |
| GL18-TL-RESNET101-GEM-W | 67.3 | 80.6 | 44.3 | 61.5 |
| GL18-TL-RESNET152-GEM-W | 68.7 | 79.7 | 44.2 | 60.3 |
Remarque (juin 2022): Nous avons mis à jour des fichiers de téléchargement pour les images d'Oxford 5K et Paris 6K pour utiliser des images avec des visages floues comme suggéré par les propriétaires de jeux de données originaux. Gardez à l'esprit que "les expériences ont montré que l'on peut utiliser la version brouillée contre le visage pour l'analyse comparative de la récupération avec une perte de précision négligeable".
@article{RTC18,
title = {Fine-tuning {CNN} Image Retrieval with No Human Annotation},
author = {Radenovi{'c}, F. and Tolias, G. and Chum, O.}
journal = {TPAMI},
year = {2018}
}
@inproceedings{RTC16,
title = {{CNN} Image Retrieval Learns from {BoW}: Unsupervised Fine-Tuning with Hard Examples},
author = {Radenovi{'c}, F. and Tolias, G. and Chum, O.},
booktitle = {ECCV},
year = {2016}
}
@inproceedings{RITAC18,
author = {Radenovi{'c}, F. and Iscen, A. and Tolias, G. and Avrithis, Y. and Chum, O.},
title = {Revisiting Oxford and Paris: Large-Scale Image Retrieval Benchmarking},
booktitle = {CVPR},
year = {2018}
}
roxford5k et rparis6k pour les nouveaux réseaux pré-formés avec projection, formé à la fois sur des ensembles de données de train retrieval-SfM-120 et google-landmarks-2018