以下の内容はhttps://cysec148.hatenablog.com/entry/2025/04/08/064235より取得しました。


第26回:Pix2Pixで画像変換

Hello there, ('ω')ノ

🧠 はじめに:Pix2Pixとは?

Pix2Pix とは、
GAN(敵対的生成ネットワーク) をベースにした 画像から画像への変換(Image-to-Image Translation) を行うモデルです。

提案者: 2016年、Phillip Isola らによる論文
目的:
- 入力画像(条件画像) から ターゲット画像 への変換
- 条件付きGAN(Conditional GAN, cGAN) を使用

Pix2Pixの特徴:
- 画像の色付け(Colorization)
- スケッチ → 写真変換(Sketch-to-Photo)
- 衛星画像 → マップ変換(Satellite to Map)
- ファッションデザインのスタイル変換


📚 1. Pix2Pixの基本概念と仕組み


🎨 ① Pix2Pixの基本構造

Pix2Pix は、Conditional GAN(cGAN) を使用し、
条件画像(条件付き入力) から ターゲット画像 を生成します。


🎯 【Pix2Pixのアーキテクチャ】

[条件画像 x] → [生成器 G] → [生成画像 x'] → [識別器 D] → [本物/偽物の判別]
                          ↑
                  [ターゲット画像 y] → [識別器 D] → [本物/偽物の判別]

1. 生成器(Generator, G):
- 条件画像 x から ターゲット画像 y を模倣
- ターゲット画像に近い画像 x' を生成

2. 識別器(Discriminator, D):
- 生成画像 x' と本物画像 y を判別
- 本物か偽物かの識別精度を向上

3. 条件付きGAN(cGAN):
- ターゲット画像 y に基づいた条件生成
- 通常のGANより制御された画像生成が可能


📚 ② Pix2Pixの損失関数

Pix2Pixの損失関数は、cGANの損失L1再構成誤差 の組み合わせです。


📚 【Pix2Pixの目的関数】

[ L(G, D) = L_{\text{cGAN}}(G, D) + \lambda L_1(G) ]

1. cGANの損失(Adversarial Loss)
[ L{\text{cGAN}}(G, D) = \mathbb{E}{x, y} [\log D(x, y)] + \mathbb{E}_{x, z} [\log (1 - D(x, G(x, z)))] ]

  • D(x, y): 実画像が本物である確率
  • D(x, G(x, z)): 生成画像が本物と判定される確率

2. L1再構成誤差(L1 Loss)
[ L_1(G) = \mathbb{E}{x, y, z} [| y - G(x, z) |1] ]

  • L1 Loss: 生成画像とターゲット画像のピクセル単位の距離
  • 目的: より現実的な画像生成の促進

3. 最終損失関数
[ L(G, D) = \mathbb{E}{x, y} [\log D(x, y)] + \mathbb{E}{x, z} [\log (1 - D(x, G(x, z)))] + \lambda \mathbb{E}{x, y, z} [| y - G(x, z) |1] ]

λ(ラムダ): L1損失の重み(通常は λ = 100)


📚 ③ 条件付きGAN(cGAN)との違い

Pix2Pixは cGAN に基づいていますが、
通常のGANと異なる特徴 があります。

通常のGAN:
- ノイズ z から画像 x' を生成
- D は x' が本物か偽物かを判定

Pix2Pix(cGAN):
- 条件画像 x に基づいてターゲット画像 y を生成
- D は(x, x')がターゲット画像 y に近いかどうかを判定


🎨 2. Pix2Pixの具体的な活用例


🎯 ① スケッチからリアル画像への変換

概要:
- 白黒のスケッチ画像 から リアルな写真 を生成
- ファッションデザイン、工業デザイン などに応用

ユースケース:
- 人物スケッチ → 写真生成
- プロダクトデザインのスタイル確認


🎨 ② 衛星画像からマップへの変換

概要:
- 衛星画像(上空写真) から マップ(地図) を生成
- 都市計画やインフラ解析に応用可能

ユースケース:
- Google Earth の画像 → 地図への変換
- 災害エリアの解析とリスク評価


📚 ③ モノクロ画像のカラー化

概要:
- モノクロ画像に自動で色を付ける技術
- 古い写真や映像の修復に活用可能

ユースケース:
- 歴史的写真の復元
- 映画やドキュメントのカラー化


🤖 ④ セグメンテーションマップから画像生成

概要:
- セグメンテーションマップ から 現実的な画像 を生成
- 自動運転、医療画像解析などの分野で応用

ユースケース:
- 医療用CTスキャン画像のカラー化
- 自動運転用セグメンテーションマップ → 画像変換


🤖 3. Pix2Pixの実装(PyTorchで画像変換)


📚 ① 必要なライブラリのインストール

pip install torch torchvision matplotlib numpy

📚 ② 生成器(Generator)の定義

import torch
import torch.nn as nn

# U-Net ベースの生成器(Generator)
class UNetGenerator(nn.Module):
    def __init__(self, input_channels, output_channels):
        super(UNetGenerator, self).__init__()
        self.model = nn.Sequential(
            nn.Conv2d(input_channels, 64, kernel_size=4, stride=2, padding=1),
            nn.LeakyReLU(0.2),

            nn.Conv2d(64, 128, kernel_size=4, stride=2, padding=1),
            nn.BatchNorm2d(128),
            nn.LeakyReLU(0.2),

            nn.Conv2d(128, 256, kernel_size=4, stride=2, padding=1),
            nn.BatchNorm2d(256),
            nn.LeakyReLU(0.2),

            nn.ConvTranspose2d(256, 128, kernel_size=4, stride=2, padding=1),
            nn.BatchNorm2d(128),
            nn.ReLU(),

            nn.ConvTranspose2d(128, 64, kernel_size=4, stride=2, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(),

            nn.ConvTranspose2d(64, output_channels, kernel_size=4, stride=2, padding=1),
            nn.Tanh()
        )

    def forward(self, x):
        return self.model(x)

生成器は U-Net アーキテクチャで構成される


📚 ③ 識別器(Discriminator)の定義

# PatchGAN ベースの識別器(Discriminator)
class PatchGANDiscriminator(nn.Module):
    def __init__(self, input_channels):
        super(PatchGANDiscriminator, self).__init__()
        self.model = nn.Sequential(
            nn.Conv2d(input_channels, 64, kernel_size=4, stride=2, padding=1),
            nn.LeakyReLU(0.2),

            nn.Conv2d(64, 128, kernel_size=4, stride=2, padding=1),
            nn.BatchNorm2d(128),
            nn.LeakyReLU(0.2),

            nn.Conv2d(128, 256, kernel_size=4, stride=2, padding=1),
            nn.BatchNorm2d(256),
            nn.LeakyReLU(0.2),

            nn.Conv2d(256, 1, kernel_size=4, stride=1, padding=1),
            nn.Sigmoid()
        )

    def forward(self, x):
        return self.model(x)

識別器は PatchGAN で画像の局所的なリアリズムを判別


📚 ④ Pix2Pixの損失関数の定義

# cGANとL1損失の組み合わせ
def pix2pix_loss(d_real, d_fake, real_images, fake_images, lambda_l1=100):
    adversarial_loss = nn.BCELoss()
    l1_loss = nn.L1Loss()

    # cGAN損失
    d_loss_real = adversarial_loss(d_real, torch.ones_like(d_real))
    d_loss_fake = adversarial_loss(d_fake, torch.zeros_like(d_fake))
    d_loss = (d_loss_real + d_loss_fake) / 2

    # L1再構成誤差
    l1_loss_value = l1_loss(fake_images, real_images) * lambda_l1

    # 生成器の損失
    g_loss = adversarial_loss(d_fake, torch.ones_like(d_fake)) + l1_loss_value

    return d_loss, g_loss

📚 ⑤ Pix2Pixの学習ループ

import torchvision
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

# データセットの読み込み
transform = transforms.Compose([
    transforms.Resize((256, 256)),
    transforms.ToTensor(),
    transforms.Normalize([0.5], [0.5])
])

dataset = datasets.ImageFolder(root="./data/sketch_to_photo", transform=transform)
dataloader = DataLoader(dataset, batch_size=64, shuffle=True)

# モデルの初期化
generator = UNetGenerator(3, 3)
discriminator = PatchGANDiscriminator(6)

# 最適化
lr = 0.0002
g_optimizer = torch.optim.Adam(generator.parameters(), lr=lr)
d_optimizer = torch.optim.Adam(discriminator.parameters(), lr=lr)

# 学習ループ
num_epochs = 100
for epoch in range(num_epochs):
    for real_images, _ in dataloader:
        real_images = real_images.to(torch.device("cuda" if torch.cuda.is_available() else "cpu"))

        # 条件画像とターゲット画像を分離
        input_images, target_images = real_images[:, :3, :, :], real_images[:, 3:, :, :]

        # ① 生成画像の生成
        fake_images = generator(input_images)

        # ② 識別器の更新
        d_real = discriminator(torch.cat([input_images, target_images], dim=1))
        d_fake = discriminator(torch.cat([input_images, fake_images.detach()], dim=1))
        d_loss, g_loss = pix2pix_loss(d_real, d_fake, target_images, fake_images)

        d_optimizer.zero_grad()
        d_loss.backward()
        d_optimizer.step()

        # ③ 生成器の更新
        d_fake = discriminator(torch.cat([input_images, fake_images], dim=1))
        _, g_loss = pix2pix_loss(d_real, d_fake, target_images

, fake_images)

        g_optimizer.zero_grad()
        g_loss.backward()
        g_optimizer.step()

    print(f"Epoch [{epoch+1}/{num_epochs}], D Loss: {d_loss.item():.4f}, G Loss: {g_loss.item():.4f}")

Pix2Pixの学習完了!


🎨 ⑥ 画像変換の可視化

import matplotlib.pyplot as plt

# 生成画像の可視化
def show_generated_images(generator, input_images):
    with torch.no_grad():
        generated_images = generator(input_images)
        grid = torchvision.utils.make_grid(generated_images, nrow=4, normalize=True)
        plt.imshow(grid.permute(1, 2, 0).cpu().numpy())
        plt.title("Pix2Pix Generated Images")
        plt.axis("off")
        plt.show()

# 画像の生成と可視化
show_generated_images(generator, input_images[:4])

スケッチ → 写真変換、衛星画像 → 地図変換の可視化完了!


📚 4. Pix2Pixの応用とユースケース


🎯 ① スケッチからリアル画像への変換

応用:
- ファッションデザイン、建築デザイン、ゲームキャラクターの生成
- スケッチ画像から現実的な写真生成

ユースケース:
- 自動アバター生成、3Dモデリング、プロダクトデザイン


📚 ② 衛星画像からマップへの変換

応用:
- 都市計画や災害解析での衛星画像解析
- 農業・森林管理のリモートセンシング

ユースケース:
- Google Earth 画像 → マップへの変換
- 災害エリアの解析とリスク評価


📚 ③ 医療画像解析と異常検知

応用:
- 医療用画像の変換と拡張
- MRI・CTスキャンの自動解析

ユースケース:
- 腫瘍の自動検出、組織画像のカラー化
- 医療画像のセグメンテーションと自動分類


🎁 まとめ:Pix2Pixで画像から画像への変換をマスターしよう!

Pix2Pixは、条件付きGAN(cGAN)を活用して画像から画像への変換を行うモデル。
スケッチ→写真、衛星画像→マップ、モノクロ→カラー化など、多様な応用が可能。
U-Netベースの生成器とPatchGANベースの識別器で安定した画像変換を実現。
PyTorchでPix2Pixの実装から学習・画像変換までをマスターしよう!

Best regards, (^^ゞ




以上の内容はhttps://cysec148.hatenablog.com/entry/2025/04/08/064235より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14