Scientific Programming in Python

Topic 8: Basics of Data Parallelism

Notebook created by Martín Villanueva - martin.villanueva@usm.cl - DI UTFSM - June 2017.


In [3]:
import numba
import numpy as np
import matplotlib.pyplot as plt
import threading
import multiprocessing
from ipyparallel import Client

def image_plot(img):
    """
    img is an (nx,ny,3) numpy.array
    """
    plt.figure(figsize=(12,12))
    plt.imshow(img)
    plt.axis('off')
    plt.show()

En esta actividad realizaremos convolución de imágenes (tarea altamente paralelizable), sobre imágenes de gran tamaño y de forma paralela, utilizando bibliotecas de paralelización en Python.

En primer lugar cargamos y visualizamos la imágen a trabajar:


In [4]:
img = plt.imread('heic1608b.jpg', format='jpeg')[0:8660,:,:]
print(img.shape)


(8660, 10260, 3)

In [5]:
image_plot(img)


Lo que se desea es aplicar un filtro de blurring (Gaussiano) sobre tal imágen. En este caso ocuparemos en filtro/kernel Gaussiano de 5x5 generado por la siguiente función:


In [26]:
def gaussian_kernel(shape=(3,3),sigma=0.5):
    """
    2D gaussian mask - should give the same result as MATLAB's
    fspecial('gaussian',[shape],[sigma])
    """
    m,n = [(ss-1.)/2. for ss in shape]
    y,x = np.ogrid[-m:m+1,-n:n+1]
    h = np.exp( -(x*x + y*y) / (2.*sigma*sigma) )
    h[ h < np.finfo(h.dtype).eps*h.max() ] = 0
    sumh = h.sum()
    if sumh != 0:
        h /= sumh
    return h

In [27]:
K = gaussian_kernel((5,5))
print(K)


[[  6.96247819e-08   2.80886418e-05   2.07548550e-04   2.80886418e-05
    6.96247819e-08]
 [  2.80886418e-05   1.13317669e-02   8.37310610e-02   1.13317669e-02
    2.80886418e-05]
 [  2.07548550e-04   8.37310610e-02   6.18693507e-01   8.37310610e-02
    2.07548550e-04]
 [  2.80886418e-05   1.13317669e-02   8.37310610e-02   1.13317669e-02
    2.80886418e-05]
 [  6.96247819e-08   2.80886418e-05   2.07548550e-04   2.80886418e-05
    6.96247819e-08]]

Para ello se le solicita lo siguiente:

  1. Usando IPython.Parallel desarrolle una solución para aplicar el filtro de convolución K sobre la imágen dada. Usted es libre de elegir el modo (synchronous o asynchronous) y el modo de despacho de tareas. Notar: Que la imágen tiene 3 canales (RGB) y debe aplicar el filtro independientemente en cada uno.
  2. Ejecute su solución sobre la imágen y muestre el resultado.
  3. Ejecute su solución anterior sobre un pool de 1, 2, 4 y 8 engines realizando un análisis de tiempo con %timeit. Extraiga conclusiones de los resultados obtenidos (considere las características del CPU de su computador).

In [ ]: