summaryrefslogtreecommitdiff
path: root/docs/source/auto_examples/plot_OTDA_mapping_color_images.rst
diff options
context:
space:
mode:
Diffstat (limited to 'docs/source/auto_examples/plot_OTDA_mapping_color_images.rst')
-rw-r--r--docs/source/auto_examples/plot_OTDA_mapping_color_images.rst246
1 files changed, 246 insertions, 0 deletions
diff --git a/docs/source/auto_examples/plot_OTDA_mapping_color_images.rst b/docs/source/auto_examples/plot_OTDA_mapping_color_images.rst
new file mode 100644
index 0000000..60be3a4
--- /dev/null
+++ b/docs/source/auto_examples/plot_OTDA_mapping_color_images.rst
@@ -0,0 +1,246 @@
+
+
+.. _sphx_glr_auto_examples_plot_OTDA_mapping_color_images.py:
+
+
+====================================================================================
+OT for domain adaptation with image color adaptation [6] with mapping estimation [8]
+====================================================================================
+
+[6] Ferradans, S., Papadakis, N., Peyre, G., & Aujol, J. F. (2014). Regularized
+ discrete optimal transport. SIAM Journal on Imaging Sciences, 7(3), 1853-1882.
+[8] M. Perrot, N. Courty, R. Flamary, A. Habrard, "Mapping estimation for
+ discrete optimal transport", Neural Information Processing Systems (NIPS), 2016.
+
+
+
+
+
+.. rst-class:: sphx-glr-horizontal
+
+
+ *
+
+ .. image:: /auto_examples/images/sphx_glr_plot_OTDA_mapping_color_images_001.png
+ :scale: 47
+
+ *
+
+ .. image:: /auto_examples/images/sphx_glr_plot_OTDA_mapping_color_images_002.png
+ :scale: 47
+
+
+.. rst-class:: sphx-glr-script-out
+
+ Out::
+
+ It. |Loss |Delta loss
+ --------------------------------
+ 0|3.624802e+02|0.000000e+00
+ 1|3.547180e+02|-2.141395e-02
+ 2|3.545494e+02|-4.753955e-04
+ 3|3.544646e+02|-2.391784e-04
+ 4|3.544126e+02|-1.466280e-04
+ 5|3.543775e+02|-9.921805e-05
+ 6|3.543518e+02|-7.245828e-05
+ 7|3.543323e+02|-5.491924e-05
+ 8|3.543170e+02|-4.342401e-05
+ 9|3.543046e+02|-3.472174e-05
+ 10|3.542945e+02|-2.878681e-05
+ 11|3.542859e+02|-2.417065e-05
+ 12|3.542786e+02|-2.058131e-05
+ 13|3.542723e+02|-1.768262e-05
+ 14|3.542668e+02|-1.551616e-05
+ 15|3.542620e+02|-1.371909e-05
+ 16|3.542577e+02|-1.213326e-05
+ 17|3.542538e+02|-1.085481e-05
+ 18|3.542531e+02|-1.996006e-06
+ It. |Loss |Delta loss
+ --------------------------------
+ 0|3.555768e+02|0.000000e+00
+ 1|3.510071e+02|-1.285164e-02
+ 2|3.509110e+02|-2.736701e-04
+ 3|3.508748e+02|-1.031476e-04
+ 4|3.508506e+02|-6.910585e-05
+ 5|3.508330e+02|-5.014608e-05
+ 6|3.508195e+02|-3.839166e-05
+ 7|3.508090e+02|-3.004218e-05
+ 8|3.508005e+02|-2.417627e-05
+ 9|3.507935e+02|-2.004621e-05
+ 10|3.507876e+02|-1.681731e-05
+
+
+
+
+|
+
+
+.. code-block:: python
+
+
+ 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,:]
+
+ #%% Plot image distributions
+
+
+ pl.figure(2,(10,5))
+
+ pl.subplot(1,2,1)
+ pl.scatter(xs[:,0],xs[:,2],c=xs)
+ pl.axis([0,1,0,1])
+ pl.xlabel('Red')
+ pl.ylabel('Blue')
+ pl.title('Image 1')
+
+ pl.subplot(1,2,2)
+ #pl.imshow(I2)
+ pl.scatter(xt[:,0],xt[:,2],c=xt)
+ pl.axis([0,1,0,1])
+ pl.xlabel('Red')
+ pl.ylabel('Blue')
+ pl.title('Image 2')
+
+ pl.show()
+
+
+
+ #%% domain adaptation between images
+ def minmax(I):
+ return np.minimum(np.maximum(I,0),1)
+ # LP problem
+ da_emd=ot.da.OTDA() # init class
+ da_emd.fit(xs,xt) # fit distributions
+
+ X1t=da_emd.predict(X1) # out of sample
+ I1t=minmax(mat2im(X1t,I1.shape))
+
+ # sinkhorn regularization
+ lambd=1e-1
+ da_entrop=ot.da.OTDA_sinkhorn()
+ da_entrop.fit(xs,xt,reg=lambd)
+
+ X1te=da_entrop.predict(X1)
+ I1te=minmax(mat2im(X1te,I1.shape))
+
+ # linear mapping estimation
+ eta=1e-8 # quadratic regularization for regression
+ mu=1e0 # weight of the OT linear term
+ bias=True # estimate a bias
+
+ ot_mapping=ot.da.OTDA_mapping_linear()
+ ot_mapping.fit(xs,xt,mu=mu,eta=eta,bias=bias,numItermax = 20,verbose=True)
+
+ X1tl=ot_mapping.predict(X1) # use the estimated mapping
+ I1tl=minmax(mat2im(X1tl,I1.shape))
+
+ # nonlinear mapping estimation
+ eta=1e-2 # quadratic regularization for regression
+ mu=1e0 # weight of the OT linear term
+ bias=False # estimate a bias
+ sigma=1 # sigma bandwidth fot gaussian kernel
+
+
+ ot_mapping_kernel=ot.da.OTDA_mapping_kernel()
+ ot_mapping_kernel.fit(xs,xt,mu=mu,eta=eta,sigma=sigma,bias=bias,numItermax = 10,verbose=True)
+
+ X1tn=ot_mapping_kernel.predict(X1) # use the estimated mapping
+ I1tn=minmax(mat2im(X1tn,I1.shape))
+ #%% plot images
+
+
+ pl.figure(2,(10,8))
+
+ pl.subplot(2,3,1)
+
+ pl.imshow(I1)
+ pl.title('Im. 1')
+
+ pl.subplot(2,3,2)
+
+ pl.imshow(I2)
+ pl.title('Im. 2')
+
+
+ pl.subplot(2,3,3)
+ pl.imshow(I1t)
+ pl.title('Im. 1 Interp LP')
+
+ pl.subplot(2,3,4)
+ pl.imshow(I1te)
+ pl.title('Im. 1 Interp Entrop')
+
+
+ pl.subplot(2,3,5)
+ pl.imshow(I1tl)
+ pl.title('Im. 1 Linear mapping')
+
+ pl.subplot(2,3,6)
+ pl.imshow(I1tn)
+ pl.title('Im. 1 nonlinear mapping')
+
+ pl.show()
+
+**Total running time of the script:** ( 1 minutes 59.537 seconds)
+
+
+
+.. container:: sphx-glr-footer
+
+
+ .. container:: sphx-glr-download
+
+ :download:`Download Python source code: plot_OTDA_mapping_color_images.py <plot_OTDA_mapping_color_images.py>`
+
+
+
+ .. container:: sphx-glr-download
+
+ :download:`Download Jupyter notebook: plot_OTDA_mapping_color_images.ipynb <plot_OTDA_mapping_color_images.ipynb>`
+
+.. rst-class:: sphx-glr-signature
+
+ `Generated by Sphinx-Gallery <http://sphinx-gallery.readthedocs.io>`_