{"id":13444195,"url":"https://github.com/filipradenovic/cnnimageretrieval-pytorch","last_synced_at":"2025-05-15T18:08:41.455Z","repository":{"id":38375596,"uuid":"131194654","full_name":"filipradenovic/cnnimageretrieval-pytorch","owner":"filipradenovic","description":"CNN Image Retrieval in PyTorch: Training and evaluating CNNs for Image Retrieval in PyTorch","archived":false,"fork":false,"pushed_at":"2024-05-13T13:12:43.000Z","size":95,"stargazers_count":1462,"open_issues_count":34,"forks_count":321,"subscribers_count":33,"default_branch":"master","last_synced_at":"2025-04-07T23:08:04.274Z","etag":null,"topics":["cnn","convolutional-neural-networks","image-retrieval","python","pytorch"],"latest_commit_sha":null,"homepage":"http://cmp.felk.cvut.cz/cnnimageretrieval","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/filipradenovic.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-04-26T18:19:44.000Z","updated_at":"2025-04-01T10:15:14.000Z","dependencies_parsed_at":"2025-03-10T19:06:57.833Z","dependency_job_id":"ce6f101f-3788-4f82-ae65-6c1335247f50","html_url":"https://github.com/filipradenovic/cnnimageretrieval-pytorch","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/filipradenovic%2Fcnnimageretrieval-pytorch","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/filipradenovic%2Fcnnimageretrieval-pytorch/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/filipradenovic%2Fcnnimageretrieval-pytorch/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/filipradenovic%2Fcnnimageretrieval-pytorch/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/filipradenovic","download_url":"https://codeload.github.com/filipradenovic/cnnimageretrieval-pytorch/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254394722,"owners_count":22063984,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cnn","convolutional-neural-networks","image-retrieval","python","pytorch"],"created_at":"2024-07-31T03:02:21.565Z","updated_at":"2025-05-15T18:08:41.431Z","avatar_url":"https://github.com/filipradenovic.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"## CNN Image Retrieval in PyTorch: Training and evaluating CNNs for Image Retrieval in PyTorch\n\nThis is a Python toolbox that implements the training and testing of the approach described in our papers:\n\n\n**Fine-tuning CNN Image Retrieval with No Human Annotation**,  \nRadenović F., Tolias G., Chum O., \nTPAMI 2018 [[arXiv](https://arxiv.org/abs/1711.02512)]\n\n**CNN Image Retrieval Learns from BoW: Unsupervised Fine-Tuning with Hard Examples**,  \nRadenović F., Tolias G., Chum O., \nECCV 2016 [[arXiv](http://arxiv.org/abs/1604.02426)]\n\n\n\u003cimg src=\"http://cmp.felk.cvut.cz/cnnimageretrieval/img/cnnimageretrieval_network_medium.png\" width=\\textwidth/\u003e\n\n---\n\n### What is it?\n\nThis code implements:\n\n1. Training (fine-tuning) CNN for image retrieval\n1. Learning supervised whitening, as post-processing, for global image descriptors\n1. Testing CNN image retrieval on Oxford and Paris datasets\n\n---\n\n### Prerequisites\n\nIn order to run this toolbox you will need:\n\n1. Python3 (tested with Python 3.7.0 on Debian 8.1)\n1. PyTorch deep learning framework (tested with version 1.0.0)\n1. All the rest (data + networks) is automatically downloaded with our scripts\n\n---\n\n### Usage\n\nNavigate (```cd```) to the root of the toolbox ```[YOUR_CIRTORCH_ROOT]```. \nYou can install package with `pip3 install .` if you need. \nMake sure to have desired PyTorch and torchvision packages installed.  \n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eTraining\u003c/b\u003e\u003c/summary\u003e\u003cbr/\u003e\n  \n  Example training script is located in ```YOUR_CIRTORCH_ROOT/cirtorch/examples/train.py```\n  ```\n  python3 -m cirtorch.examples.train [-h] [--training-dataset DATASET] [--no-val]\n                  [--test-datasets DATASETS] [--test-whiten DATASET]\n                  [--test-freq N] [--arch ARCH] [--pool POOL]\n                  [--local-whitening] [--regional] [--whitening]\n                  [--not-pretrained] [--loss LOSS] [--loss-margin LM]\n                  [--image-size N] [--neg-num N] [--query-size N]\n                  [--pool-size N] [--gpu-id N] [--workers N] [--epochs N]\n                  [--batch-size N] [--optimizer OPTIMIZER] [--lr LR]\n                  [--momentum M] [--weight-decay W] [--print-freq N]\n                  [--resume FILENAME]\n                  EXPORT_DIR\n  ```\n\n  For detailed explanation of the options run:\n  ```\n  python3 -m cirtorch.examples.train -h\n  ```\n\n  \u003e **Note**: Data and networks used for training and testing are automatically downloaded when using the example script.\n  \n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eTesting\u003c/b\u003e\u003c/summary\u003e\u003cbr/\u003e\n\n  Example testing script is located in ```YOUR_CIRTORCH_ROOT/cirtorch/examples/test.py```\n  ```\n  python3 -m cirtorch.examples.test [-h] (--network-path NETWORK | --network-offtheshelf NETWORK)\n                 [--datasets DATASETS] [--image-size N]\n                 [--multiscale MULTISCALE] [--whitening WHITENING] [--gpu-id N]\n  ```\n\n  For detailed explanation of the options run:\n  ```\n  python3 -m cirtorch.examples.test -h\n  ```\n\n  \u003e **Note**: Data used for testing are automatically downloaded when using the example script.\n\n\u003c/details\u003e\n\n---\n\n###  Papers implementation\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eTraining\u003c/b\u003e\u003c/summary\u003e\u003cbr/\u003e\n\n  For example, to train our best network described in the TPAMI 2018 paper run the following command. \n  After each epoch, the fine-tuned network will be tested on the revisited Oxford and Paris benchmarks:\n  ```\n  python3 -m cirtorch.examples.train YOUR_EXPORT_DIR --gpu-id '0' --training-dataset 'retrieval-SfM-120k' \n              --test-datasets 'roxford5k,rparis6k' --arch 'resnet101' --pool 'gem' --loss 'contrastive' \n              --loss-margin 0.85 --optimizer 'adam' --lr 5e-7 --neg-num 5 --query-size=2000 \n              --pool-size=22000 --batch-size 5 --image-size 362\n  ```\n\n  Networks can be evaluated with learned whitening after each epoch (whitening is estimated at the end of the epoch). To achieve this run the following command. \n  Note that this will significantly slow down the entire training procedure, and you can evaluate networks with learned whitening later on using the example test script.\n\n  ```\n  python3 -m cirtorch.examples.train YOUR_EXPORT_DIR --gpu-id '0' --training-dataset 'retrieval-SfM-120k' \n              --test-datasets 'roxford5k,rparis6k' --test-whiten 'retrieval-SfM-30k' \n              --arch 'resnet101' --pool 'gem' --loss 'contrastive' --loss-margin 0.85 \n              --optimizer 'adam' --lr 5e-7 --neg-num 5 --query-size=2000 --pool-size=22000 \n              --batch-size 5 --image-size 362\n  ```\n\n  \u003e **Note**: Adjusted (lower) learning rate is set to achieve similar performance as with [MatConvNet](https://github.com/filipradenovic/cnnimageretrieval) and [PyTorch-0.3.0](https://github.com/filipradenovic/cnnimageretrieval-pytorch/tree/v1.0) implementation of the training.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eTesting our pretrained networks\u003c/b\u003e\u003c/summary\u003e\u003cbr/\u003e\n\n  Pretrained networks trained using the same parameters as in our TPAMI 2018 paper are provided, with precomputed post-processing whitening step. \n  To evaluate them run:\n  ```\n  python3 -m cirtorch.examples.test --gpu-id '0' --network-path 'retrievalSfM120k-resnet101-gem' \n                  --datasets 'oxford5k,paris6k,roxford5k,rparis6k' \n                  --whitening 'retrieval-SfM-120k'\n                  --multiscale '[1, 1/2**(1/2), 1/2]'\n  ```\n  or\n  ```\n  python3 -m cirtorch.examples.test --gpu-id '0' --network-path 'retrievalSfM120k-vgg16-gem' \n                  --datasets 'oxford5k,paris6k,roxford5k,rparis6k' \n                  --whitening 'retrieval-SfM-120k'\n                  --multiscale '[1, 1/2**(1/2), 1/2]'\n  ```\n  The table below shows the performance comparison of networks trained with this framework and the networks used in the paper which were trained with our [CNN Image Retrieval in MatConvNet](https://github.com/filipradenovic/cnnimageretrieval):\n\n  | Model | Oxford | Paris | ROxf (M) | RPar (M) | ROxf (H) | RPar (H) |\n  |:------|:------:|:------:|:------:|:------:|:------:|:------:|\n  | VGG16-GeM (MatConvNet) | 87.9 | 87.7 | 61.9 | 69.3 | 33.7 | 44.3 |\n  | VGG16-GeM (PyTorch) | 87.3 | 87.8 | 60.9 | 69.3 | 32.9 | 44.2 |\n  | ResNet101-GeM (MatConvNet) | 87.8 | 92.7 | 64.7 | 77.2 | 38.5 | 56.3 |\n  | ResNet101-GeM (PyTorch) | 88.2 | 92.5 | 65.4 | 76.7 | 40.1 | 55.2 |\n  \n  \u003e **Note** (June 2022): We updated download files for [Oxford 5k](https://www.robots.ox.ac.uk/~vgg/data/oxbuildings/) and [Paris 6k](https://www.robots.ox.ac.uk/~vgg/data/parisbuildings/) images to use images with blurred faces as suggested by the original dataset owners. Bear in mind, \"experiments have shown that one can use the face-blurred version for benchmarking image retrieval with negligible loss of accuracy\".\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eTesting your trained networks\u003c/b\u003e\u003c/summary\u003e\u003cbr/\u003e\n\n  To evaluate your trained network using single scale and without learning whitening:\n  ```\n  python3 -m cirtorch.examples.test --gpu-id '0' --network-path YOUR_NETWORK_PATH \n                  --datasets 'oxford5k,paris6k,roxford5k,rparis6k'\n  ```\n\n  To evaluate trained network using multi scale evaluation and with learned whitening as post-processing:\n  ```\n  python3 -m cirtorch.examples.test --gpu-id '0' --network-path YOUR_NETWORK_PATH \n                  --datasets 'oxford5k,paris6k,roxford5k,rparis6k'\n                  --whitening 'retrieval-SfM-120k' \n                  --multiscale '[1, 1/2**(1/2), 1/2]'\n  ```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eTesting off-the-shelf networks\u003c/b\u003e\u003c/summary\u003e\u003cbr/\u003e\n\n  Off-the-shelf networks can be evaluated as well, for example:\n  ```\n  python3 -m cirtorch.examples.test --gpu-id '0' --network-offtheshelf 'resnet101-gem'\n                  --datasets 'oxford5k,paris6k,roxford5k,rparis6k'\n                  --whitening 'retrieval-SfM-120k' \n                  --multiscale '[1, 1/2**(1/2), 1/2]'\n  ```\n  \n\u003c/details\u003e\n\n---\n\n### Networks with projection (FC) layer after global pooling\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eTraining\u003c/b\u003e\u003c/summary\u003e\u003cbr/\u003e\n  \n  An alternative architecture includes a learnable FC (projection) layer after the global pooling. It is important to initialize the parameters of this layer with the result of learned whitening. \n  To train such a setup you should run the following commands (the performance will be evaluated every 5 epochs on `roxford5k` and `rparis6k`):\n  ```\n  python3 -m cirtorch.examples.train YOUR_EXPORT_DIR --gpu-id '0' --training-dataset 'retrieval-SfM-120k' \n              --loss 'triplet' --loss-margin 0.5 --optimizer 'adam' --lr 1e-6 \n              --arch 'resnet50' --pool 'gem' --whitening \n              --neg-num 5 --query-size=2000 --pool-size=20000 \n              --batch-size 5 --image-size 1024 --epochs 100 \n              --test-datasets 'roxford5k,rparis6k' --test-freq 5 \n  ```\n  or\n  ```\n  python3 -m cirtorch.examples.train YOUR_EXPORT_DIR --gpu-id '0' --training-dataset 'retrieval-SfM-120k' \n              --loss 'triplet' --loss-margin 0.5 --optimizer 'adam' --lr 5e-7 \n              --arch 'resnet101' --pool 'gem' --whitening \n              --neg-num 4 --query-size=2000 --pool-size=20000 \n              --batch-size 5 --image-size 1024 --epochs 100 \n              --test-datasets 'roxford5k,rparis6k' --test-freq 5 \n  ```\n  or\n  ```\n  python3 -m cirtorch.examples.train YOUR_EXPORT_DIR --gpu-id '0' --training-dataset 'retrieval-SfM-120k' \n              --loss 'triplet' --loss-margin 0.5 --optimizer 'adam' --lr 5e-7 \n              --arch 'resnet152' --pool 'gem' --whitening \n              --neg-num 3 --query-size=2000 --pool-size=20000 \n              --batch-size 5 --image-size 900 --epochs 100 \n              --test-datasets 'roxford5k,rparis6k' --test-freq 5 \n  ```\n  for `ResNet50`, `ResNet101`, or `ResNet152`, respectively. \n  \n  Implementation details:\n  \n  - The FC layer is initialized with the result of whitening learned in a supervised manner using our training data and off-the-shelf features.\n  - The whitening for this FC layer is precomputed for popular architectures and pooling methods, see [imageretrievalnet.py#L50](https://github.com/filipradenovic/cnnimageretrieval-pytorch/blob/474b1fe61ff0e8a6f076ef58f7334cf33d7a3773/cirtorch/networks/imageretrievalnet.py#L50) for the full list of precomputed FC layers.\n  - When this FC layer is added in the fine-tuning procedure, the performance is highest if the images are with a similar high-resolution at train and test time. \n  - When this FC layer is added, the distribution of pairwise distances changes significantly, so roughly twice larger margin should be used for contrastive loss. In this scenario, triplet loss performs slightly better. \n  - Additional tunning of hyper-parameters can be performed to achieve higher performance or faster training. Note that, in this example, `--neg-num` and `--image-size` hyper-parameters are chosen such that the training can be performed on a single GPU with `16 GB` of memory. \n    \n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eTesting our pretrained networks with projection layer\u003c/b\u003e\u003c/summary\u003e\u003cbr/\u003e\n\n  Pretrained networks with projection layer are provided, trained both on `retrieval-SfM-120k (rSfM120k)` and [`google-landmarks-2018 (gl18)`](https://www.kaggle.com/google/google-landmarks-dataset) train datasets.\n  For this architecture, there is no need to compute whitening as post-processing step (typically the performance boost is insignificant), although one can do that, as well.\n  For example, multi-scale evaluation of ResNet101 with GeM with projection layer trained on `google-landmarks-2018 (gl18)` dataset using high-resolution images and a triplet loss, is performed with the following script:\n  ```\n  python3 -m cirtorch.examples.test_e2e --gpu-id '0' --network 'gl18-tl-resnet101-gem-w' \n              --datasets 'roxford5k,rparis6k' --multiscale '[1, 2**(1/2), 1/2**(1/2)]'\n  ```\n\n  Multi-scale performance of all available pre-trained networks is given in the following table:\n\n  | Model | ROxf (M) | RPar (M) | ROxf (H) | RPar (H) |\n  |:------|:------:|:------:|:------:|:------:|\n  | [rSfM120k-tl-resnet50-gem-w](http://cmp.felk.cvut.cz/cnnimageretrieval/data/networks/retrieval-SfM-120k/rSfM120k-tl-resnet50-gem-w-97bf910.pth)  | 64.7 | 76.3 | 39.0 | 54.9 |\n  | [rSfM120k-tl-resnet101-gem-w](http://cmp.felk.cvut.cz/cnnimageretrieval/data/networks/retrieval-SfM-120k/rSfM120k-tl-resnet101-gem-w-a155e54.pth) | 67.8 | 77.6 | 41.7 | 56.3 |\n  | [rSfM120k-tl-resnet152-gem-w](http://cmp.felk.cvut.cz/cnnimageretrieval/data/networks/retrieval-SfM-120k/rSfM120k-tl-resnet152-gem-w-f39cada.pth) | 68.8 | 78.0 | 41.3 | 57.2 |\n  | [gl18-tl-resnet50-gem-w](http://cmp.felk.cvut.cz/cnnimageretrieval/data/networks/gl18/gl18-tl-resnet50-gem-w-83fdc30.pth)  | 63.6 | 78.0 | 40.9 | 57.5 |\n  | [gl18-tl-resnet101-gem-w](http://cmp.felk.cvut.cz/cnnimageretrieval/data/networks/gl18/gl18-tl-resnet101-gem-w-a4d43db.pth) | 67.3 | 80.6 | 44.3 | 61.5 |\n  | [gl18-tl-resnet152-gem-w](http://cmp.felk.cvut.cz/cnnimageretrieval/data/networks/gl18/gl18-tl-resnet152-gem-w-21278d5.pth) | 68.7 | 79.7 | 44.2 | 60.3 |\n  \n  \u003e **Note** (June 2022): We updated download files for [Oxford 5k](https://www.robots.ox.ac.uk/~vgg/data/oxbuildings/) and [Paris 6k](https://www.robots.ox.ac.uk/~vgg/data/parisbuildings/) images to use images with blurred faces as suggested by the original dataset owners. Bear in mind, \"experiments have shown that one can use the face-blurred version for benchmarking image retrieval with negligible loss of accuracy\".\n  \n\u003c/details\u003e\n\n---\n\n### Related publications\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eTraining (fine-tuning) convolutional neural networks\u003c/b\u003e\u003c/summary\u003e\u003cbr/\u003e\n\n  ```\n  @article{RTC18,\n   title = {Fine-tuning {CNN} Image Retrieval with No Human Annotation},\n   author = {Radenovi{\\'c}, F. and Tolias, G. and Chum, O.}\n   journal = {TPAMI},\n   year = {2018}\n  }\n  ```\n  ```\n  @inproceedings{RTC16,\n   title = {{CNN} Image Retrieval Learns from {BoW}: Unsupervised Fine-Tuning with Hard Examples},\n   author = {Radenovi{\\'c}, F. and Tolias, G. and Chum, O.},\n   booktitle = {ECCV},\n   year = {2016}\n  }\n  ```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003eRevisited benchmarks for Oxford and Paris ('roxford5k' and 'rparis6k')\u003c/b\u003e\u003c/summary\u003e\u003cbr/\u003e\n\n  ```\n  @inproceedings{RITAC18,\n   author = {Radenovi{\\'c}, F. and Iscen, A. and Tolias, G. and Avrithis, Y. and Chum, O.},\n   title = {Revisiting Oxford and Paris: Large-Scale Image Retrieval Benchmarking},\n   booktitle = {CVPR},\n   year = {2018}\n  }\n  ```\n  \n\u003c/details\u003e\n\n---\n\n### Versions\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003emaster (devolopment)\u003c/b\u003e\u003c/summary\u003e\n  \n  #### [master](https://github.com/filipradenovic/cnnimageretrieval-pytorch/tree/master) (development)\n  \n  - Merged pull request [#78](https://github.com/filipradenovic/cnnimageretrieval-pytorch/pull/78) that fixes broken download links\n  - Merged pull request [#56](https://github.com/filipradenovic/cnnimageretrieval-pytorch/pull/56) that adds setup file\n\u003c/details\u003e\n  \n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003ev1.2 (07 Dec 2020)\u003c/b\u003e\u003c/summary\u003e\n  \n  #### [v1.2](https://github.com/filipradenovic/cnnimageretrieval-pytorch/tree/v1.2) (07 Dec 2020)\n  \n  - Added example script for descriptor extraction with different publicly available models\n  - Added the [MIT license](https://github.com/filipradenovic/cnnimageretrieval-pytorch/blob/master/LICENSE)\n  - Added mutli-scale performance on `roxford5k` and `rparis6k` for new pre-trained networks with projection, trained on both `retrieval-SfM-120` and `google-landmarks-2018` train datasets\n  - Added a new example test script without post-processing, for networks that include projection layer\n  - Added few things in train example: GeMmp pooling, triplet loss, small trick to handle really large batches\n  - Added more pre-computed whitening options in imageretrievalnet\n  - Added triplet loss \n  - Added GeM pooling with multiple parameters (one p per channel/dimensionality)\n  - Added script to enable download on Windows 10 as explained in Issue [#39](https://github.com/filipradenovic/cnnimageretrieval-pytorch/issues/39), courtesy of [SongZRui](https://github.com/SongZRui)\n  - Fixed cropping of down-sampled query image\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003ev1.1 (12 Jun 2019)\u003c/b\u003e\u003c/summary\u003e\n  \n  #### [v1.1](https://github.com/filipradenovic/cnnimageretrieval-pytorch/tree/v1.1) (12 Jun 2019)\n  \n  - Migrated code to PyTorch 1.0.0, removed Variable, added torch.no_grad for more speed and less memory at evaluation\n  - Added rigid grid regional pooling that can be combined with any global pooling method (R-MAC, R-SPoC, R-GeM)\n  - Added PowerLaw normalization layer\n  - Added multi-scale testing with any given set of scales, in example test script\n  - Fix related to precision errors of covariance matrix estimation during whitening learning\n  - Fixed minor bugs\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003e\u003cb\u003ev1.0 (09 Jul 2018)\u003c/b\u003e\u003c/summary\u003e\n  \n  #### [v1.0](https://github.com/filipradenovic/cnnimageretrieval-pytorch/tree/v1.0) (09 Jul 2018)\n  \n  - First public version\n  - Compatible with PyTorch 0.3.0\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffilipradenovic%2Fcnnimageretrieval-pytorch","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffilipradenovic%2Fcnnimageretrieval-pytorch","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffilipradenovic%2Fcnnimageretrieval-pytorch/lists"}