From 3f46a247b174918e24e2e448b21de21bb0037b2c Mon Sep 17 00:00:00 2001 From: Rémi Flamary Date: Wed, 2 Nov 2016 12:04:15 +0100 Subject: add image color adaptation demo --- data/autumn.jpg | Bin 0 -> 621005 bytes data/fallingwater.jpg | Bin 0 -> 382775 bytes data/ocean_day.jpg | Bin 0 -> 76640 bytes data/ocean_sunset.jpg | Bin 0 -> 131739 bytes data/woods.jpg | Bin 0 -> 387260 bytes examples/demo_OTDA_color_images.py | 119 +++++++++++++++++++++++++++++++++++++ 6 files changed, 119 insertions(+) create mode 100644 data/autumn.jpg create mode 100644 data/fallingwater.jpg create mode 100644 data/ocean_day.jpg create mode 100644 data/ocean_sunset.jpg create mode 100644 data/woods.jpg create mode 100644 examples/demo_OTDA_color_images.py diff --git a/data/autumn.jpg b/data/autumn.jpg new file mode 100644 index 0000000..fddce1e Binary files /dev/null and b/data/autumn.jpg differ diff --git a/data/fallingwater.jpg b/data/fallingwater.jpg new file mode 100644 index 0000000..c5a533a Binary files /dev/null and b/data/fallingwater.jpg differ diff --git a/data/ocean_day.jpg b/data/ocean_day.jpg new file mode 100644 index 0000000..bbe5c62 Binary files /dev/null and b/data/ocean_day.jpg differ diff --git a/data/ocean_sunset.jpg b/data/ocean_sunset.jpg new file mode 100644 index 0000000..01c9e5d Binary files /dev/null and b/data/ocean_sunset.jpg differ diff --git a/data/woods.jpg b/data/woods.jpg new file mode 100644 index 0000000..a9a9532 Binary files /dev/null and b/data/woods.jpg differ diff --git a/examples/demo_OTDA_color_images.py b/examples/demo_OTDA_color_images.py new file mode 100644 index 0000000..7a08ea0 --- /dev/null +++ b/examples/demo_OTDA_color_images.py @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- +""" +demo of Optimal transport for domain adaptation with image color adaptation as in [6] + +[6] Ferradans, S., Papadakis, N., Peyré, G., & Aujol, J. F. (2014). Regularized discrete optimal transport. SIAM Journal on Imaging Sciences, 7(3), 1853-1882. +""" + +import numpy as np +import scipy.ndimage as spi +import matplotlib.pylab as pl +import ot + + +#%% Loading images + +I1=spi.imread('../data/ocean_day.jpg').astype(np.float64)/256 +I2=spi.imread('../data/ocean_sunset.jpg').astype(np.float64)/256 + +#%% Plot images + +pl.figure(1) + +pl.subplot(1,2,1) +pl.imshow(I1) +pl.title('Image 1') + +pl.subplot(1,2,2) +pl.imshow(I2) +pl.title('Image 2') + +pl.show() + +#%% Image conversion and dataset generation + +def im2mat(I): + """Converts and image to matrix (one pixel per line)""" + return I.reshape((I.shape[0]*I.shape[1],I.shape[2])) + +def mat2im(X,shape): + """Converts back a matrix to an image""" + return X.reshape(shape) + +X1=im2mat(I1) +X2=im2mat(I2) + +# training samples +nb=1000 +idx1=np.random.randint(X1.shape[0],size=(nb,)) +idx2=np.random.randint(X2.shape[0],size=(nb,)) + +xs=X1[idx1,:] +xt=X2[idx2,:] + +#%% domain adaptation between images + +# LP problem +da_emd=ot.da.OTDA() # init class +da_emd.fit(xs,xt) # fit distributions + + +# sinkhorn regularization +lambd=1e-1 +da_entrop=ot.da.OTDA_sinkhorn() +da_entrop.fit(xs,xt,reg=lambd) + + + +#%% prediction between images (using out of sample prediction as in [6]) + +X1t=da_emd.predict(X1) +X2t=da_emd.predict(X2,-1) + + +X1te=da_entrop.predict(X1) +X2te=da_entrop.predict(X2,-1) + + +def minmax(I): + return np.minimum(np.maximum(I,0),1) + +I1t=minmax(mat2im(X1t,I1.shape)) +I2t=minmax(mat2im(X2t,I2.shape)) + +I1te=minmax(mat2im(X1te,I1.shape)) +I2te=minmax(mat2im(X2te,I2.shape)) + +#%% plot all images + +pl.figure(2,(10,8)) + +pl.subplot(2,3,1) + +pl.imshow(I1) +pl.title('Image 1') + +pl.subplot(2,3,2) +pl.imshow(I1t) +pl.title('Image 1 Adapt') + + +pl.subplot(2,3,3) +pl.imshow(I1te) +pl.title('Image 1 Adapt (reg)') + +pl.subplot(2,3,4) + +pl.imshow(I2) +pl.title('Image 2') + +pl.subplot(2,3,5) +pl.imshow(I2t) +pl.title('Image 2 Adapt') + + +pl.subplot(2,3,6) +pl.imshow(I2te) +pl.title('Image 2 Adapt (reg)') + +pl.show() \ No newline at end of file -- cgit v1.2.3