【大失敗】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を作るのは簡単ではありませんね。。少しずつ改善を重ねていきたいと思います。次回以降も、お楽しみに!
ではまた〜👋
この記事が気に入ったらサポートをしてみませんか?