From 7bd5b48cddd32a6d334459adff2f5387c66c2e90 Mon Sep 17 00:00:00 2001
From: David Geissbuhler <david.geissbuhler@idiap.ch>
Date: Mon, 25 Sep 2017 12:04:39 +0200
Subject: [PATCH] Added MIFS database

---
 bob/pad/face/config/database/mifs.py          |  33 +++++
 bob/pad/face/config/mifs.py                   |  50 ++++++++
 bob/pad/face/database/__init__.py             |   2 +
 bob/pad/face/database/mifs.py                 | 113 ++++++++++++++++++
 .../lists/mifs/grandtest/dev/for_attack.lst   |  70 +++++++++++
 .../lists/mifs/grandtest/dev/for_real.lst     |  70 +++++++++++
 .../lists/mifs/grandtest/eval/for_attack.lst  |  68 +++++++++++
 .../lists/mifs/grandtest/eval/for_real.lst    |  68 +++++++++++
 .../lists/mifs/grandtest/train/for_attack.lst |  70 +++++++++++
 .../lists/mifs/grandtest/train/for_real.lst   |  70 +++++++++++
 bob/pad/face/test/test_databases.py           |   2 -
 setup.py                                      |   2 +
 12 files changed, 616 insertions(+), 2 deletions(-)
 create mode 100644 bob/pad/face/config/database/mifs.py
 create mode 100644 bob/pad/face/config/mifs.py
 create mode 100644 bob/pad/face/database/mifs.py
 create mode 100644 bob/pad/face/lists/mifs/grandtest/dev/for_attack.lst
 create mode 100644 bob/pad/face/lists/mifs/grandtest/dev/for_real.lst
 create mode 100644 bob/pad/face/lists/mifs/grandtest/eval/for_attack.lst
 create mode 100644 bob/pad/face/lists/mifs/grandtest/eval/for_real.lst
 create mode 100644 bob/pad/face/lists/mifs/grandtest/train/for_attack.lst
 create mode 100644 bob/pad/face/lists/mifs/grandtest/train/for_real.lst

diff --git a/bob/pad/face/config/database/mifs.py b/bob/pad/face/config/database/mifs.py
new file mode 100644
index 00000000..b9e20ea9
--- /dev/null
+++ b/bob/pad/face/config/database/mifs.py
@@ -0,0 +1,33 @@
+
+
+from bob.pad.face.database.mifs import MIFSPadDatabase
+
+
+# Directory where the data files are stored.
+# This directory is given in the .bob_bio_databases.txt file located in your home directory
+original_directory = "[MIFS_DATABASE_DIRECTORY]"
+"""Value of ``~/.bob_bio_databases.txt`` for this database"""
+
+original_extension = ".jpg" # extension of the data files
+
+
+database = MIFSPadDatabase(
+    protocol='grandtest',
+    original_directory=original_directory,
+    original_extension=original_extension,
+    training_depends_on_protocol=True,
+)
+"""The :py:class:`bob.pad.base.database.PadDatabase` derivative with Replay-Mobile
+database settings.
+
+.. warning::
+
+   This class only provides a programmatic interface to load data in an orderly
+   manner, respecting usage protocols. It does **not** contain the raw
+   data files. You should procure those yourself.
+
+Notice that ``original_directory`` is set to ``[YOUR_REPLAY_MOBILE_DIRECTORY]``.
+You must make sure to create ``${HOME}/.bob_bio_databases.txt`` setting this
+value to the place where you actually installed the Replay-Mobile Database, as
+explained in the section :ref:`bob.pad.face.baselines`.
+"""
diff --git a/bob/pad/face/config/mifs.py b/bob/pad/face/config/mifs.py
new file mode 100644
index 00000000..d3e15df2
--- /dev/null
+++ b/bob/pad/face/config/mifs.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python
+
+"""`MIFS`_ is a database for face PAD experiments using make-up.
+"""
+
+from bob.pad.face.database import MIFSPadDatabase
+
+# Directory where the data files are stored.
+# This directory is given in the .bob_bio_databases.txt file located in your home directory
+ORIGINAL_DIRECTORY = "[MIFS_DATABASE_DIRECTORY]"
+"""Value of ``~/.bob_bio_databases.txt`` for this database"""
+
+ORIGINAL_EXTENSION = "" # extension of the data files
+
+database = MIFSPadDatabase(
+    protocol='grandtest',
+    original_directory=ORIGINAL_DIRECTORY,
+    original_extension=ORIGINAL_EXTENSION,
+    training_depends_on_protocol=True,
+)
+"""The :py:class:`bob.pad.base.database.PadDatabase` derivative with Replayattack
+database settings
+
+.. warning::
+
+   This class only provides a programmatic interface to load data in an orderly
+   manner, respecting usage protocols. It does **not** contain the raw
+   data files. You should procure those yourself.
+
+Notice that ``original_directory`` is set to ``[YOUR_REPLAY_ATTACK_DIRECTORY]``.
+You must make sure to create ``${HOME}/.bob_bio_databases.txt`` setting this
+value to the place where you actually installed the Replayattack Database, as
+explained in the section :ref:`bob.pad.face.baselines`.
+"""
+
+protocol = 'grandtest'
+"""The default protocol to use for reproducing the baselines.
+
+You may modify this at runtime by specifying the option ``--protocol`` on the
+command-line of ``spoof.py`` or using the keyword ``protocol`` on a
+configuration file that is loaded **after** this configuration resource.
+"""
+
+groups = ["train", "dev", "eval"]
+"""The default groups to use for reproducing the baselines.
+
+You may modify this at runtime by specifying the option ``--groups`` on the
+command-line of ``spoof.py`` or using the keyword ``groups`` on a
+configuration file that is loaded **after** this configuration resource.
+"""
diff --git a/bob/pad/face/database/__init__.py b/bob/pad/face/database/__init__.py
index bc586be2..5215323e 100644
--- a/bob/pad/face/database/__init__.py
+++ b/bob/pad/face/database/__init__.py
@@ -2,6 +2,7 @@ from .replay import ReplayPadDatabase
 from .replay_mobile import ReplayMobilePadDatabase
 from .msu_mfsd import MsuMfsdPadDatabase
 from .aggregated_db import AggregatedDbPadDatabase
