summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRémi Flamary <remi.flamary@gmail.com>2016-11-02 12:04:15 +0100
committerRémi Flamary <remi.flamary@gmail.com>2016-11-02 12:04:15 +0100
commit3f46a247b174918e24e2e448b21de21bb0037b2c (patch)
tree16de129e7771db30503411d24c13ac3beb56bff9
parentcc3da98e58d53e57b0f6c0240b8912970fe365c9 (diff)
add image color adaptation demo
-rw-r--r--data/autumn.jpgbin0 -> 621005 bytes
-rw-r--r--data/fallingwater.jpgbin0 -> 382775 bytes
-rw-r--r--data/ocean_day.jpgbin0 -> 76640 bytes
-rw-r--r--data/ocean_sunset.jpgbin0 -> 131739 bytes
-rw-r--r--data/woods.jpgbin0 -> 387260 bytes
-rw-r--r--examples/demo_OTDA_color_images.py119
6 files changed, 119 insertions, 0 deletions
diff --git a/data/autumn.jpg b/data/autumn.jpg
new file mode 100644
index 0000000..fddce1e
--- /dev/null
+++ b/data/autumn.jpg
Binary files differ
diff --git a/data/fallingwater.jpg b/data/fallingwater.jpg
new file mode 100644
index 0000000..c5a533a
--- /dev/null
+++ b/data/fallingwater.jpg
Binary files differ
diff --git a/data/ocean_day.jpg b/data/ocean_day.jpg
new file mode 100644
index 0000000..bbe5c62
--- /dev/null
+++ b/data/ocean_day.jpg
Binary files differ
diff --git a/data/ocean_sunset.jpg b/data/ocean_sunset.jpg
new file mode 100644
index 0000000..01c9e5d
--- /dev/null
+++ b/data/ocean_sunset.jpg
Binary files differ
diff --git a/data/woods.jpg b/data/woods.jpg
new file mode 100644
index 0000000..a9a9532
--- /dev/null
+++ b/data/woods.jpg
Binary files 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