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 01caa00cb7c23cbe9b8ac905c1b168ab5ee9ada7..909e3df49a80e24221d025bca98ef76ae0106559 100644 --- a/bob/bio/face/database/ijba.py +++ b/bob/bio/face/database/ijba.py @@ -4,54 +4,72 @@ # 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 +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 __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): - """ + """ IJBA database implementation of :py:class:`bob.bio.base.database.BioDatabase` interface. It is an extension of an SQL-based database interface, which directly talks to IJBA database, for verification experiments (good to use in bob.bio.base framework). - """ + """ - def __init__( - self, + def __init__( + self, original_directory=None, annotations_directory=None, original_extension=None, - **kwargs - ): - # call base class constructors to open a session to the database - super(IJBABioDatabase, self).__init__( + **kwargs + ): + # call base class constructors to open a session to the database + super(IJBABioDatabase, self).__init__( + models_depend_on_protocol=True, + training_depends_on_protocol=True, name='ijba', original_directory=original_directory, annotations_directory=annotations_directory, original_extension=original_extension, **kwargs) - from bob.db.ijba.query import Database as LowLevelDatabase - self._db = LowLevelDatabase(original_directory, annotations_directory, - original_extension) + from bob.db.ijba.query import Database as LowLevelDatabase + self._db = LowLevelDatabase(original_directory, annotations_directory, original_extension) + + 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 model_ids_with_protocol(self, groups=None, protocol="search_split1", **kwargs): - return self._db.model_ids(groups=groups, protocol=protocol) + 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 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 [IJBABioFile(f) for f in retval] + def annotations(self, biofile): + return self._db.annotations(biofile.f) - def annotations(self, myfile): - return self._db.annotations(myfile._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 8f90148e13b287bc6aa073734b1febb6df8beea8..3cc7b91ead9d6263e7b081711541a304f945369d 100644 --- a/bob/bio/face/test/test_databases.py +++ b/bob/bio/face/test/test_databases.py @@ -165,12 +165,12 @@ def test_ijba(): database = bob.bio.base.load_resource( 'ijba', 'database', preferred_package='bob.bio.face') try: - check_database(database) + check_database(database,models_depend=True, training_depends=True) except IOError as e: raise SkipTest( "The database could not queried; probably the db.sql3 file is missing. Here is the error: '%s'" % e) try: - _check_annotations(database, limit_files=1000) + _check_annotations(database, topleft=True, limit_files=1000) except IOError as e: raise SkipTest( "The annotations could not be queried; probably the annotation files are missing. Here is the error: '%s'" % e) diff --git a/setup.py b/setup.py index e55963a87f982d6d2051496c274190bcb0060452..efa163beab83bc71120d469b61c47c366bcfdfcc 100644 --- a/setup.py +++ b/setup.py @@ -114,6 +114,7 @@ setup( '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-image = bob.bio.face.config.database.mobio:mobio_image',