Sistema de servicios Web/Grid para el análisis de diferencias entre imágenes Realizado por: Yair Kukielka Alberto Sánchez Lorena García Dirigido por: Prof. José Jaime Ruz Ortiz Dpto. Arquitectura de Computadores y Automática Sistemas Informáticos Curso 2004 / 2005 Facultad de Informática Universidad Complutense de Madrid Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 3 de 120 INDICE INDICE ............................................................................................................... 3 1. Autorización a la UCM. ............................................................................. 4 2. Resumen .................................................................................................... 5 3. Abstract...................................................................................................... 6 4. Lista de palabras clave ............................................................................. 7 5. Objetivos.................................................................................................... 8 6. Tecnologías utilizadas .............................................................................. 9 6.1. .NET..................................................................................................... 9 6.2. C#....................................................................................................... 11 6.3. Servicios web ..................................................................................... 13 6.4. Visual Studio 2003 ............................................................................. 15 7. El proyecto............................................................................................... 18 7.1. Desarrollo ......................................................................................... 18 7.1.1. Inicialización................................................................................ 25 7.1.1.1. Inicialización ............................................................................ 25 7.1.1.2. Estimación de tiempos de procesadores................................. 28 7.1.2. Tratamiento de imágenes ........................................................... 29 7.1.3. Implementación de los servicios web.......................................... 32 7.1.4. Razonamiento del reparto de filas de la imagen......................... 36 7.1.5. Serialización de datos................................................................. 40 7.1.6. Algoritmo de enfriamiento simulado............................................ 43 7.1.7. Recomposición parcial de la imagen .......................................... 49 7.2. Resultados........................................................................................ 53 7.2.1. Imágenes resultado .................................................................... 53 7.2.2. Evaluación de rendimiento.......................................................... 57 7.3. Manual del usuario........................................................................... 65 7.3.1 ¿Qué es? .................................................................................... 65 7.3.2 Entorno requerido ....................................................................... 66 7.3.3 Instalación................................................................................... 66 7.3.4 Comenzando y finalizando.......................................................... 67 7.3.5 Diálogos y vistas ......................................................................... 67 7.3.6 Viendo mensajes ........................................................................ 72 7.3.7 Ejemplo de uso ........................................................................... 73 7.3.8 FAQ ............................................................................................ 79 7.4. Descargar el proyecto ..................................................................... 80 8. Apéndices ................................................................................................ 81 8.1. Diagramas UML ................................................................................ 81 8.2. Código............................................................................................... 87 8.2.1 Librerias ...................................................................................... 87 9. Glosario.................................................................................................. 118 10. Bibliografía ......................................................................................... 121 10.1. Básica .......................................................................................... 121 10.2. Complementaria ......................................................................... 121 Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 4 de 120 1. Autorización a la UCM. Los autores de este proyecto: Yair Kukielka, Alberto Sánchez y Lorena García, autorizamos a la Universidad Complutense de Madrid a utilizar y difundir, con fines académicos (no comerciales), la presente memoria, la documentación y el prototipo desarrollado. Fdo Yair Kukielka Fdo Lorena García Fdo Alberto Sánchez Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 5 de 120 2. Resumen En este proyecto se ha diseñado e implementado un sistema distribuido que detecta las diferencias entre dos imágenes mediante el agoritmo de enfriamiento simulado. El programa aprovecha la capacidad de cálculo de procesadores remotos en la red de manera paralela para analizar las imágenes con mayor rapidez. Está previsto que las imágenes a tratar provengan del mismo objetivo focal, y de tiempos diferentes. Por ejemplo, un satélite que está programado para realizar fotos de un área geográfica a la misma hora cada día. De esta manera se pueden localizar barcos enemigos, plagas o incendios en zonas de cultivo. La aplicación está desarrollada en un entorno de ventanas. El usuario elige las dos imágenes a diferenciar y obtiene una tercera imagen en blanco y negro, donde la parte blanca muestra las diferencias y la negra muestra la zona en la que no hay cambios. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 6 de 120 3. Abstract In this project an image difference detection distributed system has been designed and implemented. The program uses the parallel computing capacity of remote processors within a network in order to speed up the image analyses. It is foreseen that the images will come from the same focal objective, and at different times. For example, a satellite that is programmed to take pictures of a geographical area at the same time daily. In this way, enemy ships, plagues or fires could be detected. The application has been developed in a window environment where the user chooses two images to be processed and obtains a third black and white image, where the white parts show the areas with differences and the black sections display the zones without changes. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 7 de 120 4. Lista de palabras clave • Programación distribuida • Imágenes • Servicios web • Visual Studio 2003 • .NET • C# • Redes Grid Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 8 de 120 5. Objetivos El desarrollo del proyecto tiene, como objetivo principal, optimizar el tiempo de respuesta del sistema al realizar la comparativa de dos imágenes de grandes dimensiones utilizando un algoritmo de comparación píxel a píxel complejo. Partimos de la base de que las imágenes objeto del estudio serán de grandes dimensiones y de que el cálculo que realizará la aplicación para la detección de diferencias podría suponer gran cantidad de tiempo, podríamos estar hablando incluso de horas de procesamiento. Debido a esto se decide utilizar la idea de programación paralela distribuyendo el volumen de procesamiento entre varias máquinas conectadas a la red, con lo que se consigue un tiempo de respuesta menor al que se obtendría si la imagen fuera procesada desde una sola máquina. En este proceso también se integra la idea de la plataforma .NET de utilizar una red de servicios. Esto es, hasta no hace mucho, se venían utilizado aplicaciones que se instalaban en un ordenador y que sólo utilizaban la potencia del procesador de dicho ordenador. Con la implantación de Internet a nivel mundial y el aumento de la velocidad de interconexión entre las computadoras se puede repartir la carga de procesamiento en aplicaciones con un enorme volumen de operaciones (servicios web). Este reparto se puede hacer en ordenadores que se estén desaprovechando en ese momento. Se puede utilizar la potencia de los ordenadores que permanecen ociosos la mayor parte del tiempo y así poder sacar provecho de su capacidad. La gran mayoría del tiempo los ordenadores pueden permanecer apagados, inactivos o infrautilizando la CPU, por ejemplo al editar textos con Word (Redes Grid). Serían muchas las personas que se verían beneficiadas: aquellos ordenadores que pasen gran parte del tiempo sin ser usados podrían ser alquilados o prestados a otras personas o a empresas que necesiten, en momentos puntuales, una capacidad de cálculo mayor de la que disponen, sin necesidad de gastar innecesariamente grandes sumas de dinero en supercomputadoras. Bastaría con instalar esos servicios en las máquinas alquiladas y enviar solicitudes a estos servidores eventuales por medio de la red. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 9 de 120 6. Tecnologías utilizadas Las tecnologías que se han utilizado en el desarrollo del proyecto son: - .NET - C# - Servicios Web - Visual Studio 2003 6.1. .NET Desde la introducción de Windows 3.1 en 1992 hasta Windows XP Microsoft ha usado como núcleo la misma API (Interfaz de Programación de Aplicaciones) de Windows. En la medida en que se iba progresando en nuevas versiones de su famoso sistema operativo Microsoft iba añadiendo grandes cantidades de información con nuevas funcionalidades a ese API. Esta estrategia de extensión de la API (en vez de sustitución) ha sido una de las razones de su éxito, cuidando la compatibilidad descendente (hacia versiones anteriores). Este camino evolutivo tiene también una gran desventaja: al ir añadiendo características nuevas sobre las antiguas, el uso de éstas se va haciendo cada vez más complejo y menos comprensible. En el año 2000 Microsoft hizo pública su estrategia, en la que se consideraba que es imprescindible “partir de un folio en blanco”, para adaptarse a las nuevas tecnologías y el software de última generación (Java, de Sun Microsystems, le estaba comiendo terreno) por medio de un entorno y de unos lenguajes y herramientas de desarrollo intuitivos y a la vez sofisticados. La nueva plataforma se llamó .NET Framework, un entorno de ejecución de desarrollo y ejecución de código mucho más moderno y orientado a objetos, cuya versión 2.0 está a punto de salir. Está preparado para su uso tanto en sistemas operativos de Microsoft como en otros que no lo son (ya se ha portado a Linux, en el proyecto Mono). Proporciona a los programadores una nueva infraestructura que permite un nuevo modelo de programación basado en el lenguaje C# y en lenguajes estándares de Internet como son HTTP, XML, UDDI y SOAP, orientado hacia la creación de aplicaciones distribuidas y servicios web. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 10 de 120 .NET es la nueva estrategia de la empresa de Bill Gates para mantener a Windows como sistema operativo dominante en el mercado, a medida que la informática comienza a alejarse del escritorio hacia dispositivos conectados a Internet como palms o PDAs. Será la API de la siguiente versión de Windows, Longhorn, cuya salida al mercado se prevé para mediados del 2006. Es importante destacar que la compatibilidad descendente no se ha perdido, ya que .NET encapsula la funcionalidad de componentes COM (comunicación entre componentes de las antiguas versiones de Windows) por lo que puede interactuar con ellos. También hay que aclarar que .NET no constituye un sistema operativo en sí mismo (al menos por el momento) y que la API de Windows está aún detrás del telón. El nuevo lenguaje creado desde cero especialmente para este entorno es C#, que aprovecha la experiencia de la programación de los últimos 20 años. También, para no complicar la existencia a los programadores de Visual Basic se ha extendido este lenguaje al más poderoso VB.NET, aunque con las deficiencias derivadas de haber evolucionado a lo largo de los años. En .NET también tienen cabida los lenguajes C++, JScript y J#. La imagen siguiente muestra la estructura de .NET Framework: Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 11 de 120 Para más información sobre .NET: http://www.microsoft.com/Net/Basics.aspx 6.2. C# En junio del año 2000 Microsoft anunció la plataforma .NET y el lenguaje creado específicamente para ella, C#. Éste es un lenguaje orientado a objetos y fuertemente tipado, diseñado para maximizar la simplicidad, expresividad y productividad de la programación. Tiene mucho en común con la manera de programar de C++ y Java, aunque también recoge características de otros lenguajes como Modula 2, C o Smalltalk. La plataforma .NET está pensada alrededor del CLR (Common Language Runtime, similar a la máquina virtual de Java, JVM) y un amplio conjunto de librerías que pueden ser aprovechados por varios lenguajes que son capaces de trabajar juntos compilando todos a un lenguaje intermedio (IL, Intermediate Language). Así, en un mismo proyecto se puede encontrar código de diferentes lenguajes como C#, VB.NET o C++ y todo se compilará a un mismo lenguaje que podrá ser interpretado por el CLR. Los creadores de este lenguaje son Anders Hejlsberg y Scout Wiltamuth, quienes se dieron a conocer por crear también el lenguaje Delphi. C# no puede ser considerado aisladamente, fuera del entorno de .NET. El compilador de C# tiene como destino específico el ambiente .NET, lo que significa que todo el código escrito en este lenguaje se ejecutará siempre en el contexto de .NET. Algunas características del lenguaje C# son: • Soporte completo para las clases y la programación orientado a objetos, incluyendo tanto herencia de interfaz como de implementación, métodos virtuales y sobrecarga de operadores. • Un conjunto consistente y bien definido de tipos básicos y tipos construidos que cuelgan de una raíz común, la clase Object. • Soporte intrínseco para la generación automática de documentación en XML. • Recolector de basura (memoria reservada dinámicamente). • Posibilidad de marcar clases o métodos con atributos definidos por el usuario. Esto puede ser útil de cara a la generación automática de documentación, y puede tener algunos efectos sobre la compilación (por ejemplo, si se marcan métodos para que sean compilados sólo durante la fase de depuración). Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 12 de 120 • Acceso total a la librería de clases base .NET, así como fácil acceso a la API de Windows, si esto fuera necesario. • El manejo de punteros y el acceso directo a memoria están disponibles en caso de necesidad, como en este proyecto, al procesar eficientemente píxeles en imágenes. • Reflexión: posibilidad de acceder a información sobre tipos en los programas o en unidades de ensamblado y también leer otros metadatos de los manifiestos. • C# puede ser utilizado para crear páginas dinámicas ASP.NET. Limitaciones de C#: • No ha sido desarrollado para el diseño de aplicaciones de tiempo real o de alto rendimiento. No dispone de funciones en línea o destructores cuya ejecución se garantice en puntos específicos de código. Para este tipo de software se seguirá utilizando C++. Lo que se necesita para escribir código en C#: • Windows 98, 2000, XP ó superior. • Instalar el SDK (Kit de desarrollo) de .NET Framework (al menos el runtime). • Es recomendable tener un entorno de programación, por ejemplo Visual Studio (http://msdn.microsoft.com/vstudio), o X-Develop (http://www.omnicore.com). Este último tiene distribuciones para Windows, Linux y Mac OS X. También existen entornos gratuitos como Eclipse (www.eclipse.org) con un pluggin para C# (http://www.improve- technologies.com/alpha/esharp). • Para ejecutar una aplicación escrita en C# en una plataforma que no tenga instalado el paquete mínimo de .NET se debe incrustar el runtime o motor de ejecución .NET en el ejecutable. En este momento se está esperando la versión 2.0 del lenguaje C#. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 13 de 120 6.3. Servicios web El entorno dentro del cual se encuentra .NET es un Internet que está cambiando de ser centrada en las personas y basada en los contenidos, a estar centrada en las aplicaciones y basada en los servicios. Estas aplicaciones y servicios forman parte de lo que se está llamando servicios web. Un servicio web es un servicio, con un interfaz definido y conocido, al que se puede acceder a través de Internet. Igual que una página web está definida por una URL (Uniform Resource Locator), un servicio web está definido por un URI (Uniform Resource Identification) y por su interfaz, a través del cual se puede acceder a él. Igual que una página web puede ofrecer cotizaciones de la bolsa, un servicio web que haga lo mismo presentará un interfaz para que se pueda acceder fácilmente a esos datos desde la aplicación. De esta forma, las aplicaciones se convierten en clientes que integran servicios web procedentes de diferentes proveedores, y además, cabe la posibilidad de que se cobre por uso del servicio, no por cada copia de la aplicación vendida. Este es uno de los aspectos que más gusta a Microsoft: la posibilidad de acabar de una vez por todas con la piratería, a base de alojar partes importantes de las aplicaciones en sus propios servidores, no en el ordenador del cliente. Los servicios web son un mecanismo novedoso para la realización de llamadas remotas a métodos. Se dividen en servicios de transporte (los protocolos del nivel más bajo, que codifican la información independientemente de su formato, y que pueden ser comunes a otros servicios), de mensajería, de descripción y de descubrimiento. En la parte más baja se encuentran los servicios de transporte, que establecen la conexión y el puerto usado. Generalmente se usa HTTP, el mismo protocolo que la WWW, pero en se puede usar también SMTP (Simple Mail Transfer Protocol -el mismo protocolo que el correo electrónico), FTP (File Transfer Protocol), o BEEP (Blocks Extensible Exchange Protocol) un protocolo específico para servicios web, que, a diferencia de los anteriores, no es cliente-servidor, sino "entre pares"; los dos ordenadores entre los que se establece la comunicación actúan como clientes y servidores a la vez. Es además extensible, y está especificado en XML; por eso se está haciendo mucho más popular para aplicaciones web. De ahí hacia arriba, están los servicios de mensajería, que especifican cómo se tiene que codificar el mensaje, que contiene los datos que se intercambian, entre el cliente y el servidor. El protocolo más usado en esta capa es el SOAP (Simple Object Access Protocol). Este protocolo puede usar cualquiera de los transportes anteriores, se pueden escribir clientes y servidores en cualquier lenguaje, y usa XML como lenguaje para especificar los mensajes. Los servicios deben especificarse para que una aplicación sepa de forma automática qué formato usar para comunicarse con un servicio. Para ello se usa principalmente WSDL (Web Services Description Language), que Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 14 de 120 permite especificar la dirección de un servicio y el interfaz que se usa para acceder a él, sea SOAP o HTML. Por último, en la capa más alta, está UDDI (Universal Description, Discovery, and Integration), un protocolo que lleva WSDL un poco más allá, permitiendo no sólo describir servicios web, sino productos, la empresa en sí, y cómo está dispuesta a llevar a cabo transacciones. El Registro UDDI permite buscar negocios, servicios por categorías, y te devuelve informaciones sobre cómo acceder a ellos. En el pasado, la invocación remota ha sido problemática. Con DCOM (Distributed COM) instanciar un objeto en el servidor, llamar a uno de sus métodos y obtener los resultados no era nada sencillo y la configuración necesaria estaba llena de trucos. SOAP simplifica las cosas enormemente. Es un estándar basado en XML que detalla cómo pueden realizarse llamadas a métodos sobre el protocolo HTTP. Un servidor remoto es capaz de comprender estas llamadas y de realizar por nosotros todo el trabajo sucio, como por ejemplo la instanciación del objeto necesario, la realización de la llamada y la devolución de la respuesta formateada al cliente. .NET Framework nos ofrece todo esto de manera muy sencilla. Con en ASP.NET, tenemos la posibilidad de utilizar el conjunto completo de técnicas de C# y .NET, pero lo más importante es que el consumo de servicios web puede lograrse desde cualquier plataforma que ofrezca acceso al servidor a través de HTTP. En otras palabras, los servicios web desarrollados para el entorno .NET pueden ser invocados, por ejemplo, desde equipos Linux, móviles con acceso HTTP, o incluso desde neveras conectadas a Internet. Otra ventaja que permite la transmisión de la información a través de HTTP es que los firewalls o cortafuegos, que a veces filtran la información sospechosa que no se reciba por el puerto 80 permitirán este tipo de comunicación, ya que se produce por este mismo puerto. Los antivirus de última generación suelen integrar firewalls que pueden bloquear cualquier tipo de comunicación que no se produzca por los puertos utilizados habitualmente. Así, desde equipos situados en redes corporativas o departamentales dentro de empresas, que suelen estar protegidos por sistemas restrictivos de seguridad se podría acceder sin problemas a estos servicios, siempre que se tenga acceso a Internet. Esto es así porque en el fondo, la información que se transmite por este método es un simple texto en un formato determinado (SOAP). Los servicios web se describen utilizando el lenguaje WSDL (Web Service Description Language), lo que hace posible el descubrimiento dinámico de servicios web en tiempo de ejecución. Esto añade un gran potencial a esta Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 15 de 120 tecnología ya que tendremos un método estándar para preguntar a un servidor qué servicios ofrece e invocarlos si se necesitan. WSDL permite describir todos los métodos (también los tipos necesarios para llamar a esos métodos) usando XML con XML Schemas. Hay una amplia gama de tipos disponibles para los servicios web, que van desde los tipos primitivos hasta objetos complejos como DataSet, de forma que bases de datos en memoria enteras pueden ser serializadas hacia un cliente, lo q puede resultar en una reducción dramática de la carga sobre el servidor de bases de datos. La imagen siguiente muestra la interoperabilidad que ofrecen los servicios web. A la izquierda vemos un cliente creado con Java Web Service Development Pack que hace una petición de suma de 4 y 2. A la derecha un servidor con tecnología C# y ASP.NET devolviendo la solución: Por último, se debe tener en cuenta que los consumidores de un servicio web no tienen porqué ser únicamente aplicaciones web. No hay ninguna razón por la que no se puedan utilizar servicios web desde aplicaciones Windows o Linux – lo cual constituye una opción muy atractiva para la implementación de una Intranet corporativa. 6.4. Visual Studio 2003 Visual Studio .NET es un IDE (Integrated Development Environment, entorno de programación) creado por Microsoft con el objetivo de hacer más fácil e intuitiva la programación. Provee a los programadores de un amplio conjunto de herramientas para construir aplicaciones distribuidas, para la web (servicios web con XML) y para dispositivos móviles. Hoy en día es quizás el entorno más completo junto con Eclipse (http://www.eclipse.org), herramienta gratuita orientada a la programación Java. La versión 2005 de Visual Studio está en su versión Beta 2, a punto de salir al mercado con la versión 2.0 de .NET Framework. Se ofrecen varias versiones del programa: Visual Studio .NET 2003 Professional, Visual Studio .NET 2003 Enterprise Developer, Visual Studio.NET Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 16 de 120 Academic y Visual Studio .NET 2003 Enterprise Architect y. Nosotros hemos trabajado con la última, ya que la universidad tiene licencia y además es la más completa. Estas son algunas de las características ofrecidas por Visual Studio. NET 2003: 1- Capacidad de modelado visual de aplicaciones, requisitos de negocios, diseño de bases de datos y UML (Unified Modeling Language) para especificar la arquitectura de las aplicaciones y su funcionalidad, reduciendo el tiempo de desarrollo y generando directamente clases, funciones y métodos. También provee unas 60 plantillas de diferentes tipos de proyectos. 2- Soporte para programación de dispositivos móviles: • Incluye la construcción de aplicaciones para dispositivos inteligentes (Smart Devices) orientado a la plataforma Microsoft.NET Compact Framework (versión de .NET para dispositivos móviles), con el que se pueden desarrollar y depurar aplicaciones destinadas a Pocket PC, o teléfonos móviles. Integra un emulador de este tipo de dispositivos para probar y depurar los programas sin disponer físicamente de estos terminales. • Soporte para programación de aplicaciones clientes ligeras orientadas a la web, como teléfonos WAP (Wireles Application Protocol) o asistentes personales inalámbricos (PDAs). 3- Soporte para el desarrollo orientado a las empresas: • Orientado a la versión .NET Framework 1.1, que incluye mejoras con respecto a su versión 1.0, como la escalabilidad, seguridad y rendimiento. • Desarrollo sobre Windows Server 2003. • Migración sencilla para aplicaciones de .NET Framework 1.0. • Nuevos controladores para crear fácilmente conexiones a fuentes de datos OLEDB y ODBC incluyendo SQL Server, Access, Jet, DB2 y Oracle. • Soporte mejorado para trabajar con servicios web y XML. Ofrece los últimos estándares como WS-Routing, WS-Security, WS-Attachments y Direct Internet Message Encapsulation (DIME). 4- Cualquier programador puede crear un pluggin para el IDE. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 17 de 120 5- Soporte para documentación automatizada: • Visual Studio.NET 2003 (VS2003) ofrece la posibilidad de generar automáticamente documentación de código en formato XML. ¿Qué ventajas tiene esto? El lenguaje XML ofrece la posibilidad de separar la presentación de los documentos y su contenido, con lo que podremos presentar nuestra documentación de innumerables maneras. Por ejemplo VS2003 permite generar la documentación en formato HTML a partir de estos comentarios en XML. Con un par de clicks tendremos generado un conjunto completo de páginas HTML que documentan nuestro proyecto y que se pueden visualizar cómodamente en un navegador web. En nuestro caso hemos experimentado algunos problemas con este tipo de documentación. La generación automática de las páginas web no creaba bien los hipervínculos, razón por la cual no las hemos entregado. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 18 de 120 7. El proyecto 7.1. Desarrollo Como se ha explicado brevemente en el capítulo 5, el proyecto implementa un sistema distribuido que compara dos imágenes utilizando un algoritmo de detección de cambios píxel a píxel complejo y devuelve una tercera imagen que pone de manifiesto las diferencias entre las dos primeras. Para minimizar el tiempo de cálculo de las diferencias, las dos imágenes son procesadas por varios ordenadores autónomos, conectados mediante una red de comunicaciones y equipados con Servicios Web como vehículo de comunicación entre ellos. Estos ordenadores no serán supercomputadores utilizados exclusivamente para esto, sino que serán máquinas que pasan la mayor parte del tiempo ociosas o desaprovechando sus recursos. Por ejemplo, una empresa que quiera aprovechar la capacidad computacional por las noches, que es cuando sus máquinas permanecen apagadas. De esta manera, la empresa puede alquilarlas e incrementar sus beneficios. Y la empresa que necesite mayore recursos los puede obtener de forma más económica que si se hiciera con una supercomputadora. Los fundamentos de este proyecto se basan en la arquitectura cliente/servidor, es decir, un sistema distribuido donde un cliente se encarga de realizar peticiones a un sistema denominado servidor que se encarga de darles respuesta (cliente y servidor pueden coincidir físicamente en la misma máquina). A continuación se muestra un esquema que muestra la estructura de esta arquitectura: Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 19 de 120 Figura 7.1.1 Por tanto, se puede hacer una distinción entre la aplicación del lado del cliente y la aplicación del lado del servidor. La aplicación del lado del cliente se encarga, entre otras cosas, de la parte más ligera del proceso, mientras que los servidores realizan la parte más pesada. A continuación se detallan, por separado, cada una de sus tareas. • Aplicación del lado del cliente: Esta se encarga de recibir como parámetros de entrada, dos imágenes. Las imágenes que se pueden comparar han de tener las mismas dimensiones y cualquiera de los formatos de imagen con extensión: bmp, jpeg, tiff, png y gif. Figura 7.1.2 Los pasos que sigue el sistema son los siguientes: 1. Las imágenes recibidas como parámetros de entrada se transforman en imágenes equivalentes en escala de grises. Esta Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 20 de 120 transformación se realiza ya que el algoritmo de detección de cambios (algoritmo de enfriamiento simulado) sólo tiene capacidad para reconocer cambios en imágenes con una sola componente de color (escala de grises). De esta manera, en el programa se introducen imágenes a color, que son transformadas en sus equivalentes en blanco y negro. Estas imágenes equivalentes en blanco y negro son las que se introducen en el algoritmo de detección de cambios. Por tanto, aunque el programa reciba imágenes a color, la solución realmente es la obtenida de comparar sus equivalentes a blanco y negro. Se ha desarrollado de esta manera, para no limitar que las entradas al programa solo fueran fotos en blanco y negro. (Revisar punto: Agrisar imagen) Es más aconsejable comparar imágenes en escala de grises, ya que las imágenes, al ser transformadas a blanco y negro, dejan de ser fieles a las originales. Para poder comparar imágenes a color, se hubieran tenido que tratar, en el algoritmo de detección de cambios, las tres componentes de color, y en este caso solo se ha tenido en cuenta una. 2. El siguiente paso que ejecuta el programa, es el de realizar la primera llamada a un servidor para recibir la información sobre los posibles servidores que son susceptibles de ser utilizados (Figura 7.1.2). Con esto se consigue tener actualizada siempre la lista de servidores que se pueden utilizar sin tener que retocar el código de la aplicación cliente. (Revisar servicio Web). Se ha pensado de esta manera poruqe hemos considerado que somos una gran empresa que ha distribuido gran cantidad de copias del programa. Si esta lista estuviera ubicada en el software del cliente; cuando se aumente el número de servidores disponibles, habría que actualizar todas las copias del software cliente para que tuvieran cononcimiento de los nuevos servidores. Esta actualización debería hacerla el propio usuario a través de la descarga de la aplicación vía web. Y esto supondría un engorro por parte del usuario (como es el caso de las molestas actualizaciones críticas de los sitemas operativos de Microsoft). De la manera que lo hemos implementado, nosotros como desarrolladores, solo tendríamos que modificar la lista de los servidores del servicio web; y el usuario no tendría que ser el responsable de las actualizaciones. Figura 7.1.3 Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 21 de 120 3. Una vez que tiene conocimiento de las direcciones de todos los servidores que contienen el servicio Web, se calcula la capacidad de procesamiento (o potencia) de cada uno de ellos, para más tarde repartir la imagen en relación a la rapidez en que pueden procesar los datos. Previamente la máquina cliente ha comprobado qué direcciones de las recibidas en el punto dos están disponibles y cuales no, esto es, que procesadores están operativos en ese momento y cuales no. 4. A continuación, se hace un reparto del número de filas total de la imagen entre el número de PC´s que tenemos para procesar. Este reparto se hace en función del tiempo que hayan tardado en realizar un cálculo, idéntico para todos (indicado en el punto anterior). Así conseguimos un reparto de carga equilibrado de la imagen, de tal manera que al más rápido se le asignan más filas y al más lento menos. Y, sabiendo el número de filas que debe procesar cada ordenador, se asigna un intervalo de filas específico a cada uno de ellos. Este es el reparto que se hace por defecto, pero el usuario puede posteriormente modificarlo y asignar las filas que considere oportunas para cada procesador, pero teniendo en cuenta que se esta modificando el balanceo de carga. 5. Ahora que ya se tiene la información necesaria para saber con qué procesadores se cuenta para el cálculo, y el intervalo de filas exactas que debe calcular cada uno, se serializa la información para mandársela a los diferentes servidores. Esto quiere decir que se transforman las imágenes a una secuencia de caracteres para que puedan ser enviarlos al servicio web a traves de la red, puesto que el servicio web no puede enviar ni recibir el tipo de datos que se manejan en el proceso, se tranforman a tipos más simples. 6. Más tarde, se lanzan a ejecución a la vez cada una de las partes de la imagen a los diferentes procesadores (Figura 7.1.3). Debido al reparto equitativo que se hizo de las partes de la imagen, deberían tardar aproximadamente el mismo tiempo todos los procesadores en devolver la respuesta debido a las estimaciones realizadas previamente. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 22 de 120 Envío de información a los procesadores. Figura 7.1.4 Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 23 de 120 7. Cuando le llegan las soluciones resultado de los procesadores, se realiza el proceso inverso de serializacion, para deserializar los datos recibidos del servicio web. Respuesta obtenida de los procesadores. Figura 7.1.5 8. A medida que van llegando las respuestas de los servidores, se muestra ese fragmento de la imagen por pantalla. Y así, con cada una de las partes, hasta que les llega la última. Una vez que se tienen todas las partes, se construye una imagen en blanco y negro que es el resultado de ensamblar cada una de ellas (Figura 7.1.5). Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 24 de 120 Figura 7.1.6 • Aplicación del lado del servidor: La aplicación del lado del servidor contiene los métodos precisos de los que la aplicación cliente hace uso remotamente (métodos del servicio web). Estos métodos son: 1. El método DameProcesadoresAUtilizar, que meramente proporciona una lista con las direcciones de los procesadores que se pueden utilizar. 2. Un método muy sencillo que simplemente se utiliza con la finalidad de comprobar que la aplicación cliente conecta con el servidor, denominado ComprobarExistencia. Devuelve la cadena de caracteres “Hola”. 3. Un método que realiza un cálculo, con el fin de que la aplicación cliente tome medidas del tiempo que tarda el procesador en realizarlo, y en base a todas las medidas tomadas de cada procesador, pueda comparar la rapidez de cada servidor para más tarde saber cuanta carga de proceso enviar a cada procesador. El método se llama ComprobarPotencia. 4. El método que implementa el algoritmo del Simulated Annealing, que recibe el nombre de CalculaEnfSimulado. Recibe como entradas un array de enteros con las filas de cada imagen que debe procesar y devuelve en el mismo formato la imagen diferencia de esas filas. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 25 de 120 7.1.1. Inicialización En este apartado se explica como se recogen los datos de cada uno de los servidores que guardaremos en variables. 7.1.1.1. Inicialización Antes de poder hacer la llamada al método del servicio web del cálculo de diferencias entre imágenes, es necesario conocer los procesadores disponibles de los que vamos a poder hacer uso. Para conocer esta información se dispone de una lista con los servidores que se pueden emplear. Esta lista no puede ser modificada por el usuario, por lo que no va a poder añadir ningún servidor complementario, como se ha explicado en el capítulo anterior esto se realiza con la idea de evitar que la lista este en la aplicación software que tendrán instalado los usuarios en su máquina. En un servidor, en principio golls2, va a estar disponible la lista con los procesadores que a priori pueden ser utilizados. Para acceder a esta lista hacemos una llamada a un método del servicio web de golls2 (Figura 7.1.1.1.1). Al mantener la lista en un servidor conseguimos que siempre esté actualizada en todos los clientes, ya que cada uno que acceda a la lista a través del servicio web encontrará la última versión de esta lista de servidores disponibles. Esto evita guardar la misma lista en varios ordenadores y la dificultad de tener que cambiarlas todas al mismo tiempo cuando se requiera modificar la información de la lista, ya que si no se modificasen a la vez perderíamos consistencia en la información. A continuación se muestra como se realiza la llamada al método DameProcesadoresAUtilizar del servicio web, que nos devuelve los procesadores de la lista: servicio = new referencia.Service1("http://golls2.esi.ucm.es/Grupo2/ ServicioWebEnfSimulado/Service1.asmx"); procesadores =servicio.DameProcesadoresAUtilizar(); Figura 7.1.1.1.1 Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 26 de 120 Si no está disponible golls2 accedemos a un segundo equipo (en nuestro caso con IP 147.96.188.72) en el que también tendremos actualizada la lista de servidores. Una vez que hemos obtenido la lista de servidores, tenemos que asegurarnos de que realmente están disponibles. No basta con obtener la lista de procesadores ya que puede que haya alguno que no funcione debido a un problema, por ejemplo, si ha perdido la conexión de red, está demasiado ocupado, está apagado o ha sufrido un error de hardware. Para saber si un servidor esta operativo se hace una llamada a través de un servicio web, a un método que nos devuelve la cadena de caracteres “Hola” si el procesador esta operativo, de manera que si no está operativo lo descartaremos enseguida. Si pasado un tiempo prudencial (5 segundos) no hemos obtenido respuesta de algún servidor lo consideramos no operativo. Para cada servidor que pueda ser usado lanzamos un hilo que ejecute la llamada a ese servicio web, de esta forma el proceso se realiza concurrentemente y obtenemos las respuestas de una forma más rápida (Figura 7.1.1.1.2): /*creamos un hilo para comprobar que el servidor existe y no está caído*/ hiloExistencia[i] = new Thread(new ThreadStart(ComprobarExistenciaHilo)); hiloExistencia[i].Name = i.ToString(); hiloExistencia[i].Start(); responde[i] = hiloExistencia[i].Join(tiempoPrudencial); Código que muestra la llamada al método del servicio web que nos devuelve el string de respuesta: comprobador[i] = new referencia.Service1(procs[i].direccion); respuesta[i]=comprobador[i].ComprobarExistenciaWS();//El método devuelve un string Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 27 de 120 Figura 7.1.1.1.2 Después de esto ya tendremos los nombres de los servidores, así como la disponibilidad de cada uno de ellos. En esta lista también se incluye el procesador del cliente que ejecuta la aplicación, con lo cual la máquina cliente también va a realizar cálculos para la resolución del algoritmo sin quedarse en espera hasta que acaben los servidores. La información de cada procesador la guardamos en un struct, y los struct de todos los servidores en un array de procesadores. A continuación se muestran los datos que guarda un struct de cada procesador: public struct Processor { public string direccion;//Contiene el nombre del servidor public bool disponible;//Indicara si el servidor esta activo o //no public int tiempoEmpleado;//Tiempo que emplea en realizar el //cálculo de prueba de carga. public int filaIni;//primera fila de la imagen asignada a este //procesador public int filaFin;//última fila de la imagen asignada a este //procesador public int numFilas; //filaFin-filaIni } Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 28 de 120 Cuando se acaban de inicializar los procesadores sólo tendrán valores los campos direccion y disponible, el resto se rellenarán en los pasos sucesivos. 7.1.1.2. Estimación de tiempos de procesadores Cuando conocemos qué procesadores están operativos para el proceso de cálculo debemos estimar qué parte de las imágenes calcula cada uno. De tal manera que haya un balance de carga en función de las potencias de los procesadores en ese momento. Antes de continuar explicaremos qué son las matrices de las imágenes. Como se explica en el punto de tratamiento de las imágenes (7.1.2), cada imagen está representada por una matriz de dos dimensiones (ancho y alto) de píxeles. Esta matriz se obtiene a partir de cada imagen en la fase de agrisamiento. Esta matriz esta compuesta por números enteros comprendidos entre 0 y 255, que representan píxeles en escala de grises. Cada servidor va a procesar una parte de estas matrices. Hay muchas maneras de de hacer las divisiones en la matriz. Nosotros hemos elegido la que creemos más fácil, por filas. Más adelante se explicará el método elegido para hacer el reparto de filas (7.1.4). Por ahora sólo es necesario saber que para realizar el reparto tenemos que estimar la carga que puede ejecutar cada uno de los procesadores, para conseguir un tiempo de respuesta similar de cada uno de ellos. Para ello, se hace una llamada, a cada servidor disponible, al método del servicio web encargado de proporcionar unos tiempos que indican la potencia de cálculo que tienen en ese momento: referencia.Service1 comprobadorPot=new referencia.Service1(procs[i].direccion); comprobadorPot.ComprobarPotenciaWS(); Estos tiempos devueltos son los tiempos que tardan los servidores en hacer unos cálculos cuya única finalidad es medir el tiempo que tardan en realizarlos. Se podría considerar como un benchmark del servidor: hacemos unos cálculos para determinar el rendimiento de los ordenadores y así determinar cuales son los más rápidos, que son los que ejecutarán mayor carga de trabajo. Para cada llamada que hacemos al servicio web lanzamos un hilo, de esta manera se calcularán todos los tiempos de manera concurrente (Figura 7.1.1.2.1). hiloPotencia[i] = new Thread(new ThreadStart(ComprobarPotenciaHilo)); hiloPotencia[i].Name= i.ToString(); hiloPotencia[i].Start(); hiloPotencia[i].Join(); Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 29 de 120 Dentro del método ComprobarPotenciaHilo se realiza la llamada al servicio web que calcula los tiempos. Figura 7.1.1.2.1 7.1.2. Tratamiento de imágenes .NET ofrece, funcionalidades para el tratamiento de imágenes. Para ello Microsoft ha incluido en este entorno la tecnología GDI+ (Graphic Device Interface) cuyo objetivo es abstraer las características del hardware a una API de alto nivel. GDI+ es un conjunto de clases base que son capaces de producir las instrucciones que deben ser enviadas a los controladores de dispositivos gráficos para producir la salida gráfica apropiada en el monitor (o impresa en papel). Nosotros hemos usado estas funciones de .NET (que residen en el espacio de nombres System.Drawing) aunque no tan extensivamente como nos hubiera gustado, ya que al apoyarse sobre clases y objetos instanciados de estas clases no se consigue un rendimiento como el que obtendríamos con C++ si operamos a nivel de píxel, que es algo que tendremos que hacer. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 30 de 120 Por lo tanto, para la manipulación de las imágenes a bajo nivel usamos secciones de código no seguras, es decir, bloques de código C++ delimitados por la palabra reservada unsafe. La primera fase de la aplicación es comprobar que las imágenes de entrada (imágenes A y B) están en el formato que admite el algoritmo de enfriamiento simulado y si no lo están, transformarlas. El formato debe ser el de una imagen en blanco y negro (más concretamente en escala de grises) con formato de píxeles Format8bppIndexed. En el siguiente bloque daremos a conocer algunos conocimientos previos necesarios para comprender lo que significan estos formatos y la manera en la que .NET encapsula las imágenes, que puede llegar a ser un poco confusa. Dado que la manipulación de imágenes a bajo nivel a través de las funciones GetPixel y SetPixel no es realmente eficiente, accederemos a la memoria, como hemos mencionado antes, a través de código no seguro en C++. En .NET hay 14 formatos de píxeles en imágenes. A nosotros nos interesa el formato Format8bppIndexed, ya que tiene una paleta de 256 colores codificando cada uno con 8 bits, de ahí su nombre. Es decir, tiene un array de 256 posiciones y en cada una guarda codificado (en 8 bits) un color, en nuestro caso será un gris. Esos 8 bits se dividen en 4 pares de dígitos hexadecimales (cada par es un byte) que indican los niveles de los 3 componentes espectrales de la luz (rojo, verde, azul) y el de opacidad o nivel alfa (este último indica el nivel de transparencia). De ahí el acrónimo RGBA (Red, Green, Blue, Alpha). Esta manera de codificar los colores de la imagen nos permitirá guardarla o codificarla como un array de enteros, cuya manipulación será mucho más rápida y fácil. Es importante no confundir los formatos de píxeles de imágenes con las extensiones de los achivos de imágenes en el sistema operativo. Nuestra aplicación acepta imágenes con las extensiones BMP, TIFF, GIF, PNG y JPEG. Lo primero que debemos hacer es transformar la imagen original en una imagen con el formato de píxeles Format8bppIndexed, ya que será ese formato el que usará nuestro algoritmo de enfriamiento simulado. Debido a que no se pueden presuponer algunos parámetros necesarios para la transformación puesto que si se hace se perdería información, no existe una función para convertir cualquier formato al que nosotros usaremos (Format8bppIndexed). Se podría pensar que lo más simple sería crear una función para cada uno de los 13 formatos restantes que convirtiera la foto a Format8bppIndexed. Sin embargo, aprovecharemos la ventaja de que se puede pasar desde cualquier formato al formato Format24bppRgb. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 31 de 120 La idea entonces será pasar la imagen original a formato Format24bppRgb y hacer una única función que lo pase luego al formato Format8bppIndexed. En esta transformación se puede perder parte de la información de la imagen original, pero es información que no necesitaremos (por ejemplo los colores). Aquí entramos en el proceso de pasar una imagen en formato Format24bppRgb (que puede estar en blanco y negro o en color) al formato objetivo Format8bppIndexed. El siguiente fragmento de pseudocódigo ilustra el proceso que acabamos de explicar: if (imagen <> Format8bppIndexed) PasarAFormat24bppRgb( imagen ); PasarAFormat8bppIndexed( imagen ); Hay que recordar que las imágenes con la paleta de colores codificada en formato RGBA tienen un byte para cada uno de sus 4 componentes, y hay que pasarlo a un gris que ocupará solamente un byte.. Esto se hace traduciendo el píxel del sistema RGB al sistema YIQ. Este último sistema es el usado en la codificación de imágenes en el formato NTSC de las televisiones a color, que aprovecha algunas características de la visión humana para maximizar el uso de la señal. El formato YIQ tiene 3 componentes que son respectivamente la luminancia, la crominancia roja y la crominancia azul. Esta transformación es muy útil porque de aquí obtenemos la luminancia (Y) que es justamente el gris que buscamos. Según la CIE (Comisión Internacional sobre Iluminación) la luminancia es la manera objetiva de medir la cantidad de brillo. Es la línea donde los tres componentes R, G y B son iguales, es decir, tienen el mismo valor siendo el mínimo 0 y el máximo 255. Para pasar del sistema RGB a YIQ aplicamos a cada uno de los 3 componentes de color RGB unos coeficientes y los sumamos: Y = (R x 0.299) + (G x 0.587) + (B x 0,114) donde Y es un número de 0 a 255 (un gris). El 0 es el negro y a medida que aumenta el número se aclara hasta llegar al 255, el blanco. Esta es la parte del programa en la que se emplea código no seguro, accediendo directamente a píxeles que están en la memoria y aplicándoles estos coeficientes. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 32 de 120 La siguiente imagen muestra la relación entre los sistemas YIQ y RGB: Figura 7.1.2.1 Ahora tenemos una imagen en escala de grises en formato Format8bppIndexed, y hemos guardado cada uno de los grises (representados por números enteros de 0 a 255) en un array de dos dimensiones (el ancho y alto de la foto). Por ejemplo, si tenemos una imagen de 800x600 píxeles, obtendremos un array de enteros de 600 filas y 800 columnas. A partir de este momento, todo el proceso se hará usando este array, dado que las operaciones de acceso a los datos son mucho más rápidas. Resumiendo, hemos pasado de tener dos imágenes en cualquier formato (y en uno de los 5 tipos de extensiones que admite nuestro programa) a tener dos arrays de dos dimensiones de enteros. Esos dos arrays de enteros se los pasaremos a las máquinas que los vayan a procesar, que son el cliente y los servidores remotos disponibles. 7.1.3. Implementación de los servicios web En este apartado se explicará con detalle la estructura del servicio web desarrollado para este proyecto, lo que se ha denominado en el apartado de desarrollo “aplicación del lado del servidor”. El servicio es un servicio web ASP.NET, dentro de las plantillas de proyecto de ASP.NET, que esta incluido en el paquete de Visual Studio.NET 2003. Resulta muy sencillo implementar un servicio web, ya que Visual Studio, por medio del VSDesigner reduce la complejidad y se encarga de todo lo relativo a las comunicaciones a través de Internet (el documento Dicovery y el WSDL), de tal manera que los desarrolladores del proyecto solo tienen que centrarse en la lógica de negocio. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 33 de 120 Figura 7.1.3.1 El cuerpo del servicio web está formado por 4 métodos que serán invocados desde la aplicación cliente. Cada uno de estos métodos se ha desarrollado atendiendo a las necesidades de la aplicación cliente, aunque pueden ser invocados por cualquier otra aplicación que necesite exactamente las funcionalidades que ofrecen. Seguidamente se explican los pormenores de cada uno de estos métodos: - Método 1: La cabecera del método es la siguiente: DameProcesadoresAUtilizar():String[] Este método devuelve la información sobre todos los posibles procesadores que se pueden utilizar. O mejor dicho, manda a la aplicación cliente todas las direcciones desde donde se puede ejecutar el servicio web. La lista de direcciones se devuelve como un array, en el que cada posición contiene una cadena de caracteres con una dirección. La idea de este método es que la aplicación cliente siempre tenga actualizada la lista de direcciones que puede utilizar. En un primer prototipo de la aplicación, este método no existía ya que las direcciones se incluían dentro de la aplicación. Pero más tarde, y con el objetivo de generalizarla lo máximo posible, se pensó que en cualquier momento se podría disponer de un “servidor más”, es decir, un ordenador disponible más en la red donde estuviera instalado el servicio web. En el primer prototipo, habría que modificar el código de la aplicación cliente e incluir una línea más. Y así con todas las aplicaciones cliente que hubiera distribuidas. Por este motivo, se pensó que sería mejor que la aplicación cliente, al comenzar su ejecución, se conectara a algún servidor y se descargara la lista de todas las direcciones. De esta manera sólo se tendría que modificar este servicio web desde el servidor (y ni siquiera desde todos los servidores), y todas las aplicaciones clientes Servidor Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 34 de 120 quedarían exentas de modificaciones. Si el cliente no está conectado a la red, sólo usará su propio procesador. - Método 2: Que tiene la forma: ComprobarExistenciaWS():string Este método únicamente devuelve la cadena de caracteres “Hola”. Aunque parezca una simpleza, la aplicación cliente lo invoca y del resultado de la invocación se conocerá si el servidor esta disponible para ser usado, o si por el contrario ha habido algún problema con la conexión. De esta manera, la aplicación podrá elaborar la verdadera lista de direcciones que se va a utilizar, haciendo la comprobación con cada una de las direcciones que ha obtenido gracias al Método 1. - Método 3: La cabecera tiene el siguiente formato: ComprobarPotenciaWS():void Hace una llamada al método CompruebaCarga() de la librería AlgComprobarCarga. Este cálculo se realiza con ánimo de cronometrar el tiempo que tarda cada procesador en ejecutar esa función. De esta manera, si se puede llevar a cabo una comparativa de tiempos. En resumidas cuentas, el propósito de este algoritmo se puede asemejar a la idea de benchmark, es decir, que sirve para evaluar el rendimiento del ordenador. Para más información, revisar la sección 7.1.1.2 ( Estimación de tiempos de procesadores). - Método 4 El método presenta la siguiente estructura: public String[] CalculaEnfSimuladoWS( String[] smatrizA,String[] smatrizB,int numFilas, int numColumnas,int numFI,int numFF,int vueltas, int solapamiento) Este método es uno de los más importantes, ya que es el que va a determinar las diferencias entre las imágenes. Hace una llamada a la librería AlgEnfriamientoSimulado y a la librería SerializaciónDatos. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 35 de 120 Lo primero que hace esta función cuando recibe los datos es deshacer la serialización de los datos que recibe por entrada. Esto significa que traduce los datos que le llegan por la red al formato que necesita. El concepto de serialización viene explicado con detalle en el punto 7.1.5. Una vez obtenido los datos en el formato adecuado, se hace una llamada al a librería de AlgEnfrimamientoSimulado para que calcule los datos correspondientes (mas información sobre esta librería en la sección 7.1.6). A continuación se vuelven a serializar los datos para poder enviarlos a la aplicación cliente. El uso del servicio web requiere la creación de la clase Proxy que es la encargada de la comunicación entre la aplicación cliente y el servicio web. La aplicación cliente se comunica directamente con el Proxy para invocar las operaciones necesarias del servicio web. Así, al invocar las llamadas de las funciones a través del Proxy, el cliente cree que está llamando a una función local, cuando en realidad lo está haciendo a una máquina remota. Se puede ver la información relativa a un servicio web o verificar la operatividad del servicio en la máquina sobre la que se ha desarrollado la aplicación (en este caso, golls2.esi.ucm.es). Para ello, basta con dirigir el navegador a la ubicación donde se encuentra el servicio web. Para hacer una prueba, se puede ver la información del servicio web que se ha implementado en este proyecto en esta dirección: http://golls2.esi.ucm.es/Grupo2/ServicioWebEnfSimulado/Service1.asmx La siguiente figura muestra la lista de todas las operaciones disponibles para el servicio web que se muestran al seguir este vínculo. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 36 de 120 7.1.4. Razonamiento del reparto de filas de la imagen Para poder realizar la ejecución del algoritmo del cálculo de las diferencias en varios servidores, es necesario hacer una división de las matrices que forman las imágenes de entrada. Cada división será una submatriz de la matriz imagen, y cada servidor hará el tratamiento de una de estas submatrices. Ya se ha comentado anteriormente (puntos 7.1.1.2 y 7.1.2) el formato de matriz bidimensional en el que hemos traducido las imágenes. El reparto de la matriz se puede hacer de distintas formas, nosotros hemos elegido la que hemos creído más fácil de entender e implementar, es decir, por filas. Cada submatriz estará definida por su fila inicial, las filas intermedias y su fila final. Estas filas serán pasadas como parámetros a cada servidor junto con la matriz inicial de la imagen y así el servidor correspondiente hará los cálculos de la parte de la matriz que le es indicada a través de las filas inicial y final. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 37 de 120 Lo primero es calcular el número de filas que va a ejecutar cada servidor. De este cáculo se encarga el método llamado CalculaReparto. Para realizar este cálculo se tiene en cuenta el tamaño de la matriz imagen de entrada y el tiempo obtenido de cada procesador al ejecutar un pequeño cálculo, (este método se ha explicado anteriormente en los puntos 7.1.1.2 y 7.1.3 de esta documentación). La fórmula matemática para realizar este cálculo es la siguiente: T/ TT = C Donde T es la suma de los tiempos de respuesta de los servidores (∑TRi) dividido entre el tiempo de respuesta del servidor i (TRi) y TT es la suma de los T de todos los servidores. El siguiente fragmento de código realiza la suma de los tiempos de respuesta de los servidores: for (int i=0;i=0) procs[0].numFilas += numFilasRest; else procs[0].numFilas=0; Con el cálculo de T para cada servidor se consigue un número proporcionalmente inverso al tiempo que ha tardado en responder con respecto al resto de servidores, es decir, un servidor con un tiempo de respuesta mayor que otro tendrá un número T menor (cuanto más tiempo de respuesta menos columnas va a ejecutar.) Con el cálculo de C para cada procesador se normaliza el número T calculado anteriormente para que sea un número de 0 a 1, y por lo tanto, la suma de todos los C dará 1 como resultado. Al multiplicar estos C por el número de filas se obtendrá como resultado las filas que va utilizar cada procesador en los cálculos. Después de calcular el número de filas que ejecutará cada procesador se procede fijar el intervalo de filas que debe realizar cada procesador. Para ello se fijan las filas inicial y final, necesarias para determinar la submatriz correspondiente. Para hacer el cálculo de estas filas es necesario saber el número de filas de solapamiento que tiene el algoritmo. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 39 de 120 El solapamiento es un número que indica la cantidad de filas que se calcularán en dos procesadores a la vez. Esto se hace para mejorar el proceso de detección de cambios, ya que aumenta la probabilidad de encontrar diferencias (Ver punto 7.1.6 para más detalle). Definiremos una variable que llevará cuenta de la primera fila de la matriz imagen que no esta asignada. Esta variable se inicializa con la fila 0, que es la primera y se llamará fila incial. Ahora, pondremos el ejemplo de cómo se calcula el intervalo de filas a ejecutar por el primer procesador disponible. Como no encontramos en la primera fila, no existirá solapamiento en la parte de arriba de la submatriz, por lo tanto se suman el número de filas a ejecutar por el primer servidor a la variable fila inicial y obtendremos la fila final sin solapamiento. Para hallar la fila final con solapamiento simplemente se suma el número de filas a solapar a la fila final calculada anteriormente. El número de filas a ejecutar por cada servidor son las que hemos calculado al principio de este apartado. El código siguiente muestra este proceso: if(ultimaFilaAsignada==0) //por aquí entrará localhost { procs[i].filaIni=ultimaFilaAsignada; ultimaFilaAsignada=ultimaFilaAsignada+procs[i].numFilas; //ahora, esta comprobación es por si el cliente es el único servidor disponible if (ultimaFilaAsignada==numFilasImagen) procs[i].filaFin=ultimaFilaAsignada-1; else procs[i].filaFin=ultimaFilaAsignada-1+solapamiento; } Si nos encontramos en una fila intermedia de la matriz, esto es, que fila inicial no sea 0, entonces se añade solapamiento por encima y por debado del intervalo de filas. Esto se hace, por arriba restando las filas a solapar a la fila inicial, y por debajo, que se hace sumando las filas a solapar a la fila final. La fila inicial será la fila siguiente a la fila final de la submatriz anterior, y la fila final se calcula sumando las filas que tiene que ejecutar el servidor a la fila inicial. El código siguiente muestra este proceso: else if (ultimaFilaAsignada+procs[i].numFilas < numFilasImagen) { procs[i].filaIni=ultimaFilaAsignada - solapamiento; ultimaFilaAsignada=ultimaFilaAsignada+procs[i].numFilas; procs[i].filaFin=ultimaFilaAsignada-1+solapamiento; } Si la fila final a la que hemos llegado es la última fila de la matriz entonces no se añadirá solapamiento por debajo, y habremos terminado con el calculo de las submatrices. El código siguiente muestra este proceso: Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 40 de 120 else if(ultimaFilaAsignada+procs[i].numFilas==numFilasImagen) { procs[i].filaIni=ultimaFilaAsignada - solapamiento; ultimaFilaAsignada=ultimaFilaAsignada+procs[i].numFilas-1; procs[i].filaFin=ultimaFilaAsignada; } 7.1.5. Serialización de datos Para aclarar este concepto, aquí se da una definición formal del concepto de serialización de datos. “La serialización de datos es el proceso en el que se toman objetos y se convierte su información de estado en un formato que permita su transporte o su almacenamiento. La acción inversa consiste en deshacer la serialización y dejar el objeto con la misma forma que tenía inicialmente”. Dicho de una manera más simple, la serialización consiste en transformar datos que tienen una forma, a otra forma, pero manteniendo su significado. La necesidad de incluir en este proyecto la “serialización de datos” se pone de manifiesto cuando se intenta enviar al servicio web la información necesaria para calcular las diferencias entre las imágenes. Desde el inicio del proyecto, se tratan las imágenes como una array bidimensional, en el que cada posición contiene un número de entre 0 y 255. Por otro lado, la función que calcula los cambios entre las dos imágenes de entrada, necesita como parámetros de entrada, entre otros, las dos imágenes. Entre los tipos de datos que se le pueden pasar a los métodos de servicios web y los tipos de datos que devuelven se encuentran: los tipos de datos primitivos y arrays unidimensionales de tipos primitivos, entre otros. Como se puede observar, en ningún caso se contempla los arrays de dos dimensiones. Por esta razón, se ha desarrollado una función que transforma el array de double bidimensional en un array unidimensional del tipo primitivo String. De esta manera se puede enviar sin ningún problema la imagen como un array unidimensional de tipo String. Cuando las imágenes llegan al método del servicio web, se deshace la serialización y se puede trabajar con la imagen en formato array bidimensional. Las funciones de serialización y deserialización de los datos, en este caso, se llaman PasaAMatriz y PasaAString, y tienen la estructura que sigue: Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 41 de 120 pasaAString(double[][]): String[] pasaAMatriz(String[]):double[][] La primera función es la que llamamos de serialización, que transforma el array bidimensional de double que se le pasa como parámetro en un array unidimensional de String. El mecanismo que sigue esta función es que lee cada elemento de una fila del array de double y lo va metiendo en un String. Cuando termina de leer esa fila, guarda el string resultante en la fila correspondiente al array de String. Para que se vea más claro, se incluye el fragmento de código de la función: String s=""; int numFilas=matriz.Length; int numColumnas=matriz[1].Length; String [] salida=new String[numFilas]; for(int i=0;i 0.5 ⇒ si = +1 else si = -1 si Calculado si se desplaza la ventana y se pasa al siguiente 2. Cálculo de la matriz de probabilidades P 1. Calcular la imagen diferencia en valor absoluto X = abs(A−B) 2. Obtener dos conjuntos que se denominan Xc y Xn, que se corresponden con valores de cambios y no cambios. 3. Obtención de Xc y Xn Calcular la desviación típica σ de la matriz X. Ahora para cada valor de X en la posición (x,y), if X(x,y) > T* σ ⇒ Xc (k) = X(x,y) else Xn (k) = X(x,y) 4. Calcular las medias y varianzas para los datos Xc y Xn: mc, sc y mn, sn 5. Para cada valor de la matriz X(x,y) calcular una probabilidad como sigue ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎣ ⎡ ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ − −= 2),(5.0exp 2 1),( sc mcyxX sc yxpXc π Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 48 de 120 ⎥ ⎥ ⎦ ⎤ ⎢ ⎢ ⎣ ⎡ ⎟ ⎠ ⎞ ⎜ ⎝ ⎛ − −= 2),(5.0exp 2 1),( sn mnyxX sn yxpXn π ),(),(),( yxpXnyxpXcyxpX += 6. Normalizar los valores de ),( yxpX al rango [0,1], como sigue: calcular el máximo (Max) y el mínimo (min) de todos los valores y obtener: min min),(),( − − = Max yxpXyxpX El resultado final es una matriz bidimensional de probabilidades P en las localizaciones (x,y), a la que habrá que recurrir después durante el proceso de enfriamiento simulado. 3. Enfriamiento simulado Inicializar la temperatura T(k), k = 0 (iteración) do k = k + 1 do recorrer toda la matriz de estados inicial E píxel a píxel, considerando que su estado es si. Definir una región de vecindad de ese píxel de dimensión 3x3 o 5x5 de forma que los estados de esa región serán sj. Tomando como referencia la matriz de probabilidades P y las posiciones i y j, calcular wij de la siguiente forma: en la localización i if pX(x,y) < 0.05 then pi = -1 else pi = +1 en la localización j if pX(x,y) < 0.05 then pj = -1 else pj = +1 wij = pi pj Calcular ∑ ∑−= = = N i N j jiij sswEa 1 12 1 (para una vecindad de 3x3 por ejemplo) Eb = - Ea if Eb < Ea then si = -si else if )1,0( )( exp random kT aEbE > ⎟ ⎟ ⎠ ⎞ ⎜ ⎜ ⎝ ⎛ − − then si = -si until todos los nodos han sido visitados Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 49 de 120 until k = kmax (máximo numero de iteraciones o la energía se estabiliza) Matriz Estados (E) M N x y Matriz de probabilidades (P) M N x y s1 s2 s3 s4 si s5 s6 s7 s8 M pX1 pX2 pX3 pX4 pXi pX5 pX6 pX7 pX8 Actualización del estado si en función de los sj ; j =1,2,3,4,5,6,7,8 7.1.7. Recomposición parcial de la imagen Recordemos que a cada servidor le hemos indicado que calcule sólo una parte de las matrices, por lo tanto devolverá una parte de la solución. Cada servidor devuelve una matriz solución de tamaño igual a las imágenes iniciales, pero sólo son válidas las filas que han sido calculadas entre las filas inicial y final que hemos pasado a cada servidor como parámetro. Es necesario recoger todas estas matrices solución parciales devueltas por los servidores e insertar en la matriz solución final las filas válidas de cada uno. Para hacer el cálculo de las matrices soluciones parciales hemos lanzado un hilo por cada servidor que ejecuta el algoritmo de enfriamiento simulado, de esta manera el proceso se ejecuta en los servidores de forma concurrente. Para ejecutar el algoritmo en un servidor se llama al método LanzaHilos que llama, a su vez, al método calcular del servicio web que contiene el algoritmo de enfriamiento simulado. Antes hemos pasado como parámetros las matrices de las imágenes así como las filas inicial y final que va a usar cada procesador, además de otros parámetros necesarios para el correcto funcionamiento del algoritmo. Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 50 de 120 AlgEnfriamientoSimulado.Class1 algorit = new AlgEnfriamientoSimulado.Class1(mA,mB,numFilasImagen, numColumnasImagen,fInicial,fFinal,vueltasIter,tamVentana); algorit.calcular(sol); soluciones[i]=sol; RecomponeSolucion(Thread.CurrentThread); Cuando termina el servicio web de hacer los cálculos nos devuelve la matriz con la solución parcial que ha calculado ese servidor. Lo último que hace el hilo que hemos lanzado para el cálculo de una parte de la matriz, es llamar al método RecomponeSolucion que se encargara de rellenar las filas que ha calculado en la matriz solución final. Este método recorre las filas, delimitadas por las filas inicial y final que ha usado ese servidor, de la matriz solución final y las va rellenando celda a celda con los valores de esas mismas filas en la matriz solución parcial devuelta por el servicio web. Si hay solapamiento entonces habrá filas repetidas en, al menos, dos matrices solución parciales; para rellenar estas filas se hace una función OR de las filas iguales en cada matriz solución parcial. La función OR lo que hace es que si una celda de la matriz es diferencia para una solución parcial y no es diferencia para otra, entonces nosotros si lo tomamos como diferencia. A continuación se ve un ejemplo en el que hay solapamiento en la fila 3, y cómo se realiza la OR en esa fila: Parte de la solución calculada por el servidor1: 1 0 0 Fila1 0 1 1 Fila2 1 0 1 Fila3 Parte de la solución calculada por el servidor2: 0 0 1 Fila3 1 1 0 Fila4 0 0 0 Fila5 Sistemas Informáticos. Sistema de servicios Web/Grid para el análisis de d diferencias entre imágenes Facultad de Informática UCM Página 51 de 120 Solución final: 1 0 0 Fila1 0 1 1 Fila2 1 0 1 Fila3 1 1 0 Fila4 0 0 0 Fila5 Este código muestra como se hace este cálculo: int numero=int.Parse(hilo.Name); double[][] s = soluciones[numero]; int fIni = procs[numero].filaIni; int fFin = procs[numero].filaFin; //recorremos las filas mut.WaitOne(); //aquí solo puede entrar un hilo cada vez for (int j=fIni;j<=fFin;j++) { //recorremos las columnas for (int k=0;k