「クリエイティブな超能力を持つPix2Pixの解放 – 画像の変換」

「画像変換の超能力を解き放つクリエイティブなPix2Pix」

イントロダクション

子供が描く絵を生き生きとしたイメージに変える特別なコンピュータプログラムを想像してみてください。子供たちが描くカラフルで想像力に溢れる絵を、まるで魔法のように本物のようなイメージに変換できるのです!それが「Pix2Pix」と呼ばれるプログラムです。カードのデッキで素晴らしいトリックを披露するマジシャンのように、Pix2Pixは絵に関して素晴らしいことを成し遂げるのです。Pix2Pixはコンピュータが画像を理解し、処理する方法に大きな変化をもたらしました。それによって、作成される画像について細かい制御ができるようになります。まるで画像を作成したり変更したりするための超能力のようです!

出典: X.com

学習目標

  • Pix2Pixが何か、どのように機能し、実際の世界での応用を探求することを学ぶ
  • Pix2Pixを使用して、建物の正面データセットを使用して絵を写真に変換してみる
  • Pix2Pixの動作や問題解決に対する実装の理解と、画像から画像への変換タスクが直面している問題をどのように解決するかの理解

本記事はデータサイエンスブログマラソンの一環として公開されました。

一般対抗ネットワーク(GAN)

人工知能の中で最もエキサイティングな最近の発明の一つが、生成的対抗ネットワークまたはGANです。これらの強力なニューラルネットワークは、画像、音楽、テキストなどを含む新しいコンテンツを作成できます。GANは、生成器(コンテンツを作成する)と識別器(作成されたコンテンツを判断する)の2つのニューラルネットワークで構成されています。

生成器はコンテンツの作成に責任を持ちます。ランダムなノイズやデータから始め、それを徐々に意味のあるものに洗練させます。例えば、画像生成では、ゼロから画像を作成することができます。ランダムなピクセル値を調整して美しい本物の画像に似せることから始めます。識別器の役割は、生成器が作成したコンテンツを評価することです。コンテンツが本物か偽物かを判断します。より多くのコンテンツを調べ、生成器にフィードバックを提供することで、訓練が進むにつれて識別器はますます向上します。

出典: Neptune.ai

GANの教育プロセス全体は、対抗トレーニングと呼ばれています。非常に理解しやすいものです。生成器は最初は完全ではないコンテンツを作成します。識別器はコンテンツを評価します。すなわち、本物と偽物を区別しようとします。生成器は識別器からフィードバックを受け取り、より信じられるようにコンテンツを調整します。こうして、前よりも良いコンテンツを提供します。生成器の改善に応じて、識別器は偽物のコンテンツを検出する能力を向上させます。このようにして、対抗トレーニングが続き、GANはますます強力になります。

Pix2Pix

画像の変換と操作の概念は、従来の画像処理技術から始まりました。これには画像のリサイズ、色補正、フィルタリングなどが含まれます。ただし、これらの従来の方法は、画像から画像への変換などのより複雑なタスクには限界がありました。機械学習、特にディープラーニングは、画像変換の分野で革命をもたらしました。最近では、CNNs(畳み込みニューラルネットワーク)は画像処理タスクの自動化に重要な役割を果たしています。しかし、生成的対抗ネットワーク(GANs)の開発は、画像から画像への変換における重要な成果を意味しました。

Pix2Pixは、画像翻訳タスクに使用されるディープラーニングモデルです。Pix2Pixの核となるアイデアは、一つのドメインからの入力画像を他のドメインで対応する出力画像を生成することです。つまり、一つのスタイルから別のスタイルへの画像変換を行います。このアプローチは条件付きGANと呼ばれます。Pix2Pixは、入力画像が生成器を条件付ける条件付き形式のGANアーキテクチャを活用しています。条件に基づいて出力が生成されます。

出典: Phillipi

条件付き生成敵対ネットワーク(CGAN)は、生成された画像に対して正確な制御を可能にするGANフレームワークの高度なバージョンであり、特定のカテゴリの画像を生成することができます。Pix2Pix GANは、別の与えられた画像の存在に依存する画像の生成プロセスを持つCGANの一例です。画像では、pix2pixが作成した驚異を見ることができます。私はラベルからストリートシーン、ラベルからファサード、白黒からカラー、空中写真から実地図、昼の写真から夜景、エッジに基づいた写真などを作成できます。

