Pytorch의 빠르고 차별화 가능한 MS-SSIM 및 SSIM.



SSIM 및 MS-SSIM에 사용되는 가우스 커널은 별도로 가능합니다. 이미지 처리에서 분리 가능한 필터는 두 개의 더 간단한 필터의 제품으로 작성 될 수 있습니다. 일반적으로 2 차원 컨볼 루션 작업은 2 개의 1 차원 필터로 분리됩니다. 이것은 An의 계산 비용을 줄입니다
그냥 릴리스. @iyume의 힌트를 입력하십시오
@fynnbe의 3D 이미지 지원!
이제 (v0.2), SSIM & MSSIM은 텐서 플로 및 스키지로 일관된 결과를 생성 할 수 있습니다 . 벤치 마크 (Pytorch-MSSSIM, Tensorflow 및 Skimage)는 테스트 섹션에서 찾을 수 있습니다.
pip install pytorch-msssim from pytorch_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 )정규화 된 이미지에서 MS-SSIM/SSIM을 계산 해야하는 경우 먼저 [0, 1] 또는 [0, 255]의 범위로 거절하십시오.
# 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,) SSIM의 경우 부정적인 결과를 피하기 위해 nonnegative_ssim=True 설정하는 것이 좋습니다. 그러나이 옵션은 기본적으로 텐서 플로우 및 스키지와 일치하게 유지하기 위해 False 으로 설정됩니다.
MS-SSIM의 경우 Nonnegative_SSIM 옵션이 없으며 SSIM 대출은 NAN 결과를 피하기 위해 음성이없는 것으로 강요됩니다.
cd tests # requires tf2
python tests_comparisons_tf_skimage.py
# or skimage only
# python tests_comparisons_skimage.py 출력 :
Downloading test image...
===================================
Test SSIM
===================================
====> Single Image
Repeat 100 times
sigma=0.0 ssim_skimage=1.000000 (147.2605 ms), ssim_tf=1.000000 (343.4146 ms), ssim_torch=1.000000 (92.9151 ms)
sigma=10.0 ssim_skimage=0.932423 (147.5198 ms), ssim_tf=0.932661 (343.5191 ms), ssim_torch=0.932421 (95.6283 ms)
sigma=20.0 ssim_skimage=0.785744 (152.6441 ms), ssim_tf=0.785733 (343.4085 ms), ssim_torch=0.785738 (87.5639 ms)
sigma=30.0 ssim_skimage=0.636902 (145.5763 ms), ssim_tf=0.636902 (343.5312 ms), ssim_torch=0.636895 (90.4084 ms)
sigma=40.0 ssim_skimage=0.515798 (147.3798 ms), ssim_tf=0.515801 (344.8978 ms), ssim_torch=0.515791 (96.4440 ms)
sigma=50.0 ssim_skimage=0.422011 (148.2900 ms), ssim_tf=0.422007 (345.4076 ms), ssim_torch=0.422005 (86.3799 ms)
sigma=60.0 ssim_skimage=0.351139 (146.2039 ms), ssim_tf=0.351139 (343.4428 ms), ssim_torch=0.351133 (93.3445 ms)
sigma=70.0 ssim_skimage=0.296336 (145.5341 ms), ssim_tf=0.296337 (345.2255 ms), ssim_torch=0.296331 (92.6771 ms)
sigma=80.0 ssim_skimage=0.253328 (147.6655 ms), ssim_tf=0.253328 (343.1386 ms), ssim_torch=0.253324 (82.5985 ms)
sigma=90.0 ssim_skimage=0.219404 (142.6025 ms), ssim_tf=0.219405 (345.8275 ms), ssim_torch=0.219400 (100.9946 ms)
sigma=100.0 ssim_skimage=0.192681 (144.5597 ms), ssim_tf=0.192682 (346.5489 ms), ssim_torch=0.192678 (85.0229 ms)
Pass!
====> Batch
Pass!
===================================
Test MS-SSIM
===================================
====> Single Image
Repeat 100 times
sigma=0.0 msssim_tf=1.000000 (671.5363 ms), msssim_torch=1.000000 (125.1403 ms)
sigma=10.0 msssim_tf=0.991137 (669.0296 ms), msssim_torch=0.991086 (113.4078 ms)
sigma=20.0 msssim_tf=0.967292 (670.5530 ms), msssim_torch=0.967281 (107.6428 ms)
sigma=30.0 msssim_tf=0.934875 (668.7717 ms), msssim_torch=0.934875 (111.3334 ms)
sigma=40.0 msssim_tf=0.897660 (669.0801 ms), msssim_torch=0.897658 (107.3700 ms)
sigma=50.0 msssim_tf=0.858956 (671.4629 ms), msssim_torch=0.858954 (100.9959 ms)
sigma=60.0 msssim_tf=0.820477 (670.5424 ms), msssim_torch=0.820475 (103.4489 ms)
sigma=70.0 msssim_tf=0.783511 (671.9357 ms), msssim_torch=0.783507 (113.9048 ms)
sigma=80.0 msssim_tf=0.749522 (672.3925 ms), msssim_torch=0.749518 (120.3891 ms)
sigma=90.0 msssim_tf=0.716221 (672.9066 ms), msssim_torch=0.716217 (118.3788 ms)
sigma=100.0 msssim_tf=0.684958 (675.2075 ms), msssim_torch=0.684953 (117.9481 ms)
Pass
====> Batch
Pass
SSIM = 1.0000
SSIM = 0.4225
SSIM = 0.1924손실 함수로 SSIM 또는 MS_SSIM을 사용하는 방법에 대한 자세한 내용은 'Tests/Tests_Loss.py'를 참조하십시오.
'Tests/AE_Example'참조
왼쪽 : 원본 이미지, 오른쪽 : 재구성 된 이미지
https://github.com/jorge-pessoa/pytorch-msssim
https://ece.uwaterloo.ca/~z70wang/research/ssim/
https://ece.uwaterloo.ca/~z70wang/publications/msssim.pdf
MATLAB 코드
Tensorflow의 SSIM & MS-SSIM