PyTorch에 SSIM Looss 설치
PyTorch를 사용한 Conv2d 설치
import torch
import torch.nn.functional as F
from torch import Tensor
from torch.nn import Module
class SSIMLoss(Module):
def __init__(self, kernel_size: int = 11, sigma: float = 1.5) -> None:
"""Computes the structural similarity (SSIM) index map between two images.
Args:
kernel_size (int): Height and width of the gaussian kernel.
sigma (float): Gaussian standard deviation in the x and y direction.
"""
super().__init__()
self.kernel_size = kernel_size
self.sigma = sigma
self.gaussian_kernel = self._create_gaussian_kernel(self.kernel_size, self.sigma)
def forward(self, x: Tensor, y: Tensor, as_loss: bool = True) -> Tensor:
if not self.gaussian_kernel.is_cuda:
self.gaussian_kernel = self.gaussian_kernel.to(x.device)
ssim_map = self._ssim(x, y)
if as_loss:
return 1 - ssim_map.mean()
else:
return ssim_map
def _ssim(self, x: Tensor, y: Tensor) -> Tensor:
# Compute means
ux = F.conv2d(x, self.gaussian_kernel, padding=self.kernel_size // 2, groups=3)
uy = F.conv2d(y, self.gaussian_kernel, padding=self.kernel_size // 2, groups=3)
# Compute variances
uxx = F.conv2d(x * x, self.gaussian_kernel, padding=self.kernel_size // 2, groups=3)
uyy = F.conv2d(y * y, self.gaussian_kernel, padding=self.kernel_size // 2, groups=3)
uxy = F.conv2d(x * y, self.gaussian_kernel, padding=self.kernel_size // 2, groups=3)
vx = uxx - ux * ux
vy = uyy - uy * uy
vxy = uxy - ux * uy
c1 = 0.01 ** 2
c2 = 0.03 ** 2
numerator = (2 * ux * uy + c1) * (2 * vxy + c2)
denominator = (ux ** 2 + uy ** 2 + c1) * (vx + vy + c2)
return numerator / (denominator + 1e-12)
def _create_gaussian_kernel(self, kernel_size: int, sigma: float) -> Tensor:
start = (1 - kernel_size) / 2
end = (1 + kernel_size) / 2
kernel_1d = torch.arange(start, end, step=1, dtype=torch.float)
kernel_1d = torch.exp(-torch.pow(kernel_1d / sigma, 2) / 2)
kernel_1d = (kernel_1d / kernel_1d.sum()).unsqueeze(dim=0)
kernel_2d = torch.matmul(kernel_1d.t(), kernel_1d)
kernel_2d = kernel_2d.expand(3, 1, kernel_size, kernel_size).contiguous()
return kernel_2d
분산 공식의 변형
\begin{aligned}
\sigma^2 &=\frac{(x_1 -\overline x)^2 + (x_2 -\overline x)^2 +\dots + (x_n -\overline x)^2}{n}\\\\
&=\frac{x_1^2 -2x_1\overline x + (\overline x) ^2 + x_2^2 -2x_2\overline x + (\overline x) ^2 +\dots + x_n^2 -2x_n\overline x + (\overline x) ^2}{n}\\\\
&=\frac{(x_1^2 + x_2^2 +\dots + x_n^2) - 2\overline x (x_1 + x_2 +\dots + x_n) + n (\overline x)^2}{n}\\\\
&=\overline {x^2} - 2 (\overline x)^2 + (\overline x)^2\\\\
&=\overline {x^2} - (\overline x)^2
\end{aligned}
References
Reference
이 문제에 관하여(PyTorch에 SSIM Looss 설치), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/taikiinoue45/articles/bf7d2314ab4d10텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)