mga/blog

ISSN 2011-0146

New Faces

publicado en arte,diseño,información,interacción,programación,visualización por mga en March 18, 2011

–Texto en inglés como parte de mi estudio en Carnegie Mellon University. Eventualmente haré una versión en español.–

New Faces is a project that began in 2009 after I got fed up with Colombia’s online newspapers’ (one site, another site) high emphasis in sports and celebtrity-related news. I decided to take a screenshot of the offending website and remove this information (along with advertising) in order to see what was left.

Clearly sports, advertising and celebrity news have a relatively high importance for this colombian newspaper (at least in its online incarnation). This led me to wonder if this was the same across different countries. I decided to create a Python script that makes use of webkit2png-0.5 to take a screenshot of eleven news websites every night at 8pm. This script has been ran almost every night since November 8, 2009.

New faces

After seeing Rutherford Chang’s work with the New York Times where he blacks-out every element in the page except faces (no link available, sorry) I thought it would be an interesting idea to execute this same process in my dataset of more than 3,000 files and 10 GB.

I tested various technical solution for this process and decided upon using the OpenCV library for Processing.

After that it was a matter of applying it to my dataset and see if it worked. I tried several parameters for the detect() method since there were many false positives (text selected as face) and false negatives (face undetected when there should be) but could not get 100% accuracy. These errors provide an interesting outcome anyway.

The faces are extracted from the screenshots and saved as separate files along with their original location in x,y and number of total faces in the screenshot. There were 28,000+ faces deteced (less than 10 faces per screenshot).

With this new subset I then created a Flash interface to view the faces in their original x,y coordinates with buttons to toggle the visibility of individual news sites. Next to the buttons a blue line indicates average face area, a green line indicates how many screenshots (individual days captured) and a red line indicates total amount of faces in that site.

View the Flash interface online in your browser. F for fullscreen (click the interface to give it focus). CAUTION: ~30,000 images files loaded might clog up your browser (although they’re about 2kb each only). Interface is not optimized for low-end computers.

Future work

From this initial work some superficial conclusions could be made (see photo captions). Further analysis could provide some interesting information such as:

  • dominant race or skin color
  • gender distribution
  • dominant face expression (sad, happy, angry, etc.)
  • average face area
  • preferred location in the page
  • how the above change over time

The interface makes use of Bit-101?s Minimal Comps.

This project was done as part of the requirements to complete the Spring 2011 Interactive Art and Computational Design course with Professor Golan Levin in Carnegie Mellon University.

socially nervous

publicado en arte,crítica,interacción,programación,web por mga en March 18, 2011

–Texto en inglés como parte de mi estudio en Carnegie Mellon University. Eventualmente haré una versión en español.–

Description
Social network services[1] enable people to communicate with each other in ways that would be considered science fiction only a few years ago. This enablement has been welcome by people at large, with some criticisms concerning personal privacy and how well (or not) the networks they model reflect real life (offline) relationships. socially nervous is a commentary on how these services have affected our way we perceive these relationships.

The object

An electronic “pet” with movement and audiovisual actuation capabilities. The pet will communicate wirelessly with a host computer which in turn will receive information from the owner’s personal “identities” in two social network services: Facebook and Twitter. Only incoming information to these profiles will be taken into account (information generated by the user’s “friends”).

This information will be manifested physically by the pet’s behavior (movement, sound, light). As information is accumulated by the pet manifestations become more intense and erratic. As soon as someone touches the pet, it “forgets” any information stored and “sleeps”. The process begins again as soon as physical contact is lost.

Awkwardness
 The pet’s shape is informed by the awkwardness inherent in the process of virtual socialization. The object could easily be a teddy bear or some other more familiar shape which would make the observer want to interact with it. Instead, I decided to create a non-familiar, even agressive, shape with sharp edges and non-symmetrical. An observer would notice an erratically-behaving object wandering about in response to virtual interactions. By touching it, the user “calms” the pet; physical interaction “defeats” virtual interaction.

Behavior states
Any information received by the pet will provoke behaviors in any of these types: physical, visual, auditive.
The stimulus is always represented in the 5×7 matrix as an icon followed by the username/alias of the person who provoked it. Below is a table of the different stimuli the pet receives along with the type of behavior it provokes:

Stimulus Icon Vibration Movement Lights Auditive
New tweet ? x
New follow ? x x x
New mention ! x x x
New direct message ? x x
Tagged in a photo [ . ] x x
Tagged in a video > x x
Being touched ?

A video of the behaviors working (indirect stimulus received via Bluetooth from a computer not in video). Initial/passive message was later changed to “please hug me”:

Part list