画像から画像への変換の課題

画像から画像への変換は、特に目標が一つのドメインから別のドメインの画像に変換することで、内容と構造を慎重に保持する場合には、困難なコンピュータビジョンのタスクです。画像から画像への変換の課題は、入力と出力のドメイン間の複雑な関係を捉えることにあります。この問題への画期的な解決策の一つはPix2Pixです。

生成された画像には、ぼんやりとしたり歪んだりするといった問題が生じることがあります。Pix2pixでは、画像を生成するネットワーク(ジェネレーター)とそれがリアルに見えるかどうかをチェックするネットワーク(ディスクリミネーター)の2つを使用して、画像をより良く見せようとします。ディスクリミネーターは、ジェネレーターがより鮮明で実際の写真に似た画像を生成するのを助けるため、ぼんやり感や歪みの問題が少なくなります。

画像着色のようなタスクでは、生成された画像の色が周囲の領域に広がり、現実的でない色の分布が生じることがあります。Pix2pixは、条件付きGANの技術を使用して、色付けプロセスをより制御することができます。これにより、色付けがより自然で乱れが少なく見えるようになります。

Pix2Pixのアーキテクチャ

Pix2Pixのアーキテクチャは、ジェネレーターとディスクリミネーターの2つの主要なコンポーネントで構成されています。ジェネレーターとディスクリミネーターのモデルを構築する一般的なアプローチは、畳み込み-バッチ正規化-ReLUなどの層からなる標準的なビルディングブロックを使用することです。これらのビルディングブロックを組み合わせて、深層畳み込みニューラルネットワークを形成します。

U-NETジェネレーターモデル

ここでは、ジェネレーターにはU-Netモデルのアーキテクチャが使用されています。伝統的なエンコーダーデコーダーモデルは、画像を入力として受け取り、数層のダウンサンプリングを行います。このプロセスは、画像のレイヤーがいくつかの層にアップサンプリングされ、最終的な画像が出力されるまで続きます。UNetアーキテクチャでは、画像を再度ダウンサンプリングおよびアップサンプリングする必要があります。ただし、ここでの違いはエンコーダーとデコーダーの同じサイズのレイヤー間にスキップ接続が存在することです。スキップ接続により、モデルは低レベルと高レベルの特徴を組み合わせることができ、ダウンサンプリングプロセス中の情報の損失の問題を解決することができます。

U字型の上部は、入力画像の空間的次元を徐々に減少させながら、特徴チャンネルの数を増やす一連の畳み込みとプーリングレイヤーで構成されています。この特定の部分は、入力画像からの文脈情報を捉える役割を担っています。U-Netは、画像セグメンテーションタスクのためのディープラーニングの基礎的なアーキテクチャとなっています。最終的に、このジェネレーターは、実際の画像と区別がつかない画像を生成します。

出典:GitHub

PatchGANディスクリミネーターモデル

ディスクリミネーターモデルは、2つの画像を入力として受け取るように設計されています。ソースドメインからの画像とターゲットドメインからの画像を受け取ります。主な課題は、画像がジェネレーターによって生成されたものかどうかの確率を評価し、決定することです。

ディスクリミネーターモデルは、画像を分類するためにディープ畳み込みニューラルネットワークを使用した伝統的なGANを使用します。Pix2Pixディスクリミネーターは、従来のGANの代わりにPatchGANを使用しています。フル入力画像を真の画像または偽の画像として分類するのではなく、このディープ畳み込みニューラルネットワークを使用して、画像をパッチに分割して個別に評価します。PatchGANは、ジェネレーターに細かいフィードバックを提供し、ローカルな画像の詳細の改善に注力することを可能にします。これにより、ジェネレーターのトレーニングがより良くなります。それは、細かいディテールの保存が重要ないくつかのタスクにおいて非常に役立ちます。これらのタスクには、画像の超解像などが含まれます。高解像度でリアルな結果を生成するのに役立ちます。

