ControlLoRA形式のデータセットとControlNet LLLite形式のデータセットの相互変換スクリプト

自分用メモなので簡素。
ControlLoRA→ControlNet LLLite
LoRAtoLLLite.py

from datasets import load_dataset
import os
from PIL import Image

# 出力ディレクトリを指定
output_dir = "D:/Documents/AI/fill50k"  # ここにデータを保存します

# 画像、ガイド、テキストディレクトリを作成
image_dir = os.path.join(output_dir, "image")
guide_dir = os.path.join(output_dir, "guide")
text_dir = os.path.join(output_dir, "text")
os.makedirs(image_dir, exist_ok=True)
os.makedirs(guide_dir, exist_ok=True)
os.makedirs(text_dir, exist_ok=True)

# データセットをダウンロード
dataset = load_dataset("HighCWu/fill50k", split="train")  # trainデータセットのすべての行をダウンロード

# データをループして画像とテキストを保存
for i, data_point in enumerate(dataset):
    image = data_point['image']  # 画像を取得
    guide = data_point['guide']  # ガイド画像を取得
    text_list = data_point['text']  # テキストリストを取得

    # テキストリストから文字列を作成
    cleaned_text = ''.join(text_list).replace(", ", " ")

    # 画像を保存
    image_path = os.path.join(image_dir, f"{i+1}.png")
    image.save(image_path)

    # ガイド画像を保存
    guide_path = os.path.join(guide_dir, f"{i+1}.png")
    guide.save(guide_path)

    # テキストを保存
    text_path = os.path.join(text_dir, f"{i+1}.txt")
    with open(text_path, 'w') as text_file:
        text_file.write(cleaned_text)

print("データの保存が完了しました。")

ControlNet LLLite→ControlLoRA
まず画像フォルダとテキストファイルからjsonを書き出す
source_dir ガイド画像
target_dir 生成したい画像
prompt_dir prompt詰め合わせフォルダ

import os
import json

source_dir = "D:\\desktop\\Face\\image"
target_dir = "D:\\desktop\\Face\\guide"
prompt_dir = "D:\\desktop\\Face\\text"

# Get all the image filenames in the source directory
file_names = [f for f in os.listdir(source_dir) if f.endswith('.png')]

# For each file, read the corresponding prompt and construct the JSON format
json_strings = []
for file_name in file_names:
    # Construct file paths
    source_path = os.path.join(source_dir, file_name)
    target_path = os.path.join(target_dir, file_name)
    prompt_file_path = os.path.join(prompt_dir, file_name.replace('.png', '.txt'))
    
    # Read the prompt from the text file
    with open(prompt_file_path, 'r', encoding="utf-8") as f:
        prompt_text = f.read().strip()
    
    # Construct the dictionary
    json_dict = {
        "source": f"source/{file_name}",
        "target": f"target/{file_name}",
        "prompt": prompt_text
    }
    json_strings.append(json.dumps(json_dict, ensure_ascii=False))

# Save the results to "eyes_heart.json" as newline-separated strings
with open('eyes_heart.json', 'w', encoding="utf-8") as f:
    f.write('\n'.join(json_strings))
import os
import datasets

from datasets.arrow_dataset import Dataset
from datasets.dataset_dict import DatasetDict

def map_fn(example):
    image_path = os.path.join("D:/desktop/Face", example['target'])
    guide_path = os.path.join("D:/desktop/Face", example['source'])
    return dict(image=image_path, guide=guide_path, text=example['prompt'])


eyes_heart_dataset = Dataset.from_json("D:/desktop/Face/eyes_heart.json") 
eyes_heart_dataset = eyes_heart_dataset.map(map_fn)
eyes_heart_dataset = eyes_heart_dataset.remove_columns(['source', 'target', 'prompt'])
eyes_heart_dataset = eyes_heart_dataset.cast_column("image", datasets.Image(decode=True))
eyes_heart_dataset = eyes_heart_dataset.cast_column("guide", datasets.Image(decode=True))
eyes_heart_dataset = DatasetDict(train=eyes_heart_dataset)
eyes_heart_dataset.save_to_disk("D:/desktop/Face/eyes_heart")

これで同じデータセットで最強のControlNet頂上決戦ができる!!!!

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