I used 3mm laser-cut acrylic for the box (Sketchup 3D file).

A Processing-based visual interface will be developed to manage Facebook and Twitter profile settings.

Code
The Processing code uses random stimuli to show all possible behavior states. Modifications must be made in order to accomodate a particular social network service user. The Wiring code is quite elaborate (~2k lines of code) but you are welcome to look into it.

This project was done as part of the requirements to complete the Fall 2010 Making Things Interact course with Professor Mark Gross in Carnegie Mellon University.

The Thought Factory

publicado en arte,diseño,interacción,programación,video,visualización,web por mga en March 28, 2010

I was invited by my colleagues Hernando Barragán and Annelie Franke to collaborate with the Thought Factory, a project that started in their Design Studio 6 course for the second semester 2009. The project was commisioned by the XII Iberoamerican Theatre Festival in Bogotá, one of the most important festivals of its type in the world. The idea was to create a collaborative work that would allow people to interact with the festival.

With this in mind, the Thought Factory was created and its main purpose was to save and classify the thoughts of festival visitors. Thoughts are abstract and intangible notions (we can’t read minds… yet). The Factory was made to make those thoughts somewhat tangible, “saving” them in bottles that can later be opened and their contents made visible as the genius in the lamp.

Each bottle represents an inquiry made by festival organizers. Every hour and a half a new bottle is placed in the filling station:

A bottle being filled

From that moment, and during the next ninety minutes, that bottle will be filled with thoughts from people who type them in the input stations:

Thought input machine

Thoughts can also be sent as an SMS message via mobile phone.

Since the Festival as for all ages it was necessary to curate these thoughts (basically removing obscene ones… let’s be honest, there’s plenty of obscenities in our thoughts :P).

Curating machine

Once approved, the message enters the bottle in the filling station:

When removed from the filling station, the bottle is labelled and placed with the rest of the full bottles so its thoughts can be read in the viewing station.

At the end of the Festival (in april 4, 2010) there will be sixty bottles full of thoughts that can be read in the project website.

My main tasks were developing the visual interfaces (thought input, thought curating, filling station, bottle visualization), the database that manages thoughts and inquiries and all communication happening between these and the bottles. SMS message service was kindly provided by Contacto SMS.

If you are curious about the tech side of the project: interfaces are made with Adobe Flash which communicate with a MySQL database via PHP and AMFPHP. Filling and viewing stations communicate with the bottles via Wiring using sockets and an RFID tag. ActionScript programming was made in FDT.

La Fábrica de Pensamientos

publicado en arte,diseño,interacción,programación,video,visualización,web por mga en March 28, 2010

Fui invitado por mis colegas Hernando Barragán y Annelie Franke a participar en la Fábrica de Pensamientos, un proyecto que se deprendió de su curso Estudio 6 del segundo semestre de 2009. El proyecto fue comisionado por el XII Festival Iberoamericano de Teatro de Bogotá, uno de los festivales de este tipo más importantes del mundo. La idea era hacer una obra colaborativa que permitiera a la gente interactuar con el festival.

A partir de esa premisa, se realizó la Fábrica de Pensamientos cuya idea principal es guardar y clasificar los pensamientos de los visitantes al festival. Los pensamientos son nociones abstractas e intangibles (aún no podemos leer la mente). Con la Fábrica se busca hacer esos pensamientos tangibles de alguna forma, “guardándolos” en botellas que luego pueden ser abiertas y su contenido se hace visible como el genio de la lámpara.

Cada botella representa una inquietud planteada por el festival. Cada hora y media se pone una nueva botella en la base de llenado:

Una botella en proceso de ser llenada

A partir de ese momento, y durante los siguientes noventa minutos, se llenará esa botella con los pensamientos que la gente escribe en las máquinas de entrada:

Máquina de entrada de pensamiento

Pensamientos también pueden entrar en la botella vía mensaje de texto de teléfono celular.

Dado que el Festival es un evento para toda la familia es necesario hacer una curaduría de los pensamientos (básicamente prevenir el ingreso de obscenidades… seamos honestos, hay mucho pensamiento obsceno sucediendo en nuestras cabezas :P ).

Máquina de curaduría

Una vez aprobado, el mensaje entra a la botella que se encuentra en la base de llenado:

Cuando se retira la botella de la base, se etiqueta y se guarda para luego ser consultada por los visitantes en cualquier momento en la estación de visualización.

Al finalizar el Festival en abril 4 de 2010 habrá sesenta botellas llenas de pensamientos que podrán ser visualizadas en el sitio web del proyecto.

