見出し画像

【AIを作って学ぼ!】GANを使ってアニメキャラを作ってみよう!

割引あり

「AI分野で近年大きな注目を集める『GAN(Generative Adversarial Network)』は、画像や音声などの新たなデータを“創り出す”ことができる革新的な技術です。ですが、名前は聞いたことがあっても、いざ自分で使ってみるとなると『難しそう…』と二の足を踏んでしまう方も多いのではないでしょうか?
本記事では、その中でも比較的シンプルなモデルである『DC-GAN』を扱い、アニメキャラクター画像生成を例に、GANを動かしながら学ぶプロセスをわかりやすく解説します。理論を読むだけでなく、実際にコードを動かし、モデルを学習させ、ユニークな画像が生み出される瞬間を体験することで、GANの世界をより身近に感じられるはずです。
アニメキャラはあくまで例ですが、こうした具体例に取り組むことで、GANの可能性や応用先に目を向けるきっかけにもなります。さあ、一緒にDC-GANを触って、AI画像生成の第一歩を踏み出してみましょう!」


1.データセットを取得しよう!

今回GANに学習させるデータをKaggleというデータサイエンスや機械学習に関するコンペティション(競技)を行うためのオンラインプラットフォームから取得します。Kaggleは多くのオープンデータセットが公開されています。自由にアクセスして学習や研究に活用できます。

上記サイトからダウンロードしてください。
「Download」はアカウントを作成しないとできない可能性がありますので、気をつけてください。
ダウンロードをするとzipファイルが指定フォルダにダウンロードされます。解凍すると65,000点のアニメキャラクターの画像が展開されます。


2.データの前処理を行おう!

GANにデータを学習させやすいように画像を64✕64の大きさに変更します。
64✕64にリサイズするのは以下理由です。

2-1: 計算資源とメモリの負荷を軽減するため
GAN(特にDCGANなど)を用いて画像を生成する場合、画像サイズが大きいほど、モデルのパラメータ数や必要な計算量が増えます。
64×64ピクセルというサイズは、

  • モデルの計算量(フロップ数)が比較的抑えられる(128,256等だと解像度=情報量が多くなってしまう)

  • GPUメモリへの負荷も軽くなる
    といった利点があります。
    これにより、学習が安定しやすく、より短時間で繰り返し試行できる環境が整います。

2-2: 初期段階での実験や検証が容易
GANの研究開発では、まずは小さなサイズでモデルがうまく機能するか確認することが多いです。
64×64は、

  • 学習プロセスを素早く回せる

  • 生成画像の質の劣化が極端に大きくはない(まだある程度わかるレベルの特徴が保持される)
    という「バランスの良い」サイズとしてしばしば選択されます。

2-3: DCGAN論文などの標準的な設定に倣った慣例
多くのGAN関連研究(特に初期のDCGAN論文など)で64×64が標準的な設定として使用されてきました。
そのため、

  • その後の研究者・開発者が比較実験をしやすい

  • 学習コードやネットワークアーキテクチャが他の実装例と整合しやすい
    などの理由で、64×64が一種の「デファクトスタンダード」となっています。

2-4: より高解像度へのステップアップが容易
初期段階で64×64で十分な成果を得られたら、その後128×128や256×256など、より高解像度への拡張が計画できます。
64×64である程度モデルの挙動を理解・安定化したうえで解像度を上げることで、問題発生時にどこが原因か特定しやすくなります。
(たとえば、いきなり高解像度で失敗すると、計算量が多すぎるのか、モデルが未熟なのか、データ不足なのかなどが切り分けにくくなります。)

以下は画像のリサイズ用のサンプルコードです。

import os
from PIL import Image

input_folder = 'images'
output_folder = 'images-processed'

for root, dirs, files in os.walk(input_folder):
    # 相対パス取得
    relative_path = os.path.relpath(root, input_folder)
    # 出力用サブフォルダ作成
    output_subfolder = os.path.join(output_folder, relative_path)
    if not os.path.exists(output_subfolder):
        os.makedirs(output_subfolder)

    for filename in files:
        # 画像ファイル判定
        if filename.lower().endswith('.jpg') or filename.lower().endswith('.png'):
            img_path = os.path.join(root, filename)
            # 画像読み込み
            img = Image.open(img_path)
            
            # リサイズ(64x64)
            resized_img = img.resize((64, 64))
            
            # 出力ファイルパス
            output_path = os.path.join(output_subfolder, filename)
            # リサイズ画像保存
            resized_img.save(output_path)


3.モデルを構築しよう!

ここから先は

15,135字 / 7画像

PayPay
PayPayで支払うと抽選でお得

この記事が気に入ったらチップで応援してみませんか?