Source code for facereclib.features.SIFTKeypoints
#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
# Laurent El Shafey <Laurent.El-Shafey@idiap.ch>
import bob.ip.base
import numpy
from .Extractor import Extractor
[docs]class SIFTKeypoints (Extractor):
"""Extracts Sift descriptors according to the given keypoints"""
# TODO: REFACTOR: assign better names for variables
def __init__(
self,
sigmas,
height,
width,
n_intervals,
n_octaves,
octave_min,
edge_thres,
peak_thres,
magnif,
estimate_orientation = False
):
if not hasattr(bob.ip.base, "VLSIFT"):
raise NotImplementedError("VLSIFT is not part of bob.ip.base; maybe SIFT headers aren't installed in your system? Try out facereclib.features.SIFTBobKeypoints!")
# call base class constructor
Extractor.__init__(self)
# prepare SIFT extractor
self.m_n_scales = len(sigmas)
self.m_sigmas = numpy.ndarray(shape=(self.m_n_scales,), dtype=numpy.float64)
# TODO: restructure this code
if self.m_n_scales >= 5: self.m_sigmas[4] = sigmas[4]
if self.m_n_scales >= 4: self.m_sigmas[3] = sigmas[3]
if self.m_n_scales >= 3: self.m_sigmas[2] = sigmas[2]
if self.m_n_scales >= 2: self.m_sigmas[1] = sigmas[1]
if self.m_n_scales >= 1: self.m_sigmas[0] = sigmas[0]
self.m_estimate_orientation = estimate_orientation
if(estimate_orientation): self.m_len_keypoint = 3
else: self.m_len_keypoint = 4
self.m_height = height
self.m_width = width
self.m_n_intervals = n_intervals
self.m_n_octaves = n_octaves
self.m_octave_min = octave_min
self.m_peak_thres = peak_thres
self.m_edge_thres = edge_thres
self.m_magnif = magnif
# SIFT extractor
self.m_sift_extract = bob.ip.base.VLSIFT((self.m_height, self.m_width), self.m_n_intervals, self.m_n_octaves, self.m_octave_min, self.m_peak_thres, self.m_edge_thres, self.m_magnif)
def __linearize_cut__(self, descr):
l_vec = 128 # Length of the SIFT descriptors
l_full = len(descr) * l_vec
output = numpy.ndarray(shape=(l_full,), dtype=descr[0].dtype)
k=0
for vec in descr:
output[k*l_vec:(k+1)*l_vec] = vec[4:132] # Cut first 4 values
k=k+1
return output
def __call__(self, img_annots):
"""Extract SIFT features given the image and the keypoints"""
image = img_annots[0]
annotations = img_annots[1]
# Creates keypoints numpy array
kp = numpy.ndarray(shape=(len(annotations)*self.m_n_scales,self.m_len_keypoint), dtype=numpy.float64)
c=0
for k in range(annotations.shape[0]):
for x in range(self.m_n_scales):
if(self.m_estimate_orientation):
kp[c*self.m_n_scales+x,:]=[annotations[k,0], annotations[k,1], self.m_sigmas[x]]
else:
kp[c*self.m_n_scales+x,:]=[annotations[k,0], annotations[k,1], self.m_sigmas[x], 0.]
c=c+1
# Extracts and returns descriptors
return self.__linearize_cut__(self.m_sift_extract(image, kp))