Metadata-Version: 2.1
Name: ibeis
Version: 2.3.0
Summary: IBEIS - Image Based Ecological Information System
Home-page: https://github.com/Erotemic/ibeis
Author: ['Jon Crall', 'Jason Parham']
Author-email: erotemic@gmail.com
License: Apache 2
Classifier: Development Status :: 4 - Beta
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Requires-Python: >=3.7
Description-Content-Type: text/x-rst
License-File: LICENSE
Requires-Dist: flask
Requires-Dist: Pillow
Requires-Dist: pygments
Requires-Dist: boto
Requires-Dist: cachetools
Requires-Dist: colorama
Requires-Dist: dateutils
Requires-Dist: ipython
Requires-Dist: lockfile
Requires-Dist: matplotlib
Requires-Dist: networkx
Requires-Dist: numpy
Requires-Dist: pandas
Requires-Dist: parse
Requires-Dist: pyasn1
Requires-Dist: pyparsing
Requires-Dist: pyzmq
Requires-Dist: requests
Requires-Dist: scikit-image
Requires-Dist: scikit-learn
Requires-Dist: scipy
Requires-Dist: setuptools
Requires-Dist: simplejson
Requires-Dist: six
Requires-Dist: statsmodels
Requires-Dist: delorean
Requires-Dist: ubelt
Requires-Dist: futures-actors
Requires-Dist: utool
Requires-Dist: vtool-ibeis
Requires-Dist: dtool-ibeis
Requires-Dist: plottool-ibeis
Requires-Dist: guitool-ibeis
Requires-Dist: pyflann-ibeis
Requires-Dist: vtool-ibeis-ext
Requires-Dist: pyhesaff
Requires-Dist: pyqt5
Requires-Dist: pynmea2
Requires-Dist: tornado
Requires-Dist: psutil
Provides-Extra: all
Requires-Dist: flask ; extra == 'all'
Requires-Dist: Pillow ; extra == 'all'
Requires-Dist: pygments ; extra == 'all'
Requires-Dist: boto ; extra == 'all'
Requires-Dist: cachetools ; extra == 'all'
Requires-Dist: colorama ; extra == 'all'
Requires-Dist: dateutils ; extra == 'all'
Requires-Dist: ipython ; extra == 'all'
Requires-Dist: lockfile ; extra == 'all'
Requires-Dist: matplotlib ; extra == 'all'
Requires-Dist: networkx ; extra == 'all'
Requires-Dist: numpy ; extra == 'all'
Requires-Dist: pandas ; extra == 'all'
Requires-Dist: parse ; extra == 'all'
Requires-Dist: pyasn1 ; extra == 'all'
Requires-Dist: pyparsing ; extra == 'all'
Requires-Dist: pyzmq ; extra == 'all'
Requires-Dist: requests ; extra == 'all'
Requires-Dist: scikit-image ; extra == 'all'
Requires-Dist: scikit-learn ; extra == 'all'
Requires-Dist: scipy ; extra == 'all'
Requires-Dist: setuptools ; extra == 'all'
Requires-Dist: simplejson ; extra == 'all'
Requires-Dist: six ; extra == 'all'
Requires-Dist: statsmodels ; extra == 'all'
Requires-Dist: delorean ; extra == 'all'
Requires-Dist: ubelt ; extra == 'all'
Requires-Dist: futures-actors ; extra == 'all'
Requires-Dist: utool ; extra == 'all'
Requires-Dist: vtool-ibeis ; extra == 'all'
Requires-Dist: dtool-ibeis ; extra == 'all'
Requires-Dist: plottool-ibeis ; extra == 'all'
Requires-Dist: guitool-ibeis ; extra == 'all'
Requires-Dist: pyflann-ibeis ; extra == 'all'
Requires-Dist: vtool-ibeis-ext ; extra == 'all'
Requires-Dist: pyhesaff ; extra == 'all'
Requires-Dist: pyqt5 ; extra == 'all'
Requires-Dist: pynmea2 ; extra == 'all'
Requires-Dist: tornado ; extra == 'all'
Requires-Dist: psutil ; extra == 'all'
Requires-Dist: xdoctest ; extra == 'all'
Requires-Dist: pytest ; extra == 'all'
Requires-Dist: pytest-cov ; extra == 'all'
Requires-Dist: coverage ; extra == 'all'
Requires-Dist: codecov ; extra == 'all'
Requires-Dist: ansi2html ; extra == 'all'
Requires-Dist: autopep8 ; extra == 'all'
Requires-Dist: pyfiglet ; extra == 'all'
Requires-Dist: flask-cors ; extra == 'all'
Requires-Dist: pydot ; extra == 'all'
Requires-Dist: pydot-ng ; extra == 'all'
Requires-Dist: Flask-CAS ; extra == 'all'
Requires-Dist: Cython ; extra == 'all'
Requires-Dist: jupyter ; extra == 'all'
Provides-Extra: all-strict
Requires-Dist: flask (==0.10.1) ; extra == 'all-strict'
Requires-Dist: Pillow (==3.3.0) ; extra == 'all-strict'
Requires-Dist: pygments (==2.1.3) ; extra == 'all-strict'
Requires-Dist: boto (==2.20.1) ; extra == 'all-strict'
Requires-Dist: cachetools (==1.1.6) ; extra == 'all-strict'
Requires-Dist: colorama (==0.3.2) ; extra == 'all-strict'
Requires-Dist: dateutils (==0.6.6) ; extra == 'all-strict'
Requires-Dist: ipython (==5.0.0) ; extra == 'all-strict'
Requires-Dist: lockfile (==0.10.2) ; extra == 'all-strict'
Requires-Dist: matplotlib (==1.5.1) ; extra == 'all-strict'
Requires-Dist: networkx (==2.1) ; extra == 'all-strict'
Requires-Dist: numpy (==1.12.0) ; extra == 'all-strict'
Requires-Dist: pandas (==0.19.2) ; extra == 'all-strict'
Requires-Dist: parse (==1.6.6) ; extra == 'all-strict'
Requires-Dist: pyasn1 (==0.1.7) ; extra == 'all-strict'
Requires-Dist: pyparsing (==2.1.5) ; extra == 'all-strict'
Requires-Dist: pyzmq (==14.7.0) ; extra == 'all-strict'
Requires-Dist: requests (==2.5.0) ; extra == 'all-strict'
Requires-Dist: scikit-image (==0.12.3) ; extra == 'all-strict'
Requires-Dist: scikit-learn (==0.17.1) ; extra == 'all-strict'
Requires-Dist: scipy (==0.18.0) ; extra == 'all-strict'
Requires-Dist: setuptools (==34.1.0) ; extra == 'all-strict'
Requires-Dist: simplejson (==3.6.5) ; extra == 'all-strict'
Requires-Dist: six (==1.10.0) ; extra == 'all-strict'
Requires-Dist: statsmodels (==0.6.1) ; extra == 'all-strict'
Requires-Dist: delorean ; extra == 'all-strict'
Requires-Dist: ubelt (==0.8.7) ; extra == 'all-strict'
Requires-Dist: futures-actors (==0.0.5) ; extra == 'all-strict'
Requires-Dist: utool (==2.1.6) ; extra == 'all-strict'
Requires-Dist: vtool-ibeis (==2.1.0) ; extra == 'all-strict'
Requires-Dist: dtool-ibeis (==1.0.2) ; extra == 'all-strict'
Requires-Dist: plottool-ibeis (==2.1.0) ; extra == 'all-strict'
Requires-Dist: guitool-ibeis (==2.0.0) ; extra == 'all-strict'
Requires-Dist: pyflann-ibeis (==2.2.0) ; extra == 'all-strict'
Requires-Dist: vtool-ibeis-ext (==0.1.0) ; extra == 'all-strict'
Requires-Dist: pyhesaff (==2.1.0) ; extra == 'all-strict'
Requires-Dist: pyqt5 (==5.11.2) ; extra == 'all-strict'
Requires-Dist: pynmea2 (==1.5.3) ; extra == 'all-strict'
Requires-Dist: tornado (==4.2.1) ; extra == 'all-strict'
Requires-Dist: psutil (==5.9.0) ; extra == 'all-strict'
Requires-Dist: xdoctest (==0.3.0) ; extra == 'all-strict'
Requires-Dist: pytest (==3.3.1) ; extra == 'all-strict'
Requires-Dist: pytest-cov ; extra == 'all-strict'
Requires-Dist: coverage (==4.3.4) ; extra == 'all-strict'
Requires-Dist: codecov (==2.0.15) ; extra == 'all-strict'
Requires-Dist: ansi2html ; extra == 'all-strict'
Requires-Dist: autopep8 ; extra == 'all-strict'
Requires-Dist: pyfiglet ; extra == 'all-strict'
Requires-Dist: flask-cors ; extra == 'all-strict'
Requires-Dist: pydot ; extra == 'all-strict'
Requires-Dist: pydot-ng ; extra == 'all-strict'
Requires-Dist: Flask-CAS ; extra == 'all-strict'
Requires-Dist: Cython (==0.24) ; extra == 'all-strict'
Requires-Dist: jupyter ; extra == 'all-strict'
Provides-Extra: graphics
Provides-Extra: graphics-strict
Requires-Dist: opencv-python (==3.4.15.55) ; (python_version < "3.10" and python_version >= "3.9") and extra == 'graphics-strict'
Requires-Dist: opencv-python (==3.1.0.0) ; (python_version < "3.4" and python_version >= "2.7") and extra == 'graphics-strict'
Requires-Dist: opencv-python (==3.1.0.5) ; (python_version < "3.5" and python_version >= "3.4") and extra == 'graphics-strict'
Requires-Dist: opencv-python (==3.1.0.2) ; (python_version < "3.6" and python_version >= "3.5") and extra == 'graphics-strict'
Requires-Dist: opencv-python (==3.4.13.47) ; (python_version < "3.7" and python_version >= "3.6") and extra == 'graphics-strict'
Requires-Dist: opencv-python (==3.4.15.55) ; (python_version < "3.8" and python_version >= "3.7") and extra == 'graphics-strict'
Requires-Dist: opencv-python (==3.4.15.55) ; (python_version < "3.9" and python_version >= "3.8") and extra == 'graphics-strict'
Requires-Dist: opencv-python (==4.5.4.58) ; (python_version >= "3.10") and extra == 'graphics-strict'
Requires-Dist: opencv-python ; (python_version < "3.10" and python_version >= "3.9") and extra == 'graphics'
Requires-Dist: opencv-python ; (python_version < "3.4" and python_version >= "2.7") and extra == 'graphics'
Requires-Dist: opencv-python ; (python_version < "3.5" and python_version >= "3.4") and extra == 'graphics'
Requires-Dist: opencv-python ; (python_version < "3.6" and python_version >= "3.5") and extra == 'graphics'
Requires-Dist: opencv-python ; (python_version < "3.7" and python_version >= "3.6") and extra == 'graphics'
Requires-Dist: opencv-python ; (python_version < "3.8" and python_version >= "3.7") and extra == 'graphics'
Requires-Dist: opencv-python ; (python_version < "3.9" and python_version >= "3.8") and extra == 'graphics'
Requires-Dist: opencv-python ; (python_version >= "3.10") and extra == 'graphics'
Provides-Extra: headless
Provides-Extra: headless-strict
Requires-Dist: opencv-python-headless (==3.4.13.47) ; (python_version < "3.10" and python_version >= "3.9") and extra == 'headless-strict'
Requires-Dist: opencv-python-headless (==3.4.2.16) ; (python_version < "3.4" and python_version >= "2.7") and extra == 'headless-strict'
Requires-Dist: opencv-python-headless (==3.4.2.16) ; (python_version < "3.5" and python_version >= "3.4") and extra == 'headless-strict'
Requires-Dist: opencv-python-headless (==3.4.11.39) ; (python_version < "3.6" and python_version >= "3.5") and extra == 'headless-strict'
Requires-Dist: opencv-python-headless (==3.4.13.47) ; (python_version < "3.7" and python_version >= "3.6") and extra == 'headless-strict'
Requires-Dist: opencv-python-headless (==3.4.13.47) ; (python_version < "3.8" and python_version >= "3.7") and extra == 'headless-strict'
Requires-Dist: opencv-python-headless (==3.4.13.47) ; (python_version < "3.9" and python_version >= "3.8") and extra == 'headless-strict'
Requires-Dist: opencv-python-headless (==4.5.4.58) ; (python_version >= "3.10") and extra == 'headless-strict'
Requires-Dist: opencv-python-headless ; (python_version < "3.10" and python_version >= "3.9") and extra == 'headless'
Requires-Dist: opencv-python-headless ; (python_version < "3.4" and python_version >= "2.7") and extra == 'headless'
Requires-Dist: opencv-python-headless ; (python_version < "3.5" and python_version >= "3.4") and extra == 'headless'
Requires-Dist: opencv-python-headless ; (python_version < "3.6" and python_version >= "3.5") and extra == 'headless'
Requires-Dist: opencv-python-headless ; (python_version < "3.7" and python_version >= "3.6") and extra == 'headless'
Requires-Dist: opencv-python-headless ; (python_version < "3.8" and python_version >= "3.7") and extra == 'headless'
Requires-Dist: opencv-python-headless ; (python_version < "3.9" and python_version >= "3.8") and extra == 'headless'
Requires-Dist: opencv-python-headless ; (python_version >= "3.10") and extra == 'headless'
Provides-Extra: optional
Requires-Dist: ansi2html ; extra == 'optional'
Requires-Dist: autopep8 ; extra == 'optional'
Requires-Dist: pyfiglet ; extra == 'optional'
Requires-Dist: flask-cors ; extra == 'optional'
Requires-Dist: pydot ; extra == 'optional'
Requires-Dist: pydot-ng ; extra == 'optional'
Requires-Dist: Flask-CAS ; extra == 'optional'
Requires-Dist: Cython ; extra == 'optional'
Requires-Dist: jupyter ; extra == 'optional'
Provides-Extra: optional-strict
Requires-Dist: ansi2html ; extra == 'optional-strict'
Requires-Dist: autopep8 ; extra == 'optional-strict'
Requires-Dist: pyfiglet ; extra == 'optional-strict'
Requires-Dist: flask-cors ; extra == 'optional-strict'
Requires-Dist: pydot ; extra == 'optional-strict'
Requires-Dist: pydot-ng ; extra == 'optional-strict'
Requires-Dist: Flask-CAS ; extra == 'optional-strict'
Requires-Dist: Cython (==0.24) ; extra == 'optional-strict'
Requires-Dist: jupyter ; extra == 'optional-strict'
Provides-Extra: runtime-strict
Requires-Dist: flask (==0.10.1) ; extra == 'runtime-strict'
Requires-Dist: Pillow (==3.3.0) ; extra == 'runtime-strict'
Requires-Dist: pygments (==2.1.3) ; extra == 'runtime-strict'
Requires-Dist: boto (==2.20.1) ; extra == 'runtime-strict'
Requires-Dist: cachetools (==1.1.6) ; extra == 'runtime-strict'
Requires-Dist: colorama (==0.3.2) ; extra == 'runtime-strict'
Requires-Dist: dateutils (==0.6.6) ; extra == 'runtime-strict'
Requires-Dist: ipython (==5.0.0) ; extra == 'runtime-strict'
Requires-Dist: lockfile (==0.10.2) ; extra == 'runtime-strict'
Requires-Dist: matplotlib (==1.5.1) ; extra == 'runtime-strict'
Requires-Dist: networkx (==2.1) ; extra == 'runtime-strict'
Requires-Dist: numpy (==1.12.0) ; extra == 'runtime-strict'
Requires-Dist: pandas (==0.19.2) ; extra == 'runtime-strict'
Requires-Dist: parse (==1.6.6) ; extra == 'runtime-strict'
Requires-Dist: pyasn1 (==0.1.7) ; extra == 'runtime-strict'
Requires-Dist: pyparsing (==2.1.5) ; extra == 'runtime-strict'
Requires-Dist: pyzmq (==14.7.0) ; extra == 'runtime-strict'
Requires-Dist: requests (==2.5.0) ; extra == 'runtime-strict'
Requires-Dist: scikit-image (==0.12.3) ; extra == 'runtime-strict'
Requires-Dist: scikit-learn (==0.17.1) ; extra == 'runtime-strict'
Requires-Dist: scipy (==0.18.0) ; extra == 'runtime-strict'
Requires-Dist: setuptools (==34.1.0) ; extra == 'runtime-strict'
Requires-Dist: simplejson (==3.6.5) ; extra == 'runtime-strict'
Requires-Dist: six (==1.10.0) ; extra == 'runtime-strict'
Requires-Dist: statsmodels (==0.6.1) ; extra == 'runtime-strict'
Requires-Dist: delorean ; extra == 'runtime-strict'
Requires-Dist: ubelt (==0.8.7) ; extra == 'runtime-strict'
Requires-Dist: futures-actors (==0.0.5) ; extra == 'runtime-strict'
Requires-Dist: utool (==2.1.6) ; extra == 'runtime-strict'
Requires-Dist: vtool-ibeis (==2.1.0) ; extra == 'runtime-strict'
Requires-Dist: dtool-ibeis (==1.0.2) ; extra == 'runtime-strict'
Requires-Dist: plottool-ibeis (==2.1.0) ; extra == 'runtime-strict'
Requires-Dist: guitool-ibeis (==2.0.0) ; extra == 'runtime-strict'
Requires-Dist: pyflann-ibeis (==2.2.0) ; extra == 'runtime-strict'
Requires-Dist: vtool-ibeis-ext (==0.1.0) ; extra == 'runtime-strict'
Requires-Dist: pyhesaff (==2.1.0) ; extra == 'runtime-strict'
Requires-Dist: pyqt5 (==5.11.2) ; extra == 'runtime-strict'
Requires-Dist: pynmea2 (==1.5.3) ; extra == 'runtime-strict'
Requires-Dist: tornado (==4.2.1) ; extra == 'runtime-strict'
Requires-Dist: psutil (==5.9.0) ; extra == 'runtime-strict'
Provides-Extra: tests
Requires-Dist: xdoctest ; extra == 'tests'
Requires-Dist: pytest ; extra == 'tests'
Requires-Dist: pytest-cov ; extra == 'tests'
Requires-Dist: coverage ; extra == 'tests'
Requires-Dist: codecov ; extra == 'tests'
Provides-Extra: tests-strict
Requires-Dist: xdoctest (==0.3.0) ; extra == 'tests-strict'
Requires-Dist: pytest (==3.3.1) ; extra == 'tests-strict'
Requires-Dist: pytest-cov ; extra == 'tests-strict'
Requires-Dist: coverage (==4.3.4) ; extra == 'tests-strict'
Requires-Dist: codecov (==2.0.15) ; extra == 'tests-strict'