出典:ResearchGate

Pix2Pixの応用

では、Pix2Pixのいくつかの応用例を見てみましょう。

  • 建築デザイン: Pix2Pixは、建物のデザインの荒いスケッチを詳細な建築設計図に変換することができます。これにより、建築家はより良い建物の設計ができます。
  • スタイル変換: 画像のスタイルを他の画像に転写することができます。有名な絵画のスタイルを写真に適用することができます。
  • ナビゲーションシステム: Pix2Pixはナビゲーションシステムにも応用されます。ストリートビューの画像をキャプチャし、Pix2Pixを使用して正確な地図に変換することができます。自律型ナビゲーションシステムにとって価値のあるものです。
  • 医療画像: Pix2Pixは医療画像の強化や変換に利用することができます。高解像度の画像は、医療業界でより良い治療を提供するために常に役立ちます。このPix2Pixは低解像度のMRIスキャンを高解像度に変換したり、X線画像からCT画像を生成するのに役立ちます。
  • 芸術と創造性: クリエイティブな目的でPix2Pixを使用します。ユーザーの入力に基づいて、ユニークで芸術的な画像やアニメーションを生成します。

Pix2Pixを使用している企業

ここで、Pix2Pixを使用しているいくつかの企業を見てみましょう。

  • Adobeは、Pix2Pixを使用してクリエイティブクラウド製品の機能を開発しています。スケッチをリアルな画像に変換したり、画像を一つのスタイルから別のスタイルに変換したりすることができます。Adobeはまた、自身の機械学習モデルのトレーニングのために合成データを生成するためにPix2Pixを使用しています。
  • Googleは、Pix2Pixを使用してマップや写真製品の機能を開発しています。衛星画像からリアルなストリートビューを作成したり、白黒写真にカラーを付けたりします。
  • Nvidiaは、AIプラットフォームにPix2Pixを使用しています。合成データセットを生成する能力があります。また、画像の新しいスタイルを作成することもできます。
  • GoogleのMagenta Studioは、機械学習とアートを探求する研究プロジェクトです。GoogleのMagenta Studioは、Pix2Pixを使用してさまざまなアート作成ツールを作成しました。Magenta Studioは、Pix2Pixを使用して画像の変換、画像の補完、画像の埋め込みなど、さまざまな種類のアートを作成するための多くのColabノートブックを公開しています。画像の埋め込みには、画像からオブジェクトを除去したり、画像の欠損部分を埋めたりすることが含まれます。Magenta Studioはさらに、Pix2Pixを使用してさまざまなアート形式を生成する多くのMagentaモデルも公開しています。これらのモデルには、低解像度の画像から高解像度の画像を生成するPix2PixHD、多様な芸術的スタイルからインスピレーションを受けた画像を作成するDisco Diffusion、リアリズムと想像力を融合させた画像を生成するGANPaintなどがあります。

実装

まず必要なすべてのライブラリとモジュールをインポートしましょう。不足しているモジュールがある場合は、pipコマンドを使用してインポートしてください。

import numpy as npfrom matplotlib import pylab as pltimport cv2import tensorflow as tfimport tensorflow.keras.layers as layersfrom tensorflow.keras.models import Modelfrom glob import globimport timeimport os

データセット

このプロジェクトで使用したデータセットは、Kaggleで入手可能であり、以下からダウンロードできます。

リンク:https://www.kaggle.com/datasets/balraj98/facades-dataset

このデータセットには、建物のファサードの画像とそれに対応するセグメンテーションの画像が含まれています。データセットはトレーニングとテストのサブセットに分割されています。合計で506の建物のファサード画像があります。

出典:Kaggle

前処理

次のステップは、データをロードし、問題の要件に応じて前処理することです。必要なすべてのステップを実行するための関数を定義します。この関数は、画像とそれに対応するラベルのバッチをロードし、前処理してモデルに供給できるように準備されたNumPy配列として返します。最初に、テストの画像とテストのラベルが存在するパスを指定します。glob関数を使用して、2つのディレクトリ内のすべてのファイルを見つけます。img_Aとimg_2という2つの空のリストを作成します。これらの空のリストに、バッチ1と2の前処理済みの画像を保存します。ループが作成されると、バッチ1と2のファイルパスのペアを反復処理します。各ペアについて、openCVを使用して画像を読み込み、変数に保存します。

