Turbowarpで開いてください。 https://turbowarp.org/1282571837 1. 緑の旗を押してください。 32×32個の標準正規分布に従うランダムノイズを生成し、最初の画像として表示します。同時に、画像生成に必要な作業用メモリを初期化します。 2. Characterの値を1~46(あ~ん)から選択してください。 3. Gキーを押してください。 選択したひらがなの生成を開始します。 ランダムノイズから少しずつノイズを除去し、全10ステップでひらがなの画像へ変化させます。各ステップの処理が終わるたびに、現在の画像が画面へ表示されます。 生成中は処理が完了するまで待ってください。 4. 別の画像を生成する場合 もう一度緑の旗を押してください。新しいランダムノイズが作られるため、同じ文字を選んでも異なる画像が生成されます。
【このプロジェクトについて】 このプロジェクトは、32×32ピクセルのひらがな画像を生成する小型の条件付き拡散モデルです。 外部のAIサービスやWeb APIは使用していません。学習済みニューラルネットワークのパラメーターと、画像生成に必要な演算をプロジェクト内に収録し、Scratch(Turbowarp上で)推論処理を実行しています。 【画像生成の仕組み】 最初に、32×32=1024個の標準正規分布に従う乱数を生成します。この時点の画像は、ランダムなノイズだけで構成されています。 ニューラルネットワークは、現在の画像に含まれるノイズを予測します。予測されたノイズを利用して画像を更新する処理を繰り返すことで、ランダムノイズを少しずつひらがなの形へ変化させます。 画像の更新には、DDIMと呼ばれる決定論的なサンプリング方法を使用しています。このプロジェクトでは、1枚の画像を10ステップで生成します。 【文字の指定方法】 モデルには、現在の画像と時刻だけでなく、生成したい文字を表すCharacterの情報も入力されます。 文字情報は48個の数値からなる埋め込みベクトルへ変換され、時刻を表すベクトルと合成されます。この条件ベクトルをニューラルネットワークの各残差ブロックへ入力することで、「どのひらがなを生成するか」を指定しています。 【ニューラルネットワークの構成】 モデルは、小型のConditional U-Netを使用しています。 主な処理は次のとおりです。 ・全結合層(Linear) ・畳み込み層(Conv2D) ・LeakyReLU活性化関数 ・残差ブロック(Residual Block) ・2×2平均プーリング ・最近傍法による2倍アップサンプリング ・文字埋め込み ・Sinusoidal Timestep Embedding ・条件ベクトルの加算 ・DDIMによる画像更新 画像を段階的に縮小して全体的な特徴を処理した後、途中の特徴を再利用しながら元の32×32サイズへ拡大します。 【モデルについて】 入力画像サイズ:32×32ピクセル 出力画像サイズ:32×32ピクセル 階調:グレースケール 生成対象:ひらがな46文字 学習書体:Takao Gothic 画像生成ステップ数:10 推論用パラメーター数:165,505個 パラメーター形式:32ビット浮動小数点数 パラメーター:EMAモデル 学習時のモデルに含まれていたBatch Normalizationは、推論用に直前の畳み込み層へ統合しています。これにより、生成結果をほぼ変化させずに、保存するパラメーター数と推論時の演算を削減しています。 【実装について】 画像や特徴マップは、チャンネル、Y座標、X座標の順番で1次元のリストへ格納しています。畳み込み、全結合、活性化関数、画像の縮小と拡大、条件ベクトルの計算、DDIMによる画像更新まで、すべてプロジェクト内で処理しています。 モデルのパラメーターはParamリストに格納されています。中間計算にはMemoryリストを使用し、処理終了後に不要な作業データを削除することで、メモリ使用量と保存容量を抑えています。 【検証】 同じ初期ノイズ、文字、時刻を使用して、Python上のPyTorchモデルとTurboWarp版の出力を比較しました。 Character=1「あ」、時刻=999でニューラルネットワークを1回実行したとき、出力値の最大誤差は約0.00002でした。 この結果から、TurboWarp上の演算は元のPyTorchモデルを高い精度で再現できていると判断しています。 【クレジット】 学習および基準実装:Python / PyTorch 使用フォント:Takao Gothic 学習はRTX 5070Tiを使用して行われました。 ここまでの道のりである、私のGitHubリポジトリは探せばどこかにあります。