├── .gitignore ├── H1to3p.xml ├── LICENSE ├── README.md ├── beblid_hpatches.ipynb ├── demo.ipynb ├── demo.py ├── expected-result.png ├── graf1.png └── graf3.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /H1to3p.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 3 5 | 3 6 |
d
7 | 8 | 7.6285898e-01 -2.9922929e-01 2.2567123e+02 9 | 3.3443473e-01 1.0143901e+00 -7.6999973e+01 10 | 3.4663091e-04 -1.4364524e-05 1.0000000e+00
11 |
12 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Iago Suárez 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # beblid-opencv-demo 2 | ## How to improve a 14% your image matching with only one line of code? BEBLID is the key! 3 | 4 | [BEBLID](https://docs.opencv.org/4.5.1/d7/d99/classcv_1_1xfeatures2d_1_1BEBLID.html) is 5 | an efficient binary descriptor learned with boosting. It is able to describe keypoints 6 | from any detector just by changing the scale_factor parameter. In several benchmarks it 7 | has proved to largely improve other binary descriptors like ORB or BRISK with the same 8 | efficiency. BEBLID describes using the difference of mean gray values in different 9 | regions of the image around the KeyPoint, the descriptor is specifically optimized for 10 | image matching and patch retrieval addressing the asymmetries of these problems. 11 | 12 | This repo contains in [`demo.ipynb`](demo.ipynb) a python notebook example that shows you how well it works compared with ORB, 13 | since both have the same interface, this improvement takes only 1 line of code! 14 | 15 | ## Install 16 | 17 | If you want to run the python notebook in your Ubuntu 18.04, follow these instructions: 18 | 19 | ``` 20 | sudo apt-get install python3 python3-pip python3-venv 21 | python3 -m venv venv 22 | source venv/bin/activate 23 | python3 -m pip install --upgrade pip 24 | pip3 install notebook matplotlib 25 | ``` 26 | 27 | ## Running 28 | Now to run the notebook: 29 | ``` 30 | jupyter notebook Demo.ipynb 31 | ``` 32 | 33 | If all the cells are correctly executed you should see a result like this: 34 | 35 | ![Expected Result](expected-result.png) 36 | 37 | ## References 38 | 39 | If you find this repository useful please cite [our paper](https://raw.githubusercontent.com/iago-suarez/BEBLID/master/BEBLID_Boosted_Efficient_Binary_Local_Image_Descriptor.pdf): 40 | 41 | ```bibtex 42 | @article{SUAREZ2020, 43 | title = "BEBLID: Boosted Efficient Binary Local Image Descriptor", 44 | journal = "Pattern Recognition Letters", 45 | year = "2020", 46 | issn = "0167-8655", 47 | doi = "https://doi.org/10.1016/j.patrec.2020.04.005", 48 | url = "http://www.sciencedirect.com/science/article/pii/S0167865520301252", 49 | author = "Iago Suárez and Ghesn Sfeir and José M. Buenaposada and Luis Baumela", 50 | keywords = "Local image descriptors, Binary descriptors, Real-time, Efficient matching, Boosting", 51 | abstract = "Efficient matching of local image features is a fundamental task in many computer vision applications. However, the real-time performance of top matching algorithms is compromised in computationally limited devices, such as mobile phones or drones, due to the simplicity of their hardware and their finite energy supply. In this paper we introduce BEBLID, an efficient learned binary image descriptor. It improves our previous real-valued descriptor, BELID, making it both more efficient for matching and more accurate. To this end we use AdaBoost with an improved weak-learner training scheme that produces better local descriptions. Further, we binarize our descriptor by forcing all weak-learners to have the same weight in the strong learner combination and train it in an unbalanced data set to address the asymmetries arising in matching and retrieval tasks. In our experiments BEBLID achieves an accuracy close to SIFT and better computational efficiency than ORB, the fastest algorithm in the literature." 52 | } 53 | ``` 54 | 55 | More details in [the original repo](https://github.com/iago-suarez/BEBLID). -------------------------------------------------------------------------------- /beblid_hpatches.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "id": "AxrWqwTIkRQN" 7 | }, 8 | "source": [ 9 | "![](https://camo.githubusercontent.com/4ed246eb4c5a73d3c02c1b094c1274219d40f68a9cfb6010e6f4552769e4689b/68747470733a2f2f68706174636865732e6769746875622e696f2f6173736574732f68706174636865732d6c6f676f2e706e67)\n", 10 | "# Executing BEBLID in Hpatches\n", 11 | "\n", 12 | "\n", 13 | "The following Python Notebook shows how to evaluate a local descriptor in [HPatches dataset](https://hpatches.github.io). We prove it for [BEBLID](https://docs.opencv.org/4.x/d7/d99/classcv_1_1xfeatures2d_1_1BEBLID.html), but the same can be done for [TEBLID](https://docs.opencv.org/4.x/dd/dc1/classcv_1_1xfeatures2d_1_1TEBLID.html) (which is a improved version of BEBLID), [HashSIFT](https://github.com/iago-suarez/efficient-descriptors), [SOSNet](https://github.com/scape-research/SOSNet) or any other.\n", 14 | "\n", 15 | "![](https://github.com/hpatches/hpatches-dataset/blob/master/img/images.png?raw=true)" 16 | ] 17 | }, 18 | { 19 | "cell_type": "code", 20 | "execution_count": null, 21 | "metadata": { 22 | "colab": { 23 | "base_uri": "https://localhost:8080/" 24 | }, 25 | "id": "vbseTbHdkNEM", 26 | "outputId": "7ecd5f5a-3a57-4bc5-bdcc-aa57cdc6fdc8" 27 | }, 28 | "outputs": [ 29 | { 30 | "output_type": "stream", 31 | "name": "stdout", 32 | "text": [ 33 | "Cloning into 'hpatches'...\n", 34 | "remote: Enumerating objects: 1672, done.\u001b[K\n", 35 | "remote: Counting objects: 100% (160/160), done.\u001b[K\n", 36 | "remote: Compressing objects: 100% (32/32), done.\u001b[K\n", 37 | "remote: Total 1672 (delta 132), reused 155 (delta 128), pack-reused 1512\u001b[K\n", 38 | "Receiving objects: 100% (1672/1672), 296.72 MiB | 19.74 MiB/s, done.\n", 39 | "Resolving deltas: 100% (986/986), done.\n", 40 | "Checking out files: 100% (232/232), done.\n" 41 | ] 42 | } 43 | ], 44 | "source": [ 45 | "# Download the benchmark repository\n", 46 | "!git clone https://github.com/iago-suarez/hpatches-benchmark.git -b no-libupm hpatches" 47 | ] 48 | }, 49 | { 50 | "cell_type": "code", 51 | "execution_count": null, 52 | "metadata": { 53 | "colab": { 54 | "base_uri": "https://localhost:8080/" 55 | }, 56 | "id": "0-RWqW20l1dP", 57 | "outputId": "f6819fd7-faa7-4845-86a5-cbfdfddec533" 58 | }, 59 | "outputs": [ 60 | { 61 | "output_type": "stream", 62 | "name": "stdout", 63 | "text": [ 64 | "\n", 65 | ">> Please wait, downloading the HPatches patches dataset ~4.2G\n", 66 | "\n", 67 | "--2022-12-13 21:10:01-- http://icvl.ee.ic.ac.uk/vbalnt/hpatches/hpatches-release.tar.gz\n", 68 | "Resolving icvl.ee.ic.ac.uk (icvl.ee.ic.ac.uk)... 155.198.116.158\n", 69 | "Connecting to icvl.ee.ic.ac.uk (icvl.ee.ic.ac.uk)|155.198.116.158|:80... connected.\n", 70 | "HTTP request sent, awaiting response... 200 OK\n", 71 | "Length: 4467627904 (4.2G) [application/x-gzip]\n", 72 | "Saving to: ‘./data/hpatches-release.tar.gz’\n", 73 | "\n", 74 | "./data/hpatches-rel 100%[===================>] 4.16G 30.3MB/s in 2m 22s \n", 75 | "\n", 76 | "2022-12-13 21:12:23 (30.0 MB/s) - ‘./data/hpatches-release.tar.gz’ saved [4467627904/4467627904]\n", 77 | "\n", 78 | ">> Please wait, extracting the HPatches patches dataset ~4.2G\n", 79 | ">> Done!\n" 80 | ] 81 | } 82 | ], 83 | "source": [ 84 | "# Donwload the benchmark content\n", 85 | "!cd hpatches && sh download.sh hpatches && cd .." 86 | ] 87 | }, 88 | { 89 | "cell_type": "code", 90 | "execution_count": null, 91 | "metadata": { 92 | "colab": { 93 | "base_uri": "https://localhost:8080/" 94 | }, 95 | "id": "7uaiAwualRY8", 96 | "outputId": "fea8bb87-1b70-4b1f-f5de-1ddb31e4e6f4" 97 | }, 98 | "outputs": [ 99 | { 100 | "output_type": "stream", 101 | "name": "stdout", 102 | "text": [ 103 | "Reading package lists... Done\n", 104 | "Building dependency tree \n", 105 | "Reading state information... Done\n", 106 | "The following package was automatically installed and is no longer required:\n", 107 | " libnvidia-common-460\n", 108 | "Use 'sudo apt autoremove' to remove it.\n", 109 | "The following additional packages will be installed:\n", 110 | " cm-super-minimal fonts-droid-fallback fonts-lato fonts-lmodern\n", 111 | " fonts-noto-mono fonts-texgyre ghostscript gsfonts javascript-common\n", 112 | " libcupsfilters1 libcupsimage2 libgs9 libgs9-common libijs-0.35 libjbig2dec0\n", 113 | " libjs-jquery libkpathsea6 libpotrace0 libptexenc1 libruby2.5 libsynctex1\n", 114 | " libtexlua52 libtexluajit2 libzzip-0-13 lmodern pfb2t1c2pfb poppler-data\n", 115 | " preview-latex-style rake ruby ruby-did-you-mean ruby-minitest\n", 116 | " ruby-net-telnet ruby-power-assert ruby-test-unit ruby2.5\n", 117 | " rubygems-integration t1utils tex-common tex-gyre texlive-base\n", 118 | " texlive-binaries texlive-latex-base texlive-latex-recommended\n", 119 | " texlive-pictures texlive-plain-generic tipa\n", 120 | "Suggested packages:\n", 121 | " fonts-noto ghostscript-x apache2 | lighttpd | httpd poppler-utils\n", 122 | " fonts-japanese-mincho | fonts-ipafont-mincho fonts-japanese-gothic\n", 123 | " | fonts-ipafont-gothic fonts-arphic-ukai fonts-arphic-uming fonts-nanum ri\n", 124 | " ruby-dev bundler debhelper perl-tk xpdf-reader | pdf-viewer\n", 125 | " texlive-fonts-recommended-doc texlive-latex-base-doc python-pygments\n", 126 | " icc-profiles libfile-which-perl libspreadsheet-parseexcel-perl\n", 127 | " texlive-latex-extra-doc texlive-latex-recommended-doc texlive-pstricks\n", 128 | " dot2tex prerex ruby-tcltk | libtcltk-ruby texlive-pictures-doc vprerex\n", 129 | "The following NEW packages will be installed:\n", 130 | " cm-super cm-super-minimal dvipng fonts-droid-fallback fonts-lato\n", 131 | " fonts-lmodern fonts-noto-mono fonts-texgyre ghostscript gsfonts\n", 132 | " javascript-common libcupsfilters1 libcupsimage2 libgs9 libgs9-common\n", 133 | " libijs-0.35 libjbig2dec0 libjs-jquery libkpathsea6 libpotrace0 libptexenc1\n", 134 | " libruby2.5 libsynctex1 libtexlua52 libtexluajit2 libzzip-0-13 lmodern\n", 135 | " pfb2t1c2pfb poppler-data preview-latex-style rake ruby ruby-did-you-mean\n", 136 | " ruby-minitest ruby-net-telnet ruby-power-assert ruby-test-unit ruby2.5\n", 137 | " rubygems-integration t1utils tex-common tex-gyre texlive-base\n", 138 | " texlive-binaries texlive-fonts-recommended texlive-latex-base\n", 139 | " texlive-latex-extra texlive-latex-recommended texlive-pictures\n", 140 | " texlive-plain-generic tipa\n", 141 | "0 upgraded, 51 newly installed, 0 to remove and 20 not upgraded.\n", 142 | "Need to get 163 MB of archives.\n", 143 | "After this operation, 503 MB of additional disk space will be used.\n", 144 | "Get:1 http://archive.ubuntu.com/ubuntu bionic/main amd64 fonts-droid-fallback all 1:6.0.1r16-1.1 [1,805 kB]\n", 145 | "Get:2 http://archive.ubuntu.com/ubuntu bionic/main amd64 fonts-lato all 2.0-2 [2,698 kB]\n", 146 | "Get:3 http://archive.ubuntu.com/ubuntu bionic/main amd64 poppler-data all 0.4.8-2 [1,479 kB]\n", 147 | "Get:4 http://archive.ubuntu.com/ubuntu bionic/main amd64 tex-common all 6.09 [33.0 kB]\n", 148 | "Get:5 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libkpathsea6 amd64 2017.20170613.44572-8ubuntu0.1 [54.9 kB]\n", 149 | "Get:6 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libptexenc1 amd64 2017.20170613.44572-8ubuntu0.1 [34.5 kB]\n", 150 | "Get:7 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libsynctex1 amd64 2017.20170613.44572-8ubuntu0.1 [41.4 kB]\n", 151 | "Get:8 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libtexlua52 amd64 2017.20170613.44572-8ubuntu0.1 [91.2 kB]\n", 152 | "Get:9 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libtexluajit2 amd64 2017.20170613.44572-8ubuntu0.1 [230 kB]\n", 153 | "Get:10 http://archive.ubuntu.com/ubuntu bionic/main amd64 t1utils amd64 1.41-2 [56.0 kB]\n", 154 | "Get:11 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libcupsimage2 amd64 2.2.7-1ubuntu2.9 [18.6 kB]\n", 155 | "Get:12 http://archive.ubuntu.com/ubuntu bionic/main amd64 libijs-0.35 amd64 0.35-13 [15.5 kB]\n", 156 | "Get:13 http://archive.ubuntu.com/ubuntu bionic/main amd64 libjbig2dec0 amd64 0.13-6 [55.9 kB]\n", 157 | "Get:14 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libgs9-common all 9.26~dfsg+0-0ubuntu0.18.04.17 [5,092 kB]\n", 158 | "Get:15 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libgs9 amd64 9.26~dfsg+0-0ubuntu0.18.04.17 [2,267 kB]\n", 159 | "Get:16 http://archive.ubuntu.com/ubuntu bionic/main amd64 libpotrace0 amd64 1.14-2 [17.4 kB]\n", 160 | "Get:17 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libzzip-0-13 amd64 0.13.62-3.1ubuntu0.18.04.1 [26.0 kB]\n", 161 | "Get:18 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 texlive-binaries amd64 2017.20170613.44572-8ubuntu0.1 [8,179 kB]\n", 162 | "Get:19 http://archive.ubuntu.com/ubuntu bionic/main amd64 texlive-base all 2017.20180305-1 [18.7 MB]\n", 163 | "Get:20 http://archive.ubuntu.com/ubuntu bionic/main amd64 fonts-lmodern all 2.004.5-3 [4,551 kB]\n", 164 | "Get:21 http://archive.ubuntu.com/ubuntu bionic/main amd64 texlive-latex-base all 2017.20180305-1 [951 kB]\n", 165 | "Get:22 http://archive.ubuntu.com/ubuntu bionic/main amd64 texlive-latex-recommended all 2017.20180305-1 [14.9 MB]\n", 166 | "Get:23 http://archive.ubuntu.com/ubuntu bionic/universe amd64 cm-super-minimal all 0.3.4-11 [5,810 kB]\n", 167 | "Get:24 http://archive.ubuntu.com/ubuntu bionic/universe amd64 pfb2t1c2pfb amd64 0.3-11 [9,342 B]\n", 168 | "Get:25 http://archive.ubuntu.com/ubuntu bionic/universe amd64 cm-super all 0.3.4-11 [18.7 MB]\n", 169 | "Get:26 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 ghostscript amd64 9.26~dfsg+0-0ubuntu0.18.04.17 [51.3 kB]\n", 170 | "Get:27 http://archive.ubuntu.com/ubuntu bionic/universe amd64 dvipng amd64 1.15-1 [78.2 kB]\n", 171 | "Get:28 http://archive.ubuntu.com/ubuntu bionic/main amd64 fonts-noto-mono all 20171026-2 [75.5 kB]\n", 172 | "Get:29 http://archive.ubuntu.com/ubuntu bionic/universe amd64 fonts-texgyre all 20160520-1 [8,761 kB]\n", 173 | "Get:30 http://archive.ubuntu.com/ubuntu bionic/main amd64 gsfonts all 1:8.11+urwcyr1.0.7~pre44-4.4 [3,120 kB]\n", 174 | "Get:31 http://archive.ubuntu.com/ubuntu bionic/main amd64 javascript-common all 11 [6,066 B]\n", 175 | "Get:32 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libcupsfilters1 amd64 1.20.2-0ubuntu3.1 [108 kB]\n", 176 | "Get:33 http://archive.ubuntu.com/ubuntu bionic/main amd64 libjs-jquery all 3.2.1-1 [152 kB]\n", 177 | "Get:34 http://archive.ubuntu.com/ubuntu bionic/main amd64 rubygems-integration all 1.11 [4,994 B]\n", 178 | "Get:35 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 ruby2.5 amd64 2.5.1-1ubuntu1.12 [48.6 kB]\n", 179 | "Get:36 http://archive.ubuntu.com/ubuntu bionic/main amd64 ruby amd64 1:2.5.1 [5,712 B]\n", 180 | "Get:37 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 rake all 12.3.1-1ubuntu0.1 [44.9 kB]\n", 181 | "Get:38 http://archive.ubuntu.com/ubuntu bionic/main amd64 ruby-did-you-mean all 1.2.0-2 [9,700 B]\n", 182 | "Get:39 http://archive.ubuntu.com/ubuntu bionic/main amd64 ruby-minitest all 5.10.3-1 [38.6 kB]\n", 183 | "Get:40 http://archive.ubuntu.com/ubuntu bionic/main amd64 ruby-net-telnet all 0.1.1-2 [12.6 kB]\n", 184 | "Get:41 http://archive.ubuntu.com/ubuntu bionic/main amd64 ruby-power-assert all 0.3.0-1 [7,952 B]\n", 185 | "Get:42 http://archive.ubuntu.com/ubuntu bionic/main amd64 ruby-test-unit all 3.2.5-1 [61.1 kB]\n", 186 | "Get:43 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 libruby2.5 amd64 2.5.1-1ubuntu1.12 [3,073 kB]\n", 187 | "Get:44 http://archive.ubuntu.com/ubuntu bionic/main amd64 lmodern all 2.004.5-3 [9,631 kB]\n", 188 | "Get:45 http://archive.ubuntu.com/ubuntu bionic/main amd64 preview-latex-style all 11.91-1ubuntu1 [185 kB]\n", 189 | "Get:46 http://archive.ubuntu.com/ubuntu bionic/universe amd64 tex-gyre all 20160520-1 [4,998 kB]\n", 190 | "Get:47 http://archive.ubuntu.com/ubuntu bionic/universe amd64 texlive-fonts-recommended all 2017.20180305-1 [5,262 kB]\n", 191 | "Get:48 http://archive.ubuntu.com/ubuntu bionic/universe amd64 texlive-pictures all 2017.20180305-1 [4,026 kB]\n", 192 | "Get:49 http://archive.ubuntu.com/ubuntu bionic/universe amd64 texlive-latex-extra all 2017.20180305-2 [10.6 MB]\n", 193 | "Get:50 http://archive.ubuntu.com/ubuntu bionic/universe amd64 texlive-plain-generic all 2017.20180305-2 [23.6 MB]\n", 194 | "Get:51 http://archive.ubuntu.com/ubuntu bionic/universe amd64 tipa all 2:1.3-20 [2,978 kB]\n", 195 | "Fetched 163 MB in 3s (52.2 MB/s)\n", 196 | "debconf: unable to initialize frontend: Dialog\n", 197 | "debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76, <> line 51.)\n", 198 | "debconf: falling back to frontend: Readline\n", 199 | "debconf: unable to initialize frontend: Readline\n", 200 | "debconf: (This frontend requires a controlling tty.)\n", 201 | "debconf: falling back to frontend: Teletype\n", 202 | "dpkg-preconfigure: unable to re-open stdin: \n", 203 | "Selecting previously unselected package fonts-droid-fallback.\n", 204 | "(Reading database ... 124013 files and directories currently installed.)\n", 205 | "Preparing to unpack .../00-fonts-droid-fallback_1%3a6.0.1r16-1.1_all.deb ...\n", 206 | "Unpacking fonts-droid-fallback (1:6.0.1r16-1.1) ...\n", 207 | "Selecting previously unselected package fonts-lato.\n", 208 | "Preparing to unpack .../01-fonts-lato_2.0-2_all.deb ...\n", 209 | "Unpacking fonts-lato (2.0-2) ...\n", 210 | "Selecting previously unselected package poppler-data.\n", 211 | "Preparing to unpack .../02-poppler-data_0.4.8-2_all.deb ...\n", 212 | "Unpacking poppler-data (0.4.8-2) ...\n", 213 | "Selecting previously unselected package tex-common.\n", 214 | "Preparing to unpack .../03-tex-common_6.09_all.deb ...\n", 215 | "Unpacking tex-common (6.09) ...\n", 216 | "Selecting previously unselected package libkpathsea6:amd64.\n", 217 | "Preparing to unpack .../04-libkpathsea6_2017.20170613.44572-8ubuntu0.1_amd64.deb ...\n", 218 | "Unpacking libkpathsea6:amd64 (2017.20170613.44572-8ubuntu0.1) ...\n", 219 | "Selecting previously unselected package libptexenc1:amd64.\n", 220 | "Preparing to unpack .../05-libptexenc1_2017.20170613.44572-8ubuntu0.1_amd64.deb ...\n", 221 | "Unpacking libptexenc1:amd64 (2017.20170613.44572-8ubuntu0.1) ...\n", 222 | "Selecting previously unselected package libsynctex1:amd64.\n", 223 | "Preparing to unpack .../06-libsynctex1_2017.20170613.44572-8ubuntu0.1_amd64.deb ...\n", 224 | "Unpacking libsynctex1:amd64 (2017.20170613.44572-8ubuntu0.1) ...\n", 225 | "Selecting previously unselected package libtexlua52:amd64.\n", 226 | "Preparing to unpack .../07-libtexlua52_2017.20170613.44572-8ubuntu0.1_amd64.deb ...\n", 227 | "Unpacking libtexlua52:amd64 (2017.20170613.44572-8ubuntu0.1) ...\n", 228 | "Selecting previously unselected package libtexluajit2:amd64.\n", 229 | "Preparing to unpack .../08-libtexluajit2_2017.20170613.44572-8ubuntu0.1_amd64.deb ...\n", 230 | "Unpacking libtexluajit2:amd64 (2017.20170613.44572-8ubuntu0.1) ...\n", 231 | "Selecting previously unselected package t1utils.\n", 232 | "Preparing to unpack .../09-t1utils_1.41-2_amd64.deb ...\n", 233 | "Unpacking t1utils (1.41-2) ...\n", 234 | "Selecting previously unselected package libcupsimage2:amd64.\n", 235 | "Preparing to unpack .../10-libcupsimage2_2.2.7-1ubuntu2.9_amd64.deb ...\n", 236 | "Unpacking libcupsimage2:amd64 (2.2.7-1ubuntu2.9) ...\n", 237 | "Selecting previously unselected package libijs-0.35:amd64.\n", 238 | "Preparing to unpack .../11-libijs-0.35_0.35-13_amd64.deb ...\n", 239 | "Unpacking libijs-0.35:amd64 (0.35-13) ...\n", 240 | "Selecting previously unselected package libjbig2dec0:amd64.\n", 241 | "Preparing to unpack .../12-libjbig2dec0_0.13-6_amd64.deb ...\n", 242 | "Unpacking libjbig2dec0:amd64 (0.13-6) ...\n", 243 | "Selecting previously unselected package libgs9-common.\n", 244 | "Preparing to unpack .../13-libgs9-common_9.26~dfsg+0-0ubuntu0.18.04.17_all.deb ...\n", 245 | "Unpacking libgs9-common (9.26~dfsg+0-0ubuntu0.18.04.17) ...\n", 246 | "Selecting previously unselected package libgs9:amd64.\n", 247 | "Preparing to unpack .../14-libgs9_9.26~dfsg+0-0ubuntu0.18.04.17_amd64.deb ...\n", 248 | "Unpacking libgs9:amd64 (9.26~dfsg+0-0ubuntu0.18.04.17) ...\n", 249 | "Selecting previously unselected package libpotrace0.\n", 250 | "Preparing to unpack .../15-libpotrace0_1.14-2_amd64.deb ...\n", 251 | "Unpacking libpotrace0 (1.14-2) ...\n", 252 | "Selecting previously unselected package libzzip-0-13:amd64.\n", 253 | "Preparing to unpack .../16-libzzip-0-13_0.13.62-3.1ubuntu0.18.04.1_amd64.deb ...\n", 254 | "Unpacking libzzip-0-13:amd64 (0.13.62-3.1ubuntu0.18.04.1) ...\n", 255 | "Selecting previously unselected package texlive-binaries.\n", 256 | "Preparing to unpack .../17-texlive-binaries_2017.20170613.44572-8ubuntu0.1_amd64.deb ...\n", 257 | "Unpacking texlive-binaries (2017.20170613.44572-8ubuntu0.1) ...\n", 258 | "Selecting previously unselected package texlive-base.\n", 259 | "Preparing to unpack .../18-texlive-base_2017.20180305-1_all.deb ...\n", 260 | "Unpacking texlive-base (2017.20180305-1) ...\n", 261 | "Selecting previously unselected package fonts-lmodern.\n", 262 | "Preparing to unpack .../19-fonts-lmodern_2.004.5-3_all.deb ...\n", 263 | "Unpacking fonts-lmodern (2.004.5-3) ...\n", 264 | "Selecting previously unselected package texlive-latex-base.\n", 265 | "Preparing to unpack .../20-texlive-latex-base_2017.20180305-1_all.deb ...\n", 266 | "Unpacking texlive-latex-base (2017.20180305-1) ...\n", 267 | "Selecting previously unselected package texlive-latex-recommended.\n", 268 | "Preparing to unpack .../21-texlive-latex-recommended_2017.20180305-1_all.deb ...\n", 269 | "Unpacking texlive-latex-recommended (2017.20180305-1) ...\n", 270 | "Selecting previously unselected package cm-super-minimal.\n", 271 | "Preparing to unpack .../22-cm-super-minimal_0.3.4-11_all.deb ...\n", 272 | "Unpacking cm-super-minimal (0.3.4-11) ...\n", 273 | "Selecting previously unselected package pfb2t1c2pfb.\n", 274 | "Preparing to unpack .../23-pfb2t1c2pfb_0.3-11_amd64.deb ...\n", 275 | "Unpacking pfb2t1c2pfb (0.3-11) ...\n", 276 | "Selecting previously unselected package cm-super.\n", 277 | "Preparing to unpack .../24-cm-super_0.3.4-11_all.deb ...\n", 278 | "Unpacking cm-super (0.3.4-11) ...\n", 279 | "Selecting previously unselected package ghostscript.\n", 280 | "Preparing to unpack .../25-ghostscript_9.26~dfsg+0-0ubuntu0.18.04.17_amd64.deb ...\n", 281 | "Unpacking ghostscript (9.26~dfsg+0-0ubuntu0.18.04.17) ...\n", 282 | "Selecting previously unselected package dvipng.\n", 283 | "Preparing to unpack .../26-dvipng_1.15-1_amd64.deb ...\n", 284 | "Unpacking dvipng (1.15-1) ...\n", 285 | "Selecting previously unselected package fonts-noto-mono.\n", 286 | "Preparing to unpack .../27-fonts-noto-mono_20171026-2_all.deb ...\n", 287 | "Unpacking fonts-noto-mono (20171026-2) ...\n", 288 | "Selecting previously unselected package fonts-texgyre.\n", 289 | "Preparing to unpack .../28-fonts-texgyre_20160520-1_all.deb ...\n", 290 | "Unpacking fonts-texgyre (20160520-1) ...\n", 291 | "Selecting previously unselected package gsfonts.\n", 292 | "Preparing to unpack .../29-gsfonts_1%3a8.11+urwcyr1.0.7~pre44-4.4_all.deb ...\n", 293 | "Unpacking gsfonts (1:8.11+urwcyr1.0.7~pre44-4.4) ...\n", 294 | "Selecting previously unselected package javascript-common.\n", 295 | "Preparing to unpack .../30-javascript-common_11_all.deb ...\n", 296 | "Unpacking javascript-common (11) ...\n", 297 | "Selecting previously unselected package libcupsfilters1:amd64.\n", 298 | "Preparing to unpack .../31-libcupsfilters1_1.20.2-0ubuntu3.1_amd64.deb ...\n", 299 | "Unpacking libcupsfilters1:amd64 (1.20.2-0ubuntu3.1) ...\n", 300 | "Selecting previously unselected package libjs-jquery.\n", 301 | "Preparing to unpack .../32-libjs-jquery_3.2.1-1_all.deb ...\n", 302 | "Unpacking libjs-jquery (3.2.1-1) ...\n", 303 | "Selecting previously unselected package rubygems-integration.\n", 304 | "Preparing to unpack .../33-rubygems-integration_1.11_all.deb ...\n", 305 | "Unpacking rubygems-integration (1.11) ...\n", 306 | "Selecting previously unselected package ruby2.5.\n", 307 | "Preparing to unpack .../34-ruby2.5_2.5.1-1ubuntu1.12_amd64.deb ...\n", 308 | "Unpacking ruby2.5 (2.5.1-1ubuntu1.12) ...\n", 309 | "Selecting previously unselected package ruby.\n", 310 | "Preparing to unpack .../35-ruby_1%3a2.5.1_amd64.deb ...\n", 311 | "Unpacking ruby (1:2.5.1) ...\n", 312 | "Selecting previously unselected package rake.\n", 313 | "Preparing to unpack .../36-rake_12.3.1-1ubuntu0.1_all.deb ...\n", 314 | "Unpacking rake (12.3.1-1ubuntu0.1) ...\n", 315 | "Selecting previously unselected package ruby-did-you-mean.\n", 316 | "Preparing to unpack .../37-ruby-did-you-mean_1.2.0-2_all.deb ...\n", 317 | "Unpacking ruby-did-you-mean (1.2.0-2) ...\n", 318 | "Selecting previously unselected package ruby-minitest.\n", 319 | "Preparing to unpack .../38-ruby-minitest_5.10.3-1_all.deb ...\n", 320 | "Unpacking ruby-minitest (5.10.3-1) ...\n", 321 | "Selecting previously unselected package ruby-net-telnet.\n", 322 | "Preparing to unpack .../39-ruby-net-telnet_0.1.1-2_all.deb ...\n", 323 | "Unpacking ruby-net-telnet (0.1.1-2) ...\n", 324 | "Selecting previously unselected package ruby-power-assert.\n", 325 | "Preparing to unpack .../40-ruby-power-assert_0.3.0-1_all.deb ...\n", 326 | "Unpacking ruby-power-assert (0.3.0-1) ...\n", 327 | "Selecting previously unselected package ruby-test-unit.\n", 328 | "Preparing to unpack .../41-ruby-test-unit_3.2.5-1_all.deb ...\n", 329 | "Unpacking ruby-test-unit (3.2.5-1) ...\n", 330 | "Selecting previously unselected package libruby2.5:amd64.\n", 331 | "Preparing to unpack .../42-libruby2.5_2.5.1-1ubuntu1.12_amd64.deb ...\n", 332 | "Unpacking libruby2.5:amd64 (2.5.1-1ubuntu1.12) ...\n", 333 | "Selecting previously unselected package lmodern.\n", 334 | "Preparing to unpack .../43-lmodern_2.004.5-3_all.deb ...\n", 335 | "Unpacking lmodern (2.004.5-3) ...\n", 336 | "Selecting previously unselected package preview-latex-style.\n", 337 | "Preparing to unpack .../44-preview-latex-style_11.91-1ubuntu1_all.deb ...\n", 338 | "Unpacking preview-latex-style (11.91-1ubuntu1) ...\n", 339 | "Selecting previously unselected package tex-gyre.\n", 340 | "Preparing to unpack .../45-tex-gyre_20160520-1_all.deb ...\n", 341 | "Unpacking tex-gyre (20160520-1) ...\n", 342 | "Selecting previously unselected package texlive-fonts-recommended.\n", 343 | "Preparing to unpack .../46-texlive-fonts-recommended_2017.20180305-1_all.deb ...\n", 344 | "Unpacking texlive-fonts-recommended (2017.20180305-1) ...\n", 345 | "Selecting previously unselected package texlive-pictures.\n", 346 | "Preparing to unpack .../47-texlive-pictures_2017.20180305-1_all.deb ...\n", 347 | "Unpacking texlive-pictures (2017.20180305-1) ...\n", 348 | "Selecting previously unselected package texlive-latex-extra.\n", 349 | "Preparing to unpack .../48-texlive-latex-extra_2017.20180305-2_all.deb ...\n", 350 | "Unpacking texlive-latex-extra (2017.20180305-2) ...\n", 351 | "Selecting previously unselected package texlive-plain-generic.\n", 352 | "Preparing to unpack .../49-texlive-plain-generic_2017.20180305-2_all.deb ...\n", 353 | "Unpacking texlive-plain-generic (2017.20180305-2) ...\n", 354 | "Selecting previously unselected package tipa.\n", 355 | "Preparing to unpack .../50-tipa_2%3a1.3-20_all.deb ...\n", 356 | "Unpacking tipa (2:1.3-20) ...\n", 357 | "Setting up libgs9-common (9.26~dfsg+0-0ubuntu0.18.04.17) ...\n", 358 | "Setting up libkpathsea6:amd64 (2017.20170613.44572-8ubuntu0.1) ...\n", 359 | "Setting up libjs-jquery (3.2.1-1) ...\n", 360 | "Setting up libtexlua52:amd64 (2017.20170613.44572-8ubuntu0.1) ...\n", 361 | "Setting up fonts-droid-fallback (1:6.0.1r16-1.1) ...\n", 362 | "Setting up libsynctex1:amd64 (2017.20170613.44572-8ubuntu0.1) ...\n", 363 | "Setting up libptexenc1:amd64 (2017.20170613.44572-8ubuntu0.1) ...\n", 364 | "Setting up tex-common (6.09) ...\n", 365 | "debconf: unable to initialize frontend: Dialog\n", 366 | "debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)\n", 367 | "debconf: falling back to frontend: Readline\n", 368 | "update-language: texlive-base not installed and configured, doing nothing!\n", 369 | "Setting up gsfonts (1:8.11+urwcyr1.0.7~pre44-4.4) ...\n", 370 | "Setting up poppler-data (0.4.8-2) ...\n", 371 | "Setting up tex-gyre (20160520-1) ...\n", 372 | "Setting up preview-latex-style (11.91-1ubuntu1) ...\n", 373 | "Setting up fonts-texgyre (20160520-1) ...\n", 374 | "Setting up pfb2t1c2pfb (0.3-11) ...\n", 375 | "Setting up fonts-noto-mono (20171026-2) ...\n", 376 | "Setting up fonts-lato (2.0-2) ...\n", 377 | "Setting up libcupsfilters1:amd64 (1.20.2-0ubuntu3.1) ...\n", 378 | "Setting up libcupsimage2:amd64 (2.2.7-1ubuntu2.9) ...\n", 379 | "Setting up libjbig2dec0:amd64 (0.13-6) ...\n", 380 | "Setting up ruby-did-you-mean (1.2.0-2) ...\n", 381 | "Setting up t1utils (1.41-2) ...\n", 382 | "Setting up ruby-net-telnet (0.1.1-2) ...\n", 383 | "Setting up libijs-0.35:amd64 (0.35-13) ...\n", 384 | "Setting up rubygems-integration (1.11) ...\n", 385 | "Setting up libpotrace0 (1.14-2) ...\n", 386 | "Setting up javascript-common (11) ...\n", 387 | "Setting up ruby-minitest (5.10.3-1) ...\n", 388 | "Setting up libzzip-0-13:amd64 (0.13.62-3.1ubuntu0.18.04.1) ...\n", 389 | "Setting up libgs9:amd64 (9.26~dfsg+0-0ubuntu0.18.04.17) ...\n", 390 | "Setting up libtexluajit2:amd64 (2017.20170613.44572-8ubuntu0.1) ...\n", 391 | "Setting up fonts-lmodern (2.004.5-3) ...\n", 392 | "Setting up ruby-power-assert (0.3.0-1) ...\n", 393 | "Setting up ghostscript (9.26~dfsg+0-0ubuntu0.18.04.17) ...\n", 394 | "Setting up texlive-binaries (2017.20170613.44572-8ubuntu0.1) ...\n", 395 | "update-alternatives: using /usr/bin/xdvi-xaw to provide /usr/bin/xdvi.bin (xdvi.bin) in auto mode\n", 396 | "update-alternatives: using /usr/bin/bibtex.original to provide /usr/bin/bibtex (bibtex) in auto mode\n", 397 | "Setting up texlive-base (2017.20180305-1) ...\n", 398 | "mktexlsr: Updating /var/lib/texmf/ls-R-TEXLIVEDIST... \n", 399 | "mktexlsr: Updating /var/lib/texmf/ls-R-TEXMFMAIN... \n", 400 | "mktexlsr: Updating /var/lib/texmf/ls-R... \n", 401 | "mktexlsr: Done.\n", 402 | "tl-paper: setting paper size for dvips to a4: /var/lib/texmf/dvips/config/config-paper.ps\n", 403 | "tl-paper: setting paper size for dvipdfmx to a4: /var/lib/texmf/dvipdfmx/dvipdfmx-paper.cfg\n", 404 | "tl-paper: setting paper size for xdvi to a4: /var/lib/texmf/xdvi/XDvi-paper\n", 405 | "tl-paper: setting paper size for pdftex to a4: /var/lib/texmf/tex/generic/config/pdftexconfig.tex\n", 406 | "debconf: unable to initialize frontend: Dialog\n", 407 | "debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)\n", 408 | "debconf: falling back to frontend: Readline\n", 409 | "Setting up texlive-fonts-recommended (2017.20180305-1) ...\n", 410 | "Setting up texlive-plain-generic (2017.20180305-2) ...\n", 411 | "Setting up texlive-latex-base (2017.20180305-1) ...\n", 412 | "Setting up lmodern (2.004.5-3) ...\n", 413 | "Setting up texlive-latex-recommended (2017.20180305-1) ...\n", 414 | "Setting up texlive-pictures (2017.20180305-1) ...\n", 415 | "Setting up dvipng (1.15-1) ...\n", 416 | "Setting up tipa (2:1.3-20) ...\n", 417 | "Regenerating '/var/lib/texmf/fmtutil.cnf-DEBIAN'... done.\n", 418 | "Regenerating '/var/lib/texmf/fmtutil.cnf-TEXLIVEDIST'... done.\n", 419 | "update-fmtutil has updated the following file(s):\n", 420 | "\t/var/lib/texmf/fmtutil.cnf-DEBIAN\n", 421 | "\t/var/lib/texmf/fmtutil.cnf-TEXLIVEDIST\n", 422 | "If you want to activate the changes in the above file(s),\n", 423 | "you should run fmtutil-sys or fmtutil.\n", 424 | "Setting up cm-super-minimal (0.3.4-11) ...\n", 425 | "Setting up texlive-latex-extra (2017.20180305-2) ...\n", 426 | "Setting up cm-super (0.3.4-11) ...\n", 427 | "Creating fonts. This may take some time... done.\n", 428 | "Setting up rake (12.3.1-1ubuntu0.1) ...\n", 429 | "Setting up ruby2.5 (2.5.1-1ubuntu1.12) ...\n", 430 | "Setting up ruby (1:2.5.1) ...\n", 431 | "Setting up ruby-test-unit (3.2.5-1) ...\n", 432 | "Setting up libruby2.5:amd64 (2.5.1-1ubuntu1.12) ...\n", 433 | "Processing triggers for mime-support (3.60ubuntu1) ...\n", 434 | "Processing triggers for libc-bin (2.27-3ubuntu1.6) ...\n", 435 | "Processing triggers for man-db (2.8.3-2ubuntu0.1) ...\n", 436 | "Processing triggers for fontconfig (2.12.6-0ubuntu2) ...\n", 437 | "Processing triggers for tex-common (6.09) ...\n", 438 | "debconf: unable to initialize frontend: Dialog\n", 439 | "debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)\n", 440 | "debconf: falling back to frontend: Readline\n", 441 | "Running updmap-sys. This may take some time... done.\n", 442 | "Running mktexlsr /var/lib/texmf ... done.\n", 443 | "Building format(s) --all.\n", 444 | "\tThis may take some time... done.\n" 445 | ] 446 | } 447 | ], 448 | "source": [ 449 | "# Install some necessary requirements\n", 450 | "!sudo apt install cm-super dvipng texlive-latex-extra texlive-fonts-recommended \n", 451 | "!pip install numpy matplotlib opencv-contrib-python>=4.5 joblib pandas dill tqdm scipy tabulate future " 452 | ] 453 | }, 454 | { 455 | "cell_type": "code", 456 | "execution_count": null, 457 | "metadata": { 458 | "id": "0zneZNu_kWKP", 459 | "cellView": "form" 460 | }, 461 | "outputs": [], 462 | "source": [ 463 | "#@title PatchClustersDataset class definition\n", 464 | "# Create a generic dataset class\n", 465 | "import glob\n", 466 | "import json\n", 467 | "import logging\n", 468 | "import os.path\n", 469 | "import pickle\n", 470 | "from collections import namedtuple\n", 471 | "\n", 472 | "import cv2\n", 473 | "import numpy as np\n", 474 | "from tqdm import tqdm\n", 475 | "\n", 476 | "Size = namedtuple('Size', ('width', 'height'))\n", 477 | "\n", 478 | "\n", 479 | "def touch_dir(dir_name):\n", 480 | " \"\"\"\n", 481 | " Creates a directory if it doesn't exists\n", 482 | " :param dir_name: The directory to be created.\n", 483 | " :type dir_name: str\n", 484 | " \"\"\"\n", 485 | " if not os.path.exists(dir_name):\n", 486 | " os.makedirs(dir_name)\n", 487 | "\n", 488 | "\n", 489 | "class PatchClustersDataset:\n", 490 | " \"\"\"Represents a dataset of clusters, where each sample is a image patch.\n", 491 | " The associated labels determine each cluster and represents the same 3D region.\"\"\"\n", 492 | "\n", 493 | " @property\n", 494 | " def dataset_name(self):\n", 495 | " return self.__dataset_name\n", 496 | "\n", 497 | " @property\n", 498 | " def n_samples(self):\n", 499 | " return self._n_samples\n", 500 | "\n", 501 | " @property\n", 502 | " def patch_size(self):\n", 503 | " return self.__patch_size\n", 504 | "\n", 505 | " @property\n", 506 | " def original_patch_size(self):\n", 507 | " return self.__original_patch_size\n", 508 | "\n", 509 | " @property\n", 510 | " def preprocessor(self):\n", 511 | " return self.__preprocessor\n", 512 | "\n", 513 | " @property\n", 514 | " def is_data_preprocessed(self):\n", 515 | " return self._is_data_preprocessed\n", 516 | "\n", 517 | " @property\n", 518 | " def data(self):\n", 519 | " return self._data\n", 520 | "\n", 521 | " @property\n", 522 | " def cluster_labels(self):\n", 523 | " return self._cluster_labels\n", 524 | "\n", 525 | " @property\n", 526 | " def imgs_names(self):\n", 527 | " return self._imgs_names\n", 528 | "\n", 529 | " @property\n", 530 | " def full_name(self):\n", 531 | " return \"{} ({},{}) {}\".format(\n", 532 | " self.dataset_name,\n", 533 | " str(self.patch_size.width),\n", 534 | " str(self.patch_size.height),\n", 535 | " \"None\" if self.preprocessor is None else self.preprocessor.get_preprocessor_name())\n", 536 | "\n", 537 | " @property\n", 538 | " def data_augmentation(self):\n", 539 | " return self._data_augmentation\n", 540 | "\n", 541 | " @property\n", 542 | " def extra_info(self):\n", 543 | " return self._extra_info\n", 544 | "\n", 545 | " @property\n", 546 | " def patch_margin(self):\n", 547 | " return self._patch_margin\n", 548 | "\n", 549 | " def __init__(self, dataset_name, preprocessor=None, patch_size=Size(32, 32), original_patch_size=Size(64, 64),\n", 550 | " data_augmentation=False, patch_margin=0):\n", 551 | " self.__dataset_name = dataset_name\n", 552 | " self.__preprocessor = preprocessor\n", 553 | " self.__patch_size = patch_size\n", 554 | " self.__original_patch_size = original_patch_size\n", 555 | " self._data_augmentation = data_augmentation\n", 556 | " self._n_samples = None\n", 557 | " self._is_data_preprocessed = None\n", 558 | " self._data = None\n", 559 | " self._cluster_labels = None\n", 560 | " self._imgs_names = None\n", 561 | " self._extra_info = None\n", 562 | " self._patch_margin = patch_margin\n", 563 | "\n", 564 | " @dataset_name.setter\n", 565 | " def dataset_name(self, dataset_name):\n", 566 | " self.__dataset_name = dataset_name\n", 567 | "\n", 568 | " @preprocessor.setter\n", 569 | " def preprocessor(self, preprocessor):\n", 570 | " self.__preprocessor = preprocessor\n" 571 | ] 572 | }, 573 | { 574 | "cell_type": "code", 575 | "source": [ 576 | "#@title HpatchesPatchClustersDataset class definition\n", 577 | "\n", 578 | "# For the remaining 5 images in the sequence, we provide three patch sets\n", 579 | "# `eK.png` and `hK.png` and `tK.png`, containing the corresponding patches from\n", 580 | "# `ref.png` as found in the `K-th` image with increasing amounts of geometric noise (`e`<`h`<`t`).\n", 581 | "TPS = {\n", 582 | " 'all': ['ref', 'e1', 'e2', 'e3', 'e4', 'e5', 'h1', 'h2', 'h3', 'h4', 'h5', 't1', 't2', 't3', 't4', 't5'],\n", 583 | " 'easy': ['ref', 'e1', 'e2', 'e3', 'e4', 'e5'],\n", 584 | " 'hard': ['ref', 'h1', 'h2', 'h3', 'h4', 'h5'],\n", 585 | " 'tough': ['ref', 't1', 't2', 't3', 't4', 't5'],\n", 586 | " 'easy_hard': ['ref', 'e1', 'e2', 'e3', 'e4', 'e5', 'h1', 'h2', 'h3', 'h4', 'h5'],\n", 587 | " 'hard_tough': ['ref', 'h1', 'h2', 'h3', 'h4', 'h5', 't1', 't2', 't3', 't4', 't5']\n", 588 | "}\n", 589 | "\n", 590 | "\n", 591 | "class HpatchesSequence:\n", 592 | " \"\"\"Class for loading an HPatches sequence from a sequence folder\"\"\"\n", 593 | "\n", 594 | " def __init__(self, base):\n", 595 | " name = base.split('/')\n", 596 | " self.name = name[-1]\n", 597 | " self.base = base\n", 598 | " for t in TPS['all']:\n", 599 | " im_path = os.path.join(base, t + '.png')\n", 600 | " im = cv2.imread(im_path, 0)\n", 601 | " self.N = im.shape[0] / 65\n", 602 | " setattr(self, t, np.split(im, self.N))\n", 603 | "\n", 604 | "\n", 605 | "class HpatchesPatchClustersDataset(PatchClustersDataset):\n", 606 | " \"\"\"\n", 607 | " Class to contain all the Hpatches-related information\n", 608 | " \"\"\"\n", 609 | " _DATASET_PATH = 'hpatches/data/hpatches-release'\n", 610 | " _CACHE_DIR = \"hpatches/data/cache\"\n", 611 | " _USE_CACHE = True\n", 612 | "\n", 613 | " DONT_SERIALIZE_FIELDS = ['imgs_names', 'n_kps_per_scene', 'scene_first_kps_idx', 'scene_number', 'idx_img',\n", 614 | " 'dataset_name', 'tskdir']\n", 615 | "\n", 616 | " @property\n", 617 | " def dataset_name(self):\n", 618 | " return 'hpatches-' + self.split_name + '-' + self._difficulty_level\n", 619 | "\n", 620 | " @property\n", 621 | " def split_name(self):\n", 622 | " return self._split_name\n", 623 | "\n", 624 | " @property\n", 625 | " def difficulty_level(self):\n", 626 | " return self._difficulty_level\n", 627 | "\n", 628 | " @property\n", 629 | " def subset(self):\n", 630 | " return self._subset\n", 631 | "\n", 632 | " def __init__(self, preprocessor=None, patch_size=Size(32, 32), difficulty_level='easy', split_name='a',\n", 633 | " data_augmentation=False, subset='test', patch_margin=0, splits=None):\n", 634 | " assert isinstance(split_name, str) and isinstance(difficulty_level, str)\n", 635 | " super().__init__(\"hpatches-\" + split_name + \"-\" + difficulty_level, preprocessor, patch_size, Size(65, 65),\n", 636 | " False, patch_margin)\n", 637 | "\n", 638 | " self._subset = subset\n", 639 | " self._split_name = split_name\n", 640 | " self._difficulty_level = difficulty_level\n", 641 | " self.tskdir = os.path.normpath(os.path.join(\"hpatches\", \"tasks\"))\n", 642 | "\n", 643 | " if splits is None:\n", 644 | " with open(os.path.join(\"hpatches/tasks/splits/splits.json\")) as f:\n", 645 | " splits = json.load(f)\n", 646 | " self.splits = splits\n", 647 | "\n", 648 | " self._imgs_names = TPS[self.difficulty_level]\n", 649 | " self._data = None\n", 650 | " self._n_kps_per_scene = None\n", 651 | " self._scene_first_kps_idx = None\n", 652 | " self._scene_number = None\n", 653 | " self._idx_img = None\n", 654 | "\n", 655 | " def dataset_path(self):\n", 656 | " \"\"\"\n", 657 | " Returns the path on disk where the dataset is stored\n", 658 | " \"\"\"\n", 659 | " return self._DATASET_PATH\n", 660 | "\n", 661 | " def load_data(self):\n", 662 | " \"\"\"\n", 663 | " Hpatches dataset is stored in the directory _DATASET_PATH. This method loads the image patches\n", 664 | " from these directory to the field self.all_patches in memory.\n", 665 | " \"\"\"\n", 666 | " # All patches will contain the output patches\n", 667 | " self._data = {}\n", 668 | " # alternatively, to save the file\n", 669 | " if not os.path.exists(HpatchesPatchClustersDataset._CACHE_DIR):\n", 670 | " os.mkdir(HpatchesPatchClustersDataset._CACHE_DIR)\n", 671 | "\n", 672 | " # This is the cache file where the raw patches are stored\n", 673 | " cache_file = os.path.join(HpatchesPatchClustersDataset._CACHE_DIR, 'cache.dictionary')\n", 674 | "\n", 675 | " if not self._USE_CACHE or not os.path.isfile(cache_file):\n", 676 | " logging.info(\"--> Reading patches\")\n", 677 | "\n", 678 | " # Read all the folders in the dataset directory. Each one is a different scene\n", 679 | " assert os.path.exists(HpatchesPatchClustersDataset._DATASET_PATH)\n", 680 | " seqs = glob.glob(HpatchesPatchClustersDataset._DATASET_PATH + '/*')\n", 681 | " seqs = [os.path.abspath(p) for p in seqs]\n", 682 | "\n", 683 | " # Read the sequence and add to the all_patches field the new scene\n", 684 | " pbar = tqdm(seqs)\n", 685 | " for seq_path in pbar:\n", 686 | " seq = HpatchesSequence(seq_path)\n", 687 | " self._data[seq.name] = {}\n", 688 | " for tp in TPS['all']:\n", 689 | " self._data[seq.name][tp] = np.array(\n", 690 | " [cv2.resize(patch, tuple(self.patch_size)) for patch in getattr(seq, tp)])\n", 691 | "\n", 692 | " if self._USE_CACHE:\n", 693 | " logging.info(\"--> Saving patches to cache file \\\"{}\\\"\".format(cache_file))\n", 694 | " with open(cache_file, 'wb') as dictionary_file:\n", 695 | " pickle.dump(self._data, dictionary_file)\n", 696 | "\n", 697 | " else:\n", 698 | " logging.info(\"--> Reading patches from cache file \\\"{}\\\"\".format(cache_file))\n", 699 | " with open(cache_file, 'rb') as dictionary_file:\n", 700 | " self._data = pickle.load(dictionary_file)\n", 701 | " logging.info(\"--> Dataset successfully loaded\")\n", 702 | "\n", 703 | " n_imgs_per_scene = np.array([len(seq) for seq in self.data.values()])\n", 704 | " self._n_kps_per_scene = np.array([len(seq['ref']) for seq in self.data.values()])\n", 705 | " kps_per_scene = n_imgs_per_scene * self._n_kps_per_scene\n", 706 | " self._scene_first_kps_idx = np.cumsum(np.append(0, kps_per_scene))\n", 707 | " self._scene_number = {list(self._data.keys())[i]: i for i in range(len(self._n_kps_per_scene))}\n", 708 | " self._idx_img = {self.imgs_names[i]: i for i in range(len(self.imgs_names))}\n", 709 | " self._n_samples = np.sum(kps_per_scene)\n", 710 | "\n", 711 | " if self.preprocessor is not None:\n", 712 | " logging.info(\"\\t--> Preprocessing patches with \" + str(self.preprocessor))\n", 713 | " prep_sample = self.preprocessor.preprocess_patch(np.zeros(self.patch_size, dtype=np.uint8))\n", 714 | " prep_shape, prep_type = prep_sample.shape, prep_sample.dtype\n", 715 | "\n", 716 | " ss_dim_index = 0 if self.preprocessor is None else self.preprocessor.get_ss_dim_index()\n", 717 | " dst_shape = ((self._n_samples,) + prep_shape) if ss_dim_index == 0 else prep_shape + (self._n_samples,)\n", 718 | " data = np.empty(dst_shape, dtype=prep_type)\n", 719 | " counter = 0\n", 720 | " for scene_name, scene_content in tqdm(self._data.items()):\n", 721 | " for img_name in scene_content.keys():\n", 722 | " tmp = self.preprocessor.preprocess_patch_array(scene_content[img_name])\n", 723 | " n_tmp_patches = len(scene_content[img_name])\n", 724 | "\n", 725 | " indexer = [np.s_[:]] * data.ndim\n", 726 | " indexer[ss_dim_index] = slice(counter, (counter + n_tmp_patches))\n", 727 | " data[tuple(indexer)] = tmp\n", 728 | " counter += n_tmp_patches\n", 729 | "\n", 730 | " self._data = data\n", 731 | " self._is_data_preprocessed = True\n", 732 | " else:\n", 733 | " self._is_data_preprocessed = False\n", 734 | "\n", 735 | " def gen_patches_array(self, preprocess=False):\n", 736 | " \"\"\"\n", 737 | " Generates a flat array with all the patches in the dataset.\n", 738 | " :return: An array with all the patches in the dataset\n", 739 | " :rtype: ndarray\n", 740 | " \"\"\"\n", 741 | " if self._data is None:\n", 742 | " # Load the data if it hasn't been loaded\n", 743 | " self.load_data()\n", 744 | "\n", 745 | " if self.is_data_preprocessed:\n", 746 | " return self.data\n", 747 | "\n", 748 | " flat_patches = []\n", 749 | " for _, scene in self._data.items():\n", 750 | " for _, img_patches in scene.items():\n", 751 | " flat_patches.append(img_patches)\n", 752 | "\n", 753 | " flat_patches = np.vstack(flat_patches)\n", 754 | " logging.debug(\"\\t--> Loaded {} patches in memory\".format(len(flat_patches)))\n", 755 | " if self.preprocessor is not None and preprocess:\n", 756 | " logging.debug(\"\\t--> Preprocessing {} patches with {}\".format(len(flat_patches), self.preprocessor))\n", 757 | " flat_patches = self.preprocessor.preprocess_patch_array(flat_patches)\n", 758 | " return flat_patches\n", 759 | "\n", 760 | " def __generate_index(self, scene_name, img, kp):\n", 761 | " \"\"\"\n", 762 | " Generates the unique index in the flat list of patches the identifies the patch in one concrete scene and image.\n", 763 | " :param scene_name: The name of the scene where is the patch\n", 764 | " :type scene_name: str\n", 765 | " :param img: The image in the scene where the patch is\n", 766 | " :type img: str\n", 767 | " :param kp: The index of the keypoint in the image keypoints\n", 768 | " :type kp: int\n", 769 | " :return: the index\n", 770 | " :rtype: int\n", 771 | " \"\"\"\n", 772 | " my_scene_num = self._scene_number[scene_name]\n", 773 | " return self._scene_first_kps_idx[my_scene_num] \\\n", 774 | " + self._idx_img[img] * self._n_kps_per_scene[my_scene_num] \\\n", 775 | " + kp\n" 776 | ], 777 | "metadata": { 778 | "cellView": "form", 779 | "id": "DrBx1tsCLhA-" 780 | }, 781 | "execution_count": null, 782 | "outputs": [] 783 | }, 784 | { 785 | "cell_type": "code", 786 | "execution_count": null, 787 | "metadata": { 788 | "id": "5Tk7AqpWkShL" 789 | }, 790 | "outputs": [], 791 | "source": [ 792 | "%matplotlib inline\n", 793 | "# This aim of this experiment is to generate the CSV files that the HPatches benchmark needs to be executed\n", 794 | "# For more information see: https://github.com/hpatches/hpatches-descriptors\n", 795 | "import logging\n", 796 | "import os\n", 797 | "import sys\n", 798 | "from shutil import copyfile\n", 799 | "\n", 800 | "import cv2\n", 801 | "import numpy as np\n", 802 | "from tqdm import tqdm\n", 803 | "\n", 804 | "sys.path.append(os.getcwd())\n", 805 | "\n", 806 | "sys.path.append(os.path.join(os.getcwd(), 'hpatches', 'python'))\n", 807 | "\n", 808 | "from hpatches.python.utils.tasks import methods\n", 809 | "from hpatches.python.utils.results import plot_hpatches_results\n", 810 | "from hpatches.python.utils.results import DescriptorHPatchesResult\n", 811 | "import os.path\n", 812 | "import os\n", 813 | "import dill\n", 814 | "import json\n", 815 | "import matplotlib.pyplot as plt" 816 | ] 817 | }, 818 | { 819 | "cell_type": "code", 820 | "execution_count": null, 821 | "metadata": { 822 | "id": "hqcf6-mkkzF8" 823 | }, 824 | "outputs": [], 825 | "source": [ 826 | "# all types of patches\n", 827 | "#TPS = ['ref', 'e1', 'e2', 'e3', 'e4', 'e5', 'h1', 'h2', 'h3', 'h4', 'h5', 't1', 't2', 't3', 't4', 't5']\n", 828 | "\n", 829 | "class MemoryHpatchesDescr:\n", 830 | " def __init__(self, name, descriptors):\n", 831 | " self.base = \"NOT_USED\"\n", 832 | " self.name = name\n", 833 | " self.N = descriptors['ref'].shape[0]\n", 834 | " self.dim = descriptors['ref'].shape[1]\n", 835 | " for img_name, descr in descriptors.items():\n", 836 | " setattr(self, img_name, descr)\n", 837 | "\n", 838 | "\n", 839 | "def do_run_method(t, descr, splt, res_path):\n", 840 | " res = methods[t](descr, splt)\n", 841 | " dill.dump(res, open(res_path, \"wb\"))\n", 842 | "\n", 843 | "\n", 844 | "def copy_soa_descriptor_results(dst_results_dir, split_name='full'):\n", 845 | " original_results_path = os.path.join('hpatches', 'python', 'results')\n", 846 | " descr_names = ['orb', 'binboost', 'cvLATCH', 'LDAHashDIF128', 'sift', 'cvRSIFT', '64x64-CDbin-256', 'hardnet+',\n", 847 | " 'tfeat-margin-star', 'cvBRISK',\n", 848 | " 'DOAP-ST-Lib-256b', 'LDB', 'BiSIFT']\n", 849 | " touch_dir(dst_results_dir)\n", 850 | "\n", 851 | " copied_descrs = []\n", 852 | " for descr_name in descr_names:\n", 853 | " val_res = os.path.join(original_results_path, descr_name + \"_verification_\" + split_name + \".p\")\n", 854 | " match_res = os.path.join(original_results_path, descr_name + \"_matching_\" + split_name + \".p\")\n", 855 | " ret_res = os.path.join(original_results_path, descr_name + \"_retrieval_\" + split_name + \".p\")\n", 856 | " if os.path.isfile(val_res) and os.path.isfile(match_res) and os.path.isfile(ret_res):\n", 857 | " dst_val_res = os.path.join(dst_results_dir, descr_name + \"_verification_\" + split_name + \".p\")\n", 858 | " copyfile(val_res, dst_val_res)\n", 859 | " dst_match_res = os.path.join(dst_results_dir, descr_name + \"_matching_\" + split_name + \".p\")\n", 860 | " copyfile(match_res, dst_match_res)\n", 861 | " dst_ret_res = os.path.join(dst_results_dir, descr_name + \"_retrieval_\" + split_name + \".p\")\n", 862 | " copyfile(ret_res, dst_ret_res)\n", 863 | " copied_descrs.append(descr_name)\n", 864 | "\n", 865 | " return copied_descrs" 866 | ] 867 | }, 868 | { 869 | "cell_type": "markdown", 870 | "source": [ 871 | "Main code to generate the Hpatches results" 872 | ], 873 | "metadata": { 874 | "id": "xmOtToe0MAoa" 875 | } 876 | }, 877 | { 878 | "cell_type": "code", 879 | "execution_count": null, 880 | "metadata": { 881 | "id": "u7EjRiWclG5f", 882 | "colab": { 883 | "base_uri": "https://localhost:8080/" 884 | }, 885 | "outputId": "233d1bc6-2c05-43fd-814d-109d7a1e6227" 886 | }, 887 | "outputs": [ 888 | { 889 | "output_type": "stream", 890 | "name": "stderr", 891 | "text": [ 892 | "INFO:root:--> Using Hpatches split: \"full\"\n", 893 | "INFO:root:--> Reading patches\n", 894 | "100%|██████████| 116/116 [03:39<00:00, 1.89s/it]\n", 895 | "INFO:root:--> Saving patches to cache file \"hpatches/data/cache/cache.dictionary\"\n" 896 | ] 897 | } 898 | ], 899 | "source": [ 900 | "\"\"\"Executes the experiment, using one model do describe the Hpatches dataset\"\"\"\n", 901 | "logging.getLogger().setLevel(logging.DEBUG)\n", 902 | "with open(\"hpatches/tasks/splits/splits.json\") as f:\n", 903 | " splits = json.load(f)\n", 904 | "\n", 905 | "output_dir = '.'\n", 906 | "split = 'full'\n", 907 | "logging.info(\"--> Using Hpatches split: \\\"{}\\\"\".format(split))\n", 908 | "splt = splits[split]\n", 909 | "\n", 910 | "results_dir = os.path.join(output_dir, 'eval_results')\n", 911 | "touch_dir(results_dir)\n", 912 | "\n", 913 | "db = HpatchesPatchClustersDataset(difficulty_level='all')\n", 914 | "db.load_data()" 915 | ] 916 | }, 917 | { 918 | "cell_type": "code", 919 | "source": [ 920 | "# Describe all the patches with the descriptor\n", 921 | "N_DIMS = 512\n", 922 | "# Assuming patches of 32x32, we center the keypoint at (16, 16)\n", 923 | "kp = [cv2.KeyPoint(16.0, 16.0, 32.0, 0.0)]\n", 924 | "# Add in these lists all the descriptors you want to evaluate\n", 925 | "descr_names = ['BEBLID-512']\n", 926 | "models = [cv2.xfeatures2d.BEBLID_create(1.0)]\n", 927 | "distance_types = ['L1']\n", 928 | "\n", 929 | "for model, descr_name, dist_type in zip(models, descr_names, distance_types):\n", 930 | " hpatches_descripors = {}\n", 931 | " patches_pbar = tqdm(db.data.items())\n", 932 | " patches_pbar.set_description(\"Describing Hpatches with \\\"{}\\\"\".format(descr_name))\n", 933 | "\n", 934 | " for scene_name, scene_images in patches_pbar:\n", 935 | " descriptors = {}\n", 936 | " for img_name, img_patches in scene_images.items():\n", 937 | " descriptors[img_name] = np.array([model.compute(img, kp)[1].flatten() for img in img_patches])\n", 938 | " hpatches_descripors[scene_name] = MemoryHpatchesDescr(scene_name, descriptors)\n", 939 | "\n", 940 | " # Compress l1 descriptors to use hamming distance\n", 941 | " if dist_type == 'L1':\n", 942 | " dist_type = 'HAMMING'\n", 943 | "\n", 944 | " hpatches_descripors['distance'] = dist_type\n", 945 | " hpatches_descripors['dim'] = N_DIMS\n", 946 | "\n", 947 | " for t in ['verification', 'matching', 'retrieval']:\n", 948 | " res_path = os.path.join(results_dir, descr_name + \"_\" + t + \"_\" + splt['name'] + \".p\")\n", 949 | " if os.path.exists(res_path):\n", 950 | " print(\"Results for the %s, %s task, split %s, already cached!\" %\n", 951 | " (descr_name, t, splt['name']))\n", 952 | " ans = input('Do you want to re-run this? (yes)/(no): ')\n", 953 | " if ans.lower() == 'yes':\n", 954 | " do_run_method(t, hpatches_descripors, splt, res_path)\n", 955 | " else:\n", 956 | " pass\n", 957 | "\n", 958 | " else:\n", 959 | " do_run_method(t, hpatches_descripors, splt, res_path)\n", 960 | "\n", 961 | "# Add SIFT, ORB and others to the plots\n", 962 | "copied_descrs = copy_soa_descriptor_results(results_dir, splt['name'])\n", 963 | "descr_names = descr_names + copied_descrs\n", 964 | "logging.debug(\"--> Adding the following descriptors to the experiment: {}\".format(copied_descrs))\n", 965 | "\n", 966 | "hpatches_results = [DescriptorHPatchesResult(desc, splt, results_dir) for desc in descr_names]" 967 | ], 968 | "metadata": { 969 | "colab": { 970 | "base_uri": "https://localhost:8080/" 971 | }, 972 | "id": "h-wBUdTwTd3I", 973 | "outputId": "72c5fc23-2b42-4624-a537-00cadf30b97d" 974 | }, 975 | "execution_count": null, 976 | "outputs": [ 977 | { 978 | "output_type": "stream", 979 | "name": "stderr", 980 | "text": [ 981 | "Describing Hpatches with \"BEBLID-512\": 100%|██████████| 116/116 [00:52<00:00, 2.20it/s]\n" 982 | ] 983 | }, 984 | { 985 | "output_type": "stream", 986 | "name": "stdout", 987 | "text": [ 988 | ">> Evaluating \u001b[32mverification\u001b[0m task\n" 989 | ] 990 | }, 991 | { 992 | "output_type": "stream", 993 | "name": "stderr", 994 | "text": [ 995 | "Processing verification task 1/3 : 100%|██████████| 1000000/1000000 [00:26<00:00, 37509.16it/s]\n", 996 | "Processing verification task 2/3 : 100%|██████████| 1000000/1000000 [00:27<00:00, 36782.32it/s]\n", 997 | "Processing verification task 3/3 : 100%|██████████| 1000000/1000000 [00:28<00:00, 35315.52it/s]\n" 998 | ] 999 | }, 1000 | { 1001 | "output_type": "stream", 1002 | "name": "stdout", 1003 | "text": [ 1004 | ">> \u001b[32mVerification\u001b[0m task finished in 90 secs \n", 1005 | ">> Evaluating \u001b[32mmatching\u001b[0m task\n" 1006 | ] 1007 | }, 1008 | { 1009 | "output_type": "stream", 1010 | "name": "stderr", 1011 | "text": [ 1012 | "100%|██████████| 116/116 [01:05<00:00, 1.77it/s]\n" 1013 | ] 1014 | }, 1015 | { 1016 | "output_type": "stream", 1017 | "name": "stdout", 1018 | "text": [ 1019 | ">> \u001b[32mMatching\u001b[0m task finished in 65 secs \n", 1020 | ">> Evaluating \u001b[32mretrieval\u001b[0m task\n", 1021 | ">> Please wait, computing distance matrix...\n", 1022 | ">> Distance matrix done.\n" 1023 | ] 1024 | }, 1025 | { 1026 | "output_type": "stream", 1027 | "name": "stderr", 1028 | "text": [ 1029 | "Processing retrieval task: 100%|██████████| 10000/10000 [04:11<00:00, 39.80it/s]\n" 1030 | ] 1031 | }, 1032 | { 1033 | "output_type": "stream", 1034 | "name": "stdout", 1035 | "text": [ 1036 | ">> \u001b[32mRetrieval\u001b[0m task finished in 379 secs \n" 1037 | ] 1038 | }, 1039 | { 1040 | "output_type": "stream", 1041 | "name": "stderr", 1042 | "text": [ 1043 | "DEBUG:root:--> Adding the following descriptors to the experiment: ['orb', 'binboost', 'cvLATCH', 'LDAHashDIF128', 'sift', 'cvRSIFT', '64x64-CDbin-256', 'hardnet+', 'tfeat-margin-star', 'cvBRISK', 'DOAP-ST-Lib-256b', 'LDB', 'BiSIFT']\n" 1044 | ] 1045 | } 1046 | ] 1047 | }, 1048 | { 1049 | "cell_type": "code", 1050 | "source": [ 1051 | "# Plot results using matplotlib\n", 1052 | "logging.getLogger().setLevel(logging.INFO)\n", 1053 | "plot_hpatches_results(hpatches_results, output_dir, balanced_verification=False)\n", 1054 | "out_file = os.path.join(output_dir, 'hpatches_results.pdf')\n", 1055 | "logging.info(\"--> Comparison sucessfully generated in file \\\"{}\\\"\".format(out_file))" 1056 | ], 1057 | "metadata": { 1058 | "colab": { 1059 | "base_uri": "https://localhost:8080/", 1060 | "height": 459 1061 | }, 1062 | "id": "xLNu67LkQPh8", 1063 | "outputId": "3acf848a-addb-4c40-994f-029fbf3d1f4b" 1064 | }, 1065 | "execution_count": null, 1066 | "outputs": [ 1067 | { 1068 | "output_type": "stream", 1069 | "name": "stderr", 1070 | "text": [ 1071 | "INFO:root:--> Comparison sucessfully generated in file \"./hpatches_results.pdf\"\n" 1072 | ] 1073 | }, 1074 | { 1075 | "output_type": "display_data", 1076 | "data": { 1077 | "text/plain": [ 1078 | "
" 1079 | ], 1080 | "image/png": "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\n" 1081 | }, 1082 | "metadata": { 1083 | "needs_background": "light" 1084 | } 1085 | } 1086 | ] 1087 | }, 1088 | { 1089 | "cell_type": "code", 1090 | "source": [ 1091 | "from google.colab import files\n", 1092 | "files.download('hpatches_results.pdf')" 1093 | ], 1094 | "metadata": { 1095 | "id": "W5FtMPzzQ4R5", 1096 | "colab": { 1097 | "base_uri": "https://localhost:8080/", 1098 | "height": 17 1099 | }, 1100 | "outputId": "ee967583-d1fd-40eb-efff-b0ba372a4f9f" 1101 | }, 1102 | "execution_count": null, 1103 | "outputs": [ 1104 | { 1105 | "output_type": "display_data", 1106 | "data": { 1107 | "text/plain": [ 1108 | "" 1109 | ], 1110 | "application/javascript": [ 1111 | "\n", 1112 | " async function download(id, filename, size) {\n", 1113 | " if (!google.colab.kernel.accessAllowed) {\n", 1114 | " return;\n", 1115 | " }\n", 1116 | " const div = document.createElement('div');\n", 1117 | " const label = document.createElement('label');\n", 1118 | " label.textContent = `Downloading \"${filename}\": `;\n", 1119 | " div.appendChild(label);\n", 1120 | " const progress = document.createElement('progress');\n", 1121 | " progress.max = size;\n", 1122 | " div.appendChild(progress);\n", 1123 | " document.body.appendChild(div);\n", 1124 | "\n", 1125 | " const buffers = [];\n", 1126 | " let downloaded = 0;\n", 1127 | "\n", 1128 | " const channel = await google.colab.kernel.comms.open(id);\n", 1129 | " // Send a message to notify the kernel that we're ready.\n", 1130 | " channel.send({})\n", 1131 | "\n", 1132 | " for await (const message of channel.messages) {\n", 1133 | " // Send a message to notify the kernel that we're ready.\n", 1134 | " channel.send({})\n", 1135 | " if (message.buffers) {\n", 1136 | " for (const buffer of message.buffers) {\n", 1137 | " buffers.push(buffer);\n", 1138 | " downloaded += buffer.byteLength;\n", 1139 | " progress.value = downloaded;\n", 1140 | " }\n", 1141 | " }\n", 1142 | " }\n", 1143 | " const blob = new Blob(buffers, {type: 'application/binary'});\n", 1144 | " const a = document.createElement('a');\n", 1145 | " a.href = window.URL.createObjectURL(blob);\n", 1146 | " a.download = filename;\n", 1147 | " div.appendChild(a);\n", 1148 | " a.click();\n", 1149 | " div.remove();\n", 1150 | " }\n", 1151 | " " 1152 | ] 1153 | }, 1154 | "metadata": {} 1155 | }, 1156 | { 1157 | "output_type": "display_data", 1158 | "data": { 1159 | "text/plain": [ 1160 | "" 1161 | ], 1162 | "application/javascript": [ 1163 | "download(\"download_06acb3e4-debc-42e2-a51d-7b4dadc78a9e\", \"hpatches_results.pdf\", 139662)" 1164 | ] 1165 | }, 1166 | "metadata": {} 1167 | } 1168 | ] 1169 | }, 1170 | { 1171 | "cell_type": "code", 1172 | "source": [], 1173 | "metadata": { 1174 | "id": "DQw0ZtNqqpaI" 1175 | }, 1176 | "execution_count": null, 1177 | "outputs": [] 1178 | } 1179 | ], 1180 | "metadata": { 1181 | "colab": { 1182 | "provenance": [] 1183 | }, 1184 | "kernelspec": { 1185 | "display_name": "Python 3", 1186 | "name": "python3" 1187 | }, 1188 | "language_info": { 1189 | "name": "python" 1190 | } 1191 | }, 1192 | "nbformat": 4, 1193 | "nbformat_minor": 0 1194 | } -------------------------------------------------------------------------------- /demo.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function 2 | import cv2 as cv 3 | import numpy as np 4 | import argparse 5 | from math import sqrt 6 | 7 | parser = argparse.ArgumentParser(description='Code from AKAZE local features matching tutorial.') 8 | parser.add_argument('--input1', help='Path to input image 1.', default='graf1.png') 9 | parser.add_argument('--input2', help='Path to input image 2.', default='graf3.png') 10 | parser.add_argument('--homography', help='Path to the homography matrix.', default='H1to3p.xml') 11 | args = parser.parse_args() 12 | 13 | img1 = cv.imread(args.input1, cv.IMREAD_GRAYSCALE) 14 | img2 = cv.imread(args.input2, cv.IMREAD_GRAYSCALE) 15 | 16 | if img1 is None or img2 is None: 17 | print('Could not open or find the images!') 18 | exit(0) 19 | 20 | fs = cv.FileStorage(args.homography, cv.FILE_STORAGE_READ) 21 | homography = fs.getFirstTopLevelNode().mat() 22 | 23 | detector = cv.ORB_create(10000) 24 | # descriptor = cv.ORB_create() 25 | descriptor = cv.xfeatures2d.BEBLID_create(0.75) 26 | kpts1 = detector.detect(img1, None) 27 | kpts2 = detector.detect(img2, None) 28 | kpts1, desc1 = descriptor.compute(img1, kpts1) 29 | kpts2, desc2 = descriptor.compute(img2, kpts2) 30 | 31 | matcher = cv.DescriptorMatcher_create(cv.DescriptorMatcher_BRUTEFORCE_HAMMING) 32 | nn_matches = matcher.knnMatch(desc1, desc2, 2) 33 | matched1 = [] 34 | matched2 = [] 35 | nn_match_ratio = 0.8 # Nearest neighbor matching ratio 36 | for m, n in nn_matches: 37 | if m.distance < nn_match_ratio * n.distance: 38 | matched1.append(kpts1[m.queryIdx]) 39 | matched2.append(kpts2[m.trainIdx]) 40 | inliers1 = [] 41 | inliers2 = [] 42 | good_matches = [] 43 | inlier_threshold = 2.5 # Distance threshold to identify inliers with homography check 44 | for i, m in enumerate(matched1): 45 | # Create the homogeneous point 46 | col = np.ones((3, 1), dtype=np.float64) 47 | col[0:2, 0] = m.pt 48 | # Project from image 1 to image 2 49 | col = np.dot(homography, col) 50 | col /= col[2, 0] 51 | # Calculate euclidean distance 52 | dist = sqrt(pow(col[0, 0] - matched2[i].pt[0], 2) + \ 53 | pow(col[1, 0] - matched2[i].pt[1], 2)) 54 | if dist < inlier_threshold: 55 | good_matches.append(cv.DMatch(len(inliers1), len(inliers2), 0)) 56 | inliers1.append(matched1[i]) 57 | inliers2.append(matched2[i]) 58 | res = np.empty((max(img1.shape[0], img2.shape[0]), img1.shape[1] + img2.shape[1], 3), dtype=np.uint8) 59 | 60 | cv.drawMatches(img1, inliers1, img2, inliers2, good_matches, res) 61 | cv.imwrite("matching_result.png", res) 62 | inlier_ratio = len(inliers1) / float(len(matched1)) 63 | print('Matching Results') 64 | print('*******************************') 65 | print('# Keypoints 1: \t', len(kpts1)) 66 | print('# Keypoints 2: \t', len(kpts2)) 67 | print('# Matches: \t', len(matched1)) 68 | print('# Inliers: \t', len(inliers1)) 69 | print('# Inliers Ratio: \t', inlier_ratio) 70 | cv.imshow('result', res) 71 | cv.waitKey() 72 | -------------------------------------------------------------------------------- /expected-result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iago-suarez/beblid-opencv-demo/3ec4aefdde0869fd490c05709a1e760d6ef9d6e2/expected-result.png -------------------------------------------------------------------------------- /graf1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iago-suarez/beblid-opencv-demo/3ec4aefdde0869fd490c05709a1e760d6ef9d6e2/graf1.png -------------------------------------------------------------------------------- /graf3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iago-suarez/beblid-opencv-demo/3ec4aefdde0869fd490c05709a1e760d6ef9d6e2/graf3.png --------------------------------------------------------------------------------