カラーチャンネル

画像のカラーチャンネルを反転させ、深層学習モデルの入力仕様に合わせるための手順として、画像を256×256ピクセルにリサイズし、最後に前処理された画像をそれぞれのリストに追加します。バッチ内のすべての画像を処理した後、コードはリストimg_Aとimg_BをNumPy配列に変換し、ピクセル値を範囲[-1, 1]にスケーリングします。最後に、処理された画像をimg_Aとimg_Bとして返します。

def load_data(batch_size):    path1=sorted(glob('../test_picture/*'))    path2=sorted(glob('../test_label/*'))    i=np.random.randint(0,27)    batch1=path1[i*batch_size:(i+1)*batch_size]    batch2=path2[i*batch_size:(i+1)*batch_size]        img_A=[]    img_B=[]    for filename1,filename2 in zip(batch1,batch2):        img1=cv2.imread(filename1)        img2=cv2.imread(filename2)        img1=img1[...,::-1]        img2=img2[...,::-1]        img1=cv2.resize(img1,(256,256),interpolation=cv2.INTER_AREA)        img2=cv2.resize(img2,(256,256),interpolation=cv2.INTER_AREA)        img_A.append(img1)        img_B.append(img2)          img_A=np.array(img_A)/127.5-1    img_B=np.array(img_B)/127.5-1        return img_A,img_B 

同様に、トレーニングデータの前処理のために別の関数を作成する必要があります。以前はテストデータのすべての前処理手順を行い、最後にすべての画像をリストに保存し、終わりまで存在していました。しかし、ここではトレーニングデータの前処理のためには、最後まですべてのデータを保存する必要はありません。そのため、ジェネレータ関数を利用します。yield文はジェネレータ関数を作成するために使用されます。現在のバッチの処理された画像をimg_Aおよびimg_Bとしてyieldし、一度にメモリに読み込まずにトレーニングデータを一度に1バッチずつ反復処理することができます。これがジェネレータの魅力です。

# ジェネレータ関数def load_batch(batch_size):    path1=sorted(glob('../train_picture/*'))    path2=sorted(glob('../train_label/*'))    n_batches=int(len(path1)/batch_size)      for i in range(n_batches):        batch1=path1[i*batch_size:(i+1)*batch_size]        batch2=path2[i*batch_size:(i+1)*batch_size]        img_A,img_B=[],[]        for filename1,filename2 in zip(batch1,batch2):            img1=cv2.imread(filename1)            img2=cv2.imread(filename2)            img1=img1[...,::-1]            img2=img2[...,::-1]            img1=cv2.resize(img1,(256,256),interpolation=cv2.INTER_AREA)                img2=cv2.resize(img2,(256,256),interpolation=cv2.INTER_AREA)            img_A.append(img1)            img_B.append(img2)              img_A=np.array(img_A)/127.5-1        img_B=np.array(img_B)/127.5-1            yield img_A,img_B 

次に、pix2pixという名前のクラスを定義します。クラス内で必要なすべての関数を定義します。コンストラクタ、ジェネレータ、ディスクリミネータ、トレーニングメソッド、および出力を視覚化するためのsample_imagesが含まれます。各メソッドについて詳しく学んでいきます。

class pix2pix():    def __init__(self):      pass    def build_generator(self):      pass    def build_discriminator(self):      pass    def train(self,epochs,batch_size=1):      pass    def sample_images(self, epoch):      pass     

コンストラクタメソッド

まず、コンストラクタメソッドを定義します。このメソッドは、pix2pixモデルの属性やコンポーネントを初期化します。クラスのオブジェクトが作成される際に自動的に呼び出される特別なメソッドです。画像の寸法とチャンネルの数を定義しています。画像は256×256ピクセルで、3つのカラーチャンネル(RGB)を持つことが期待されています。self.gfとself.dfは、ジェネレータとディスクリミネータモデルのフィルタ(チャンネル)の数を定義する属性です。

