Reference:Datawhale tinydiffusion
Kaggle 実装:#
データ準備#
- git clone で tinydiffusion をローカルにダウンロード
- cifar-10-pythonデータセットを datasets / フォルダにダウンロードし、ディレクトリ構造を datasets/cifar-10-batches-py のままにします。
- kaggle dataset にパッケージをアップロードし、名前を cifar-10-python とします。
実行#
- 新しい notebook を作成し、input にデータセット cifar-10-python を追加します。
- デフォルトのコードを実行
- 環境を設定
!pip install -r /kaggle/input/tinydiffusion/TinyDiffusion/ddpm/requirements.txt
- データセットを output パスにコピー
import shutil
import os
# データセットの入力ディレクトリと出力ディレクトリを定義
input_dir = '/kaggle/input/tinydiffusion'
output_dir = '/kaggle/output/tinydiffusion'
# 出力ディレクトリが存在するか確認し、存在しない場合は作成
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 入力ディレクトリ内のすべてのファイルとフォルダを走査
for root, dirs, files in os.walk(input_dir):
# 対応する出力ディレクトリを構築
relative_path = os.path.relpath(root, input_dir)
output_sub_dir = os.path.join(output_dir, relative_path)
# 出力サブディレクトリが存在しない場合は作成
if not os.path.exists(output_sub_dir):
os.makedirs(output_sub_dir)
# ファイルを出力ディレクトリにコピー
for file in files:
input_file_path = os.path.join(root, file)
output_file_path = os.path.join(output_sub_dir, file)
shutil.copy2(input_file_path, output_file_path)
print("データセットのコピーが完了しました!")
- パスを作成し、10 エポックごとに生成された画像を配置
import os
# 画像を保存するターゲットディレクトリを定義
save_dir = '/kaggle/output/tinydiffusion/TinyDiffusion/samples'
# ディレクトリが存在するか確認し、存在しない場合は作成
if not os.path.exists(save_dir):
os.makedirs(save_dir)
print(f"ディレクトリを作成しました: {save_dir}")
else:
print(f"ディレクトリ {save_dir} は既に存在します。")
- output パスに移動
cd /kaggle/output/tinydiffusion/TinyDiffusion
- データを処理
!python /kaggle/input/tinydiffusion/TinyDiffusion/ddpm/dataloader.py
- 構造を印刷
!python /kaggle/input/tinydiffusion/TinyDiffusion/ddpm/unet.py
- 画像にノイズを加える
!python /kaggle/input/tinydiffusion/TinyDiffusion/ddpm/diffusion.py
- トレーニング、ここでは 100 回だけトレーニングします。変更が必要な場合は、コマンドラインで変更できます。
!python /kaggle/output/tinydiffusion/TinyDiffusion/ddpm/train.py --epochs 100 --batch_size 128 --lr 1e-4 --img_size 32
- 画像を表示
import os
from PIL import Image
import matplotlib.pyplot as plt
# 画像ディレクトリを定義
save_dir = '/kaggle/output/tinydiffusion/TinyDiffusion/samples'
# ディレクトリが存在するか確認
if not os.path.exists(save_dir):
print(f"ディレクトリ {save_dir} は存在しません。")
else:
# ディレクトリ内のすべてのファイルを取得
all_files = os.listdir(save_dir)
# 画像ファイルをフィルタリング(ここでは画像ファイルの拡張子が.png, .jpg, .jpegであると仮定)
image_files = [f for f in all_files if f.lower().endswith(('.png', '.jpg', '.jpeg'))]
if not image_files:
print(f"ディレクトリ {save_dir} に画像ファイルはありません。")
else:
print(f"以下の画像ファイルが見つかりました:")
for idx, image_file in enumerate(image_files):
print(f"{idx + 1}. {image_file}")
# 画像を表示(オプション)
image_path = os.path.join(save_dir, image_file)
img = Image.open(image_path)
plt.imshow(img)
plt.title(image_file)
plt.axis('off')
plt.show()
結果#