diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6489c109f75951127ce5701f50389680dea3b440..7622b06458e60461240597f833cb2377661d8ade 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,249 +1,143 @@ -# This build file heavily uses template features from YAML so it is generic -# enough for any Bob project. Don't modify it unless you know what you're -# doing. +# This build file uses template features from YAML so it is generic enough for +# any Bob project. Don't modify it unless you know what you're doing. +# Definition of global variables (all stages) +variables: + CONDA_ROOT: "${CI_PROJECT_DIR}/miniconda" -# Definition of our build pipeline + +# Definition of our build pipeline order stages: - build - - test - - docs - - wheels - deploy + - pypi -# --------- -# Templates -# --------- - -# Template for the build stage -# Needs to run on all supported architectures, platforms and python versions +# Build targets .build_template: &build_job stage: build before_script: - - git clean -ffdx - mkdir _ci - curl --silent "https://gitlab.idiap.ch/bob/bob.admin/raw/master/gitlab/install.sh" > _ci/install.sh - chmod 755 _ci/install.sh - - ./_ci/install.sh _ci #updates + - ./_ci/install.sh _ci master #installs ci support scripts - ./_ci/before_build.sh script: - ./_ci/build.sh after_script: - ./_ci/after_build.sh - artifacts: - expire_in: 1 week + cache: &build_caches paths: - - _ci/ - - dist/ - - sphinx/ - - -# Template for the test stage - re-installs from uploaded wheels -# Needs to run on all supported architectures, platforms and python versions -.test_template: &test_job - stage: test - before_script: - - ./_ci/install.sh _ci #updates - - ./_ci/before_test.sh - script: - - ./_ci/test.sh - after_script: - - ./_ci/after_test.sh - - -# Template for the wheel uploading stage -# Needs to run against one supported architecture, platform and python version -.wheels_template: &wheels_job - stage: wheels - environment: intranet - only: - - master - - /^v\d+\.\d+\.\d+([abc]\d*)?$/ # PEP-440 compliant version (tags) - before_script: - - ./_ci/install.sh _ci #updates - - ./_ci/before_wheels.sh - script: - - ./_ci/wheels.sh - after_script: - - ./_ci/after_wheels.sh - - -# Template for (latest) documentation upload stage -# Only one real job needs to do this -.docs_template: &docs_job - stage: docs - environment: intranet - only: - - master - before_script: - - ./_ci/install.sh _ci #updates - - ./_ci/before_docs.sh - script: - - ./_ci/docs.sh - after_script: - - ./_ci/after_docs.sh - - -# Template for the deployment stage - re-installs from uploaded wheels -# Needs to run on a single architecture only -# Will deploy your package to PyPI and other required services -# Only runs for tags -.deploy_template: &deploy_job - stage: deploy - environment: internet - only: - - /^v\d+\.\d+\.\d+([abc]\d*)?$/ # PEP-440 compliant version (tags) - except: - - branches - before_script: - - ./_ci/install.sh _ci #updates - - ./_ci/before_deploy.sh - script: - - ./_ci/deploy.sh - after_script: - - ./_ci/after_deploy.sh - + - miniconda.sh + - ${CONDA_ROOT}/pkgs/*.tar.bz2 + - ${CONDA_ROOT}/pkgs/urls.txt -# ------------- -# Build Targets -# ------------- -# Linux + Python 2.7: Builds, tests, uploads wheel and deploys (if needed) -build_linux_27: +.build_linux_template: &linux_build_job <<: *build_job - variables: &linux_27_build_variables - PYTHON_VERSION: "2.7" - WHEEL_TAG: "py27" - tags: - - conda-linux - -test_linux_27: - <<: *test_job - variables: *linux_27_build_variables - dependencies: - - build_linux_27 - tags: - - conda-linux - -wheels_linux_27: - <<: *wheels_job - variables: *linux_27_build_variables - dependencies: - - build_linux_27 - tags: - - conda-linux - -deploy_linux_27: - <<: *deploy_job - variables: *linux_27_build_variables - dependencies: - - build_linux_27 tags: - - conda-linux + - docker + image: continuumio/conda-concourse-ci + artifacts: + expire_in: 1 week + paths: + - _ci/ + - ${CONDA_ROOT}/conda-bld/linux-64/*.tar.bz2 + cache: + <<: *build_caches + key: "linux-cache" -# Linux + Python 3.5: Builds, tests and uploads wheel -build_linux_35: +.build_macosx_template: &macosx_build_job <<: *build_job - variables: &linux_35_build_variables - PYTHON_VERSION: "3.5" - WHEEL_TAG: "py3" - tags: - - conda-linux - -test_linux_35: - <<: *test_job - variables: *linux_35_build_variables - dependencies: - - build_linux_35 tags: - - conda-linux + - macosx + artifacts: + expire_in: 1 week + paths: + - _ci/ + - ${CONDA_ROOT}/conda-bld/osx-64/*.tar.bz2 + cache: + <<: *build_caches + key: "macosx-cache" -wheels_linux_35: - <<: *wheels_job - variables: *linux_35_build_variables - dependencies: - - build_linux_35 - tags: - - conda-linux -docs_linux_35: - <<: *docs_job - variables: *linux_35_build_variables - dependencies: - - build_linux_35 - tags: - - conda-linux +build_linux_27: + <<: *linux_build_job + variables: + PYTHON_VERSION: "2.7" -# Linux + Python 3.6: Builds and tests build_linux_36: - <<: *build_job - variables: &linux_36_build_variables + <<: *linux_build_job + variables: PYTHON_VERSION: "3.6" - WHEEL_TAG: "py3" - tags: - - conda-linux - -test_linux_36: - <<: *test_job - variables: *linux_36_build_variables - dependencies: - - build_linux_36 - tags: - - conda-linux + BUILD_EGG: "true" + artifacts: + expire_in: 1 week + paths: + - _ci/ + - dist/*.zip + - sphinx + - ${CONDA_ROOT}/conda-bld/linux-64/*.tar.bz2 -# Mac OSX + Python 2.7: Builds and tests build_macosx_27: - <<: *build_job - variables: &macosx_27_build_variables + <<: *macosx_build_job + variables: PYTHON_VERSION: "2.7" - WHEEL_TAG: "py27" - tags: - - conda-macosx -test_macosx_27: - <<: *test_job - variables: *macosx_27_build_variables + +build_macosx_36: + <<: *macosx_build_job + variables: + PYTHON_VERSION: "3.6" + + +# Deploy targets +.deploy_template: &deploy_job + stage: deploy + before_script: + - ./_ci/install.sh _ci master #updates ci support scripts + script: + - ./_ci/deploy.sh dependencies: + - build_linux_27 + - build_linux_36 - build_macosx_27 + - build_macosx_36 tags: - - conda-macosx + - deployer -# Mac OSX + Python 3.5: Builds and tests -build_macosx_35: - <<: *build_job - variables: &macosx_35_build_variables - PYTHON_VERSION: "3.5" - WHEEL_TAG: "py3" - tags: - - conda-macosx +deploy_beta: + <<: *deploy_job + environment: beta + only: + - master -test_macosx_35: - <<: *test_job - variables: *macosx_35_build_variables - dependencies: - - build_macosx_35 - tags: - - conda-macosx +deploy_stable: + <<: *deploy_job + environment: stable + only: + - /^v\d+\.\d+\.\d+([abc]\d*)?$/ # PEP-440 compliant version (tags) + except: + - branches -# Mac OSX + Python 3.6: Builds and tests -build_macosx_36: - <<: *build_job - variables: &macosx_36_build_variables - PYTHON_VERSION: "3.6" - WHEEL_TAG: "py3" - tags: - - conda-macosx -test_macosx_36: - <<: *test_job - variables: *macosx_36_build_variables +pypi: + stage: pypi + environment: pypi + only: + - /^v\d+\.\d+\.\d+([abc]\d*)?$/ # PEP-440 compliant version (tags) + except: + - branches + before_script: + - ./_ci/install.sh _ci master #updates ci support scripts + script: + - ./_ci/pypi.sh dependencies: - - build_macosx_36 + - build_linux_36 tags: - - conda-macosx + - deployer diff --git a/bob/bio/vein/database/utfvp.py b/bob/bio/vein/database/utfvp.py index c699fbd23d56585916fa5d6780285aa65b0bacda..7b15ef6a6a4c692e5ad978953ef1a6c0b772e489 100644 --- a/bob/bio/vein/database/utfvp.py +++ b/bob/bio/vein/database/utfvp.py @@ -1,31 +1,43 @@ #!/usr/bin/env python # vim: set fileencoding=utf-8 : -# Fri 04 Nov 2016 14:46:53 CET +# Tue 27 Sep 2016 16:48:57 CEST + from bob.bio.base.database import BioFile, BioDatabase +from . import AnnotatedArray +from ..preprocessor.utils import poly_to_mask + class File(BioFile): """ - Implements extra properties of vein files for the UTFVP Fingervein database + Implements extra properties of vein files for the UTFVP database Parameters: - f (object): Low-level file (or sample) object that is kept inside + f (object): Low-level file (or sample) object that is kept inside """ def __init__(self, f): - super(File, self).__init__(client_id=f.client_id, path=f.path, - file_id=f.id) + super(File, self).__init__(client_id=f.unique_finger_name, path=f.path, + file_id=f.id) self.__f = f + def load(self, *args, **kwargs): + """(Overrides base method) Loads both image and mask""" + + image = super(File, self).load(*args, **kwargs) + roi = self.__f.roi() + return AnnotatedArray(image, metadata=dict(roi=roi)) + + class Database(BioDatabase): """ - Implements verification API for querying UTFVP Fingervein database. + Implements verification API for querying UTFVP database. """ def __init__(self, **kwargs): @@ -34,22 +46,38 @@ class Database(BioDatabase): from bob.db.utfvp.query import Database as LowLevelDatabase self._db = LowLevelDatabase() + self.low_level_group_names = ('train', 'dev') + self.high_level_group_names = ('world', 'dev') + + def groups(self): + + return self.convert_names_to_highlevel(self._db.groups(), + self.low_level_group_names, self.high_level_group_names) + + def client_id_from_model_id(self, model_id, group='dev'): + """Required as ``model_id != client_id`` on this database""" + + return self._db.finger_name_from_model_id(model_id) + + def model_ids_with_protocol(self, groups=None, protocol=None, **kwargs): - protocol = protocol if protocol is not None else self.protocol + + groups = self.convert_names_to_lowlevel(groups, + self.low_level_group_names, self.high_level_group_names) return self._db.model_ids(groups=groups, protocol=protocol) + def objects(self, groups=None, protocol=None, purposes=None, model_ids=None, **kwargs): + groups = self.convert_names_to_lowlevel(groups, + self.low_level_group_names, self.high_level_group_names) retval = self._db.objects(groups=groups, protocol=protocol, - purposes=purposes, model_ids=model_ids, **kwargs) + purposes=purposes, model_ids=model_ids, + **kwargs) return [File(f) for f in retval] + def annotations(self, file): return None - - def client_id_from_model_id(self, model_id, group='dev'): - """Required as ``model_id != client_id`` on this database""" - - return self._db.get_client_id_from_model_id(model_id) diff --git a/bob/bio/vein/tests/test_databases.py b/bob/bio/vein/tests/test_databases.py index e3adf5ca0f828ccc0823dde04e0640d1dc2e58cb..d665d2710d2c4a1b8589d9155b546a106b23be27 100644 --- a/bob/bio/vein/tests/test_databases.py +++ b/bob/bio/vein/tests/test_databases.py @@ -14,8 +14,8 @@ def test_utfvp(): module = bob.bio.base.load_resource('utfvp', 'config', preferred_package='bob.bio.vein') try: - check_database(module.database, protocol=module.protocol, - groups=('dev', 'eval')) + check_database(module.database, protocol='nomLeftIndex', groups=('dev', + 'eval')) except IOError as e: raise SkipTest( "The database could not queried; probably the db.sql3 file is missing. Here is the error: '%s'" % e) @@ -52,4 +52,4 @@ def test_putvein(): check_database(module.database, protocol='wrist-LR_1', groups=('dev',)) except IOError as e: raise SkipTest( - "The database could not queried; probably the db.sql3 file is missing. Here is the error: '%s'" % e) \ No newline at end of file + "The database could not queried; probably the db.sql3 file is missing. Here is the error: '%s'" % e) diff --git a/conda/meta.yaml b/conda/meta.yaml new file mode 100644 index 0000000000000000000000000000000000000000..eb3e8030a23f1efe3ef164c522ae482c4aa3885c --- /dev/null +++ b/conda/meta.yaml @@ -0,0 +1,88 @@ +{% set name = 'bob.bio.vein' %} +{% set project_dir = environ.get('RECIPE_DIR') + '/..' %} + +package: + name: {{ name }} + version: {{ environ.get('BOB_PACKAGE_VERSION', '0.0.1') }} + +build: + entry_points: + - compare_rois.py = bob.bio.vein.script.compare_rois:main + - view_sample.py = bob.bio.vein.script.view_sample:main + - blame.py = bob.bio.vein.script.blame:main + - markdet.py = bob.bio.vein.script.markdet:main + - watershed_mask.py = bob.bio.vein.script.watershed_mask:main + number: {{ environ.get('BOB_BUILD_NUMBER', 0) }} + run_exports: + - {{ pin_subpackage(name) }} + script: + - cd {{ project_dir }} + {% if environ.get('BUILD_EGG') %} + - python setup.py sdist --formats=zip + {% endif %} + - python setup.py install --single-version-externally-managed --record record.txt + +requirements: + host: + - python {{ python }} + - setuptools {{ setuptools }} + - numpy {{ numpy }} + - scipy {{ scipy }} + - pillow {{ pillow }} + - schema {{ schema }} + - docopt {{ docopt }} + - scikit-image {{ scikit_image }} + - matplotlib {{ matplotlib }} + - bob.extension + - bob.core + - bob.io.base + - bob.io.matlab + - bob.io.image + - bob.ip.base + - bob.ip.color + - bob.bio.base + - bob.learn.linear + - bob.learn.activation + - bob.learn.mlp + + run: + - python + - setuptools + - {{ pin_compatible('numpy') }} + - {{ pin_compatible('scipy') }} + - {{ pin_compatible('pillow') }} + - {{ pin_compatible('schema') }} + - {{ pin_compatible('docopt') }} + - {{ pin_compatible('scikit-image') }} + - {{ pin_compatible('matplotlib') }} + +test: + imports: + - {{ name }} + commands: + - compare_rois.py --help + - view_sample.py --help + - blame.py --help + - markdet.py --help + - watershed_mask.py --help + - nosetests --with-coverage --cover-package={{ name }} -sv {{ name }} + - sphinx-build -aEW {{ project_dir }}/doc {{ project_dir }}/sphinx + - sphinx-build -aEb doctest {{ project_dir }}/doc sphinx + - conda inspect linkages -p $PREFIX {{ name }} # [not win] + - conda inspect objects -p $PREFIX {{ name }} # [osx] + requires: + - bob-devel {{ bob_devel }}.* + - nose + - coverage + - sphinx + - sphinx_rtd_theme + - bob.db.utfvp + - bob.db.verafinger + - bob.db.fv3d + - bob.db.putvein + +about: + home: https://www.idiap.ch/software/bob/ + license: GNU General Public License v3 (GPLv3) + summary: Vein Recognition Library + license_family: GPL diff --git a/doc/conf.py b/doc/conf.py index c21c719a95873918396fae44c68a7fd56dfdb72c..b1cb1083f22b10c50f2a614673a9f0a65ae61f6d 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -25,15 +25,9 @@ extensions = [ 'sphinx.ext.intersphinx', 'sphinx.ext.napoleon', 'sphinx.ext.viewcode', + 'sphinx.ext.mathjax', ] -import sphinx -if sphinx.__version__ >= "1.4.1": - extensions.append('sphinx.ext.imgmath') - imgmath_image_format = 'svg' -else: - extensions.append('sphinx.ext.pngmath') - # Be picky about warnings nitpicky = True diff --git a/doc/index.rst b/doc/index.rst index 9eb9be6454c77450ee7b8227f23d3bb18afa4760..28bf4d0d31d95d4abe607e46affd8a70208f2092 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -1,6 +1,6 @@ .. vim: set fileencoding=utf-8 : -.. date: Wed Jan 14 11:58:57 CEST 2015 +.. _bob.bio.vein: ==================================== Biometric Vein Recognition Library diff --git a/doc/references.rst b/doc/references.rst index fad3f3adf7e83d6104045cb6620c17eec04943bc..5265c8692e7e35d4edf62989ca46c4ca551abed2 100644 --- a/doc/references.rst +++ b/doc/references.rst @@ -5,21 +5,21 @@ References ============ -.. [KUU02] *M. Kono, H. Ueki and S. Umemura*, **Near-infrared finger vein patterns for personal identification**, Applied Optics, Vol. 41, Issue 35, pp. 7429-7436 (2002). +.. #not used [KUU02] *M. Kono, H. Ueki and S. Umemura*, **Near-infrared finger vein patterns for personal identification**, Applied Optics, Vol. 41, Issue 35, pp. 7429-7436 (2002). .. [MNM04] *N. Miura, A. Nagasaka, and T. Miyatake*, **Feature extraction of finger vein patterns based on repeated line tracking and its application to personal identification. Machine Vision and Applications**, Vol. 15, Num. 4, pp. 194--203, 2004. .. [MNM05] *N. Miura, A. Nagasaka, and T. Miyatake*, **Extraction of Finger-Vein Pattern Using Maximum Curvature Points in Image Profiles**, Proceedings on IAPR conference on machine vision applications, Vol. 9 , pp. 347--350, 2005. -.. [LLP09] *E.C. Lee, H.C. Lee and K.R. Park*, **Finger vein recognition using minutia-based alignment and local binary pattern-based feature extraction**, International Journal of Imaging Systems and Technology. Vol. 19, No. 3, pp. 175-178, September 2009. +.. #not used [LLP09] *E.C. Lee, H.C. Lee and K.R. Park*, **Finger vein recognition using minutia-based alignment and local binary pattern-based feature extraction**, International Journal of Imaging Systems and Technology. Vol. 19, No. 3, pp. 175-178, September 2009. -.. [ZY09] *J. Zhang and J. Yang*, **Finger-vein image enhancement based on combination of gray-level grouping and circular gabor filter** In International Conference on Information Engineering and Computer Science (ICIECS), pp. 1-4, Dec 2009. +.. #not used [ZY09] *J. Zhang and J. Yang*, **Finger-vein image enhancement based on combination of gray-level grouping and circular gabor filter** In International Conference on Information Engineering and Computer Science (ICIECS), pp. 1-4, Dec 2009. -.. [ZTXL09] *Jianjun Zhao, Hogliang Tian, Weixing Xu, and Xin Li*, **A New Approach to Hand Vein Image Enhancement**. In IEEE Second International Conference on Intelligent Computation Technology and Automation, ICICTA. Vol. 1, pp. 499-501. 2009. +.. #not used [ZTXL09] *Jianjun Zhao, Hogliang Tian, Weixing Xu, and Xin Li*, **A New Approach to Hand Vein Image Enhancement**. In IEEE Second International Conference on Intelligent Computation Technology and Automation, ICICTA. Vol. 1, pp. 499-501. 2009. .. [HDLTL10] *B. Huang, Y. Dai, R. Li, D. Tang and W. Li*, **Finger-vein authentication based on wide line detector and pattern normalization**, Proceedings on 20th International Conference on Pattern Recognition (ICPR), 2010. -.. [MD13] *L. Mirmohamadsadeghi and A. Drygajlo*, **Palm vein recognition using local texture patterns**, IET Biometrics, pp. 1-9, 2013. +.. #not used [MD13] *L. Mirmohamadsadeghi and A. Drygajlo*, **Palm vein recognition using local texture patterns**, IET Biometrics, pp. 1-9, 2013. .. [TVM14] *Pedro Tome, Matthias Vanoni and Sébastien Marcel*, **On the Vulnerability of Finger Vein Recognition to Spoofing**, in: IEEE International Conference of the Biometrics Special Interest Group (BIOSIG), Darmstadt, Germay, pages 1 - 10, IEEE, 2014