次に、モデルの訓練に特定の学習率とベータパラメータを使用するAdamオプティマイザを定義します。次に、ディスクリミネータモデルが作成されます。バイナリクロスエントロピー損失と先ほど定義したAdamオプティマイザで構成されています。また、組み合わせモデルのトレーニング中にディスクリミネータの重みを固定します。self.combined属性は、ジェネレータの後に続くディスクリミネータで構成される組み合わせモデルを示しています。ジェネレータは偽の画像を生成し、ディスクリミネータはその妥当性を判断します。この組み合わせモデルは、ジェネレータがより現実的な画像を生成するように訓練します。

def __init__(self):
    self.img_rows = 256
    self.img_cols = 256
    self.channels = 3
    self.img_shape = (self.img_rows, self.img_cols, self.channels)
    patch = int(self.img_rows / (2**4))  # 2**4 = 16
    self.disc_patch = (patch, patch, 1)
    self.gf = 64
    self.df = 64
    optimizer = tf.keras.optimizers.legacy.Adam(learning_rate=0.0002, beta_1=0.5)
    self.discriminator = self.build_discriminator()
    # self.discriminator.summary()
    self.discriminator.compile(loss='binary_crossentropy', optimizer=optimizer)
    self.generator = self.build_generator()
    # self.generator.summary()
    img_A = layers.Input(shape=self.img_shape)  # picture--label
    img_B = layers.Input(shape=self.img_shape)  # label--real
    img = self.generator(img_A)
    self.discriminator.trainable = False
    valid = self.discriminator([img, img_A])
    self.combined = Model(img_A, valid)
    self.combined.compile(loss='binary_crossentropy', optimizer=optimizer)

ジェネレータを構築する

次のステップは、ジェネレータを構築することです。このメソッドでは、ジェネレータモデルのアーキテクチャを pix2pix スタイルの GAN で定義します。そのために、conv2d と deconv2d の 2 つの異なる関数が必要です。conv2d は、入力テンソル、チャネルの数、カーネルサイズ、bn(バッチ正規化を使用するかどうかを示すブール値)を取り、2D 畳み込み、LeakyReLU アクティベーション、オプションのバッチ正規化を適用し、結果のテンソルを返すヘルパー関数です。

conv2c と同様に、これはドロップアウトとバッチ正規化がオプションの転置畳み込み層(またはアップサンプリング層とも呼ばれる)を作成するためのヘルパー関数です。入力テンソル、前のレイヤーからの入力テンソル(concatenate するもの)の数、カーネルサイズ、ドロップアウトの割合を取ります。アップサンプリング層、畳み込み、アクティベーション、ドロップアウト(指定された場合)、バッチ正規化、skip_input との連結を適用し、結果のテンソルを返します。

ジェネレータモデルは、いくつかの層で構成されています。最初に入力層があります。その後、畳み込み層(conv2d)と転置畳み込み層(deconv2d)のシリーズを経ます。ここでは、d1 から d7 は次元を徐々に減らしながらチャネル数を増やす畳み込み層です。同様に、u1 から u7 は次元を徐々に増やしながらチャネル数を減らす転置畳み込み層です。スキップ接続は、入力イメージから出力までの微細なディテールを保持し、pix2pix フレームワークの画像対画像変換などのタスクに適しています。最後の層は、tanh アクティベーション関数を持つ畳み込み層です。これにより、出力イメージが生成されます。出力イメージは、入力イメージ(self.channels)と同じチャネル数を持ち、目標ドメインに似たイメージを生成することを目指しています。

