<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Fausto Loja Mora &#187; Inteligencia Artificial</title>
	<atom:link href="http://faustol.wordpress.com/category/inteligencia-artificial/feed/" rel="self" type="application/rss+xml" />
	<link>http://faustol.wordpress.com</link>
	<description>Para dar mas</description>
	<lastBuildDate>Wed, 28 Oct 2009 22:50:15 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='faustol.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/12cc869fef55b1cfb51da27a48795849?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Fausto Loja Mora &#187; Inteligencia Artificial</title>
		<link>http://faustol.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://faustol.wordpress.com/osd.xml" title="Fausto Loja Mora" />
		<item>
		<title>PROCESAMIENTO PARALELO DE IMAGENES</title>
		<link>http://faustol.wordpress.com/2007/04/25/procesamiento-paralelo-de-imagenes/</link>
		<comments>http://faustol.wordpress.com/2007/04/25/procesamiento-paralelo-de-imagenes/#comments</comments>
		<pubDate>Wed, 25 Apr 2007 23:31:36 +0000</pubDate>
		<dc:creator>faustol</dc:creator>
				<category><![CDATA[Inteligencia Artificial]]></category>

		<guid isPermaLink="false">http://faustol.wordpress.com/2007/04/25/procesamiento-paralelo-de-imagenes/</guid>
		<description><![CDATA[OBJETIVO: 
El objetivo principal del presente proyecto consiste en demostrar la utilidad y potencialidad del procesamiento paralelo. 
INTRODUCCIÓN 
El presente trabajo ha sido posible ser desarrollado gracias a la tecnología actual, como es de nuestro conocimiento la tecnología avanza cada día a pasos agigantados, y en lo que para nosotros nos es de mayor interés, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=faustol.wordpress.com&blog=950349&post=50&subd=faustol&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><span style="color:black;"><strong><span style="font-size:22pt;"><font size="2">OBJETIVO:</font></span><span style="font-size:14pt;"> </span></strong></span></p>
<p><span style="color:black;"><strong><span style="font-size:14pt;"></span></strong></span><span style="font-size:12pt;color:black;"><font size="2">El objetivo principal del presente proyecto consiste en demostrar la utilidad y potencialidad del procesamiento paralelo. </font></span></p>
<p style="text-align:center;"><span style="font-size:20pt;color:black;"><strong><font size="2">INTRODUCCIÓN</font> </strong></span></p>
<p style="text-align:justify;">El presente trabajo ha sido posible ser desarrollado gracias a la tecnología actual, como es de nuestro conocimiento la tecnología avanza cada día a pasos agigantados, y en lo que para nosotros nos es de mayor interés, como es los ordenadores, se ve como la tecnología en cuanto a procesadores avanza inexorablemente; hoy en día la capacidad de procesamiento de un ordenador es asombrosa, sin embargo las demandas de procesamiento son cada día mayores, es decir tenemos la necesidad de procesar enormes volúmenes de datos para obtener información.</p>
<p style="text-align:justify;">&nbsp;</p>
<p><span id="more-50"></span></p>
<p style="text-align:justify;">La presente aplicación tiene como finalidad realizar un procesamiento en paralelo de un gran conjunto de datos, en este caso para nuestro trabajo se va ha realizar la comparación pixel a pixel de dos imágenes en blanco y negro; para lograr este objetivo se ha utilizado MPI (<em>Message Passing Interface</em>). MPI no es más que una &#8220;Interface de Paso de Mensajes&#8221;, en otras palabras, es una interface estandarizada para la realización de aplicaciones paralelas basadas en paso de mensajes.</p>
<p style="text-align:justify;">Es importante mencionar que, la primera imagen será diseñada o armada en base a las distintas partes que hemos diseñado, para lo cual, se ha construido una interfaz de usuario en la que se puede escoger las distintas partes antes mencionadas; y la segunda imagen será generada mediante un algoritmo genético.</p>
<p style="text-align:justify;">&nbsp;</p>
<p style="text-align:justify;"><strong><em>&#8220;En este mundo cambiante muy poco puede consolidarse como una verdad&#8221; </em></strong></p>
<p style="text-align:center;"><span style="font-size:20pt;"><strong><font size="2">DESARROLLO </font></strong></span></p>
<p style="text-align:justify;"><strong>Herramientas de desarrollo </strong></p>
<ul>
<li>
<p style="text-align:justify;">Una implementación del estándar MPI, en este caso hemos utilizado DeinoMPI (http://mpi.deino.net/) para implementar la aplicación paralelizada.</p>
</li>
<li>
<p style="text-align:justify;">Microsoft Visual Studio, utilizando Visual C# para construir la interface de usuario, y Visual C++ en el cual esta desarrollado la aplicación que realiza las tareas de multiprocesamiento en el tratamiento de la imagen.</p>
</li>
</ul>
<p style="text-align:justify;"><strong>Tratamiento de las imágenes </strong></p>
<p style="text-align:justify;">El proceso de tratamiento de la imagen comienza cuando el usuario, diseña una imagen a partir de varias partes de un rostro humano definidas, estas partes pueden ser: cabello, ojos, nariz, forma del rostro, cejas, boca luego con un rostro definido, se representa cada característica en una cadena de bits, en total 17 bits. Una vez obtenida la imagen se procede a obtener todos los pixeles, los mismos que son transformados a una matriz de ceros y unos de acuerdo al color, un &#8220;1&#8243; para el color negro y un &#8220;0&#8243; para el color blanco, ahora bien esta matriz es guardada en un archivo de texto plano, que será el archivo principal o archivo patrón que usaremos para compararlo a otras representaciones de rostros generadas mediante una implementación del algoritmo genético.</p>
<p style="text-align:justify;">&nbsp;</p>
<p style="text-align:justify;">El algoritmo genético, es un algoritmo genérico, que se puede utilizar en cualquier tipo de problema, utiliza básicamente el principio de evolución natural, el cual dice que en una generación de individuos, aquel con las mejores características o aquel que se adapte mejor a un escenario pasa a la siguiente generación, así el algoritmo genético utiliza tres métodos principales: selección, cruce y mutación.</p>
<p style="text-align:justify;">El método de selección, permite seleccionar dos individuos que originan un nuevo individuo o hipótesis, en nuestra aplicación la selección se realiza al azar.</p>
<p style="text-align:justify;"><strong>Estrategia de Multiprocesamiento </strong></p>
<p style="text-align:justify;">Trabajando con MPI hemos encontrado varios contratiempos, debido a nuestra falta de experiencia trabajando en una programación multiprocesamiento, así también entender el modelo que el estándar MPI implanta, ya que MPI considera la migración de procesos, hemos escogido como solución, utilizar Servicios Web para la implementación del multiprocesamiento.</p>
<p style="text-align:justify;">Un programa típico de MPI contiene la siguiente estructura:</p>
<p style="text-align:justify;"><span style="font-size:10pt;font-family:courier new;"><span style="color:blue;">#include</span> <span style="color:maroon;">&lt;mpi.h&gt; </span></span></p>
<p style="background:#f2f2f2;">&nbsp;</p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;"><span style="color:blue;">int</span> main(<span style="color:blue;">int</span> argc,<span style="color:blue;">char</span>* argv) </span></p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;">{ </span></p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;">    MPI_Init(&amp;argc,&amp;argv); </span></p>
<p style="background:#f2f2f2;">&nbsp;</p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;">    <span style="color:blue;">int</span> numProcesos; </span></p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;">    <span style="color:blue;">int</span> idProceso; </span></p>
<p style="background:#f2f2f2;">&nbsp;</p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;">    MPI_Comm_rank(MPI_COMM_WORLD,&amp;idProceso); </span></p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;">    MPI_Comm_size(MPI_COMM_WORLD,&amp;numProcesos); </span></p>
<p style="background:#f2f2f2;">&nbsp;</p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;">    <span style="color:blue;">if</span>(idProceso == 0) </span></p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;">        <span style="color:green;">//Enviar datos a los demas procesos </span></span></p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;">    <span style="color:blue;">else </span></span></p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;">        <span style="color:blue;">for</span>(<span style="color:blue;">int</span> i = 0; i &lt; numProcesos; i++) </span></p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;">            <span style="color:green;">//Recibir datos procesados </span></span></p>
<p style="background:#f2f2f2;">&nbsp;</p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;">    MPI_Finalize(); </span></p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;">} </span></p>
<p style="margin-left:35pt;text-align:center;"><span style="font-size:10pt;">Programa MPI </span></p>
<p style="text-align:justify;">&nbsp;</p>
<p style="text-align:justify;">Como un programa de MPI se carga en un proceso y luego este es migrado hacia los demás equipos en el clúster, generalmente se utiliza estructuras de control condicionales (if – else) para controlar cual es el código que deberá ejecutar el proceso que estemos utilizando como director, generalmente el proceso 0, y cual es el código para los procesos que ejecutan las tareas paralelas, estas tareas paralelas usualmente significan que implementamos un método que contiene el mismo código para todas las tareas asignadas a los procesadores, pero con diferentes datos para cada uno de los procesos.</p>
<p style="text-align:justify;">Tomando en cuenta ese escenario creemos que es factible aplicar esta misma estructura de un programa MPI, separándolo en Servicios Web, así cada nodo de nuestro clúster contendrá, un método publico, expuesto como Método Web que recibirá los datos correspondientes desde un programa cliente que actúa como director, e invocador de los Servicios Web.</p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;">nodo1.Service proxy1 = <span style="color:blue;">new</span> hp.nodo1.Service(); </span></p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;">nodo2.Service proxy2 = <span style="color:blue;">new</span> hp.nodo2.Service(); </span></p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;">nodo3.Service proxy3 = <span style="color:blue;">new</span> hp.nodo3.Service(); </span></p>
<p style="background:#f2f2f2;">&nbsp;</p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;"><span style="color:blue;">string</span> sp1 = proxy1.HpMethod(p1); </span></p>
<p style="background:#f2f2f2;"><span style="font-size:10pt;font-family:courier new;"><span style="color:blue;">string</span> sp2 = proxy2.HpMethod(p2); </span></p>
<p style="background:#f2f2f2;text-align:justify;"><span style="font-size:10pt;font-family:courier new;"><span style="color:blue;">string</span> sp3 = proxy3.HpMethod(p3);</span></p>
<p style="text-align:center;"><span style="font-size:10pt;">Invocación a Servicios Web </span></p>
<p>Entonces cada clúster contiene el mismo servicio web, el programa cliente o invocador es el encargado de determinar los parámetros para cada invocación a las diferentes instancias (proxies) de los servicios.</p>
<p style="text-align:justify;"><em>Ventajas </em></p>
<p style="text-align:justify;">&nbsp;</p>
<ul>
<li>
<p style="text-align:justify;">No se necesita conocer en profundidad la forma de programación en red, tales como el uso de sockets, RMI (Remote Method Invocation), etc., ya que los Servicios Web abstraen toda esa funcionalidad.</p>
</li>
<li>
<p style="text-align:justify;">Debido a que un Servicio Web se &#8220;ejecuta&#8221; sobre Internet, los equipos que conforman el clúster no necesariamente deberían estar en el mismo espacio geográfico que el director o los otros clúster de la topología.</p>
</li>
<li>
<p style="text-align:justify;">Los Servicios Web utilizan protocolos estándar (HTTP, XML, SOAP) lo cual permite que estén implementados en cualquier tecnología, servicios Web en Java, .NET, etc. Logrando así poder tener una topología con ambientes de ejecución heterogéneos.</p>
</li>
</ul>
<p style="text-align:justify;"><em>Desventajas </em></p>
<ul>
<li>
<p style="text-align:justify;">La topología del clúster es estática, ya que la invocación al servicio web de cada nodo debe ser establecida durante el desarrollo de la aplicación.</p>
</li>
<li>
<p style="text-align:justify;">No se puede añadir nodos dinámicamente a la topología.</p>
</li>
<li>
<p style="text-align:justify;">Se debe controlar en la aplicación el fallo de un nodo, si un nodo falla la aplicación debe reorganizar las invocaciones.</p>
</li>
</ul>
<p style="text-align:justify;"><strong>Topología </strong></p>
<p style="text-align:justify;"><img src="http://faustol.files.wordpress.com/2007/04/042507-2328-procesamien1.png" /><strong> </strong></p>
<p style="text-align:justify;"><strong>Conclusiones</strong></p>
<ul>
<li>
<p style="text-align:justify;">Los algoritmos genéticos pueden ser usados para simular vagamente la evolución, pero una evolución aplicada a cualquier tipo de contexto del cual debemos implementar las operaciones comunes.</p>
</li>
<li>
<p style="text-align:justify;">Hemos usado los primeros métodos del algoritmo genético, es decir una <strong>selección</strong> aleatoria, <strong>cruce</strong> por el método de punto<strong> </strong>único (single point), y <strong>mutación </strong>aleatoria con cambio de un único bit de la hipótesis.</p>
</li>
<li>
<p style="text-align:justify;">Acerca de los procesos de multiprocesamiento al utilizar Servicios Web, nos da la posibilidad de publicar un servicio de multiprocesamiento en Internet.</p>
</li>
<li>
<p style="text-align:justify;">A diferencia de MPI, el cual migra los procesos entre los nodos del clúster como desarrolladores debemos implementar en cada nodo la funcionalidad requerida.  </p>
</li>
</ul>
<p style="text-align:justify;"><strong>Bibliografia </strong> </p>
<p><a href="http://www.w3.org/XML">http://www.w3.org/XML</a><br />
<a href="http://msdn.microsoft.com/xml">http://msdn.microsoft.com/xml</a></p>
<p><a href="http://msdn.microsoft.com/xml/general/wsdl.asp">http://msdn.microsoft.com/xml/general/wsdl.asp</a></p>
<p><a href="http://www.w3.org/TR/SOAP">http://www.w3.org/TR/SOAP</a><br />
<a href="http://msdn.microsoft.com/soap/">http://msdn.microsoft.com/soap</a></p>
<p><a href="http://msdn.microsoft.com/xml/general/disco.asp">http://msdn.microsoft.com/xml/general/disco.asp</a></p>
<p style="margin-left:18pt;"><a href="http://www.uddi.org">http://www.uddi.org</a><span style="font-size:9pt;font-family:arial;"> </span></p>
<p style="margin-left:18pt;"><a href="http://www.microsoft.com/PressPass/features/2000/sept00/09-06uddi.asp">http://www.microsoft.com/PressPass/features/2000/sept00/09-06uddi.asp</a><span style="font-size:9pt;font-family:arial;">) </span></p>
<p style="margin-left:18pt;"><img src="http://faustol.files.wordpress.com/2007/04/042507-2328-procesamien2.png" /><span style="font-size:9pt;font-family:arial;"><strong> </strong></span></p>
<p><img src="http://faustol.files.wordpress.com/2007/04/042507-2328-procesamien3.png" /> </p>
<p><img src="http://faustol.files.wordpress.com/2007/04/042507-2328-procesamien4.png" /></p>
<p><img src="http://faustol.files.wordpress.com/2007/04/042507-2328-procesamien5.png" /><img src="http://faustol.files.wordpress.com/2007/04/042507-2328-procesamien6.png" /></p>
<p><strong>TUTORES:</strong></p>
<p>Ing. Fausto Loja.</p>
<p>Ing. Greyson Alberca.</p>
<p><strong>AUTORES:</strong></p>
<p>Luís A Cuenca Macas.</p>
<p>Fernando Cumbicos.</p>
<p>Edison Torres.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/faustol.wordpress.com/50/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/faustol.wordpress.com/50/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/faustol.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/faustol.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/faustol.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/faustol.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/faustol.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/faustol.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/faustol.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/faustol.wordpress.com/50/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/faustol.wordpress.com/50/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/faustol.wordpress.com/50/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=faustol.wordpress.com&blog=950349&post=50&subd=faustol&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://faustol.wordpress.com/2007/04/25/procesamiento-paralelo-de-imagenes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/b93d50d6c51e259b41d74511ee2bb6c5?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">faustol</media:title>
		</media:content>

		<media:content url="http://faustol.files.wordpress.com/2007/04/042507-2328-procesamien1.png" medium="image" />

		<media:content url="http://faustol.files.wordpress.com/2007/04/042507-2328-procesamien2.png" medium="image" />

		<media:content url="http://faustol.files.wordpress.com/2007/04/042507-2328-procesamien3.png" medium="image" />

		<media:content url="http://faustol.files.wordpress.com/2007/04/042507-2328-procesamien4.png" medium="image" />

		<media:content url="http://faustol.files.wordpress.com/2007/04/042507-2328-procesamien5.png" medium="image" />

		<media:content url="http://faustol.files.wordpress.com/2007/04/042507-2328-procesamien6.png" medium="image" />
	</item>
	</channel>
</rss>