diff --git a/bob/bio/face/config/database/ijba.py b/bob/bio/face/config/database/ijba.py new file mode 100644 index 0000000000000000000000000000000000000000..d726635c72877401e4c6b05333eb60e6abded8af --- /dev/null +++ b/bob/bio/face/config/database/ijba.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python + +from bob.bio.face.database import IJBABioDatabase + +ijba_directory = "[YOUR_IJBA_DIRECTORY]" + +database = IJBABioDatabase( + original_directory=ijba_directory, + protocol='search_split1' +) diff --git a/bob/bio/face/database/ijba.py b/bob/bio/face/database/ijba.py index 711b11f339b1a0bf21647bea0a751730a7b19cb1..ef238df8b27fe4b68e3fa0a71c2cfa577abce0c8 100644 --- a/bob/bio/face/database/ijba.py +++ b/bob/bio/face/database/ijba.py @@ -4,33 +4,60 @@ # Sat 20 Aug 15:43:10 CEST 2016 """ - IJBA database implementation of bob.bio.base.database.Database interface. - It is an extension of an SQL-based database interface, which directly talks to IJBA database, for + IJBA database implementation of bob.bio.base.database.BioDatabase interface. + It is an extension of the database interface, which directly talks to IJBA database, for verification experiments (good to use in bob.bio.base framework). """ from .database import FaceBioFile -from bob.bio.base.database import BioDatabase, BioFile +from bob.bio.base.database import BioDatabase, BioFileSet +import os + + +class IJBABioFile(FaceBioFile): + def __init__(self, f): + super(IJBABioFile, self).__init__(client_id=f.client_id, path=f.path, file_id=f.id) + self.f = f + + def make_path(self, directory, extension): + # add file ID to the path, so that a unique path is generated (there might be several identities in each physical file) + return str(os.path.join(directory or '', self.path + "-" + str(self.id) + (extension or ''))) + + +class IJBABioFileSet(BioFileSet): + def __init__(self, template): + super(IJBABioFileSet, self).__init__(file_set_id = template.id, files = [IJBABioFile(f) for f in template.files], path = template.path) class IJBABioDatabase(BioDatabase): - """ - Implements verification API for querying IJBA database. - """ - - def __init__( - self, - **kwargs - ): - # call base class constructors to open a session to the database - super(IJBABioDatabase, self).__init__(name='ijba', **kwargs) - - from bob.db.ijba.query import Database as LowLevelDatabase - self.__db = LowLevelDatabase() - - def model_ids_with_protocol(self, groups=None, protocol="search_split1", **kwargs): - return self.__db.model_ids(groups=groups, protocol=protocol) - - def objects(self, groups=None, protocol="search_split1", purposes=None, model_ids=None, **kwargs): - retval = self.__db.objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs) - return [FaceBioFile(client_id=f.client_id, path=f.path, file_id=f.id) for f in retval] + """ + Implements verification API for querying IJBA database. + """ + + def __init__( + self, + **kwargs + ): + # call base class constructors to open a session to the database + super(IJBABioDatabase, self).__init__(name='ijba', models_depend_on_protocol=True, training_depends_on_protocol=True, **kwargs) + + import bob.db.ijba + self._db = bob.db.ijba.Database() + + def uses_probe_file_sets(self): + return True + + def model_ids_with_protocol(self, groups=None, protocol="search_split1", **kwargs): + return self._db.model_ids(groups=groups, protocol=protocol) + + def objects(self, groups=None, protocol="search_split1", purposes=None, model_ids=None, **kwargs): + return [IJBABioFile(f) for f in self._db.objects(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids, **kwargs)] + + def object_sets(self, groups=None, protocol="search_split1", purposes=None, model_ids=None): + return [IJBABioFileSet(t) for t in self._db.object_sets(groups=groups, protocol=protocol, purposes=purposes, model_ids=model_ids)] + + def annotations(self, biofile): + return self._db.annotations(biofile.f) + + def client_id_from_model_id(self, model_id, group='dev'): + return self._db.get_client_id_from_model_id(model_id) diff --git a/bob/bio/face/test/test_databases.py b/bob/bio/face/test/test_databases.py index f1928301a001fd755a4e2e044b957db9f1212c02..fa8c1b02a1022b2dbdc5a403026cf90006568ef8 100644 --- a/bob/bio/face/test/test_databases.py +++ b/bob/bio/face/test/test_databases.py @@ -25,13 +25,14 @@ from bob.bio.base.test.utils import db_available from bob.bio.base.test.test_database_implementations import check_database, check_database_zt -def _check_annotations(database): +def _check_annotations(database, require_eyes=True): for file in database.all_files(): annotations = database.annotations(file) if annotations is not None: assert isinstance(annotations, dict) - assert 'reye' in annotations - assert 'leye' in annotations + if require_eyes: + assert 'reye' in annotations + assert 'leye' in annotations @db_available('arface') @@ -119,8 +120,8 @@ def test_gbu(): def test_ijba(): database = bob.bio.base.load_resource('ijba', 'database', preferred_package='bob.bio.face') try: - check_database(database) - _check_annotations(database) + check_database(database,models_depend=True, training_depends=True) + _check_annotations(database, require_eyes=False) except IOError as e: raise SkipTest( "The database could not queried; probably the db.sql3 file is missing. Here is the error: '%s'" % e) diff --git a/setup.py b/setup.py index ea630ad3f0a77f6c5b227a1c2829d389fab571c3..13fe295c4ec6f471e67426c4ce6606d2e7e8ece0 100644 --- a/setup.py +++ b/setup.py @@ -109,11 +109,12 @@ setup( 'bob.bio.database': [ 'arface = bob.bio.face.config.database.arface:database', - 'atnt = bob.bio.face.config.database.atnt:database', + 'atnt = bob.bio.face.config.database.atnt:database', 'banca = bob.bio.face.config.database.banca_english:database', 'caspeal = bob.bio.face.config.database.caspeal:database', 'frgc = bob.bio.face.config.database.frgc:database', 'gbu = bob.bio.face.config.database.gbu:database', + 'ijba = bob.bio.face.config.database.ijba:database', 'lfw-restricted = bob.bio.face.config.database.lfw_restricted:database', 'lfw-unrestricted = bob.bio.face.config.database.lfw_unrestricted:database', 'mobio-male = bob.bio.face.config.database.mobio_male:database', # MOBIO gender-dependent training