def build_generator(self):
    def conv2d(layer_input, filters, f_size=(4, 4), bn=True):
        d = layers.Conv2D(filters, kernel_size=f_size, strides=(2, 2), padding='same')(layer_input)
        d = layers.LeakyReLU(0.2)(d)
        if bn:
            d = layers.BatchNormalization()(d)
        return d
    
    def deconv2d(layer_input, skip_input, filters, f_size=(4, 4), dropout_rate=0):
        u = layers.UpSampling2D((2, 2))(layer_input)
        u = layers.Conv2D(filters, kernel_size=f_size, strides=(1, 1), padding='same', activation='relu')(u)
        if dropout_rate:
            u = layers.Dropout(dropout_rate)(u)
        u = layers.BatchNormalization()(u)
        u = layers.Concatenate()([u, skip_input])
        return u
    
    d0 = layers.Input(shape=self.img_shape)
    d1 = conv2d(d0, self.gf, bn=False)
    d2 = conv2d(d1, self.gf * 2)
    d3 = conv2d(d2, self.gf * 4)
    d4 = conv2d(d3, self.gf * 8)
    d5 = conv2d(d4, self.gf * 8)
    d6 = conv2d(d5, self.gf * 8)
    d7 = conv2d(d6, self.gf * 8)
    
    u1 = deconv2d(d7, d6, self.gf * 8, dropout_rate=0.5)
    u2 = deconv2d(u1, d5, self.gf * 8, dropout_rate=0.5)
    u3 = deconv2d(u2, d4, self.gf * 8, dropout_rate=0.5)
    u4 = deconv2d(u3, d3, self.gf * 4)
    u5 = deconv2d(u4, d2, self.gf * 2)
    u6 = deconv2d(u5, d1, self.gf)
    u7 = layers.UpSampling2D((2, 2))(u6)
    
    output_img = layers.Conv2D(self.channels, kernel_size=(4, 4), strides=(1, 1), padding='same', activation='tanh')(u7)
    
    return Model(d0, output_img)

ディスクリミネータの構築

次のステップは、ディスクリミネータモデルを構築することです。このメソッドは、pix2pixスタイルのGANでディスクリミネータモデルのアーキテクチャを定義します。ジェネレータのconv2d関数と同様に、ここではd_layer関数を定義します。このヘルパー関数は、オプションのバッチ正規化を伴う畳み込み層を作成します。入力テンソル、チャンネル数、カーネルサイズ、およびbn(バッチ正規化を使用するかどうかを示すブール値)を取ります。2D畳み込み、LeakyReLU活性化、およびオプションのバッチ正規化を適用し、結果のテンソルを返します。ディスクリミネータモデルには、img_Aとimg_Bという2つの入力レイヤーがあります。それぞれの形状はself.img_shapeで定義されます。

これらの入力は、ソースドメイン(img_A)とターゲットドメイン(img_B)のペアの画像を表します。入力画像img_Aとimg_Bは、チャネル軸(axis=-1)を沿って連結され、組み合わせた画像が作成されます。ディスクリミネータのアーキテクチャは、d1からd4までの畳み込み層で構成され、フィルタが増えます。これらの層は、特徴を抽出しながら入力画像の空間次元をダウンサンプリングします。最終層は、シグモイド活性化関数を持つ畳み込み層です。これにより、入力画像のペアが実際か偽かを表す単一チャネルの出力が生成されます。この出力を使用して、入力画像のペアを実際か偽かで分類します。

def build_discriminator(self):        def d_layer(layer_input,filters,f_size=(4,4),bn=True):            d=layers.Conv2D(filters,kernel_size=f_size,strides=(2,2),            padding='same')(layer_input)            d=layers.LeakyReLU(0.2)(d)            if bn:                d=layers.BatchNormalization()(d)            return d            img_A=layers.Input(shape=self.img_shape)        img_B=layers.Input(shape=self.img_shape)            combined_imgs=layers.Concatenate(axis=-1)([img_A,img_B])            d1=d_layer(combined_imgs,self.df,bn=False)        d2=d_layer(d1,self.df*2)        d3=d_layer(d2,self.df*4)        d4=d_layer(d3,self.df*8)            validity=layers.Conv2D(1,kernel_size=(4,4),strides=(1,1),padding='same',        activation='sigmoid')(d4)            return Model([img_A,img_B],validity)

トレーニング