Mi labor principal fue desarrollar la parte visual (interfaz de entrada de pensamientos, interfaz de moderación, interfaz de llenado, interfaz de visualización, sitio web), la base de datos que soporta el sistema de pensamientos e inquietudes y toda la comunicación que sucede entre estas y las botellas. El sistema de mensajes de texto fue amablemente provisto por Contacto SMS.

Si tiene curiosidad de saber qué tecnologías están involucradas: las interfases están hechas en Adobe Flash y se comunican con la base de datos MySQL usando PHP y AMFPHP. Las interfases de llenado y visualización de botellas se comunican vía sockets con Wiring usando un tag RFID.

pop goes the weasel

publicado en ciencia,general,programación,visualización por mga en October 20, 2009

Inventando el agua que moja

Para hacer funcionar el código, cree un nuevo documento de Flash ActionScript 3 y meta tres textfields con nombre de instancia status_txt, link_txt, y weasel_txt. Puede cambiar el texto objetivo (variable target) por cualquier otro que tenga letras de la A a la Z (mayúsculas), espacio, punto y signo de exclamación. Si quiere más letras tiene que modificar la funcion randomLetter().

El máximo número de generaciones que me ha generado para este texto es de 1452.

El código (AS3):

var target:String = "O TRUE APOTHECARY! THY DRUGS ARE QUICK. THUS WITH A KISS I DIE.";
var current:String = "";
var numSiblings:Number = 100;
var variation:Number = 5;
var stepsNeeded:Number = 0;
var generation:Array = [];
var timer:Timer = new Timer(10);
 
function newGeneration():Array {
	var i:Number;
	var thisGeneration:Array = [];
	for (i=0;i < numSiblings;++i) {
		thisGeneration.push(createSibling(current));
	}
	return thisGeneration;
}
 
function newParent():String {
	var i:Number, r:String = "";
	for (i=0;i < target.length;++i) {
		r += randomLetter();
	}
	return r;
}
 
function createSibling(dad:String):String {
	var i:Number;
	var sibling:String = "";
	for (i=0;i < dad.length;++i) {
		if (Math.random()*100<variation) {
			sibling += randomLetter();
		} else {
			sibling += dad.charAt(i);
		}
	}
	return sibling;
}
 
function randomLetter():String {
	var r:String;
	var n:Number = Math.floor(Math.random()*28)+62;
	if (n==62) {
		r = " ";
	} else if (n==63) {
		r = ".";
	} else if (n==64) {
		r = "!";
	} else {
		r = String.fromCharCode(n);
	}
	return r;
}
 
function qualifyGeneration():Number {
	var i:Number, j:Number;
	var qualification:Array = [];
	var tempQ:Number = 0;
	for (i=0;i < generation.length;++i) {
		tempQ = 0;
		for (j=0;j<generation[i].length;++j) {
			if (generation[i].charAt(j)==target.charAt(j)) {
				tempQ += 1;
			}
		}
		qualification.push(tempQ);
	}
	var maxQIndex = 0;
	var maxQ = 0;
	for (i=0;i < qualification.length;++i) {
		if (qualification[i]>maxQ) {
			maxQ = qualification[i];
			maxQIndex = i;
		}
	}
	return maxQIndex;
}
 
function parseGeneration(event:TimerEvent) {
	status_txt.htmlText = "GENERACIONES: " + stepsNeeded;
	generation = newGeneration();
	current = generation[qualifyGeneration()];
	weasel_txt.text = current;
	if (current == target) {
		timer.stop();
		status_txt.htmlText = "COMPLETADO LUEGO DE " + stepsNeeded + " GENERACIONES";
		link_txt.htmlText = "<a href=\"event:restart\">OTRA VEZ</a>";
	} else {
		stepsNeeded++;
	}
}
 
function doClick (e:TextEvent) {
	if (e.text=="stop") {
		link_txt.htmlText = "<a href=\"event:continue\">CONTINUAR</a>";
		timer.stop();
	} else if (e.text=="continue") {
		link_txt.htmlText = "<a href=\"event:stop\">DETENER</a>";
		timer.start();
	} else if (e.text=="restart") {
		init();
	}
}
 
function init () {
	stepsNeeded = 0;
	current = newParent();
	timer.start();
 
	var style:StyleSheet = new StyleSheet();
	var link:Object = new Object();
	link.textDecoration = "underline";
	style.setStyle("a:hover", link);
	link_txt.styleSheet = style;
	link_txt.htmlText = "<a href=\"event:stop\">DETENER</a>";
}
 
link_txt.addEventListener(TextEvent.LINK, doClick);
timer.addEventListener("timer",parseGeneration);
 
init();
« página anteriorsiguiente página »