Source code for pliers.extractors.api.microsoft
'''
Extractors that interact with Microsoft Azure Cognitive Services API.
'''
import pandas as pd
from pliers.extractors.base import ExtractorResult
from pliers.extractors.image import ImageExtractor
from pliers.transformers import (MicrosoftAPITransformer,
MicrosoftVisionAPITransformer)
[docs]class MicrosoftAPIFaceExtractor(MicrosoftAPITransformer, ImageExtractor):
''' Extracts face features (location, emotion, accessories, etc.). From an
image using the Microsoft Azure Cognitive Services API.
Args:
face_id (bool): Return faceIds of the detected faces or not. The
default value is False.
landmarks (str): Return face landmarks of the detected faces or
not. The default value is False.
attributes (list): One or more specified face attributes as strings.
Supported face attributes include accessories, age, blur, emotion,
exposure, facialHair, gender, glasses, hair, headPose, makeup,
noise, occlusion, and smile. Note that each attribute has
additional computational and time cost.
subscription_key (str): A valid subscription key for Microsoft Cognitive
Services. Only needs to be passed the first time the extractor is
initialized.
location (str): Region the subscription key has been registered in.
It will be the first part of the endpoint URL suggested by
Microsoft when you first created the key.
Examples include: westus, westcentralus, eastus
api_version (str): API version to use.
rate_limit (int): The minimum number of seconds required between
transform calls on this Transformer.
'''
api_name = 'face'
api_method = 'detect'
_env_keys = 'MICROSOFT_FACE_SUBSCRIPTION_KEY'
_log_attributes = ('subscription_key', 'location', 'api_version',
'face_id', 'rectangle', 'landmarks', 'attributes')
[docs] def __init__(self, face_id=False, rectangle=True, landmarks=False,
attributes=None, subscription_key=None, location=None,
api_version='v1.0', rate_limit=None):
self.face_id = face_id
self.rectangle = rectangle
self.landmarks = landmarks
self.attributes = attributes
super().__init__(subscription_key=subscription_key,
location=location,
api_version=api_version,
rate_limit=rate_limit)
def _extract(self, stim):
if self.attributes:
attributes = ','.join(self.attributes)
else:
attributes = ''
params = {
'returnFaceId': self.face_id,
'returnFaceLandmarks': self.landmarks,
'returnFaceAttributes': attributes
}
raw = self._query_api(stim, params)
return ExtractorResult(raw, stim, self)
def _parse_response_json(self, json):
data_dict = {}
for k, v in json.items():
if k == 'faceRectangle' and not self.rectangle:
continue
if k == 'faceAttributes':
k = 'face'
if isinstance(v, dict):
subdata = self._parse_response_json(v)
for sk, sv in subdata.items():
data_dict['{}_{}'.format(k, sk)] = sv
elif isinstance(v, list):
# Hard coded to this extractor
for attr in v:
if k == 'hairColor':
key = attr['color']
elif k == 'accessories':
key = '{}_{}'.format(k, attr['type'])
else:
continue
data_dict[key] = attr['confidence']
else:
data_dict[k] = v
return data_dict
def _to_df(self, result):
face_results = []
for i, face in enumerate(result._data):
face_data = self._parse_response_json(face)
face_results.append(face_data)
return pd.DataFrame(face_results)
[docs]class MicrosoftVisionAPIExtractor(MicrosoftVisionAPITransformer,
ImageExtractor):
''' Base MicrosoftVisionAPIExtractor class.
Args:
features (list): One or more specified vision features as strings.
Supported vision features include Tags, Categories, ImageType,
Color, and Adult. Note that each attribute has additional
computational and time cost. By default extracts all visual
features from an image.
subscription_key (str): A valid subscription key for Microsoft Cognitive
Services. Only needs to be passed the first time the extractor is
initialized.
location (str): Region the subscription key has been registered in.
It will be the first part of the endpoint URL suggested by
Microsoft when you first created the key.
Examples include: westus, westcentralus, eastus
api_version (str): API version to use.
rate_limit (int): The minimum number of seconds required between
transform calls on this Transformer.
'''
api_method = 'analyze'
_log_attributes = ('subscription_key', 'location', 'api_version',
'features')
[docs] def __init__(self, features=None, subscription_key=None, location=None,
api_version='v1.0', rate_limit=None):
self.features = features if features else ['Tags', 'Categories',
'ImageType', 'Color',
'Adult']
super().__init__(subscription_key=subscription_key,
location=location,
api_version=api_version,
rate_limit=rate_limit)
def _extract(self, stim):
params = {
'visualFeatures': ','.join(self.features),
}
raw = self._query_api(stim, params)
return ExtractorResult(raw, stim, self)
def _to_df(self, result):
data_dict = {}
for feat in self.features:
feat = feat[0].lower() + feat[1:]
if feat in result._data:
if feat == 'tags':
for tag in result._data[feat]:
data_dict[tag['name']] = tag['confidence']
elif feat == 'categories':
for cat in result._data[feat]:
data_dict[cat['name']] = cat['score']
else:
data_dict.update(result._data[feat])
return pd.DataFrame([data_dict.values()], columns=data_dict.keys())
[docs]class MicrosoftVisionAPITagExtractor(MicrosoftVisionAPIExtractor):
''' Extracts image tags using the Microsoft API '''
[docs] def __init__(self, subscription_key=None, location=None, api_version='v1.0',
rate_limit=None):
super().__init__(features=['Tags'],
subscription_key=subscription_key,
location=location,
api_version=api_version,
rate_limit=rate_limit)
[docs]class MicrosoftVisionAPICategoryExtractor(MicrosoftVisionAPIExtractor):
''' Extracts image categories using the Microsoft API '''
[docs] def __init__(self, subscription_key=None, location=None, api_version='v1.0',
rate_limit=None):
super().__init__(features=['Categories'],
subscription_key=subscription_key,
location=location,
api_version=api_version,
rate_limit=rate_limit)
[docs]class MicrosoftVisionAPIImageTypeExtractor(MicrosoftVisionAPIExtractor):
''' Extracts image types (clipart, etc.) using the Microsoft API '''
[docs] def __init__(self, subscription_key=None, location=None, api_version='v1.0',
rate_limit=None):
super().__init__(features=['ImageType'],
subscription_key=subscription_key,
location=location,
api_version=api_version,
rate_limit=rate_limit)
[docs]class MicrosoftVisionAPIColorExtractor(MicrosoftVisionAPIExtractor):
''' Extracts image color attributes using the Microsoft API '''
[docs] def __init__(self, subscription_key=None, location=None, api_version='v1.0',
rate_limit=None):
super().__init__(features=['Color'],
subscription_key=subscription_key,
location=location,
api_version=api_version,
rate_limit=rate_limit)
[docs]class MicrosoftVisionAPIAdultExtractor(MicrosoftVisionAPIExtractor):
''' Extracts the presence of adult content using the Microsoft API '''
[docs] def __init__(self, subscription_key=None, location=None, api_version='v1.0',
rate_limit=None):
super().__init__(features=['Adult'],
subscription_key=subscription_key,
location=location,
api_version=api_version,
rate_limit=rate_limit)