Commit 19dfa1e2 authored by Amir Mohammadi's avatar Amir Mohammadi
Browse files

Add the MSU MFSD modified verification protocol

parent ffd5074e
Pipeline #7104 passed with stages
in 27 minutes and 21 seconds
#!/usr/bin/env python
from bob.bio.face.database import MsuMfsdModBioDatabase
msu_mfsd_mod_directory = "[YOUR_MSU_MFSD_MOD_DIRECTORY]"
msu_mfsd_mod_licit = MsuMfsdModBioDatabase(
original_directory=msu_mfsd_mod_directory,
original_extension=".mov",
protocol='grandtest-licit',
)
msu_mfsd_mod_spoof = MsuMfsdModBioDatabase(
original_directory=msu_mfsd_mod_directory,
original_extension=".mov",
protocol='grandtest-spoof',
)
...@@ -4,14 +4,24 @@ import bob.bio.face ...@@ -4,14 +4,24 @@ import bob.bio.face
# Cropping # Cropping
CROPPED_IMAGE_HEIGHT = 80 CROPPED_IMAGE_HEIGHT = 80
CROPPED_IMAGE_WIDTH = CROPPED_IMAGE_HEIGHT * 4 // 5 CROPPED_IMAGE_WIDTH = CROPPED_IMAGE_HEIGHT * 4 // 5
# eye positions for frontal images # eye positions for frontal images
RIGHT_EYE_POS = (CROPPED_IMAGE_HEIGHT // 5, CROPPED_IMAGE_WIDTH // 4 - 1) RIGHT_EYE_POS = (CROPPED_IMAGE_HEIGHT // 5, CROPPED_IMAGE_WIDTH // 4 - 1)
LEFT_EYE_POS = (CROPPED_IMAGE_HEIGHT // 5, CROPPED_IMAGE_WIDTH // 4 * 3) LEFT_EYE_POS = (CROPPED_IMAGE_HEIGHT // 5, CROPPED_IMAGE_WIDTH // 4 * 3)
# define the preprocessor # define the preprocessor
preprocessor = bob.bio.face.preprocessor.FaceCrop( preprocessor = bob.bio.face.preprocessor.FaceCrop(
cropped_image_size = (CROPPED_IMAGE_HEIGHT, CROPPED_IMAGE_WIDTH), cropped_image_size=(CROPPED_IMAGE_HEIGHT, CROPPED_IMAGE_WIDTH),
cropped_positions = {'leye' : LEFT_EYE_POS, 'reye' : RIGHT_EYE_POS} cropped_positions={'leye': LEFT_EYE_POS, 'reye': RIGHT_EYE_POS}
)
# top left and bottom right positions
TOP_LEFT_POS = (0, 0)
BOTTOM_RIGHT_POS = (CROPPED_IMAGE_HEIGHT, CROPPED_IMAGE_WIDTH)
# define the preprocessor
preprocessor_head = bob.bio.face.preprocessor.FaceCrop(
cropped_image_size=(CROPPED_IMAGE_HEIGHT, CROPPED_IMAGE_WIDTH),
cropped_positions={'topleft': TOP_LEFT_POS, 'bottomright': BOTTOM_RIGHT_POS}
) )
...@@ -17,8 +17,11 @@ from .frgc import FRGCBioDatabase ...@@ -17,8 +17,11 @@ from .frgc import FRGCBioDatabase
from .cuhk_cufs import CUHK_CUFSBioDatabase from .cuhk_cufs import CUHK_CUFSBioDatabase
from .scface import SCFaceBioDatabase from .scface import SCFaceBioDatabase
from .replaymobile import ReplayMobileBioDatabase from .replaymobile import ReplayMobileBioDatabase
from .msu_mfsd_mod import MsuMfsdModBioDatabase
# gets sphinx autodoc done right - don't remove it # gets sphinx autodoc done right - don't remove it
def __appropriate__(*args): def __appropriate__(*args):
"""Says object was actually declared here, and not in the import module. """Says object was actually declared here, and not in the import module.
Fixing sphinx warnings of not being able to find classes, when path is shortened. Fixing sphinx warnings of not being able to find classes, when path is shortened.
...@@ -30,24 +33,26 @@ def __appropriate__(*args): ...@@ -30,24 +33,26 @@ def __appropriate__(*args):
<https://github.com/sphinx-doc/sphinx/issues/3048>` <https://github.com/sphinx-doc/sphinx/issues/3048>`
""" """
for obj in args: obj.__module__ = __name__ for obj in args:
obj.__module__ = __name__
__appropriate__( __appropriate__(
FaceBioFile, FaceBioFile,
MobioBioDatabase, MobioBioDatabase,
ReplayBioDatabase, ReplayBioDatabase,
AtntBioDatabase, AtntBioDatabase,
BancaBioDatabase, BancaBioDatabase,
GBUBioDatabase, GBUBioDatabase,
ARFaceBioDatabase, ARFaceBioDatabase,
CaspealBioDatabase, CaspealBioDatabase,
LFWBioDatabase, LFWBioDatabase,
MultipieBioDatabase, MultipieBioDatabase,
IJBABioDatabase, IJBABioDatabase,
XM2VTSBioDatabase, XM2VTSBioDatabase,
FRGCBioDatabase, FRGCBioDatabase,
CUHK_CUFSBioDatabase, CUHK_CUFSBioDatabase,
SCFaceBioDatabase, SCFaceBioDatabase,
ReplayMobileBioDatabase, ReplayMobileBioDatabase,
) MsuMfsdModBioDatabase,
)
__all__ = [_ for _ in dir() if not _.startswith('_')] __all__ = [_ for _ in dir() if not _.startswith('_')]
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
# Wed 13 Jul 16:43:22 CEST 2016 # Wed 13 Jul 16:43:22 CEST 2016
""" """
MOBIO database implementation of bob.bio.base.database.ZTDatabase interface. MOBIO database implementation of bob.bio.base.database.ZTBioDatabase interface.
It is an extension of an SQL-based database interface, which directly talks to Mobio database, for It is an extension of an SQL-based database interface, which directly talks to Mobio database, for
verification experiments (good to use in bob.bio.base framework). verification experiments (good to use in bob.bio.base framework).
""" """
...@@ -15,7 +15,7 @@ from bob.bio.base.database import ZTBioDatabase ...@@ -15,7 +15,7 @@ from bob.bio.base.database import ZTBioDatabase
class MobioBioFile(FaceBioFile): class MobioBioFile(FaceBioFile):
"""FaceBioFile implementation of the Replay Mobile Database""" """FaceBioFile implementation of the Mobio Database"""
def __init__(self, f): def __init__(self, f):
super(MobioBioFile, self).__init__(client_id=f.client_id, path=f.path, file_id=f.id) super(MobioBioFile, self).__init__(client_id=f.client_id, path=f.path, file_id=f.id)
...@@ -24,7 +24,9 @@ class MobioBioFile(FaceBioFile): ...@@ -24,7 +24,9 @@ class MobioBioFile(FaceBioFile):
class MobioBioDatabase(ZTBioDatabase): class MobioBioDatabase(ZTBioDatabase):
""" """
Implements verification API for querying Mobio database. MOBIO database implementation of bob.bio.base.database.ZTBioDatabase interface.
It is an extension of an SQL-based database interface, which directly talks to Mobio database, for
verification experiments (good to use in bob.bio.base framework).
""" """
def __init__( def __init__(
......
#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
# Amir Mohammadi <amir.mohammadi@idiap.ch>
from .database import FaceBioFile
from bob.bio.base.database import BioDatabase
class MsuMfsdModBioFile(FaceBioFile):
"""FaceBioFile implementation of the MSU_MFSD_MOD Database"""
def __init__(self, f):
super(MsuMfsdModBioFile, self).__init__(
client_id=f.client_id, path=f.path, file_id=f.id)
self._f = f
def load(self, directory=None, extension=None):
if extension in (None, '.mov', '.mp4'):
return self._f.load(directory, extension)
else:
return super(MsuMfsdModBioFile, self).load(directory, extension)
class MsuMfsdModBioDatabase(BioDatabase):
"""
MsuMfsdMod 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 MsuMfsdMod
database, for verification experiments (good to use in bob.bio.base
framework).
"""
def __init__(self, max_number_of_frames=None, **kwargs):
# call base class constructors to open a session to the database
super(MsuMfsdModBioDatabase, self).__init__(
name='msu-mfsd-mod',
max_number_of_frames=max_number_of_frames, **kwargs)
from bob.db.msu_mfsd_mod.verificationprotocol import Database \
as LowLevelDatabase
self._db = LowLevelDatabase(max_number_of_frames)
def protocol_names(self):
return self._db.protocols()
def groups(self):
return self._db.groups()
def annotations(self, myfile):
"""
Will return the bounding box annotation of nth frame of the video.
"""
fn = myfile._f.framen
annots = myfile._f._f.bbx(directory=self.original_directory)
# convert width and height to bottomright coordinates
# bob uses the (y, x) format
topleft = (annots[fn][1], annots[fn][0])
bottomright = (annots[fn][1] + annots[fn][3],
annots[fn][0] + annots[fn][2])
annotations = {'topleft': topleft, 'bottomright': bottomright}
return annotations
def model_ids_with_protocol(self, groups=None, protocol=None, **kwargs):
return self._db.model_ids_with_protocol(groups, protocol, **kwargs)
def objects(self, groups=None, protocol=None, purposes=None,
model_ids=None, **kwargs):
retval = self._db.objects(
groups, protocol, purposes, model_ids, **kwargs)
return [MsuMfsdModBioFile(f) for f in retval]
def arrange_by_client(self, files):
client_files = {}
for file in files:
if str(file.client_id) not in client_files:
client_files[str(file.client_id)] = []
client_files[str(file.client_id)].append(file)
files_by_clients = []
for client in sorted(client_files.keys()):
files_by_clients.append(client_files[client])
return files_by_clients
...@@ -56,7 +56,8 @@ def _check_annotations(database, topleft=False, required=True, limit_files=None, ...@@ -56,7 +56,8 @@ def _check_annotations(database, topleft=False, required=True, limit_files=None,
@db_available('arface') @db_available('arface')
def test_arface(): def test_arface():
database = bob.bio.base.load_resource('arface', 'database', preferred_package='bob.bio.face') database = bob.bio.base.load_resource(
'arface', 'database', preferred_package='bob.bio.face')
try: try:
check_database(database, groups=('dev', 'eval')) check_database(database, groups=('dev', 'eval'))
except IOError as e: except IOError as e:
...@@ -71,7 +72,8 @@ def test_arface(): ...@@ -71,7 +72,8 @@ def test_arface():
@db_available('atnt') @db_available('atnt')
def test_atnt(): def test_atnt():
database = bob.bio.base.load_resource('atnt', 'database', preferred_package='bob.bio.face') database = bob.bio.base.load_resource(
'atnt', 'database', preferred_package='bob.bio.face')
try: try:
check_database(database) check_database(database)
except IOError as e: except IOError as e:
...@@ -81,7 +83,8 @@ def test_atnt(): ...@@ -81,7 +83,8 @@ def test_atnt():
@db_available('banca') @db_available('banca')
def test_banca(): def test_banca():
database = bob.bio.base.load_resource('banca', 'database', preferred_package='bob.bio.face') database = bob.bio.base.load_resource(
'banca', 'database', preferred_package='bob.bio.face')
try: try:
check_database_zt(database) check_database_zt(database)
except IOError as e: except IOError as e:
...@@ -96,7 +99,8 @@ def test_banca(): ...@@ -96,7 +99,8 @@ def test_banca():
@db_available('caspeal') @db_available('caspeal')
def test_caspeal(): def test_caspeal():
database = bob.bio.base.load_resource('caspeal', 'database', preferred_package='bob.bio.face') database = bob.bio.base.load_resource(
'caspeal', 'database', preferred_package='bob.bio.face')
try: try:
check_database(database) check_database(database)
check_database(database, protocol='aging') check_database(database, protocol='aging')
...@@ -124,7 +128,8 @@ def test_caspeal(): ...@@ -124,7 +128,8 @@ def test_caspeal():
@db_available('cuhk_cufs') @db_available('cuhk_cufs')
def test_cuhk_cufs(): def test_cuhk_cufs():
database = bob.bio.base.load_resource('cuhk_cufs', 'database', preferred_package='bob.bio.face') database = bob.bio.base.load_resource(
'cuhk_cufs', 'database', preferred_package='bob.bio.face')
try: try:
check_database(database) check_database(database)
except IOError as e: except IOError as e:
...@@ -139,7 +144,8 @@ def test_cuhk_cufs(): ...@@ -139,7 +144,8 @@ def test_cuhk_cufs():
@db_available('gbu') @db_available('gbu')
def test_gbu(): def test_gbu():
database = bob.bio.base.load_resource('gbu', 'database', preferred_package='bob.bio.face') database = bob.bio.base.load_resource(
'gbu', 'database', preferred_package='bob.bio.face')
try: try:
check_database(database, models_depend=True) check_database(database, models_depend=True)
check_database(database, protocol='Bad', models_depend=True) check_database(database, protocol='Bad', models_depend=True)
...@@ -156,7 +162,8 @@ def test_gbu(): ...@@ -156,7 +162,8 @@ def test_gbu():
@db_available('ijba') @db_available('ijba')
def test_ijba(): def test_ijba():
database = bob.bio.base.load_resource('ijba', 'database', preferred_package='bob.bio.face') database = bob.bio.base.load_resource(
'ijba', 'database', preferred_package='bob.bio.face')
try: try:
check_database(database) check_database(database)
except IOError as e: except IOError as e:
...@@ -171,10 +178,12 @@ def test_ijba(): ...@@ -171,10 +178,12 @@ def test_ijba():
@db_available('lfw') @db_available('lfw')
def test_lfw(): def test_lfw():
database = bob.bio.base.load_resource('lfw-restricted', 'database', preferred_package='bob.bio.face') database = bob.bio.base.load_resource(
'lfw-restricted', 'database', preferred_package='bob.bio.face')
try: try:
check_database(database, training_depends=True, models_depend=True) check_database(database, training_depends=True, models_depend=True)
check_database(database, groups=('dev', 'eval'), protocol='fold1', training_depends=True, models_depend=True) check_database(database, groups=('dev', 'eval'),
protocol='fold1', training_depends=True, models_depend=True)
check_database(bob.bio.base.load_resource('lfw-unrestricted', 'database', preferred_package='bob.bio.face'), check_database(bob.bio.base.load_resource('lfw-unrestricted', 'database', preferred_package='bob.bio.face'),
training_depends=True, models_depend=True) training_depends=True, models_depend=True)
except IOError as e: except IOError as e:
...@@ -189,7 +198,8 @@ def test_lfw(): ...@@ -189,7 +198,8 @@ def test_lfw():
@db_available('mobio') @db_available('mobio')
def test_mobio(): def test_mobio():
database = bob.bio.base.load_resource('mobio-image', 'database', preferred_package='bob.bio.face') database = bob.bio.base.load_resource(
'mobio-image', 'database', preferred_package='bob.bio.face')
try: try:
check_database_zt(database, models_depend=True) check_database_zt(database, models_depend=True)
check_database_zt(database, protocol='female', models_depend=True) check_database_zt(database, protocol='female', models_depend=True)
...@@ -210,7 +220,8 @@ def test_mobio(): ...@@ -210,7 +220,8 @@ def test_mobio():
@db_available('multipie') @db_available('multipie')
def test_multipie(): def test_multipie():
database = bob.bio.base.load_resource('multipie', 'database', preferred_package='bob.bio.face') database = bob.bio.base.load_resource(
'multipie', 'database', preferred_package='bob.bio.face')
try: try:
check_database_zt(database, training_depends=True) check_database_zt(database, training_depends=True)
check_database_zt(bob.bio.base.load_resource('multipie-pose', 'database', preferred_package='bob.bio.face'), check_database_zt(bob.bio.base.load_resource('multipie-pose', 'database', preferred_package='bob.bio.face'),
...@@ -231,7 +242,8 @@ def test_multipie(): ...@@ -231,7 +242,8 @@ def test_multipie():
@db_available('scface') @db_available('scface')
def test_scface(): def test_scface():
database = bob.bio.base.load_resource('scface', 'database', preferred_package='bob.bio.face') database = bob.bio.base.load_resource(
'scface', 'database', preferred_package='bob.bio.face')
try: try:
check_database_zt(database) check_database_zt(database)
except IOError as e: except IOError as e:
...@@ -246,10 +258,12 @@ def test_scface(): ...@@ -246,10 +258,12 @@ def test_scface():
@db_available('xm2vts') @db_available('xm2vts')
def test_xm2vts(): def test_xm2vts():
database = bob.bio.base.load_resource('xm2vts', 'database', preferred_package='bob.bio.face') database = bob.bio.base.load_resource(
'xm2vts', 'database', preferred_package='bob.bio.face')
try: try:
check_database(database, groups=('dev', 'eval')) check_database(database, groups=('dev', 'eval'))
check_database(database, groups=('dev', 'eval'), protocol='darkened-lp1') check_database(database, groups=('dev', 'eval'),
protocol='darkened-lp1')
except IOError as e: except IOError as e:
raise SkipTest( raise SkipTest(
"The database could not be queried; probably the db.sql3 file is missing. Here is the error: '%s'" % e) "The database could not be queried; probably the db.sql3 file is missing. Here is the error: '%s'" % e)
...@@ -262,7 +276,8 @@ def test_xm2vts(): ...@@ -262,7 +276,8 @@ def test_xm2vts():
@db_available('replay') @db_available('replay')
def test_replay_licit(): def test_replay_licit():
database = bob.bio.base.load_resource('replay-img-licit', 'database', preferred_package='bob.bio.face') database = bob.bio.base.load_resource(
'replay-img-licit', 'database', preferred_package='bob.bio.face')
try: try:
check_database(database, groups=('dev', 'eval')) check_database(database, groups=('dev', 'eval'))
except IOError as e: except IOError as e:
...@@ -277,7 +292,8 @@ def test_replay_licit(): ...@@ -277,7 +292,8 @@ def test_replay_licit():
@db_available('replay') @db_available('replay')
def test_replay_spoof(): def test_replay_spoof():
database = bob.bio.base.load_resource('replay-img-spoof', 'database', preferred_package='bob.bio.face') database = bob.bio.base.load_resource(
'replay-img-spoof', 'database', preferred_package='bob.bio.face')
try: try:
check_database(database, groups=('dev', 'eval')) check_database(database, groups=('dev', 'eval'))
except IOError as e: except IOError as e:
...@@ -292,7 +308,8 @@ def test_replay_spoof(): ...@@ -292,7 +308,8 @@ def test_replay_spoof():
@db_available('replaymobile') @db_available('replaymobile')
def test_replaymobile_licit(): def test_replaymobile_licit():
database = bob.bio.base.load_resource('replaymobile-img-licit', 'database', preferred_package='bob.bio.face') database = bob.bio.base.load_resource(
'replaymobile-img-licit', 'database', preferred_package='bob.bio.face')
try: try:
check_database(database, groups=('dev', 'eval')) check_database(database, groups=('dev', 'eval'))
except IOError as e: except IOError as e:
...@@ -307,7 +324,8 @@ def test_replaymobile_licit(): ...@@ -307,7 +324,8 @@ def test_replaymobile_licit():
@db_available('replaymobile') @db_available('replaymobile')
def test_replaymobile_spoof(): def test_replaymobile_spoof():
database = bob.bio.base.load_resource('replaymobile-img-spoof', 'database', preferred_package='bob.bio.face') database = bob.bio.base.load_resource(
'replaymobile-img-spoof', 'database', preferred_package='bob.bio.face')
try: try:
check_database(database, groups=('dev', 'eval')) check_database(database, groups=('dev', 'eval'))
except IOError as e: except IOError as e:
...@@ -318,3 +336,39 @@ def test_replaymobile_spoof(): ...@@ -318,3 +336,39 @@ def test_replaymobile_spoof():
except IOError as e: except IOError as e:
raise SkipTest( raise SkipTest(
"The annotations could not be queried; probably the annotation files are missing. Here is the error: '%s'" % e) "The annotations could not be queried; probably the annotation files are missing. Here is the error: '%s'" % e)
@db_available('msu_mfsd_mod')
def test_msu_mfsd_mod_licit():
database = bob.bio.base.load_resource(
'msu-mfsd-mod-licit', 'database', preferred_package='bob.bio.face')
try:
check_database(database, groups=('dev', 'eval'))
except IOError as e:
raise SkipTest(
"The database could not be queried; probably the db.sql3 file is "
"missing. Here is the error: '%s'" % e)
try:
_check_annotations(database, topleft=True, limit_files=20)
except IOError as e:
raise SkipTest(
"The annotations could not be queried; probably the annotation "
"files are missing. Here is the error: '%s'" % e)
@db_available('msu_mfsd_mod')
def test_msu_mfsd_mod_spoof():
database = bob.bio.base.load_resource(
'msu-mfsd-mod-spoof', 'database', preferred_package='bob.bio.face')
try:
check_database(database, groups=('dev', 'eval'))
except IOError as e:
raise SkipTest(
"The database could not be queried; probably the db.sql3 file is "
"missing. Here is the error: '%s'" % e)
try:
_check_annotations(database, topleft=True, limit_files=20)
except IOError as e:
raise SkipTest(
"The annotations could not be queried; probably the annotation "
"files are missing. Here is the error: '%s'" % e)
bob.db.arface
bob.db.banca
bob.db.caspeal
bob.db.frgc
bob.db.gbu
bob.db.lfw
bob.db.mobio
bob.db.multipie
bob.db.scface
bob.db.xm2vts
bob.db.replay
...@@ -32,6 +32,7 @@ eggs = bob.extension ...@@ -32,6 +32,7 @@ eggs = bob.extension
bob.db.gbu bob.db.gbu
bob.db.lfw bob.db.lfw
bob.db.mobio bob.db.mobio
bob.db.msu_mfsd_mod
bob.db.multipie bob.db.multipie
bob.db.replay bob.db.replay
bob.db.replaymobile bob.db.replaymobile
...@@ -73,6 +74,7 @@ develop = src/bob.extension ...@@ -73,6 +74,7 @@ develop = src/bob.extension
src/bob.db.gbu src/bob.db.gbu
src/bob.db.lfw src/bob.db.lfw
src/bob.db.mobio src/bob.db.mobio
src/bob.db.msu_mfsd_mod
src/bob.db.multipie src/bob.db.multipie
src/bob.db.replay src/bob.db.replay
src/bob.db.replaymobile src/bob.db.replaymobile
...@@ -118,6 +120,7 @@ bob.db.frgc = git https://gitlab.idiap.ch/bob/bob.db.frgc ...@@ -118,6 +120,7 @@ bob.db.frgc = git https://gitlab.idiap.ch/bob/bob.db.frgc
bob.db.gbu = git https://gitlab.idiap.ch/bob/bob.db.gbu bob.db.gbu = git https://gitlab.idiap.ch/bob/bob.db.gbu
bob.db.lfw = git https://gitlab.idiap.ch/bob/bob.db.lfw bob.db.lfw = git https://gitlab.idiap.ch/bob/bob.db.lfw
bob.db.mobio = git https://gitlab.idiap.ch/bob/bob.db.mobio bob.db.mobio = git https://gitlab.idiap.ch/bob/bob.db.mobio
bob.db.msu_mfsd_mod = git https://gitlab.idiap.ch/bob/bob.db.msu_mfsd_mod
bob.db.multipie = git https://gitlab.idiap.ch/bob/bob.db.multipie bob.db.multipie = git https://gitlab.idiap.ch/bob/bob.db.multipie
bob.db.replay = git https://gitlab.idiap.ch/bob/bob.db.replay bob.db.replay = git https://gitlab.idiap.ch/bob/bob.db.replay
bob.db.replaymobile = git https://gitlab.idiap.ch/bob/bob.db.replaymobile bob.db.replaymobile = git https://gitlab.idiap.ch/bob/bob.db.replaymobile
......
...@@ -155,6 +155,14 @@ Here is the list of files and replacement strings for all databases that are reg ...@@ -155,6 +155,14 @@ Here is the list of files and replacement strings for all databases that are reg
- Complete directory: ``[YOUR_REPLAY_ATTACK_DIRECTORY]`` - Complete directory: ``[YOUR_REPLAY_ATTACK_DIRECTORY]``
* Replay Mobile ``'replaymobile-img-licit'``, ``'replaymobile-img-spoof'``
- Complete directory: ``[YOUR_REPLAY_MOBILE_DIRECTORY]``
* MSU MFSD Modified ``'msu-mfsd-mod-licit'``, ``'msu-mfsd-mod-spoof'``
- Complete directory: ``[YOUR_MSU_MFSD_MOD_DIRECTORY]``
* SC face: ``'scface'`` * SC face: ``'scface'``
- Images: ``[YOUR_SC_FACE_DIRECTORY]`` - Images: ``[YOUR_SC_FACE_DIRECTORY]``
......
...@@ -18,6 +18,7 @@ Databases ...@@ -18,6 +18,7 @@ Databases
bob.bio.face.database.CaspealBioDatabase bob.bio.face.database.CaspealBioDatabase
bob.bio.face.database.ReplayBioDatabase bob.bio.face.database.ReplayBioDatabase
bob.bio.face.database.ReplayMobileBioDatabase bob.bio.face.database.ReplayMobileBioDatabase
bob.bio.face.database.MsuMfsdModBioDatabase
bob.bio.face.database.GBUBioDatabase bob.bio.face.database.GBUBioDatabase