Fast and differentiable MS-SSIM and SSIM for paddle.
Project description
Paddle MS-SSIM
Introduction
-
Fast and differentiable MS-SSIM and SSIM for Paddle.
-
Structural Similarity (SSIM):
-
Multi-Scale Structural Similarity (MS-SSIM):
Installation
-
via pip
$ pip install paddle-msssim
-
via sources
$ git clone https://github.com/AgentMaker/Paddle-MSSSIM $ cd Paddle-MSSSIM $ python setup.py install
Requirement
- paddlepaddle / paddlepaddle-gpu >= 2.0.0
Usage
-
Basic Usage
from paddle_msssim import ssim, ms_ssim, SSIM, MS_SSIM # X: (N,3,H,W) a batch of non-negative RGB images (0~255) # Y: (N,3,H,W) # calculate ssim & ms-ssim for each image ssim_val = ssim( X, Y, data_range=255, size_average=False) # return (N,) ms_ssim_val = ms_ssim( X, Y, data_range=255, size_average=False ) #(N,) # set 'size_average=True' to get a scalar value as loss. see tests/tests_loss.py for more details ssim_loss = 1 - ssim( X, Y, data_range=255, size_average=True) # return a scalar ms_ssim_loss = 1 - ms_ssim( X, Y, data_range=255, size_average=True ) # reuse the gaussian kernel with SSIM & MS_SSIM. ssim_module = SSIM(data_range=255, size_average=True, channel=3) # channel=1 for grayscale images ms_ssim_module = MS_SSIM(data_range=255, size_average=True, channel=3) ssim_loss = 1 - ssim_module(X, Y) ms_ssim_loss = 1 - ms_ssim_module(X, Y)
-
Normalized input
''' If you need to calculate MS-SSIM/SSIM on normalized images Please denormalize them to the range of [0, 1] or [0, 255] first ''' # X: (N,3,H,W) a batch of normalized images (-1 ~ 1) # Y: (N,3,H,W) X = (X + 1) / 2 # [-1, 1] => [0, 1] Y = (Y + 1) / 2 ms_ssim_val = ms_ssim( X, Y, data_range=1, size_average=False ) #(N,)
-
Enable nonnegative_ssim
-
For ssim, it is recommended to set
nonnegative_ssim=True
to avoid negative results. However, this option is set toFalse
by default to keep it consistent with tensorflow and skimage. -
For ms-ssim, there is no nonnegative_ssim option and the ssim reponses is forced to be non-negative to avoid NaN results.
-
Test
-
Switch to the tests dir
$ cd ./tests
-
Benchmark
$ python comparisons_skimage_tf_torch.py
outputs(AMD Ryzen 4600H): =================================== Test SSIM =================================== ====> Single Image Repeat 10 times sigma=0.0 ssim_skimage=1.000000 (247.7732 ms), ssim_tf=1.000000 (277.2696 ms), ssim_paddle=1.000000 (179.4677 ms), ssim_torch=1.000000 (183.6994 ms) sigma=10.0 ssim_skimage=0.932399 (226.1620 ms), ssim_tf=0.932640 (257.2435 ms), ssim_paddle=0.932636 (163.2263 ms), ssim_torch=0.932400 (179.1418 ms) sigma=20.0 ssim_skimage=0.786023 (224.1826 ms), ssim_tf=0.786032 (279.2126 ms), ssim_paddle=0.786017 (158.3070 ms), ssim_torch=0.786027 (180.0890 ms) sigma=30.0 ssim_skimage=0.637174 (237.5582 ms), ssim_tf=0.637183 (267.6092 ms), ssim_paddle=0.637165 (167.9277 ms), ssim_torch=0.637178 (181.7910 ms) sigma=40.0 ssim_skimage=0.515865 (221.0388 ms), ssim_tf=0.515876 (264.3230 ms), ssim_paddle=0.515857 (170.7676 ms), ssim_torch=0.515869 (189.0941 ms) sigma=50.0 ssim_skimage=0.422551 (222.6846 ms), ssim_tf=0.422558 (273.1971 ms), ssim_paddle=0.422542 (168.3579 ms), ssim_torch=0.422554 (176.7442 ms) sigma=60.0 ssim_skimage=0.351337 (215.1536 ms), ssim_tf=0.351340 (270.5560 ms), ssim_paddle=0.351325 (164.3315 ms), ssim_torch=0.351340 (194.6781 ms) sigma=70.0 ssim_skimage=0.295752 (210.0273 ms), ssim_tf=0.295756 (272.1814 ms), ssim_paddle=0.295744 (169.3864 ms), ssim_torch=0.295755 (178.9230 ms) sigma=80.0 ssim_skimage=0.253164 (239.2978 ms), ssim_tf=0.253169 (260.8894 ms), ssim_paddle=0.253157 (184.7061 ms), ssim_torch=0.253166 (181.4640 ms) sigma=90.0 ssim_skimage=0.219240 (224.7329 ms), ssim_tf=0.219245 (270.3727 ms), ssim_paddle=0.219235 (172.3580 ms), ssim_torch=0.219242 (180.5838 ms) sigma=100.0 ssim_skimage=0.192630 (238.8582 ms), ssim_tf=0.192634 (261.4317 ms), ssim_paddle=0.192624 (166.0294 ms), ssim_torch=0.192632 (175.7241 ms) Pass! ====> Batch Pass! =================================== Test MS-SSIM =================================== ====> Single Image Repeat 10 times sigma=0.0 msssim_tf=1.000000 (534.9398 ms), msssim_paddle=1.000000 (231.7381 ms), msssim_torch=1.000000 (257.3238 ms) sigma=10.0 msssim_tf=0.991148 (525.1758 ms), msssim_paddle=0.991147 (213.8527 ms), msssim_torch=0.991101 (243.9299 ms) sigma=20.0 msssim_tf=0.967450 (523.3070 ms), msssim_paddle=0.967447 (217.2415 ms), msssim_torch=0.967441 (253.1073 ms) sigma=30.0 msssim_tf=0.934692 (538.5145 ms), msssim_paddle=0.934687 (215.2203 ms), msssim_torch=0.934692 (242.5429 ms) sigma=40.0 msssim_tf=0.897363 (558.0346 ms), msssim_paddle=0.897357 (219.1107 ms), msssim_torch=0.897362 (249.1027 ms) sigma=50.0 msssim_tf=0.859276 (524.8582 ms), msssim_paddle=0.859267 (232.4189 ms), msssim_torch=0.859275 (263.1328 ms) sigma=60.0 msssim_tf=0.820967 (512.8726 ms), msssim_paddle=0.820958 (223.7422 ms), msssim_torch=0.820965 (251.9713 ms) sigma=70.0 msssim_tf=0.784204 (529.6149 ms), msssim_paddle=0.784194 (213.1742 ms), msssim_torch=0.784203 (244.9676 ms) sigma=80.0 msssim_tf=0.748574 (545.3014 ms), msssim_paddle=0.748563 (222.8581 ms), msssim_torch=0.748572 (261.0413 ms) sigma=90.0 msssim_tf=0.715980 (538.3886 ms), msssim_paddle=0.715968 (214.4464 ms), msssim_torch=0.715977 (282.6247 ms) sigma=100.0 msssim_tf=0.683882 (540.9150 ms), msssim_paddle=0.683870 (218.5596 ms), msssim_torch=0.683880 (244.1856 ms) Pass ====> Batch Pass
Example
-
Image comparison
SSIM = 1.0000 SSIM = 0.4225 SSIM = 0.1924 -
As a loss function
-
switch to the examples/as_loss dir
$ cd ./examples/as_loss
-
run the example script as_loss.py
$ python as_loss.py
Initial ssim: 0.9937540888786316 step: 1 ssim_loss: 0.993843 step: 2 ssim_loss: 0.993934 step: 3 ssim_loss: 0.994021 step: 4 ssim_loss: 0.994106 step: 5 ssim_loss: 0.994190 ... step: 81 ssim_loss: 0.999762 step: 82 ssim_loss: 0.999785 step: 83 ssim_loss: 0.999862 step: 84 ssim_loss: 0.999874 step: 85 ssim_loss: 0.999884 step: 86 ssim_loss: 0.999892 step: 87 ssim_loss: 0.999912
-
result
Input Output -
See examples/as_loss/as_loss.py for more details
-
-
Auto Encoder
- See examples/auto_encoder for more details
References
Thanks
-
This repo is based on Pytorch MS-SSIM developed by @VainF.
-
Thanks to the above project and its developers.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file paddle_msssim-0.0.2.tar.gz
.
File metadata
- Download URL: paddle_msssim-0.0.2.tar.gz
- Upload date:
- Size: 7.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.9.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | cf9f387214bc9c1c8f2dbdafc0bc92250714f25e54ee311e03b6afa10df04abe |
|
MD5 | d9931346394cd054f5e5007aa201bdd6 |
|
BLAKE2b-256 | 058bcd8dfcfd5c97f379b9ca7bcb806b8e7bbba82b44e302c48df023fb2e18d0 |
File details
Details for the file paddle_msssim-0.0.2-py3-none-any.whl
.
File metadata
- Download URL: paddle_msssim-0.0.2-py3-none-any.whl
- Upload date:
- Size: 7.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.2 CPython/3.9.1
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 23d1739ef38c8713179326c75b6b5113e377cdeaceedebef7ae8f13c02af12ba |
|
MD5 | 2ea12a5f4238d28c9d9ed025ecf267db |
|
BLAKE2b-256 | 8ba1ac5cd2c2711df550a55e9444f0e451db0b8297ce72055ea03cab03b2dc5f |