Módulo analizador de fotos Alfresco

Módulo analizador de fotos Alfresco

Durante el último Alfresco Global Hack-a-thon desarrollamos un módulo analizador de fotos Alfresco con el propósito de hacer algo diferente utilizando Alfresco como gestor de contenidos e integrarlo con procesos externos y otras herramientas.

Este módulo de Alfresco analiza fotografías de personas de las que  se extrae  información como el sexo,  la edad, sus emociones según la expresión del rostro, etc. Para ello, se puede hacer una importación masiva de imágenes en Alfresco y posteriormente realizar diferentes búsquedas como por ejemplo, saber cuántas fotos de personas de 30 años tenemos en el repositorio.

La  información que puede extraerse de una imagen es:

  • Número de personas
  • Edades
  • Género 
  • Pelo 
  • Pelo facial 
  • Emociones 
  • Accesorios 

A continuación,  os muestro el resultado que se observará en el apartado de propiedades extraídas de los metadatos de la fotografía:

 

Aquí la muestra de una interfaz de búsqueda amigable:

Y algunos ejemplos:

Más detalles acerca de la experiencia de usuario en esta demo de Youtube.

La creación de este módulo se ha realizado mediante la integración de Microsoft Azure con Alfresco Community 5.2. Para configurar la conexión con la API de Azure, deberemos de modificar las siguientes propiedades del fichero alfresco-global.properties.

// Dependiendo de la zona geográfica que nos encontremos
photo_analyzer.azure.api.url=https://westeurope.api.cognitive.microsoft.com/face/v1.0/detect
// Lista de los atributos que queremos analizar en la respuesta 
photo_analyzer.azure.api.attribute_list=age,gender,emotion,hair,facialHair,accessories,glasses
// Subscription key trial(*) https://azure.microsoft.com/es-es/try/cognitive-services/
photo_analyzer.azure.api.subscription_key=<subsription-key>

(*) Limitaciones de la Trial subscription key: 30.000 transacciones, 20 por minuto.

Respecto a la parte técnica, para extraer toda la información de las fotografías creamos un behaviour que es ejecutado cuando una nueva imagen es creada o subida al repositorio. La ejecución de este behaviour está basada en la integración con Microsoft Cognitive Services, que ejecutará una llamada a la API externa y recogerá la respuesta en formato JSON.

El siguiente método sirve para construir la llamada a Azure:

public HttpPost prepareRequest(File file) throws URISyntaxException {
URIBuilder builder = new URIBuilder(Constants.getPropertyValue(Constants.AZURE_FACE_API_URL));
builder.setParameter("returnFaceId", "true");
builder.setParameter("returnFaceRectangle", "true");
builder.setParameter("returnFaceAttributes", Constants.getPropertyValue(Constants.FACE_ATTRIBUTES_LIST_TO_EXTRACT)); URI uri = builder.build(); HttpPost request = new HttpPost(uri); request.setHeader("Content-Type", Constants.APPLICATION_OCTET_STREAM); request.setHeader("Ocp-Apim-Subscription-Key", Constants.getPropertyValue(Constants.API_SUBSCRIPTION_KEY)); FileEntity reqEntity = new FileEntity(file, ContentType.APPLICATION_OCTET_STREAM); request.setEntity(reqEntity); return request; }

Después solo necesitamos analizar el JSON de respuesta y hacer el mapping con cada campo de nuestro modelo de Alfresco.

[
     {
         "faceId": "c5c24a82-6845-4031-9d5d-978df9175426",
         "faceRectangle": {
             "width": 78,
             "height": 78,
             "left": 394,
             "top": 54
         },
         "faceLandmarks": {
             "pupilLeft": {
                 "x": 412.7,
                 "y": 78.4 
             },
             "pupilRight": {...},
             "noseTip": {...},
             "mouthLeft": {...},
             ...
             "underLipBottom": {...}
         },
         "faceAttributes": {
             "age": 71.0,
             "gender": "male",
             "smile": 0.88,
             "facialHair": {
                 "moustache": 0.8,
                 "beard": 0.1,
                 "sideburns": 0.02
             },
             "glasses": "sunglasses",
             "headPose": {
                 "roll": 2.1,
                 "yaw": 3,
                 "pitch": 0
             },
             "emotion":{
                 "anger": 0.575,
                 "contempt": 0,
                 "disgust": 0.006,
                 "fear": 0.008,
                 "happiness": 0.394,
                 "neutral": 0.013,
                 "sadness": 0,
                 "surprise": 0.004
             },
             "hair": {
                 "bald": 0.0,
                 "invisible": false,
                 "hairColor": [
                     {"color": "brown", "confidence": 1.0},
                     {"color": "blond", "confidence": 0.88},
                     {"color": "black", "confidence": 0.48},
                     {"color": "other", "confidence": 0.11},
                     {"color": "gray", "confidence": 0.07},
                     {"color": "red", "confidence": 0.03}
                 ]
             },
             "makeup": {
                 "eyeMakeup": true,
                 "lipMakeup": false
             },
             "occlusion": {
                 "foreheadOccluded": false,
                 "eyeOccluded": false,
                 "mouthOccluded": false
             },
             "accessories": [
                 {"type": "headWear", "confidence": 0.99},
                 {"type": "glasses", "confidence": 1.0},
             ],
             "blur": {
                 "blurLevel":"Medium",
                 "value":0.51
             },
             "exposure": {
                 "exposureLevel":"GoodExposure",
                 "value":0.55
             },
             "noise": {
                 "noiseLevel":"Low",
                 "value":0.12
             }
         }
     }
 ]

Este blog post muestra cómo funciona el módulo de Alfresco Photo Analyzer, integrando Alfresco Content Services y Microsoft Cognitive Services.

Más material acerca de este tema:

Para más información sobre el proyecto:

Otros proyectos relacionados pero usando Google API :

Deja un comentario

Menú de cierre