トレーニングメソッドを作成し、呼び出されたときにモデルをトレーニングする必要があります。 “valid”の配列は、実際の画像ラベルを表すnumpy配列の形式で1で構成されています。同様に、 “fake”の配列は、ニセ(生成された)画像ラベルを表すnumpy配列の形式で0で構成されています。その後、指定されたエポック数のループを初期化します。各エポックで、特定のエポックにかかる時間を記録するためにタイマーを起動します。ジェネレータは、各エポック内でバッチ単位でトレーニングデータをロードするために使用され、img_A(入力)とimg_B(ターゲット)の画像のペアを生成します。

ジェネレータは、入力画像を使用して画像を生成します。ディスクリミネータは、実際の画像ペアを実際として分類し、実際の画像の損失を計算するためにトレーニングします。同様に、ディスクリミネータは生成された画像ペアを偽として分類し、偽の画像の損失を計算します。トータルのディスクリミネータの損失は、実際と偽の画像の損失を平均したものです。ジェネレータのトレーニング目的は、ディスクリミネータを欺くような画像を生成することです。

def train(self,epochs,batch_size=1):        valid=np.ones((batch_size,)+self.disc_patch)        fake=np.zeros((batch_size,)+self.disc_patch)            for epoch in range(epochs):            start=time.time()            for batch_i,(img_A,img_B) in enumerate(load_batch(1)):                gen_imgs=self.generator.predict(img_A)                        d_loss_real = self.discriminator.train_on_batch([img_B, img_A], valid)                d_loss_fake = self.discriminator.train_on_batch([gen_imgs, img_A], fake)                d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)                        g_loss = self.combined.train_on_batch(img_A,valid)                if batch_i % 500 == 0:                    print ("[Epoch %d] [Batch %d] [D loss: %f] [G loss: %f]" % (epoch,batch_i,                                                                                d_loss,g_loss))                        self.sample_images(epoch)            print('Time for epoch {} is {} sec'.format(epoch,time.time()-start))

視覚化

sample_imagesメソッドは、トレーニング中にジェネレータの進捗状況を可視化するためにサンプル画像を生成して表示します。ここでは、rとcが3に設定され、表示される画像のグリッドに3行と3列があることを示しています。ここでは、3組の入力画像とターゲット画像がロードされます。ジェネレータは、入力画像に基づいて偽の画像を生成するために使用されます。画像は表示目的で単一の配列に連結されます。ピクセル値は、適切な視覚化のために範囲[-1、1]から[0、1]に再スケーリングされます。画像はサブプロットに表示されます。図はエポック番号をファイル名として画像ファイルとして保存されます。

def sample_images(self, epoch):        
    r, c = 3, 3        
    img_A, img_B =load_data(3)        
    fake_A = self.generator.predict(img_A)        
    gen_imgs = np.concatenate([img_A, fake_A, img_B])        
    # 画像を0から1にスケーリングする        
    gen_imgs = 0.5 * gen_imgs + 0.5        
    titles = ['入力画像', '予測された画像', '正解画像']        
    fig, axs = plt.subplots(r, c)        
    cnt = 0        
    for i in range(r):            
        for j in range(c):                
            axs[i,j].imshow(gen_imgs[cnt])                
            axs[i,j].set_title(titles[i])                
            axs[i,j].axis('off')                
            cnt += 1        
    fig.savefig("./%d.png" % (epoch))        
    plt.show()

結果

必要なメソッドをすべて定義した後、mainメソッドを呼び出す必要があります。pip2pixクラスのオブジェクトである「gan」を作成します。その後、エポック数とバッチサイズを指定してモデルをトレーニングします。

各エポックごとに、予測された画像が入力画像と正解画像と共に表示されます。トレーニングが進むにつれて、画像の変化を観察することができます。エポック数が増えると、画像はより正確になります。最終的には、正解画像と区別がつかない画像を得ることができます。それがGANの力です。

if __name__ == '__main__':
    gan = pix2pix()
    gan.train(epochs=50, batch_size=1)

1エポック目の結果:

10エポック後の結果は:

50エポック後の結果は:

まとめ

