Nobisuke
Dekisugi
RAG
Privacy policy
2024/08/28 14:12
こんにちは!今回は、画像処理でよく用いられる「多段階ノイズ除去」の概念とその実装について学んでいきましょう。一般的に、画像にノイズを加えた後、そのノイズを段階的に取り除いて元の画像に近づけるプロセスが、多段階ノイズ除去の基本です。このブログでは、PythonとPyTorchを使用して、多段階でノイズを追加し、除去していく実装方法を解説します。
(ChatGPTに書いてもらいました)
多段階ノイズ除去は、画像に対してノイズを徐々に少なくしていくステップを繰り返しながら、最終的にクリーンな画像に戻すプロセスを指します。この方法は、ディープラーニングを使った画像復元タスクにおいて非常に効果的です。特に、ガウシアンノイズを段階的に除去することで、より自然な画像復元が可能となります。
以下に、Pythonを使った多段階ノイズ除去の実装例を示します。このコードでは、MNISTデータセットを使用し、ノイズレベルを段階的に変化させながらノイズを追加し、それを段階的に除去していきます。
import torch
import torch.nn as nn
import torchvision.transforms as transforms
import torchvision.datasets as datasets
import matplotlib.pyplot as plt
# デバイスの設定
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# シンプルなCNNモデル定義
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(1, 16, kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1)
self.fc1 = nn.Linear(32 * 28 * 28, 128)
self.fc2 = nn.Linear(128, 28 * 28)
def forward(self, x):
x = torch.relu(self.conv1(x))
x = torch.relu(self.conv2(x))
x = x.view(x.size(0), -1)
x = torch.relu(self.fc1(x))
x = self.fc2(x)
x = x.view(-1, 1, 28, 28)
return x
# データセットの準備
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
mnist_train = datasets.MNIST(root='./data', train=True, transform=transform, download=True)
# ガウシアンノイズの追加
def add_gaussian_noise(img, noise_level):
noise = torch.randn(*img.shape).to(device) * noise_level
noisy_img = img + noise
noisy_img = torch.clamp(noisy_img, -1.0, 1.0)
return noisy_img
# モデルの初期化
model = SimpleCNN().to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
criterion = nn.MSELoss()
# トレーニング
num_epochs = 5
initial_noise_level = 0.5
steps = 5 # ノイズ除去のステップ数
for epoch in range(num_epochs):
for images, _ in train_loader:
images = images.to(device)
# 初期状態にノイズを追加
noisy_images = add_gaussian_noise(images, initial_noise_level)
# 多段階でノイズを除去
for step in range(steps):
current_noise_level = initial_noise_level * (1 - step / steps)
noisy_images = add_gaussian_noise(noisy_images, current_noise_level)
optimizer.zero_grad()
outputs = model(noisy_images)
loss = criterion(outputs, images)
loss.backward()
optimizer.step()
print(f'Epoch [{epoch + 1}/{num_epochs}], Loss: {loss.item():.4f}')
# 結果の表示
def show_images(orig, noisy, denoised):
orig = orig.cpu().numpy()
noisy = noisy.cpu().numpy()
denoised = denoised.cpu().detach().numpy()
fig, axes = plt.subplots(1, 3, figsize=(12, 4))
axes[0].imshow((orig[0][0] * 0.5 + 0.5), cmap='gray')
axes[0].set_title("Original Image")
axes[1].imshow((noisy[0][0] * 0.5 + 0.5), cmap='gray')
axes[1].set_title("Noisy Image")
axes[2].imshow((denoised[0][0] * 0.5 + 0.5), cmap='gray')
axes[2].set_title("Denoised Image")
plt.show()
# サンプル画像の取得と表示
sample_image, _ = mnist_train[0]
sample_image = sample_image.unsqueeze(0).to(device)
noisy_sample = sample_image
for step in range(steps):
current_noise_level = initial_noise_level * (1 - step / steps)
noisy_sample = add_gaussian_noise(noisy_sample, current_noise_level)
denoised_sample = model(noisy_sample)
show_images(sample_image, noisy_sample, denoised_sample)
シンプルなCNNモデルの使用:
ガウシアンノイズの追加:
add_gaussian_noise
関数を使って、画像に段階的にガウシアンノイズを追加します。このノイズは、各ステップで徐々に減少します。多段階ノイズ除去:
結果の表示:
多段階ノイズ除去の実装は、画像処理において非常に強力な手法です。ノイズを段階的に追加し、それを徐々に除去することで、元のクリーンな画像に近づけることができます。このブログで紹介したコードは、基本的なCNNアーキテクチャを使用して、多段階ノイズ除去の概念をシンプルに実装したものです。
ぜひ、実際にコードを試してみて、ノイズ除去のプロセスを体験してみてください。より高度なモデルや実データに適用することで、さらなる発展が期待できます。
© 2024, blueqat Inc. All rights reserved