sábado, 25 de agosto de 2012

Un céntimo por tus pensamientos

El otro día leí una noticia que me llamó la atención: una técnica para ver lo que una persona está viendo reconstruyéndolo a partir de una resonancia magnética del cerebro. Concretamente el precórtex visual. En el siguiente vídeo lo explican:



Para los que no pilléis bien el inglés hablado, podéis saltar a 1:47, donde se muestran las imagenes. A la izquierda está el vídeo que el sujeto está viendo y a la derecha la reconstrucción.

La técnica usada parece sorprendentemente simple: muestran vídeos al sujeto durante unas horas mientras graban la actividad en el precórtex visual. Después realizan un análisis de correlación entre ambos. Finalmente muestran al sujeto otro vídeo (supuestamente diferente a los usados para obtener la correlación) y son capaces de reconstruir imágenes similares a las que el sujeto está viendo. El investigador explica en el vídeo que el sistema funciona mejor cuando lo que el sujeto está viendo son cosas simples, como caras y objetos fijos.

Esta investigación ha sido publicada en Nature, con lo cual no es probable que se trate de un hoax. Sin embargo, cuando uno se pone a mirar las reconstrucciones, asaltan las dudas.

La primera curiosidad es que aparecen textos en las imágenes:



Supongo que esto es debido a que los vídeos iniciales que se le mostraron durante el proceso de entrenamiento del sistema incluían texto; pero me da la impresión de que hay demasiadas. No sé que relevancia tiene esto, pero me llama la atención.

La segunda cosa que me llama la atención es que muchas imágenes parecen estar compuestas por las superposición de unas pocas imágenes:



No sé vosotros, pero yo ahí veo un plato en un lavavajillas, superpuesto a un par de imágenes más. Imagino que parte de lo que hacen es buscar las imágenes del proceso de entrenamiento que mejor correlacionan con las medidas obtenidas en la resonancia y combinarlas entre sí, quizás con un peso dado por lo bien que se correlacionan. No está mal, pero posiblemente esto haga que los resultados parezcan más espectaculares de lo que son. El caso anterior se beneficia de que es más común encuadrar objetos centrados en la imagen. Pero éste no es el caso más claro, los hay peores:


En este caso, está claro que la reconstrucción está basada en un 83% (siempre uso 83% cuando me invento porcentajes, lo cual ocurre menos de un 83% de las veces) en imágenes de un tío con camiseta negra. El hecho de que esté borroso es debido a que es la suma de varias imágenes en diferentes posiciones, y no a que la reconstrucción es imperfecta (bueno, aunque también puede verse así).

Es decir, las imágenes son tan buenas porque para la reconstrucción usan imágenes previas que ya tienen gran parte de los detalles necesarios.

En resumen, el sistema es interesante; pero probablemente es por el momento menos espectacular de lo que puede parecer por el vídeo. De todas formas, démosle unos años para mejorar, supongamos que podemos construir escáneres de resonancia magnética portátiles y se me ocurren un par de aplicaciones interesantes para este sistema (de las cuales sólo dos están relacionadas con el porno).

Para los que tengáis tiempo y ganas, podéis intentar experimentar con ello. Dicen que sólo dan los datos a los que investigan en neurociencia, pero desde una universidad casi seguro que es posible obtener los datos.

viernes, 10 de agosto de 2012

Python embebido

Iba a empezar esta entrada diciendo que "embebido" no significa lo que creemos que significa; pero me equivocaba. Significa lo que creemos que significa (es decir, no me equivocaba ¿o sí?)

Al parecer embebido no sólo significa estar absorbido (o absorto), sino que también tiene el significado de estar incrustado en algo. Es curioso porque "embedded" y "embebido" parecen tener orígenes bastante distintos, pero acaban significando cosas parecidas.

En fin, que voy a hablar de embeber Python en un programa, concretamente, un modelo numérico.

A diferencia de otro tipo de programas, los modelos numéricos suelen tener el problema de que en depuración es difícil obtener los valores que necesitamos. Si estamos resolviendo en una malla triangular, por ejemplo, necesitariamos hacer algún tipo de interpolación antes de poder ver los datos, y eso no es algo que el debugger pueda hacer.

La solución típica suele ser ir grabando resultados cada paso temporal y verlos desde otro programa. Los inconvenientes de esto son varios:

1. Generalmente sólo se graban ciertas variables importantes, así que no podemos acceder a ciertos valores.
2. Los archivos generados suelen ser muy grandes, pero poca de la informacion que se guarda se usa realmente.
3. A veces conviene ver los valores en momentos distintos al punto en el que se graba.

Hace tiempo tuve la idea de incluir un lenguaje interpretado junto con el programa, de forma que pudiésemos acceder a las variables en ciertos puntos de la ejecución. Bueno, la idea no es realmente mía, pero nunca la he visto implementada realmente.

Empecé a intentarlo con Python, que es un lenguaje bastante adecuado para ello (parece que cada vez se postula más como la alternativa de Matlab); pero la falta de documentación y ejemplos hizo que lo dejara... hasta ayer.

Ayer me puse con ganas renovadas y ya lo tengo funcionando. En pocas palabras, tengo un código que se compila con mi programa y que se enlaza con Python. En cada paso temporal tengo una llamada a una función que detecta si se ha pulsado una tecla y en caso afirmativo pone la simulación en pausa y permite escribir comandos Python. También es posible hacer que esto ocurra en un punto concreto del programa.

La siguiente figura muestra la línea de comandos, en la que se ve cómo accedo a ciertas variables (la presión y la componente X de la velocidad).




Y también como ejecuto un código externo (unas 6 líneas) que realizan el mallado e interpolación de la presión y la muestran en forma gráfica.

Es una gráfica aburrida, pero es la que tenía.


También es posible modificar las variables sobre la marcha, así que es posible hacer cambios en el programa sin recompilarlo. Hay muchas más posibilidades, aún estoy empezando a explorar el invento.

Supongo que es algo muy específico que no motivará a todo el mundo, pero a mí estas cosas me ponen.

A los interesados, puedo pasaros el código.