Skip to content

Commit

Permalink
Merge branch 'master' of github.com:bioidiap/bob.bio.base
Browse files Browse the repository at this point in the history
  • Loading branch information
siebenkopf committed May 12, 2016
2 parents 24e704d + d320fbc commit a9f6898
Show file tree
Hide file tree
Showing 8 changed files with 168 additions and 0 deletions.
3 changes: 3 additions & 0 deletions bob/bio/base/config/preprocessor/filename.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import bob.bio.base

preprocessor = bob.bio.base.preprocessor.Filename()
105 changes: 105 additions & 0 deletions bob/bio/base/preprocessor/Filename.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
# @date Wed May 11 12:39:37 MDT 2016
# @author Manuel Gunther <siebenkopf@googlemail.com>
#
# Copyright (c) 2016, Regents of the University of Colorado on behalf of the University of Colorado Colorado Springs.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

import bob.io.base

import os

from .Preprocessor import Preprocessor

class Filename (Preprocessor):
"""This preprocessor is simply passing over the file name, in order to be used in an extractor that loads the data from file.
The file name that will be returned by the :py:meth:`read_data` function will contain the path of the :py:class:`bob.db.verification.utils.File`, but it might contain more paths (such as the ``--preprocessed-directory`` passed on command line).
"""

def __init__(self):
pass


# The call function (i.e. the operator() in C++ terms)
def __call__(self, data, annotations = None):
"""__call__(data, annotations) -> data
This function appears to do something, but it simply returns ``1``, which is used nowhere.
We could also return ``None``, but this might trigger warnings in the calling function.
**Parameters:**
``data`` : ``None``
The file name returned by :py:meth:`read_original_data`.
``annotations`` : any
ignored.
**Returns:**
``data`` : int
1 throughout
"""
return 1


############################################################
### Special functions that might be overwritten on need
############################################################

def read_original_data(self, original_file_name):
"""read_original_data(original_file_name) -> data
This function does **not** read the original image..
**Parameters:**
``original_file_name`` : any
ignored
**Returns:**
``data`` : ``None``
throughout.
"""
pass


def write_data(self, data, data_file):
"""Does **not** write any data.
``data`` : any
ignored.
``data_file`` : any
ignored.
"""
pass


def read_data(self, data_file):
"""read_data(data_file) -> data
Returns the name of the data file without its filename extension.
**Parameters:**
``data_file`` : str
The name of the preprocessed data file.
**Returns:**
``data`` : str
The preprocessed data read from file.
"""
return os.path.splitext(data_file)[0]
1 change: 1 addition & 0 deletions bob/bio/base/preprocessor/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .Preprocessor import Preprocessor
from .Filename import Filename

# gets sphinx autodoc done right - don't remove it
__all__ = [_ for _ in dir() if not _.startswith('_')]
21 changes: 21 additions & 0 deletions bob/bio/base/test/test_preprocessor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import bob.bio.base

from . import utils

def test_filename():
# load extractor
preprocessor = bob.bio.base.load_resource("filename", "preprocessor", preferred_package = 'bob.bio.base')
assert isinstance(preprocessor, bob.bio.base.preprocessor.Preprocessor)
assert isinstance(preprocessor, bob.bio.base.preprocessor.Filename)

# try to load the original image
assert preprocessor.read_original_data("/any/path") is None

# try to process
assert preprocessor(None, None) == 1

# try to write
preprocessor.write_data(None, "/any/path")

# read a file
assert preprocessor.read_data("/any/file.name") == "/any/file"
27 changes: 27 additions & 0 deletions bob/bio/base/tools/algorithm.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,15 @@ def project(algorithm, extractor, groups = None, indices = None, allow_missing_f
feature = extractor.read_feature(feature_file)
# project feature
projected = algorithm.project(feature)

if projected is None:
if allow_missing_files:
logger.debug("... Projection for extracted file %s failed; skipping", feature_file)
continue
else:
logger.error("Projection of file '%s' was not successful", feature_file)
continue

# write it
algorithm.write_feature(projected, projected_file)

Expand Down Expand Up @@ -265,6 +274,15 @@ def enroll(algorithm, extractor, compute_zt_norm, indices = None, groups = ['dev
enroll_features = [reader.read_feature(enroll_file) for enroll_file in enroll_files]

model = algorithm.enroll(enroll_features)

if model is None:
if allow_missing_files:
logger.debug("... Enrollment for model %s failed; skipping", model_id)
continue
else:
logger.error("Enrollemnt of model '%s' was not successful", model_id)
continue

# save the model
algorithm.write_model(model, model_file)

Expand Down Expand Up @@ -303,6 +321,15 @@ def enroll(algorithm, extractor, compute_zt_norm, indices = None, groups = ['dev
t_enroll_features = [reader.read_feature(t_enroll_file) for t_enroll_file in t_enroll_files]

t_model = algorithm.enroll(t_enroll_features)

if t_model is None:
if allow_missing_files:
logger.debug("... Enrollment for T-model %s failed; skipping", t_model_id)
continue
else:
logger.error("Enrollemnt of T-model '%s' was not successful", t_model_id)
continue

# save model
algorithm.write_model(t_model, t_model_file)
else:
Expand Down
9 changes: 9 additions & 0 deletions bob/bio/base/tools/extractor.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,15 @@ def extract(extractor, preprocessor, groups=None, indices = None, allow_missing_
data = preprocessor.read_data(data_file)
# extract feature
feature = extractor(data)

if feature is None:
if allow_missing_files:
logger.debug("... Feature extraction for data file %s failed; skipping", data_file)
continue
else:
logger.error("Feature extraction of file '%s' was not successful", data_file)
continue

# write feature
extractor.write_feature(feature, feature_file)
else:
Expand Down
1 change: 1 addition & 0 deletions doc/implemented.rst
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ Implementations
~~~~~~~~~~~~~~~

.. autosummary::
bob.bio.base.preprocessor.Filename
bob.bio.base.extractor.Linearize
bob.bio.base.algorithm.Distance
bob.bio.base.algorithm.PCA
Expand Down
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@

'bob.bio.preprocessor': [
'dummy = bob.bio.base.test.dummy.preprocessor:preprocessor', # for test purposes only
'filename = bob.bio.base.config.preprocessor.filename:preprocessor', # for test purposes only
],

'bob.bio.extractor': [
Expand Down

0 comments on commit a9f6898

Please sign in to comment.