├── gad.gif ├── rect.png ├── tri-2.png ├── README.md ├── .gitignore ├── GAD.py └── GAD_example.ipynb /gad.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rcdaudt/guided_anisotropic_diffusion/HEAD/gad.gif -------------------------------------------------------------------------------- /rect.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rcdaudt/guided_anisotropic_diffusion/HEAD/rect.png -------------------------------------------------------------------------------- /tri-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rcdaudt/guided_anisotropic_diffusion/HEAD/tri-2.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # guided_anisotropic_diffusion 2 | 3 | Code for the guided anisotropic diffusion (GAD) algorithm. 4 | 5 | ![GAD example](gad.gif) 6 | 7 | [Rodrigo Caye Daudt, Bertrand Le Saux, Alexandre Boulch, Yann Gousseau. "Guided Anisotropic Diffusion and Iterative learning for Weakly Supervised Change Detection." In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR) Workshops, pp. 0-0. 2019.](http://openaccess.thecvf.com/content_CVPRW_2019/papers/EarthVision/Daudt_Guided_Anisotropic_Diffusion_and_Iterative_Learning_for_Weakly_Supervised_Change_CVPRW_2019_paper.pdf) 8 | 9 | TensorFlow implementation by [Nicolas Audebert](https://nicolas.audebert.at/) can be found [here: https://github.com/Quicksign/tfGAD](https://github.com/Quicksign/tfGAD) 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | db.sqlite3 58 | 59 | # Flask stuff: 60 | instance/ 61 | .webassets-cache 62 | 63 | # Scrapy stuff: 64 | .scrapy 65 | 66 | # Sphinx documentation 67 | docs/_build/ 68 | 69 | # PyBuilder 70 | target/ 71 | 72 | # Jupyter Notebook 73 | .ipynb_checkpoints 74 | 75 | # pyenv 76 | .python-version 77 | 78 | # celery beat schedule file 79 | celerybeat-schedule 80 | 81 | # SageMath parsed files 82 | *.sage.py 83 | 84 | # Environments 85 | .env 86 | .venv 87 | env/ 88 | venv/ 89 | ENV/ 90 | env.bak/ 91 | venv.bak/ 92 | 93 | # Spyder project settings 94 | .spyderproject 95 | .spyproject 96 | 97 | # Rope project settings 98 | .ropeproject 99 | 100 | # mkdocs documentation 101 | /site 102 | 103 | # mypy 104 | .mypy_cache/ 105 | -------------------------------------------------------------------------------- /GAD.py: -------------------------------------------------------------------------------- 1 | # Guided Anisotropic Diffusion algorithm 2 | # Rodrigo Caye Daudt 3 | # https://rcdaudt.github.io 4 | # 5 | # Caye Daudt, Rodrigo, Bertrand Le Saux, Alexandre Boulch, and Yann Gousseau. "Guided anisotropic diffusion and iterative learning for weakly supervised change detection." In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition Workshops, pp. 0-0. 2019. 6 | 7 | import torch 8 | 9 | @torch.jit.script 10 | def g(x, K:float = 5.): 11 | return 1.0 / (1.0 + (torch.abs((x*x))/(K*K))) 12 | 13 | @torch.jit.script 14 | def c(I, K:float = 5.): 15 | cv = g(torch.mean(torch.abs(I[:,:,1:,:] - I[:,:,:-1,:]), 1, keepdim=True), K) 16 | ch = g(torch.mean(torch.abs(I[:,:,:,1:] - I[:,:,:,:-1]), 1, keepdim=True), K) 17 | 18 | return cv, ch 19 | 20 | 21 | @torch.jit.script 22 | def diffuse_step(cv, ch, I, l:float =0.24): 23 | dv = I[:,:,1:,:] - I[:,:,:-1,:] 24 | dh = I[:,:,:,1:] - I[:,:,:,:-1] 25 | 26 | tv = l * cv * dv # vertical transmissions 27 | I[:,:,1:,:] -= tv 28 | I[:,:,:-1,:] += tv 29 | 30 | th = l * ch * dh # horizontal transmissions 31 | I[:,:,:,1:] -= th 32 | I[:,:,:,:-1] += th 33 | 34 | return I 35 | 36 | 37 | def anisotropic_diffusion(I1, I2, I, N=500, l=0.24, K=5, is_log=True, verbose=False): 38 | if is_log: 39 | I = torch.exp(I) 40 | 41 | with torch.no_grad(): 42 | for t in range(N): 43 | if verbose: 44 | print('Iteration {}'.format(t)) 45 | 46 | cv1, ch1 = c(I1, K=K) 47 | I1 = diffuse_step(cv1, ch1, I1, l=l) 48 | 49 | cv2, ch2 = c(I2, K=K) 50 | I2 = diffuse_step(cv2, ch2, I2, l=l) 51 | 52 | cv = torch.min(cv1, cv2) 53 | ch = torch.min(ch1, ch2) 54 | del(cv1, ch1, cv2, ch2) 55 | I = diffuse_step(cv, ch, I, l=l) 56 | 57 | del(cv,ch) 58 | 59 | return I -------------------------------------------------------------------------------- /GAD_example.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "from GAD import *\n", 10 | "import torch\n", 11 | "import skimage.io as io\n", 12 | "import numpy as np" 13 | ] 14 | }, 15 | { 16 | "cell_type": "code", 17 | "execution_count": 2, 18 | "metadata": {}, 19 | "outputs": [], 20 | "source": [ 21 | "def to_torch(I):\n", 22 | " return torch.from_numpy(I.transpose((2,0,1))[np.newaxis,:,:,:])\n", 23 | "\n", 24 | "def to_numpy(I):\n", 25 | " return np.squeeze(I.numpy(),0).transpose((1,2,0))" 26 | ] 27 | }, 28 | { 29 | "cell_type": "code", 30 | "execution_count": 3, 31 | "metadata": {}, 32 | "outputs": [ 33 | { 34 | "data": { 35 | "image/png": "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\n", 36 | "text/plain": [ 37 | "
" 38 | ] 39 | }, 40 | "metadata": { 41 | "needs_background": "light" 42 | }, 43 | "output_type": "display_data" 44 | } 45 | ], 46 | "source": [ 47 | "input_image = 1.0 * io.imread('tri-2.png')\n", 48 | "io.imshow(input_image / 255)\n", 49 | "input_image_torch = to_torch(input_image)" 50 | ] 51 | }, 52 | { 53 | "cell_type": "code", 54 | "execution_count": 4, 55 | "metadata": {}, 56 | "outputs": [ 57 | { 58 | "data": { 59 | "image/png": "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\n", 60 | "text/plain": [ 61 | "
" 62 | ] 63 | }, 64 | "metadata": { 65 | "needs_background": "light" 66 | }, 67 | "output_type": "display_data" 68 | } 69 | ], 70 | "source": [ 71 | "guide_image = 1.0 * io.imread('rect.png')\n", 72 | "io.imshow(guide_image / 255)\n", 73 | "guide_image_torch = to_torch(guide_image)" 74 | ] 75 | }, 76 | { 77 | "cell_type": "code", 78 | "execution_count": 5, 79 | "metadata": {}, 80 | "outputs": [ 81 | { 82 | "data": { 83 | "text/plain": [ 84 | "" 85 | ] 86 | }, 87 | "execution_count": 5, 88 | "metadata": {}, 89 | "output_type": "execute_result" 90 | }, 91 | { 92 | "data": { 93 | "image/png": "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\n", 94 | "text/plain": [ 95 | "
" 96 | ] 97 | }, 98 | "metadata": { 99 | "needs_background": "light" 100 | }, 101 | "output_type": "display_data" 102 | } 103 | ], 104 | "source": [ 105 | "output_torch = anisotropic_diffusion(guide_image_torch.cuda(), guide_image_torch.cuda(), input_image_torch.cuda(), is_log=False, N=1000)\n", 106 | "output = to_numpy(output_torch.cpu())\n", 107 | "io.imshow(output / 255)" 108 | ] 109 | } 110 | ], 111 | "metadata": { 112 | "kernelspec": { 113 | "display_name": "Python 3", 114 | "language": "python", 115 | "name": "python3" 116 | }, 117 | "language_info": { 118 | "codemirror_mode": { 119 | "name": "ipython", 120 | "version": 3 121 | }, 122 | "file_extension": ".py", 123 | "mimetype": "text/x-python", 124 | "name": "python", 125 | "nbconvert_exporter": "python", 126 | "pygments_lexer": "ipython3", 127 | "version": "3.6.6" 128 | } 129 | }, 130 | "nbformat": 4, 131 | "nbformat_minor": 2 132 | } 133 | --------------------------------------------------------------------------------