Commit dceded86 by Sushil BHATTACHARJEE

initial commit

parent d8c4a37a
.. vim: set fileencoding=utf-8 :
.. Sat 3 Dec 20:18:15 2016 CET
.. image:: http://img.shields.io/badge/docs-stable-yellow.png
:target: http://pythonhosted.org/bob.ip.qualitymeasure/index.html
.. image:: http://img.shields.io/badge/docs-latest-orange.png
:target: https://www.idiap.ch/software/bob/docs/latest/bob/bob.ip.qualitymeasure/master/index.html
.. image:: https://gitlab.idiap.ch/bob/bob.ip.qualitymeasure/badges/master/build.svg
:target: https://gitlab.idiap.ch/bob/bob.ip.qualitymeasure/commits/master
.. image:: https://img.shields.io/badge/gitlab-project-0000c0.svg
:target: https://gitlab.idiap.ch/bob/bob.ip.qualitymeasure
.. image:: http://img.shields.io/pypi/v/bob.ip.qualitymeasure.png
:target: https://pypi.python.org/pypi/bob.ip.qualitymeasure
.. image:: http://img.shields.io/pypi/dm/bob.ip.qualitymeasure.png
:target: https://pypi.python.org/pypi/bob.ip.qualitymeasure
==================================================
Bob's library of image-quality feature-extractors
==================================================
This package is part of the signal-processing and machine learning toolbox
Bob_. It provides functions for extracting image-quality features proposed
for PAD experiments by different research group.
Installation
------------
Follow our `installation`_ instructions. Then, using the Python interpreter
provided by the distribution, bootstrap and buildout this package::
$ python bootstrap-buildout.py
$ ./bin/buildout
Contact
-------
For questions or reporting issues to this software package, contact our
development `mailing list`_.
.. Place your references here:
.. _bob: https://www.idiap.ch/software/bob
.. _installation: https://gitlab.idiap.ch/bob/bob/wikis/Installation
.. _mailing list: https://groups.google.com/forum/?fromgroups#!forum/bob-devel
# see https://docs.python.org/3/library/pkgutil.html
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
# see https://docs.python.org/3/library/pkgutil.html
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
def get_config():
"""
Returns a string containing the configuration information.
"""
import bob.extension
return bob.extension.get_config(__name__)
# gets sphinx autodoc done right - don't remove it
__all__ = [_ for _ in dir() if not _.startswith('_')]
#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
'''
Created on 13 Oct 2015
@author: sbhatta
'''
import os, sys
import argparse
import bob.io.base
import bob.io.video
import bob.ip.color
import numpy as np
import galbally_iqm_features as iqm
import antispoofing.utils.db as bobdb
#'''
#Matlab-like RGB to gray...
# @param: rgbImage : numpy array for the form: [3,h,w] where h is the height of the image and w is the width of the image.
# Returns a y-image in floating-point format (range [(16/255) .. (235/255)])
#'''
#def matlab_rgb2gray(rgbImage):
# #g1 = 0.299*rgbFrame[0,:,:] + 0.587*rgbFrame[1,:,:] + 0.114*rgbFrame[2,:,:] #standard coeffs CCIR601
#
# #this is how it's done in matlab...
# rgbImage = rgbImage / 255.0
# C0 = 65.481/255.0
# C1 = 128.553/255.0
# C2 = 24.966/255.0
# scaleMin = 16.0/255.0
# #scaleMax = 235.0/255.0
# gray = scaleMin + (C0*rgbImage[0,:,:] + C1*rgbImage[1,:,:] + C2*rgbImage[2,:,:])
#
# return gray
# """
# loads a video, and returns a feature-vector for each frame of video
# """
# def computeIQM_1video(vidPath):
# inputVideo = bob.io.video.reader(vidPath)
# vin = inputVideo.load()
# numframes = vin.shape[0]
# fset = np.zeros([numframes, 21])
# for f in range(numframes):
# rgbFrame = vin[f,:,:,:]
# grayFrame = matlab_rgb2gray(rgbFrame) #compute gray-level image for input color-frame
# bobQFeats = np.asarray(iqm.computeQualityFeatures(grayFrame)) # computeQualityFeatures() returns a tuple
# fset[f,:] = bobQFeats
#
# return fset
#
'''
computes image-quality features for a set of frames comprising a video.
@param video4d: a '4d' video (N frames, each frame representing an r-g-b image).
returns a set of feature-vectors, 1 vector per frame of video4d
'''
def computeVideoIQM(video4d):
numframes = video4d.shape[0]
#process first frame separately, to get the no. of iqm features
f=0
rgbFrame = video4d[f,:,:,:]
grayFrame = matlab_rgb2gray(rgbFrame) #compute gray-level image for input color-frame
iqmSet = iqm.compute_quality_features(grayFrame)
numIQMs = len(iqmSet)
#now initialize fset to store iqm features for all frames of input video.
fset = np.zeros([numframes, numIQMs])
bobQFeats = np.asarray(iqmSet) # computeQualityFeatures() returns a tuple
fset[f,:] = bobQFeats
for f in range(1,numframes):
rgbFrame = video4d[f,:,:,:]
# grayFrame = matlab_rgb2gray(rgbFrame) #compute gray-level image for input color-frame
# bobQFeats = np.asarray(iqm.compute_quality_features(grayFrame)) # computeQualityFeatures() returns a tuple
bobQFeats = np.asarray(iqm.compute_quality_features(rgbFrame)) # computeQualityFeatures() returns a tuple
fset[f,:] = bobQFeats
return fset
'''
loads a video, and returns a feature-vector for each frame of video
'''
def computeIQM_1video(vidPath):
inputVideo = bob.io.video.reader(vidPath)
vin = inputVideo.load()
return computeVideoIQM(vin)
def main(command_line_parameters=None):
#code for parsing command line args.
argParser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
argParser.add_argument('-f', '--print_num_files', action='store_true', dest='printNumFiles',
default=False, help='Option to print no. of files that will be processed. (Default: %(default)s)')
argParser.add_argument('-i', '--input_videofile', dest='inpFile', default = None,
help='filename of video to be processed (including complete path). Video expected in .mov format.')
argParser.add_argument('-o', '--output_featurefile', dest='outFile', default = None,
help='filename where computed features will be stored. Output file will be in hdf5 format.')
args = argParser.parse_args(command_line_parameters)
#make sure the user specifies a folder where feature-files exist
if not args.inpFile: argParser.error('Specify parameter --input_videofile')
if not args.outFile: argParser.error('Specify parameter --output_featurefile')
#1. load video file
infile = args.inpFile #k.make_path(videoRoot, '.mov')
#2. compute features, 1 vector per frame of input video.
bobIqmFeats = computeIQM_1video(infile)
#3. save features in file
outfile = args.outFile #k.make_path(featRoot, '.h5')
ohf = bob.io.base.HDF5File(outfile, 'w')
ohf.set('bobiqm', bobIqmFeats)
del ohf
if __name__ == '__main__':
main(sys.argv[1:])
'''
Created on 13 Oct 2015
@author: sbhatta
'''
import os, sys
import argparse
import bob.io.base
import bob.io.image #under the hood: loads Bob plugin for image file
import bob.io.video
import bob.ip.color
import numpy as np
import msu_iqa_features as iqa
#import MSU_MaskedIQAFeats as iqa
import antispoofing.utils.db as bobdb
'''
computes image-quality features for a set of frames comprising a video.
@param video4d: a '4d' video (N frames, each frame representing an r-g-b image).
returns a set of feature-vectors, 1 vector per frame of video4d
'''
def computeVideoIQA(video4d, validFrames):
numframes = video4d.shape[0]
#process first frame separately, to get the no. of iqm features
numValidFrames = np.sum(validFrames)
k=0
while validFrames[k] == 0: k+=1
print 'first valid frame: ', k
rgbFrame = video4d[k,:,:,:]
iqmSet = iqa.computeMsuIQAFeatures(rgbFrame)
numIQMs = len(iqmSet)
#now initialize fset to store iqm features for all frames of input video.
fset = np.zeros([numValidFrames, numIQMs])
msuQFeats = np.asarray(iqmSet) # computeQualityFeatures() returns a tuple
fset[0,:] = msuQFeats
print 'fset shape:', fset.shape
j=1
for f in range(k+1,numframes):
if validFrames[f]==1:
rgbFrame = video4d[f,:,:,:]
#grayFrame = matlab_rgb2gray(rgbFrame) #compute gray-level image for input color-frame
msuQFeats = np.asarray(iqa.computeMsuIQAFeatures(rgbFrame)) # computeQualityFeatures() returns a tuple
fset[j,:] = msuQFeats
#print j, f
j += 1
return fset
'''
loads a video, and returns a feature-vector for each frame of video
'''
def computeIQA_1video(videoFile, frameQualFile):
inputVideo = bob.io.video.reader(videoFile)
#load input video
vin = inputVideo.load()
numFrames = vin.shape[0]
if frameQualFile is not None:
f = bob.io.base.HDF5File(frameQualFile) #read only
validFrames = (f.read('/frameQuality')).flatten() #reads list of frame-quality indicators
validFrames[np.where(validFrames <> 1)]=0
else:
validFrames = np.ones(numFrames)
#print validFrames
# print type(validFrames)
numValidFrames = np.sum(validFrames)
print 'valid frames:', numValidFrames, 'of', numFrames
#bob.io.base.save(vin[0,:,:,:].astype('uint8'), '/idiap/temp/sbhatta/msudb_colorImg.png')
import time
startTime = time.time()
fset = computeVideoIQA(vin, validFrames)
print("Time for one video --- %s seconds ---" % (time.time() - startTime))
return fset
'''
'''
def parse_arguments(arguments):
#code for parsing command line args.
argParser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
# # verbose
argParser.add_argument('-v', '--verbose', dest='verbose', metavar='INT', type=int, choices=[0, 1, 2], default=1,
help='Prints (hopefully helpful) messages (Default: %(default)s)')
argParser.add_argument('-db', '--dbase_path', dest='dbPath', default = None, #'/idiap/user/sbhatta/work/Antispoofing/ImageQualityMeasures',
help='path where database videos exist.')
argParser.add_argument('-op', '--output_path', dest='outPath', default = None,
help='path where face-files will be stored.')
argParser.add_argument('-nf', '--numFiles', action='store_true', dest='numFiles',
default=False, help='Option to print no. of files that will be processed. (Default: %(default)s)')
argParser.add_argument('-f', '--singleFile', dest='singleFile', default=None,
help='filename (including complete path) of video to be used to test this code: %(default)s)')
argParser.add_argument('-ve', '--video_ext', dest='vidExtn', default=None, choices = ['avi', 'mov', 'mp4'],
help='filename (including complete path) of video to be used to test this code: %(default)s)')
bobdb.Database.create_parser(argParser, implements_any_of='video')
args = argParser.parse_args(arguments)
database = args.cls(args)
if args.singleFile is None:
#make sure the user specifies a folder where feature-files exist
if not args.dbPath: argParser.error('Specify parameter --dbase_path')
else:
folder = os.path.dirname(args.singleFile)
filename = os.path.basename(args.singleFile)
args.dbPath = folder
args.singleFile = filename
if not args.outPath: argParser.error('Specify parameter --output_path')
return (args, database)
'''
'''
def main(arguments):
args, database = parse_arguments(arguments)
inpDir = args.dbPath
outDir = args.outPath
assert os.path.exists(inpDir), "Input database folder %s does not exist" %inpDir
if args.verbose>0: print 'Loading data from',inpDir
if args.singleFile is None:
tr_realFiles, tr_attackFiles = database.get_train_data()
dv_realFiles, dv_attackFiles = database.get_devel_data()
ts_realFiles, ts_attackFiles = database.get_test_data()
allFiles = tr_realFiles + dv_realFiles + ts_realFiles + tr_attackFiles + dv_attackFiles + ts_attackFiles
del tr_realFiles, tr_attackFiles, dv_realFiles, dv_attackFiles, ts_realFiles, ts_attackFiles
numFiles = len(allFiles)
if args.numFiles:
print 'Number of files to be processed:',numFiles
print 'exiting'
return
# print numFiles
# numFiles = 1 #test
# if we are on a grid environment, just find what I have to process.
fileSet = allFiles[0:numFiles]
if os.environ.has_key('SGE_TASK_ID'):
pos = int(os.environ['SGE_TASK_ID']) - 1
if pos >= numFiles:
raise RuntimeError, "Grid request for job %d on a setup with %d jobs" % (pos, numFiles)
fileSet = [allFiles[pos]] # objects = [objects[pos]]
print 'processing', len(fileSet), ' files'
k1=0
for k in fileSet:
#1. load video file
print 'filenum:', k1
# infile = k.make_path(videoRoot, '.avi')
# outfile = k.make_path(featRoot, '.h5')
print k
if args.vidExtn is None:
inVidFile = k.videofile(inpDir) #k.make_path(inpDir, '.avi')
else:
inVidFile = k.make_path(inpDir, ('.' + args.vidExtn))
inFrameQFile = None #k.make_path(inpDir, '_frameQ.h5')
outFeatFile = k.make_path(outDir, '.h5')
head, tail = os.path.split(outFeatFile)
if not os.path.exists(head): os.makedirs(head) #create output folder, if it doesn't exist
print inFrameQFile
print outFeatFile
# if True: #not os.path.isfile(outFeatFile):
msuIQAFeats = computeIQA_1video(inVidFile, inFrameQFile)
#4. save features in file
ohf = bob.io.base.HDF5File(outFeatFile, 'w')
ohf.set('msuiqa', msuIQAFeats)
del ohf
# assert 0>1, 'stop'
k1 += 1
else:
# test feature-computation with a single file specified as input
filePart = os.path.splitext(args.singleFile)[0]
inVidFile = os.path.join(args.dbPath, filePart)+ '.avi'
inFrameQFile = os.path.join(args.dbPath, filePart)+ '_frameQ.h5'
outFeatFile = os.path.join(outDir, filePart)+ '.h5'
head, tail = os.path.split(outFeatFile)
if not os.path.exists(head): os.makedirs(head) #create output folder, if it doesn't exist
print 'single file:', inVidFile
print inFrameQFile
print outFeatFile
msuIQAFeats = computeIQA_1video(inVidFile, inFrameQFile)
#4. save features in file
ohf = bob.io.base.HDF5File(outFeatFile, 'w')
ohf.set('msuiqa', msuIQAFeats)
del ohf
# special fn to extract first frame from video-file and store it as hdf5
def extractTestFrame():
videoFile = '/idiap/home/sbhatta/work/git/refactoring/bob.db.msu_mfsd_mod/bob/db/msu_mfsd_mod/test_images/real/real_client022_android_SD_scene01.mp4'
inputVideo = bob.io.video.reader(videoFile)
#load input video
vin = inputVideo.load()
numFrames = vin.shape[0]
outframe = vin[0]
outfile = '/idiap/home/sbhatta/work/git/refactoring/bob.db.msu_mfsd_mod/bob/db/msu_mfsd_mod/test_images/real_client022_android_SD_scene01_frame0_correct.hdf5'
ohf = bob.io.base.HDF5File(outfile, 'w')
ohf.set('color_frame', outframe)
del ohf
if __name__ == '__main__':
# extractTestFrame()
main(sys.argv[1:])
##############################################################################
#
# Copyright (c) 2006 Zope Foundation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Bootstrap a buildout-based project
Simply run this script in a directory containing a buildout.cfg.
The script accepts buildout command-line options, so you can
use the -c option to specify an alternate configuration file.
"""
import os
import shutil
import sys
import tempfile
from optparse import OptionParser
__version__ = '2015-07-01'
# See zc.buildout's changelog if this version is up to date.
tmpeggs = tempfile.mkdtemp(prefix='bootstrap-')
usage = '''\
[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
Bootstraps a buildout-based project.
Simply run this script in a directory containing a buildout.cfg, using the
Python that you want bin/buildout to use.
Note that by using --find-links to point to local resources, you can keep
this script from going over the network.
'''
parser = OptionParser(usage=usage)
parser.add_option("--version",
action="store_true", default=False,
help=("Return bootstrap.py version."))
parser.add_option("-t", "--accept-buildout-test-releases",
dest='accept_buildout_test_releases',
action="store_true", default=False,
help=("Normally, if you do not specify a --version, the "
"bootstrap script and buildout gets the newest "
"*final* versions of zc.buildout and its recipes and "
"extensions for you. If you use this flag, "
"bootstrap and buildout will get the newest releases "
"even if they are alphas or betas."))
parser.add_option("-c", "--config-file",
help=("Specify the path to the buildout configuration "
"file to be used."))
parser.add_option("-f", "--find-links",
help=("Specify a URL to search for buildout releases"))
parser.add_option("--allow-site-packages",
action="store_true", default=False,
help=("Let bootstrap.py use existing site packages"))
parser.add_option("--buildout-version",
help="Use a specific zc.buildout version")
parser.add_option("--setuptools-version",
help="Use a specific setuptools version")
parser.add_option("--setuptools-to-dir",
help=("Allow for re-use of existing directory of "
"setuptools versions"))
options, args = parser.parse_args()
if options.version:
print("bootstrap.py version %s" % __version__)
sys.exit(0)
######################################################################
# load/install setuptools
try:
from urllib.request import urlopen
except ImportError:
from urllib2 import urlopen
ez = {}
if os.path.exists('ez_setup.py'):
exec(open('ez_setup.py').read(), ez)
else:
exec(urlopen('https://bootstrap.pypa.io/ez_setup.py').read(), ez)
if not options.allow_site_packages:
# ez_setup imports site, which adds site packages
# this will remove them from the path to ensure that incompatible versions
# of setuptools are not in the path
import site
# inside a virtualenv, there is no 'getsitepackages'.
# We can't remove these reliably
if hasattr(site, 'getsitepackages'):
for sitepackage_path in site.getsitepackages():
# Strip all site-packages directories from sys.path that
# are not sys.prefix; this is because on Windows
# sys.prefix is a site-package directory.
if sitepackage_path != sys.prefix:
sys.path[:] = [x for x in sys.path
if sitepackage_path not in x]
setup_args = dict(to_dir=tmpeggs, download_delay=0)
if options.setuptools_version is not None:
setup_args['version'] = options.setuptools_version
if options.setuptools_to_dir is not None:
setup_args['to_dir'] = options.setuptools_to_dir
ez['use_setuptools'](**setup_args)
import setuptools
import pkg_resources
# This does not (always?) update the default working set. We will
# do it.
for path in sys.path:
if path not in pkg_resources.working_set.entries:
pkg_resources.working_set.add_entry(path)
######################################################################
# Install buildout
ws = pkg_resources.working_set
setuptools_path = ws.find(
pkg_resources.Requirement.parse('setuptools')).location
# Fix sys.path here as easy_install.pth added before PYTHONPATH
cmd = [sys.executable, '-c',
'import sys; sys.path[0:0] = [%r]; ' % setuptools_path +
'from setuptools.command.easy_install import main; main()',
'-mZqNxd', tmpeggs]
find_links = os.environ.get(
'bootstrap-testing-find-links',
options.find_links or
('http://downloads.buildout.org/'
if options.accept_buildout_test_releases else None)
)
if find_links:
cmd.extend(['-f', find_links])
requirement = 'zc.buildout'
version = options.buildout_version
if version is None and not options.accept_buildout_test_releases:
# Figure out the most recent final version of zc.buildout.
import setuptools.package_index
_final_parts = '*final-', '*final'
def _final_version(parsed_version):
try:
return not parsed_version.is_prerelease
except AttributeError:
# Older setuptools
for part in parsed_version:
if (part[:1] == '*') and (part not in _final_parts):
return False
return True
index = setuptools.package_index.PackageIndex(
search_path=[setuptools_path])
if find_links:
index.add_find_links((find_links,))
req = pkg_resources.Requirement.parse(requirement)
if index.obtain(req) is not None:
best = []
bestv = None
for dist in index[req.project_name]:
distv = dist.parsed_version
if _final_version(distv):
if bestv is None or distv > bestv:
best = [dist]
bestv = distv
elif distv == bestv:
best.append(dist)
if best:
best.sort()
version = best[-1].version
if version:
requirement = '=='.join((requirement, version))
cmd.append(requirement)
import subprocess
if subprocess.call(cmd) != 0:
raise Exception(
"Failed to execute command:\n%s" % repr(cmd)[1:-1])
######################################################################
# Import and run buildout
ws.add_entry(tmpeggs)
ws.require(requirement)
import zc.buildout.buildout
if not [a for a in args if '=' not in a]:
args.append('bootstrap')
# if -c was provided, we push it back into args for buildout' main function
if options.config_file is not None:
args[0:0] = ['-c', options.config_file]
zc.buildout.buildout.main(args)
shutil.rmtree(tmpeggs)
; vim: set fileencoding=utf-8 :
; Tue 16 Aug 17:30:19 CEST 2016
[buildout]
parts = scripts
develop = .
eggs = bob.ip.qualitymeasure
extensions = bob.buildout
newest = false
verbose = true
[scripts]
recipe = bob.buildout:scripts
dependent-scripts = true
; vim: set fileencoding=utf-8 :
; Andre Anjos <andre.anjos@idiap.ch>
; Mon 16 Apr 08:29:18 2012 CEST
[buildout]
parts = scripts
eggs = bob.ip.qualitymeasure
extensions = bob.buildout
mr.developer
auto-checkout = *
develop = src/bob.extension
src/bob.blitz
src/bob.core
src/bob.io.base
src/bob.io.image
src/bob.io.video
src/bob.math
src/bob.sp
src/bob.ip.base
src/bob.ip.color
.
; options for bob.buildout extension
debug = true
verbose = true
newest = false
[sources]
bob.extension = git https://gitlab.idiap.ch/bob/bob.extension
bob.blitz = git https://gitlab.idiap.ch/bob/bob.blitz
bob.core = git https://gitlab.idiap.ch/bob/bob.core
bob.io.base = git https://gitlab.idiap.ch/bob/bob.io.base
bob.io.image = git https://gitlab.idiap.ch/bob/bob.io.image
bob.io.video = git https://gitlab.idiap.ch/bob/bob.io.video
bob.math = git https://gitlab.idiap.ch/bob/bob.math
bob.sp = git https://gitlab.idiap.ch/bob/bob.sp
bob.ip.base = git https://gitlab.idiap.ch/bob/bob.ip.base
bob.ip.color = git https://gitlab.idiap.ch/bob/bob.ip.color
[scripts]
recipe = bob.buildout:scripts
dependent-scripts = true