Pix2Pixの成功は、データから学習し、リアルで芸術的な表現力のある画像を生成する能力にあります。昼のシーンを夜のシーンに変換したり、白黒写真を鮮やかな色に変えたりする能力を持っています。Pix2Pixは、アーティストやデザイナーが画像を革新的かつ想像力豊かに変換して操作することができるため、クリエイティブなスーパーパワーになりました。テクノロジーの進歩につれて、さらに驚くべき機会が広がっています。アートとAIを組み合わせたい人にとって、探求するのは刺激的なフィールドです。

主なポイント

  • Pix2Pixは、私たちのアイデアから素晴らしい写真を作成するためのスマートなコンピュータフレンドです。デジタル世界の魔法のようです!
  • Pix2Pixは、コンピュータビジョンと画像処理の革命的な技術になりました。
  • トレーニングの安定性や大量のデータセットの必要性など、興味深い可能性と課題があります。
  • GoogleのMagenta Studioは、機械学習とアートを探求する研究プロジェクトであり、Pix2Pixを使用してさまざまなアートツールを作成しています。
  • この記事では、Pix2Pixが実際にどのように機能するかを見て、その魔力を理解しました。
  • 建築データを使用してPix2Pixを使用し、絵を本物の建物の写真に変える方法を学びました。

よくある質問

この記事で表示されているメディアはAnalytics Vidhyaの所有ではなく、著者の裁量で使用されています。

結論

Pix2Pixの成功は、データから学習し、リアルで芸術的な表現力のある画像を生成する能力にあります。昼のシーンを夜のシーンに変換したり、白黒写真を鮮やかな色に変えたりする能力を持っています。Pix2Pixは、アーティストやデザイナーが画像を革新的かつ想像力豊かに変換して操作することができるため、クリエイティブなスーパーパワーになりました。テクノロジーの進歩につれて、さらに驚くべき機会が広がっています。アートとAIを組み合わせたい人にとって、探求するのは刺激的なフィールドです。

主なポイント

  • Pix2Pixは、私たちのアイデアから素晴らしい写真を作成するための頭脳を持ったコンピュータの友達です。デジタル世界の魔法のようです!
  • Pix2Pixは、コンピュータビジョンと画像処理の革命的な技術になっています。
  • トレーニングの安定性や大量のデータセットの必要性など、興味深い可能性と課題があります。
  • GoogleのMagenta Studioは、機械学習とアートを探求する研究プロジェクトであり、Pix2Pixを使用してさまざまなアートツールを作成しました。
  • この記事では、Pix2Pixが実際にどのように機能するかを理解し、建築データを使用してPix2Pixを使用して絵を実際の建物のように変換する方法を

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

人工知能

「シフトのCEOであるクリス・ナーゲル – インタビューシリーズ」

クリスはSiftの最高経営責任者です彼は、Ping Identityを含むベンチャー支援および公開SaaS企業のシニアリーダーシップポジシ...

人工知能

「ゲイリー・ヒュースティス、パワーハウスフォレンジクスのオーナー兼ディレクター- インタビューシリーズ」

ゲイリー・ヒュースティス氏は、パワーハウスフォレンジックスのオーナー兼ディレクターであり、ライセンスを持つ私立探偵、...

人工知能

「Ntropyの共同創設者兼CEO、ナレ・ヴァルダニアンについて - インタビューシリーズ」

「Ntropyの共同創設者兼CEOであるナレ・ヴァルダニアンは、超人的な精度で100ミリ秒以下で金融取引を解析することを可能にす...

人工知能

「Ami Hever、UVeyeの共同創設者兼CEO - インタビューシリーズ」

עמיר חבר הוא המנכל והמייסד של UVeye, סטארט-אפ ראיה ממוחשבת בלמידה עמוקה, המציבה את התקן הגלובלי לבדיקת רכבים עם זיהוי...

人工知能

「ジャスティン・マクギル、Content at Scaleの創設者兼CEO - インタビューシリーズ」

ジャスティンは2008年以来、起業家、イノベーター、マーケターとして活動しています彼は15年以上にわたりSEOマーケティングを...

人工知能

「ジンディのCEO兼共同創設者、セリーナ・リー― インタビューシリーズ」

「Celina Leeは、ZindiのCEO兼共同創設者であり、アフリカのデータサイエンティスト向けの最大の専門ネットワークです Celina...