|ReadTheDocs| |Pypi| |Downloads| |Codecov| |GithubActions| 


.. image:: https://i.imgur.com/L0k84xQ.png

This project is a component of the WildMe / WildBook project: See https://github.com/WildbookOrg/

NOTE: This IBEIS software is the result of my (Jon Crall's) PhD work. After I
graduated, the image analysis components of IBEIS and the core HotSpotter
program have been transferred and are now being developed by the WildMe
organization. While this software is maintained and supported, it can only
handle medium scale populations and its it GUI interface can be difficult to
work with. If you have a larger population or the need for simpler and scalable
web interfaces  please reach out to the WildMe project at services@wildme.org
(more info: https://www.wildme.org/#/services/ ). 


IBEIS - Image Analysis 
----------------------

I.B.E.I.S. = Image Based Ecological Information System
------------------------------------------------------

.. image:: http://i.imgur.com/TNCiEBe.png
    :alt: "(Note: the rhino and wildebeest mathces may be dubious. Other species do work well though")


Installation Instructions (updated 2020-Nov-01)
-----------------------------------------------

The IBEIS software is now available on `pypi
<https://pypi.org/project/ibeis/>`_ for Linux systems. This means if you have
`Python installed
<https://xdoctest.readthedocs.io/en/latest/installing_python.html>`_. You can
simply run:


.. code:: bash

    pip install ibeis

to install the software. Then the command to run the GUI is:


.. code:: bash

    ibeis

On Windows / OSX I recommend using a Linux virtual machine. However, if you are
computer savvy it is possible to build all of the requirements on from source.
The only tricky components are installing the packages with binary
dependencies: ``pyhesaff`` and ``vtool_ibeis``. If you have these built then
the rest of the dependencies can be installed from pypi even on OSX / Windows.

NOTE: When using a VM on windows, you may encounter an error:

.. code:: 

    qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in 
    ... even though it was found. This application failed to start because no
    Qt platform plugin could be initialized. Reinstalling the application may
    fix this problem.

    Available platform plugins are: xcb, eglfs, ...

    Core dumped

The reason the issue happens appears to be because the opencv-python package
includes libraries also packaged with PyQt5 and those are conflicting. 

The workaround is to uninstall opencv-python and then install a variant that
does not include extra Qt libs:

.. code:: bash

    pip uninstall opencv-python
    pip install opencv-python-headless

    
Basic Usage (updated 2020-Nov-01)
---------------------------------

After installation running the ``ibeis`` command will open the GUI:


If you have already made a database, it will automatically open the most recently used database.

.. image:: https://i.imgur.com/xXF7w8P.png

If this is the first time you've run the program it will not have a database opened:

.. image:: https://i.imgur.com/Ey9Urcv.png

Select new database, (which will first ask you to select a work directory where all of your databases will live).
Then you will be asked to create a database name. Select one and then create the database in your work directory.


You can drag and drop images into the GUI to add them to the database.  Double
clicking an image lets you add "annotations":


.. image:: https://i.imgur.com/t0LQZot.png

You can also right click one or more images and click "Add annotations from
entire images" if your images are already localized to a single individual.

It important than when you add an annotation, you set its species. You can
right click multiple annotations and click "set annotation species". Change
this to anything other than "____".

Once you have annotations with species, you can click one and press "q" to
query for matches in the database of other annotations:


.. image:: https://i.imgur.com/B0ilafa.png

Right clicking and marking each match as "True" or "False" (or alternatively
selecting a row and pressing "T" or "F") will mark images as the same or
different individuals. Groups marked as the same individual will appear in the
"Tree of Names".

Note there are also batch identification methods in the "ID Encounters" "ID
Exemplars" and "Advanced ID Interface" (my personal recommendation). Play
around with different right-click menus (although note that some of these are
buggy and will crash the program), but the main simple identification
procedures are robust and should not crash.


Program Description
-------------------

IBEIS program for the storage and management of images and derived data for
use in computer vision algorithms. It aims to compute who an animal is, what
species an animal is, and where an animal is with the ultimate goal being to
ask important why biological questions.  This This repo Image Analysis image
analysis module of IBEIS. It is both a python module and standalone program. 

Currently the system is build around and SQLite database, a PyQt4 / PyQt5 GUI,
and matplotlib visualizations. Algorithms employed are: random forest species
detection and localization, hessian-affine keypoint detection, SIFT keypoint
description, LNBNN identification using approximate nearest neighbors.
Algorithms in development are SMK (selective match kernel) for identification
and deep neural networks for detection and localization. 

The core of IBEIS is the IBEISController class. It provides an API into IBEIS
data management and algorithms. The IBEIS API Documentation can be found here:
`http://erotemic.github.io/ibeis`

The IBEIS GUI (graphical user interface) is built on top of the API. 
We are also experimenting with a new web frontend that bypasses the older GUI code.

Self Installing Executables
---------------------------

Unfortunately we have not released self-installing-executables for IBEIS yet. 
We ~plan~ hope to release these "soon". 

However there are old HotSpotter (the software which IBEIS is based on)
binaries available. These can be downloaded from: `http://cs.rpi.edu/hotspotter/`

Visual Demo
-----------


.. image:: http://i.imgur.com/QWrzf9O.png
   :width: 600
   :alt: Feature Extraction

.. image:: http://i.imgur.com/iMHKEDZ.png
   :width: 600
   :alt: Nearest Neighbors


Match Scoring 
-------------

.. image:: http://imgur.com/Hj43Xxy.png
   :width: 600
   :alt: Match Inspection

Spatial Verification
--------------------

.. image:: http://i.imgur.com/VCz0j9C.jpg
   :width: 600
   :alt: sver


.. code:: bash

    python -m vtool.spatial_verification --test-spatially_verify_kpts --show

Name Scoring
------------

.. image:: http://i.imgur.com/IDUnxu2.jpg
   :width: 600
   :alt: namematch


.. code:: bash

    python -m ibeis.algo.hots.chip_match show_single_namematch --qaid 1 --show

Identification Ranking 
----------------------

.. image:: http://i.imgur.com/BlajchI.jpg
   :width: 600
   :alt: rankedmatches


.. code:: bash

    python -m ibeis.algo.hots.chip_match show_ranked_matches --show --qaid 86

Inference
---------

.. image:: http://i.imgur.com/RYeeENl.jpg
   :width: 600
   :alt: encgraph


.. code:: bash

    # broken
    # python -m ibeis.algo.preproc.preproc_encounter compute_encounter_groups --show

Internal Modules
----------------

In the interest of modular code we are actively developing several different modules. 


|ibeisGithubActions|
|utoolGithubActions|
|vtool_ibeisGithubActions|
|plottool_ibeisGithubActions|
|guitool_ibeisGithubActions|
|pyhesaffGithubActions|
|pyflann_ibeisGithubActions|
|vtool_ibeis_extGithubActions|

.. |ibeisGithubActions| image:: https://github.com/Erotemic/ibeis/actions/workflows/tests.yml/badge.svg?branch=main
    :target: https://github.com/Erotemic/ibeis/actions?query=branch%3Amain
.. |utoolGithubActions| image:: https://github.com/Erotemic/utool/actions/workflows/tests.yml/badge.svg?branch=main
    :target: https://github.com/Erotemic/utool/actions?query=branch%3Amain
.. |vtool_ibeisGithubActions| image:: https://github.com/Erotemic/vtool_ibeis/actions/workflows/tests.yml/badge.svg?branch=main
    :target: https://github.com/Erotemic/vtool_ibeis/actions?query=branch%3Amain
.. |plottool_ibeisGithubActions| image:: https://github.com/Erotemic/plottool_ibeis/actions/workflows/tests.yml/badge.svg?branch=main
    :target: https://github.com/Erotemic/plottool_ibeis/actions?query=branch%3Amain
.. |guitool_ibeisGithubActions| image:: https://github.com/Erotemic/guitool_ibeis/actions/workflows/tests.yml/badge.svg?branch=main
    :target: https://github.com/Erotemic/guitool_ibeis/actions?query=branch%3Amain
.. |pyhesaffGithubActions| image:: https://github.com/Erotemic/pyhesaff/actions/workflows/binary_test.yml/badge.svg?branch=main
    :target: https://github.com/Erotemic/pyhesaff/actions?query=branch%3Amain
.. |pyflann_ibeisGithubActions| image:: https://github.com/Erotemic/pyflann_ibeis/actions/workflows/binary_test.yml/badge.svg?branch=main
    :target: https://github.com/Erotemic/pyflann_ibeis/actions?query=branch%3Amain
.. |vtool_ibeis_extGithubActions| image:: https://github.com/Erotemic/vtool_ibeis_ext/actions/workflows/binary_test.yml/badge.svg?branch=main
    :target: https://github.com/Erotemic/vtool_ibeis_ext/actions?query=branch%3Amain



Erotemic's IBEIS Image Analysis module dependencies 

* https://github.com/Erotemic/utool

* https://github.com/Erotemic/plottool_ibeis
* https://github.com/Erotemic/vtool_ibeis
* https://github.com/Erotemic/guitool_ibeis
* https://github.com/Erotemic/pyflann_ibeis

* https://github.com/Erotemic/hesaff
* https://github.com/Erotemic/futures_actors


bluemellophone's IBEIS Image Analysis modules

* https://github.com/WildbookOrg/detecttools
* https://github.com/WildbookOrg/pyrf
  docs: http://bluemellophone.github.io/pyrf


The IBEIS module itself: 

* https://github.com/WildbookOrg/ibeis

IBEIS Development Environment Setup 
------------------------------------

.. code:: bash

    # The following install script install ibeis and all dependencies. 
    # If it doesnt you can look at the older instructions which follow
    # and try to figure it out. After running this you should have a code
    # directory with all of the above repos. 

    # Navigate to your code directory
    export CODE_DIR=~/code
    mkdir $CODE_DIR
    cd $CODE_DIR

    # Clone IBEIS
    git clone https://github.com/Erotemic/ibeis.git
    cd ibeis

    # Install the requirements for super_setup
    pip install -r requirements/super_setup.txt

    # Install the development requirements (note-these are now all on pypi, so
    # this is not strictly necessary)
    python super_setup.py ensure

    # NOTE: you can use super_setup to do several things
    python super_setup.py --help
    python super_setup.py versions
    python super_setup.py status
    python super_setup.py check
    python super_setup.py pull

    # Run the run_developer_setup.sh file in each development repo
    python super_setup.py develop

    # Or you can also just do to use pypi versions of dev repos:
    python setup.py develop

    # Optional: set a workdir and download a test dataset
    .python -m ibeis.dev 
    .python -m ibeis.dev -t mtest 
    python -m ibeis.dev -t nauts 
    ./reset_dbs.py

    python -m ibeis --set-workdir ~/data/work --preload-exit
    python -m ibeis -e ensure_mtest

    # make sure everyhing is set up correctly
    python -m ibeis --db PZ_MTEST


Running Tests
-------------

The new way of running tests is with xdoctest, or using the "run_doctests.sh" script.


Example usage
--------------

(Note: This list is far from complete, and some commands may be outdated)

.. code:: bash

    #--------------------
    # Main Commands
    #--------------------
    python -m ibeis.main <optional-arguments> [--help]
    python -m ibeis.dev <optional-arguments> [--help]
    # main is the standard entry point to the program
    # dev is a more advanced developer entry point

    # ** NEW 7-23-2015 **: the following commands are now equivalent and do not
    # have to be specified from the ibeis source dir if ibeis is installed
    python -m ibeis <optional-arguments> [--help]
    python -m ibeis.dev <optional-arguments> [--help]

    # Useful flags.
    # Read code comments in dev.py for more info.
    # Careful some commands don't work. Most do.
    # --cmd          # shows ipython prompt with useful variables populated
    # -w, --wait     # waits (useful for showing plots)
    # --gui          # starts the gui as well (dev.py does not show gui by default, main does)
    # --web          # runs the program as a web server
    # --quiet        # turns off most prints
    # --verbose      # turns on verbosity
    # --very-verbose # turns on extra verbosity
    # --debug2       # runs extra checks
    # --debug-print  # shows where print statments occur
    # -t [test]


    #--------------------
    # PSA: Workdirs:
    #--------------------
    # IBEIS uses the idea of a work directory for databases.
    # Use --set-workdir <path> to set your own, or a gui will popup and ask you about it
    ./main.py --set-workdir /raid/work --preload-exit
    ./main.py --set-logdir /raid/logs/ibeis --preload-exit

    python -m ibeis.dev --set-workdir ~/data/work --preload-exit

    # use --db to specify a database in your WorkDir
    # --setdb makes that directory your default directory
    python -m ibeis.dev --db <dbname> --setdb

    # Or just use the absolute path
    python -m ibeis.dev --dbdir <full-dbpath>


    #--------------------
    # Examples:
    # Here are are some example commands
    #--------------------
    # Run the queries for each roi with groundtruth in the PZ_MTEST database
    # using the best known configuration of parameters
    python -m ibeis.dev --db PZ_MTEST --allgt -t best
    python -m ibeis.dev --db PZ_MTEST --allgt -t score


    # View work dir
    python -m ibeis.dev --vwd --prequit

    # List known databases
    python -m ibeis.dev -t list_dbs


    # Dump/Print contents of params.args as a dict
    python -m ibeis.dev --prequit --dump-argv

    # Dump Current SQL Schema to stdout 
    python -m ibeis.dev --dump-schema --postquit


    #------------------
    # Convert a hotspotter database to IBEIS
    #------------------

    # NEW: You can simply open a hotspotter database and it will be converted to IBEIS
    python -m ibeis convert_hsdb_to_ibeis --dbdir <path_to_hsdb>

    # This script will exlicitly conver the hsdb
    python -m ibeis convert_hsdb_to_ibeis --hsdir <path_to_hsdb> --dbdir <path_to_newdb>

    #---------
    # Ingest examples
    #---------
    # Ingest raw images
    python -m ibeis.dbio.ingest_database --db JAG_Kieryn

    #---------
    # Run Tests
    #---------
    ./run_tests.py

    #----------------
    # Test Commands
    #----------------
    # Set a default DB First
    python -m ibeis.dev --setdb --dbdir /path/to/your/DBDIR
    python -m ibeis.dev --setdb --db YOURDB
    python -m ibeis.dev --setdb --db PZ_MTEST
    python -m ibeis.dev --setdb --db PZ_FlankHack

    # List all available tests
    python -m ibeis.dev -t help
    # Minimal Database Statistics
    python -m ibeis.dev --allgt -t info
    # Richer Database statistics
    python -m ibeis.dev --allgt -t dbinfo
    # Print algorithm configurations
    python -m ibeis.dev -t printcfg
    # Print database tables
    python -m ibeis.dev -t tables
    # Print only the image table
    python -m ibeis.dev -t imgtbl
    # View data directory in explorer/finder/nautilus
    python -m ibeis.dev -t vdd

    # List all IBEIS databases
    python -m ibeis list_dbs
    # Delete cache
    python -m ibeis delete_cache --db testdb1


    # Show a single annotations
    python -m ibeis.viz.viz_chip show_chip --db PZ_MTEST --aid 1 --show
    # Show annotations 1, 3, 5, and 11
    python -m ibeis.viz.viz_chip show_many_chips --db PZ_MTEST --aids=1,3,5,11 --show


    # Database Stats for all our important datasets:
    python -m ibeis.dev --allgt -t dbinfo --db PZ_MTEST | grep -F "[dbinfo]"

    # Some mass editing of metadata
    python -m ibeis.dev --db PZ_FlankHack --edit-notes
    python -m ibeis.dev --db GZ_Siva --edit-notes
    python -m ibeis.dev --db GIR_Tanya --edit-notes
    python -m ibeis.dev --allgt -t dbinfo --db GZ_ALL --set-all-species zebra_grevys

    # Current Experiments:

    # Main experiments
    python -m ibeis --tf draw_annot_scoresep --db PZ_MTEST -a default -t best --show
    python -m ibeis.dev -e draw_rank_cdf --db PZ_MTEST --show -a timectrl
    # Show disagreement cases
    ibeis --tf draw_match_cases --db PZ_MTEST -a default:size=20 \
        -t default:K=[1,4] \
        --filt :disagree=True,index=0:4 --show

    # SMK TESTS
    python -m ibeis.dev -t smk2 --allgt --db PZ_MTEST --nocache-big --nocache-query --qindex 0:20
    python -m ibeis.dev -t smk2 --allgt --db PZ_MTEST --qindex 20:30 --va

    # Feature Tuning
    python -m ibeis.dev -t test_feats -w --show --db PZ_MTEST --allgt --qindex 1:2

    python -m ibeis.dev -t featparams -w --show --db PZ_MTEST --allgt
    python -m ibeis.dev -t featparams_big -w --show --db PZ_MTEST --allgt

    # NEW DATABASE TEST
    python -m ibeis.dev -t best --db seals2 --allgt

    # Testing Distinctivness Parameters
    python -m ibeis.algo.hots.distinctiveness_normalizer --test-get_distinctiveness --show --db GZ_ALL --aid 2
    python -m ibeis.algo.hots.distinctiveness_normalizer --test-get_distinctiveness --show --db PZ_MTEST --aid 10
    python -m ibeis.algo.hots.distinctiveness_normalizer --test-test_single_annot_distinctiveness_params --show --db GZ_ALL --aid 2

    # 2D Gaussian Curves
    python -m vtool_ibeis.patch --test-test_show_gaussian_patches2 --show

    # Test Keypoint Coverage
    python -m vtool_ibeis.coverage_kpts --test-gridsearch_kpts_coverage_mask --show
    python -m vtool_ibeis.coverage_kpts --test-make_kpts_coverage_mask --show

    # Test Grid Coverage
    python -m vtool_ibeis.coverage_grid --test-gridsearch_coverage_grid_mask --show
    python -m vtool_ibeis.coverage_grid --test-sparse_grid_coverage --show
    python -m vtool_ibeis.coverage_grid --test-gridsearch_coverage_grid --show

    # Test Spatially Constrained Scoring
    python -m ibeis.algo.hots.vsone_pipeline --test-compute_query_constrained_matches --show
    python -m ibeis.algo.hots.vsone_pipeline --test-gridsearch_constrained_matches --show

    # Test VsMany ReRanking
    python -m ibeis.algo.hots.vsone_pipeline --test-vsone_reranking --show
    python -m ibeis.algo.hots.vsone_pipeline --test-vsone_reranking --show --homog

    # Problem cases with the back spot
    python -m ibeis.algo.hots.vsone_pipeline --test-vsone_reranking --show --homog --db GZ_ALL --qaid 425
    python -m ibeis.algo.hots.vsone_pipeline --test-vsone_reranking --show --homog --db GZ_ALL --qaid 662
    python -m ibeis.dev -t custom:score_method=csum,prescore_method=csum --db GZ_ALL --show --va -w --qaid 425 --noqcache
    # Shows vsone results with some of the competing cases
    python -m ibeis.algo.hots.vsone_pipeline --test-vsone_reranking --show --homog --db GZ_ALL --qaid 662 --daid_list=425,342,678,233

    # More rerank vsone tests
    python -c "import utool as ut; ut.write_modscript_alias('Tbig.sh', 'dev.py', '--allgt  --db PZ_Master0')"
    sh Tbig.sh -t custom:rrvsone_on=True custom 
    sh Tbig.sh -t custom:rrvsone_on=True custom --noqcache

    #----
    # Turning back on name scoring and feature scoring and restricting to rerank a subset
    # This gives results that are closer to what we should actually expect
    python -m ibeis.dev --allgt -t custom \
        custom:rrvsone_on=True,prior_coeff=1.0,unconstrained_coeff=0.0,fs_lnbnn_min=0,fs_lnbnn_max=1 \
        custom:rrvsone_on=True,prior_coeff=0.5,unconstrained_coeff=0.5,fs_lnbnn_min=0,fs_lnbnn_max=1 \
        custom:rrvsone_on=True,prior_coeff=0.1,unconstrained_coeff=0.9,fs_lnbnn_min=0,fs_lnbnn_max=1 \
        --print-bestcfg
    #----

    #----
    # VsOneRerank Tuning: Tune linar combination
    python -m ibeis.dev --allgt -t \
        custom:fg_weight=0.0 \
    \
        custom:rrvsone_on=True,prior_coeff=1.0,unconstrained_coeff=0.0,fs_lnbnn_min=0.0,fs_lnbnn_max=1.0,nAnnotPerNameVsOne=200,nNameShortlistVsone=200 \
    \
        custom:rrvsone_on=True,prior_coeff=.5,unconstrained_coeff=0.5,fs_lnbnn_min=0.0,fs_lnbnn_max=1.0,nAnnotPerNameVsOne=200,nNameShortlistVsone=200 \
    \
      --db PZ_MTEST
    #--print-confusion-stats --print-gtscore
    #----

    # Testing no affine invaraiance and rotation invariance
    python -m ibeis.dev -t custom:AI=True,RI=True custom:AI=False,RI=True custom:AI=True,RI=False custom:AI=False,RI=False --db PZ_MTEST --show

Caveats / Things we are not currently doing
-------------------------------------------

* We do not add or remove points from kdtrees. They are always rebuilt

.. |CircleCI| image:: https://circleci.com/gh/Erotemic/ibeis.svg?style=svg
    :target: https://circleci.com/gh/Erotemic/ibeis
.. |Travis| image:: https://img.shields.io/travis/Erotemic/ibeis/master.svg?label=Travis%20CI
   :target: https://travis-ci.org/Erotemic/ibeis?branch=master
.. |Appveyor| image:: https://ci.appveyor.com/api/projects/status/github/Erotemic/ibeis?branch=master&svg=True
   :target: https://ci.appveyor.com/project/Erotemic/ibeis/branch/master
.. |Codecov| image:: https://codecov.io/github/Erotemic/ibeis/badge.svg?branch=master&service=github
   :target: https://codecov.io/github/Erotemic/ibeis?branch=master
.. |Pypi| image:: https://img.shields.io/pypi/v/ibeis.svg
   :target: https://pypi.python.org/pypi/ibeis
.. |Downloads| image:: https://img.shields.io/pypi/dm/ibeis.svg
   :target: https://pypistats.org/packages/ibeis
.. |ReadTheDocs| image:: https://readthedocs.org/projects/ibeis/badge/?version=latest
    :target: http://ibeis.readthedocs.io/en/latest/
.. |GithubActions| image:: https://github.com/Erotemic/ibeis/actions/workflows/tests.yml/badge.svg?branch=main
    :target: https://github.com/Erotemic/ibeis/actions?query=branch%3Amain
