見出し画像

【大失敗】iPhone単体で画像生成AIを作りたい!

こんにちは!今回から、iPhone単体で画像生成AIを作成する挑戦をスタートします。プログラミング環境としては、iPhoneアプリの「Pythonista」を使用します。

まずは、画像生成AIを作るための基本的な流れを確認しましょう。

1. 学習用の画像データを準備する
2. ニューラルネットワークを構築する
3. 学習用データを使ってモデルを訓練する
4. 訓練したモデルを使って新しい画像を生成する

今回は、この流れに沿って、シンプルな画像生成AIを実装してみました。

データの前処理については、`preprocess_data`関数を作成しました。この関数では、指定されたディレクトリ内の画像ファイルを読み込み、リサイズや正規化などの前処理を行います。これにより、ニューラルネットワークに入力できる形式のデータが準備されます。

def preprocess_data(data_dir, img_height, img_width):
    images = []
    for file_name in os.listdir(data_dir):
        if file_name.endswith('.jpg') or file_name.endswith('.png'):
            img = Image.open(os.path.join(data_dir, file_name)).convert('L')
            img = img.resize((img_width, img_height))
            img_array = np.array(img)
            images.append(img_array)
    images = np.array(images).astype('float32') / 255.
    images = np.expand_dims(images, -1)
    return images

次に、シンプルなVariational Autoencoder(VAE)を`SimpleVAE`クラスとして実装しました。VAEは、エンコーダとデコーダの2つのニューラルネットワークで構成されます。エンコーダは入力画像を潜在空間上の点に変換し、デコーダはその潜在空間上の点から元の画像を復元します。

class SimpleVAE:
    def __init__(self, input_shape, latent_dim):
        self.input_shape = input_shape
        self.latent_dim = latent_dim
        self.encoder_weights = None
        self.decoder_weights = None

`train`メソッドでは、学習用データを使ってVAEの重みを更新します。損失関数として、入力画像と復元画像の間の平均二乗誤差を使用しました。バックプロパゲーションにより、損失を最小化するように重みを調整します。

def train(self, x_train, epochs=50, learning_rate=0.001):

最後に、訓練したVAEモデルを使って新しい画像を生成する`generate_images`関数を作成しました。この関数では、潜在空間上のランダムな点をデコーダに入力することで、新しい画像を生成します。

def generate_images(vae, num_images=10):
    generated_images = []
    for _ in range(num_images):
        z = np.random.randn(latent_dim)
        img = vae.decoder(z)
        generated_images.append(img)
    return generated_images


そして、これらを組み合わせて出来上がった画像がこちら!!!


。。。。。

だるすぎる...

iPhone単体とは言え、画像生成AIを作るのは簡単ではありませんね。。少しずつ改善を重ねていきたいと思います。次回以降も、お楽しみに!

ではまた〜👋

この記事が気に入ったらサポートをしてみませんか?