+from .mifs import MIFSPadDatabase
 
 
 # gets sphinx autodoc done right - don't remove it
@@ -23,6 +24,7 @@ __appropriate__(
     ReplayMobilePadDatabase,
     MsuMfsdPadDatabase,
     AggregatedDbPadDatabase,
+    MIFSPadDatabase,
     )
 
 __all__ = [_ for _ in dir() if not _.startswith('_')]
diff --git a/bob/pad/face/database/mifs.py b/bob/pad/face/database/mifs.py
new file mode 100644
index 00000000..b373bd7c
--- /dev/null
+++ b/bob/pad/face/database/mifs.py
@@ -0,0 +1,113 @@
+#!/usr/bin/env python2
+# -*- coding: utf-8 -*-
+
+
+#==============================================================================
+
+import bob.bio.video # Used in MIFSPadFile class
+import bob.io.base
+import numpy as np
+
+from bob.pad.base.database import PadFile # Used in ReplayPadFile class
+
+from bob.pad.base.database import FileListPadDatabase
+
+
+#==============================================================================
+
+class MIFSPadFile(PadFile):
+    """
+    A high level implementation of the File class for the MIFS database.
+    """
+
+    def __init__(self, client_id, path, attack_type=None, file_id=None):
+        super(MIFSPadFile, self).__init__(client_id, path, attack_type, file_id)
+
+    #==========================================================================
+    def load(self, directory=None, extension=None):
+        #path = self.make_path(directory, extension)
+        path = self.make_path(directory=directory, extension=extension) # path to the file
+        frame_selector = bob.bio.video.FrameSelector(selection_style = 'all') # this frame_selector will select all frames from the video file
+
+        data = bob.io.base.load(path)
+        data = np.expand_dims(data, axis=0) # upgade to 4D (video)
+        video_data = frame_selector(data) # video data
+
+        return video_data # video data
+
+
+#==============================================================================
+class MIFSPadDatabase(FileListPadDatabase):
+    """
+    A high level implementation of the Database class for the MIFS database.
+    """
+
+    def __init__(
+        self,
+        protocol='grandtest', # grandtest is the default protocol for this database
+        original_directory='[MIFS_DATABASE_DIRECTORY]',
+        original_extension='.jpg',
+        **kwargs):
+
+        #from bob.db.replay import Database as LowLevelDatabase
+
+        #self.db = LowLevelDatabase()
+
+        # Since the high level API expects different group names than what the low
+        # level API offers, you need to convert them when necessary
+        #self.low_level_group_names = ('train', 'devel', 'test') # group names in the low-level database interface
+        #self.high_level_group_names = ('train', 'dev', 'eval') # names are expected to be like that in objects() function
+
+        # Always use super to call parent class methods.
+        #super(ReplayPadDatabase, self).__init__(
+        #    name = 'replay',
+        #    protocol = protocol,
+        #    original_directory = original_directory,
+        #    original_extension = original_extension,
+        #    **kwargs)
+
+        from pkg_resources import resource_filename
+        folder = resource_filename(__name__, '../lists/mifs')
+        super(MIFSPadDatabase, self).__init__(folder, 'mifs',
+                                            pad_file_class=MIFSPadFile,
+                                            protocol = protocol,
+                                            original_directory=original_directory,
+                                            original_extension=original_extension)
+
+    #==========================================================================
+    def annotations(self, f):
+        """
+        Return annotations for a given file object ``f``, which is an instance
+        of ``ReplayPadFile`` defined in the HLDI of the Replay-Attack DB.
+        The ``load()`` method of ``ReplayPadFile`` class (see above)
+        returns a video, therefore this method returns bounding-box annotations
+        for each video frame. The annotations are returned as dictionary of dictionaries.
+
+        **Parameters:**
+
+        ``f`` : :py:class:`object`
+            An instance of ``ReplayPadFile`` defined above.
+
+        **Returns:**
+
+        ``annotations`` : :py:class:`dict`
+            A dictionary containing the annotations for each frame in the video.
+            Dictionary structure: ``annotations = {'1': frame1_dict, '2': frame1_dict, ...}``.
+            Where ``frameN_dict = {'topleft': (row, col), 'bottomright': (row, col)}``
+            is the dictionary defining the coordinates of the face bounding box in frame N.
+        """
+
+        path_to_file    = self.original_directory + f.path
+        face_path       = path_to_file[:-4] + '.face'
+        file_handle     = open(face_path, 'r')
+        line            = file_handle.readline()
+        bbox            = [int(x) for x in line.split()]
+
+        annotations = {} # dictionary to return
+
+        topleft = (bbox[1], bbox[0])
+        bottomright = (bbox[1] + bbox[3], bbox[0] + bbox[2])
+
+        annotations['0'] = {'topleft': topleft, 'bottomright': bottomright}
+
+        return annotations
diff --git a/bob/pad/face/lists/mifs/grandtest/dev/for_attack.lst b/bob/pad/face/lists/mifs/grandtest/dev/for_attack.lst
new file mode 100644
index 00000000..9ff5603e
--- /dev/null
+++ b/bob/pad/face/lists/mifs/grandtest/dev/for_attack.lst
@@ -0,0 +1,70 @@
+mifs_data/002_A_1.jpg 002_A_1 attack
+mifs_data/002_A_2.jpg 002_A_2 attack
+mifs_data/005_A_1.jpg 005_A_1 attack
+mifs_data/005_A_2.jpg 005_A_2 attack
+mifs_data/008_A_1.jpg 008_A_1 attack
+mifs_data/008_A_2.jpg 008_A_2 attack
+mifs_data/011_A_1.jpg 011_A_1 attack
+mifs_data/011_A_2.jpg 011_A_2 attack
+mifs_data/014_A_1.jpg 014_A_1 attack
+mifs_data/014_A_2.jpg 014_A_2 attack
+mifs_data/017_A_1.jpg 017_A_1 attack
+mifs_data/017_A_2.jpg 017_A_2 attack
+mifs_data/020_A_1.jpg 020_A_1 attack
+mifs_data/020_A_2.jpg 020_A_2 attack
+mifs_data/023_A_1.jpg 023_A_1 attack
+mifs_data/023_A_2.jpg 023_A_2 attack
+mifs_data/026_A_1.jpg 026_A_1 attack
+mifs_data/026_A_2.jpg 026_A_2 attack
+mifs_data/029_A_1.jpg 029_A_1 attack
+mifs_data/029_A_2.jpg 029_A_2 attack
+mifs_data/032_A_1.jpg 032_A_1 attack
+mifs_data/032_A_2.jpg 032_A_2 attack
+mifs_data/035_A_1.jpg 035_A_1 attack
+mifs_data/035_A_2.jpg 035_A_2 attack
+mifs_data/039_A_1.jpg 039_A_1 attack
+mifs_data/039_A_2.jpg 039_A_2 attack
+mifs_data/042_A_1.jpg 042_A_1 attack
+mifs_data/042_A_2.jpg 042_A_2 attack
+mifs_data/046_A_1.jpg 046_A_1 attack
+mifs_data/046_A_2.jpg 046_A_2 attack
+mifs_data/049_A_1.jpg 049_A_1 attack
+mifs_data/049_A_2.jpg 049_A_2 attack
+mifs_data/052_A_1.jpg 052_A_1 attack
+mifs_data/052_A_2.jpg 052_A_2 attack
+mifs_data/055_A_1.jpg 055_A_1 attack
+mifs_data/055_A_2.jpg 055_A_2 attack
+mifs_data/060_A_1.jpg 060_A_1 attack
+mifs_data/060_A_2.jpg 060_A_2 attack
+mifs_data/064_A_1.jpg 064_A_1 attack
+mifs_data/064_A_2.jpg 064_A_2 attack
+mifs_data/067_A_1.jpg 067_A_1 attack
+mifs_data/067_A_2.jpg 067_A_2 attack
+mifs_data/070_A_1.jpg 070_A_1 attack
+mifs_data/070_A_2.jpg 070_A_2 attack
+mifs_data/073_A_1.jpg 073_A_1 attack
+mifs_data/073_A_2.jpg 073_A_2 attack
+mifs_data/079_A_1.jpg 079_A_1 attack
+mifs_data/079_A_2.jpg 079_A_2 attack
+mifs_data/083_A_1.jpg 083_A_1 attack
+mifs_data/083_A_2.jpg 083_A_2 attack
+mifs_data/087_A_1.jpg 087_A_1 attack
+mifs_data/087_A_2.jpg 087_A_2 attack
+mifs_data/091_A_1.jpg 091_A_1 attack
+mifs_data/091_A_2.jpg 091_A_2 attack
+mifs_data/094_A_1.jpg 094_A_1 attack
+mifs_data/094_A_2.jpg 094_A_2 attack
+mifs_data/097_A_1.jpg 097_A_1 attack
+mifs_data/097_A_2.jpg 097_A_2 attack
+mifs_data/100_A_1.jpg 100_A_1 attack
+mifs_data/100_A_2.jpg 100_A_2 attack
+mifs_data/103_A_1.jpg 103_A_1 attack
+mifs_data/103_A_2.jpg 103_A_2 attack
+mifs_data/106_A_1.jpg 106_A_1 attack
+mifs_data/106_A_2.jpg 106_A_2 attack
+mifs_data/109_A_1.jpg 109_A_1 attack
+mifs_data/109_A_2.jpg 109_A_2 attack
+mifs_data/114_A_1.jpg 114_A_1 attack
+mifs_data/114_A_2.jpg 114_A_2 attack
+mifs_data/117_A_1.jpg 117_A_1 attack
+mifs_data/117_A_2.jpg 117_A_2 attack
diff --git a/bob/pad/face/lists/mifs/grandtest/dev/for_real.lst b/bob/pad/face/lists/mifs/grandtest/dev/for_real.lst
new file mode 100644
index 00000000..bde63686
--- /dev/null
+++ b/bob/pad/face/lists/mifs/grandtest/dev/for_real.lst
@@ -0,0 +1,70 @@
+mifs_data/002_B_1.jpg 002_B_1
+mifs_data/002_B_2.jpg 002_B_2
+mifs_data/005_B_1.jpg 005_B_1
+mifs_data/005_B_2.jpg 005_B_2
+mifs_data/008_B_1.jpg 008_B_1
+mifs_data/008_B_2.jpg 008_B_2
+mifs_data/011_B_1.jpg 011_B_1
+mifs_data/011_B_2.jpg 011_B_2
+mifs_data/014_B_1.jpg 014_B_1
+mifs_data/014_B_2.jpg 014_B_2
+mifs_data/017_B_1.jpg 017_B_1
+mifs_data/017_B_2.jpg 017_B_2
+mifs_data/020_B_1.jpg 020_B_1
+mifs_data/020_B_2.jpg 020_B_2
+mifs_data/023_B_1.jpg 023_B_1
+mifs_data/023_B_2.jpg 023_B_2
+mifs_data/026_B_1.jpg 026_B_1
+mifs_data/026_B_2.jpg 026_B_2
+mifs_data/029_B_1.jpg 029_B_1
+mifs_data/029_B_2.jpg 029_B_2
+mifs_data/032_B_1.jpg 032_B_1
+mifs_data/032_B_2.jpg 032_B_2
+mifs_data/035_B_1.jpg 035_B_1
+mifs_data/035_B_2.jpg 035_B_2
+mifs_data/039_B_1.jpg 039_B_1
+mifs_data/039_B_2.jpg 039_B_2
+mifs_data/042_B_1.jpg 042_B_1
+mifs_data/042_B_2.jpg 042_B_2
+mifs_data/046_B_1.jpg 046_B_1
+mifs_data/046_B_2.jpg 046_B_2
+mifs_data/049_B_1.jpg 049_B_1
+mifs_data/049_B_2.jpg 049_B_2
+mifs_data/052_B_1.jpg 052_B_1
+mifs_data/052_B_2.jpg 052_B_2
+mifs_data/055_B_1.jpg 055_B_1
+mifs_data/055_B_2.jpg 055_B_2
+mifs_data/060_B_1.jpg 060_B_1
+mifs_data/060_B_2.jpg 060_B_2
+mifs_data/064_B_1.jpg 064_B_1
+mifs_data/064_B_2.jpg 064_B_2
+mifs_data/067_B_1.jpg 067_B_1
+mifs_data/067_B_2.jpg 067_B_2
+mifs_data/070_B_1.jpg 070_B_1
+mifs_data/070_B_2.jpg 070_B_2
+mifs_data/073_B_1.jpg 073_B_1
+mifs_data/073_B_2.jpg 073_B_2
+mifs_data/079_B_1.jpg 079_B_1
+mifs_data/079_B_2.jpg 079_B_2
+mifs_data/083_B_1.jpg 083_B_1
+mifs_data/083_B_2.jpg 083_B_2
+mifs_data/087_B_1.jpg 087_B_1
+mifs_data/087_B_2.jpg 087_B_2
+mifs_data/091_B_1.jpg 091_B_1
+mifs_data/091_B_2.jpg 091_B_2
+mifs_data/094_B_1.jpg 094_B_1
+mifs_data/094_B_2.jpg 094_B_2
+mifs_data/097_B_1.jpg 097_B_1
+mifs_data/097_B_2.jpg 097_B_2
+mifs_data/100_B_1.jpg 100_B_1
+mifs_data/100_B_2.jpg 100_B_2
+mifs_data/103_B_1.jpg 103_B_1
+mifs_data/103_B_2.jpg 103_B_2
+mifs_data/106_B_1.jpg 106_B_1
+mifs_data/106_B_2.jpg 106_B_2
+mifs_data/109_B_1.jpg 109_B_1
+mifs_data/109_B_2.jpg 109_B_2
+mifs_data/114_B_1.jpg 114_B_1
+mifs_data/114_B_2.jpg 114_B_2
+mifs_data/117_B_1.jpg 117_B_1
+mifs_data/117_B_2.jpg 117_B_2
diff --git a/bob/pad/face/lists/mifs/grandtest/eval/for_attack.lst b/bob/pad/face/lists/mifs/grandtest/eval/for_attack.lst
new file mode 100644
index 00000000..080f1a24
--- /dev/null
+++ b/bob/pad/face/lists/mifs/grandtest/eval/for_attack.lst
@@ -0,0 +1,68 @@
+mifs_data/003_A_1.jpg 003_A_1 attack
+mifs_data/003_A_2.jpg 003_A_2 attack
+mifs_data/006_A_1.jpg 006_A_1 attack
+mifs_data/006_A_2.jpg 006_A_2 attack
+mifs_data/009_A_1.jpg 009_A_1 attack
+mifs_data/009_A_2.jpg 009_A_2 attack
+mifs_data/012_A_1.jpg 012_A_1 attack
+mifs_data/012_A_2.jpg 012_A_2 attack
+mifs_data/015_A_1.jpg 015_A_1 attack
+mifs_data/015_A_2.jpg 015_A_2 attack
+mifs_data/018_A_1.jpg 018_A_1 attack
+mifs_data/018_A_2.jpg 018_A_2 attack
+mifs_data/021_A_1.jpg 021_A_1 attack
+mifs_data/021_A_2.jpg 021_A_2 attack
+mifs_data/024_A_1.jpg 024_A_1 attack
+mifs_data/024_A_2.jpg 024_A_2 attack
+mifs_data/027_A_1.jpg 027_A_1 attack
+mifs_data/027_A_2.jpg 027_A_2 attack
+mifs_data/030_A_1.jpg 030_A_1 attack
+mifs_data/030_A_2.jpg 030_A_2 attack
+mifs_data/033_A_1.jpg 033_A_1 attack
+mifs_data/033_A_2.jpg 033_A_2 attack
+mifs_data/037_A_1.jpg 037_A_1 attack
+mifs_data/037_A_2.jpg 037_A_2 attack
+mifs_data/040_A_1.jpg 040_A_1 attack
+mifs_data/040_A_2.jpg 040_A_2 attack
+mifs_data/044_A_1.jpg 044_A_1 attack
+mifs_data/044_A_2.jpg 044_A_2 attack
+mifs_data/047_A_1.jpg 047_A_1 attack
+mifs_data/047_A_2.jpg 047_A_2 attack
+mifs_data/050_A_1.jpg 050_A_1 attack
+mifs_data/050_A_2.jpg 050_A_2 attack
+mifs_data/053_A_1.jpg 053_A_1 attack
+mifs_data/053_A_2.jpg 053_A_2 attack
+mifs_data/056_A_1.jpg 056_A_1 attack
+mifs_data/056_A_2.jpg 056_A_2 attack
+mifs_data/061_A_1.jpg 061_A_1 attack
+mifs_data/061_A_2.jpg 061_A_2 attack
+mifs_data/065_A_1.jpg 065_A_1 attack
+mifs_data/065_A_2.jpg 065_A_2 attack
+mifs_data/068_A_1.jpg 068_A_1 attack
+mifs_data/068_A_2.jpg 068_A_2 attack
+mifs_data/071_A_1.jpg 071_A_1 attack
+mifs_data/071_A_2.jpg 071_A_2 attack
+mifs_data/076_A_1.jpg 076_A_1 attack
+mifs_data/076_A_2.jpg 076_A_2 attack
+mifs_data/081_A_1.jpg 081_A_1 attack
+mifs_data/081_A_2.jpg 081_A_2 attack
+mifs_data/084_A_1.jpg 084_A_1 attack
+mifs_data/084_A_2.jpg 084_A_2 attack
+mifs_data/089_A_1.jpg 089_A_1 attack
+mifs_data/089_A_2.jpg 089_A_2 attack
+mifs_data/092_A_1.jpg 092_A_1 attack
+mifs_data/092_A_2.jpg 092_A_2 attack
+mifs_data/095_A_1.jpg 095_A_1 attack
+mifs_data/095_A_2.jpg 095_A_2 attack
+mifs_data/098_A_1.jpg 098_A_1 attack
+mifs_data/098_A_2.jpg 098_A_2 attack
+mifs_data/101_A_1.jpg 101_A_1 attack
+mifs_data/101_A_2.jpg 101_A_2 attack
+mifs_data/104_A_1.jpg 104_A_1 attack
+mifs_data/104_A_2.jpg 104_A_2 attack
+mifs_data/107_A_1.jpg 107_A_1 attack
+mifs_data/107_A_2.jpg 107_A_2 attack
+mifs_data/111_A_1.jpg 111_A_1 attack
+mifs_data/111_A_2.jpg 111_A_2 attack
+mifs_data/115_A_1.jpg 115_A_1 attack
+mifs_data/115_A_2.jpg 115_A_2 attack
diff --git a/bob/pad/face/lists/mifs/grandtest/eval/for_real.lst b/bob/pad/face/lists/mifs/grandtest/eval/for_real.lst
new file mode 100644
index 00000000..c4538821
--- /dev/null
+++ b/bob/pad/face/lists/mifs/grandtest/eval/for_real.lst
@@ -0,0 +1,68 @@
+mifs_data/003_B_1.jpg 003_B_1
+mifs_data/003_B_2.jpg 003_B_2
+mifs_data/006_B_1.jpg 006_B_1
+mifs_data/006_B_2.jpg 006_B_2
+mifs_data/009_B_1.jpg 009_B_1
+mifs_data/009_B_2.jpg 009_B_2
+mifs_data/012_B_1.jpg 012_B_1
+mifs_data/012_B_2.jpg 012_B_2
+mifs_data/015_B_1.jpg 015_B_1
+mifs_data/015_B_2.jpg 015_B_2
+mifs_data/018_B_1.jpg 018_B_1
+mifs_data/018_B_2.jpg 018_B_2
+mifs_data/021_B_1.jpg 021_B_1
+mifs_data/021_B_2.jpg 021_B_2
+mifs_data/024_B_1.jpg 024_B_1
+mifs_data/024_B_2.jpg 024_B_2
+mifs_data/027_B_1.jpg 027_B_1
+mifs_data/027_B_2.jpg 027_B_2
+mifs_data/030_B_1.jpg 030_B_1
+mifs_data/030_B_2.jpg 030_B_2
+mifs_data/033_B_1.jpg 033_B_1
+mifs_data/033_B_2.jpg 033_B_2
+mifs_data/037_B_1.jpg 037_B_1
+mifs_data/037_B_2.jpg 037_B_2
+mifs_data/040_B_1.jpg 040_B_1
+mifs_data/040_B_2.jpg 040_B_2
+mifs_data/044_B_1.jpg 044_B_1
+mifs_data/044_B_2.jpg 044_B_2
+mifs_data/047_B_1.jpg 047_B_1
+mifs_data/047_B_2.jpg 047_B_2
+mifs_data/050_B_1.jpg 050_B_1
+mifs_data/050_B_2.jpg 050_B_2
+mifs_data/053_B_1.jpg 053_B_1
+mifs_data/053_B_2.jpg 053_B_2
+mifs_data/056_B_1.jpg 056_B_1
+mifs_data/056_B_2.jpg 056_B_2
+mifs_data/061_B_1.jpg 061_B_1
+mifs_data/061_B_2.jpg 061_B_2
+mifs_data/065_B_1.jpg 065_B_1
+mifs_data/065_B_2.jpg 065_B_2
+mifs_data/068_B_1.jpg 068_B_1
+mifs_data/068_B_2.jpg 068_B_2
+mifs_data/071_B_1.jpg 071_B_1
+mifs_data/071_B_2.jpg 071_B_2
+mifs_data/076_B_1.jpg 076_B_1
+mifs_data/076_B_2.jpg 076_B_2
+mifs_data/081_B_1.jpg 081_B_1
+mifs_data/081_B_2.jpg 081_B_2
+mifs_data/084_B_1.jpg 084_B_1
+mifs_data/084_B_2.jpg 084_B_2
+mifs_data/089_B_1.jpg 089_B_1
+mifs_data/089_B_2.jpg 089_B_2
+mifs_data/092_B_1.jpg 092_B_1
+mifs_data/092_B_2.jpg 092_B_2
+mifs_data/095_B_1.jpg 095_B_1
+mifs_data/095_B_2.jpg 095_B_2
+mifs_data/098_B_1.jpg 098_B_1
+mifs_data/098_B_2.jpg 098_B_2
+mifs_data/101_B_1.jpg 101_B_1
+mifs_data/101_B_2.jpg 101_B_2
+mifs_data/104_B_1.jpg 104_B_1
+mifs_data/104_B_2.jpg 104_B_2
+mifs_data/107_B_1.jpg 107_B_1
+mifs_data/107_B_2.jpg 107_B_2
+mifs_data/111_B_1.jpg 111_B_1
+mifs_data/111_B_2.jpg 111_B_2
+mifs_data/115_B_1.jpg 115_B_1
+mifs_data/115_B_2.jpg 115_B_2
diff --git a/bob/pad/face/lists/mifs/grandtest/train/for_attack.lst b/bob/pad/face/lists/mifs/grandtest/train/for_attack.lst
new file mode 100644
index 00000000..a0f2db71
--- /dev/null
+++ b/bob/pad/face/lists/mifs/grandtest/train/for_attack.lst
@@ -0,0 +1,70 @@
+mifs_data/001_A_1.jpg 001_A_1 attack
+mifs_data/001_A_2.jpg 001_A_2 attack
+mifs_data/004_A_1.jpg 004_A_1 attack
+mifs_data/004_A_2.jpg 004_A_2 attack
+mifs_data/007_A_1.jpg 007_A_1 attack
+mifs_data/007_A_2.jpg 007_A_2 attack
+mifs_data/010_A_1.jpg 010_A_1 attack
+mifs_data/010_A_2.jpg 010_A_2 attack
+mifs_data/013_A_1.jpg 013_A_1 attack
+mifs_data/013_A_2.jpg 013_A_2 attack
+mifs_data/016_A_1.jpg 016_A_1 attack
+mifs_data/016_A_2.jpg 016_A_2 attack
+mifs_data/019_A_1.jpg 019_A_1 attack
+mifs_data/019_A_2.jpg 019_A_2 attack
+mifs_data/022_A_1.jpg 022_A_1 attack
+mifs_data/022_A_2.jpg 022_A_2 attack
+mifs_data/025_A_1.jpg 025_A_1 attack
+mifs_data/025_A_2.jpg 025_A_2 attack
+mifs_data/028_A_1.jpg 028_A_1 attack
+mifs_data/028_A_2.jpg 028_A_2 attack
+mifs_data/031_A_1.jpg 031_A_1 attack
+mifs_data/031_A_2.jpg 031_A_2 attack
+mifs_data/034_A_1.jpg 034_A_1 attack
+mifs_data/034_A_2.jpg 034_A_2 attack
+mifs_data/038_A_1.jpg 038_A_1 attack
+mifs_data/038_A_2.jpg 038_A_2 attack
+mifs_data/041_A_1.jpg 041_A_1 attack
+mifs_data/041_A_2.jpg 041_A_2 attack
+mifs_data/045_A_1.jpg 045_A_1 attack
+mifs_data/045_A_2.jpg 045_A_2 attack
+mifs_data/048_A_1.jpg 048_A_1 attack
+mifs_data/048_A_2.jpg 048_A_2 attack
+mifs_data/051_A_1.jpg 051_A_1 attack
+mifs_data/051_A_2.jpg 051_A_2 attack
+mifs_data/054_A_1.jpg 054_A_1 attack
+mifs_data/054_A_2.jpg 054_A_2 attack
+mifs_data/059_A_1.jpg 059_A_1 attack
+mifs_data/059_A_2.jpg 059_A_2 attack
+mifs_data/063_A_1.jpg 063_A_1 attack
+mifs_data/063_A_2.jpg 063_A_2 attack
+mifs_data/066_A_1.jpg 066_A_1 attack
+mifs_data/066_A_2.jpg 066_A_2 attack
+mifs_data/069_A_1.jpg 069_A_1 attack
+mifs_data/069_A_2.jpg 069_A_2 attack
+mifs_data/072_A_1.jpg 072_A_1 attack
+mifs_data/072_A_2.jpg 072_A_2 attack
+mifs_data/078_A_1.jpg 078_A_1 attack
+mifs_data/078_A_2.jpg 078_A_2 attack
+mifs_data/082_A_1.jpg 082_A_1 attack
+mifs_data/082_A_2.jpg 082_A_2 attack
+mifs_data/085_A_1.jpg 085_A_1 attack
+mifs_data/085_A_2.jpg 085_A_2 attack
+mifs_data/090_A_1.jpg 090_A_1 attack
+mifs_data/090_A_2.jpg 090_A_2 attack
+mifs_data/093_A_1.jpg 093_A_1 attack
+mifs_data/093_A_2.jpg 093_A_2 attack
+mifs_data/096_A_1.jpg 096_A_1 attack
+mifs_data/096_A_2.jpg 096_A_2 attack
+mifs_data/099_A_1.jpg 099_A_1 attack
+mifs_data/099_A_2.jpg 099_A_2 attack
+mifs_data/102_A_1.jpg 102_A_1 attack
+mifs_data/102_A_2.jpg 102_A_2 attack
+mifs_data/105_A_1.jpg 105_A_1 attack
+mifs_data/105_A_2.jpg 105_A_2 attack
+mifs_data/108_A_1.jpg 108_A_1 attack
+mifs_data/108_A_2.jpg 108_A_2 attack
+mifs_data/113_A_1.jpg 113_A_1 attack
+mifs_data/113_A_2.jpg 113_A_2 attack
+mifs_data/116_A_1.jpg 116_A_1 attack
+mifs_data/116_A_2.jpg 116_A_2 attack
diff --git a/bob/pad/face/lists/mifs/grandtest/train/for_real.lst b/bob/pad/face/lists/mifs/grandtest/train/for_real.lst
new file mode 100644
index 00000000..b191a3f4
--- /dev/null
+++ b/bob/pad/face/lists/mifs/grandtest/train/for_real.lst
@@ -0,0 +1,70 @@
+mifs_data/001_B_1.jpg 001_B_1
+mifs_data/001_B_2.jpg 001_B_2
+mifs_data/004_B_1.jpg 004_B_1
+mifs_data/004_B_2.jpg 004_B_2
+mifs_data/007_B_1.jpg 007_B_1
+mifs_data/007_B_2.jpg 007_B_2
+mifs_data/010_B_1.jpg 010_B_1
+mifs_data/010_B_2.jpg 010_B_2
+mifs_data/013_B_1.jpg 013_B_1
+mifs_data/013_B_2.jpg 013_B_2
+mifs_data/016_B_1.jpg 016_B_1
+mifs_data/016_B_2.jpg 016_B_2
+mifs_data/019_B_1.jpg 019_B_1
+mifs_data/019_B_2.jpg 019_B_2
+mifs_data/022_B_1.jpg 022_B_1
+mifs_data/022_B_2.jpg 022_B_2
+mifs_data/025_B_1.jpg 025_B_1
+mifs_data/025_B_2.jpg 025_B_2
+mifs_data/028_B_1.jpg 028_B_1
+mifs_data/028_B_2.jpg 028_B_2
+mifs_data/031_B_1.jpg 031_B_1
+mifs_data/031_B_2.jpg 031_B_2
+mifs_data/034_B_1.jpg 034_B_1
+mifs_data/034_B_2.jpg 034_B_2
+mifs_data/038_B_1.jpg 038_B_1
+mifs_data/038_B_2.jpg 038_B_2
+mifs_data/041_B_1.jpg 041_B_1
+mifs_data/041_B_2.jpg 041_B_2
+mifs_data/045_B_1.jpg 045_B_1
+mifs_data/045_B_2.jpg 045_B_2
+mifs_data/048_B_1.jpg 048_B_1
+mifs_data/048_B_2.jpg 048_B_2
+mifs_data/051_B_1.jpg 051_B_1
+mifs_data/051_B_2.jpg 051_B_2
+mifs_data/054_B_1.jpg 054_B_1
+mifs_data/054_B_2.jpg 054_B_2
+mifs_data/059_B_1.jpg 059_B_1
+mifs_data/059_B_2.jpg 059_B_2
+mifs_data/063_B_1.jpg 063_B_1
+mifs_data/063_B_2.jpg 063_B_2
+mifs_data/066_B_1.jpg 066_B_1
+mifs_data/066_B_2.jpg 066_B_2
+mifs_data/069_B_1.jpg 069_B_1
+mifs_data/069_B_2.jpg 069_B_2
+mifs_data/072_B_1.jpg 072_B_1
+mifs_data/072_B_2.jpg 072_B_2
+mifs_data/078_B_1.jpg 078_B_1
+mifs_data/078_B_2.jpg 078_B_2
+mifs_data/082_B_1.jpg 082_B_1
+mifs_data/082_B_2.jpg 082_B_2
+mifs_data/085_B_1.jpg 085_B_1
+mifs_data/085_B_2.jpg 085_B_2
+mifs_data/090_B_1.jpg 090_B_1
+mifs_data/090_B_2.jpg 090_B_2
+mifs_data/093_B_1.jpg 093_B_1
+mifs_data/093_B_2.jpg 093_B_2
+mifs_data/096_B_1.jpg 096_B_1
+mifs_data/096_B_2.jpg 096_B_2
+mifs_data/099_B_1.jpg 099_B_1
+mifs_data/099_B_2.jpg 099_B_2
+mifs_data/102_B_1.jpg 102_B_1
+mifs_data/102_B_2.jpg 102_B_2
+mifs_data/105_B_1.jpg 105_B_1
+mifs_data/105_B_2.jpg 105_B_2
+mifs_data/108_B_1.jpg 108_B_1
+mifs_data/108_B_2.jpg 108_B_2
+mifs_data/113_B_1.jpg 113_B_1
+mifs_data/113_B_2.jpg 113_B_2
+mifs_data/116_B_1.jpg 116_B_1
+mifs_data/116_B_2.jpg 116_B_2
diff --git a/bob/pad/face/test/test_databases.py b/bob/pad/face/test/test_databases.py
index 6c628bd2..bb74a9ca 100644
--- a/bob/pad/face/test/test_databases.py
+++ b/bob/pad/face/test/test_databases.py
@@ -56,5 +56,3 @@ def test_msu_mfsd():
     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)
-
-
diff --git a/setup.py b/setup.py
index efe8b2ab..b58a6cda 100644
--- a/setup.py
+++ b/setup.py
@@ -67,6 +67,7 @@ setup(
             'replay-mobile = bob.pad.face.config.database.replay_mobile:database',
             'msu-mfsd = bob.pad.face.config.database.msu_mfsd:database',
             'aggregated-db = bob.pad.face.config.database.aggregated_db:database',
+            'mifs = bob.pad.face.config.database.mifs:database',
             ],
 
         # registered configurations:
@@ -76,6 +77,7 @@ setup(
             'replay-mobile = bob.pad.face.config.replay_mobile',
             'msu-mfsd = bob.pad.face.config.msu_mfsd',
             'aggregated-db = bob.pad.face.config.aggregated_db',
+            'mifs = bob.pad.face.config.mifs',
 
             # baselines:
             'lbp-svm = bob.pad.face.config.lbp_svm',
-- 
GitLab