ホームページ >バックエンド開発 >Python チュートリアル >ステップバイステップ ガイド: ローカル パスから HuggingFace ControlNet データセットをロードする
Huggingface には、データセットを読み込むためのさまざまなオプションが用意されています。 ControlNet のローカル画像データセットを読み込むときは、データセットの構造、ファイル パス、Huggingface のデータ処理ツールとの互換性などの側面を考慮することが重要です。
コンディショニング イメージがすでに作成されており、次のフォルダー構造があると仮定します。
my_dataset/ ├── README.md └──data/ ├── captions.jsonl ├── conditioning_images │ ├── 00001.jpg │ └── 00002.jpg └── images ├── 00001.jpg └── 00002.jpg
この構造では、conditioning_images フォルダーにコンディショニング イメージが保存され、images フォルダーには ControlNet のターゲット イメージが含まれます。 captions.jsonl ファイルには、これらの画像にリンクされたキャプションが保持されます。
{"image": "images/00001.jpg", "text": "This is the caption of the first image."} {"image": "images/00002.jpg", "text": "This is the caption of the second image."}
注意
キャプション ファイル (または次のメタデータ ファイル) は csv ファイルにすることもできます。ただし、CSV を選択する場合は、テキストにカンマが含まれる可能性があり、解析の問題が発生する可能性があるため、値の区切り文字に注意してください。
メタデータ ファイルは、データセットに関する追加情報を提供する良い方法です。これには、境界ボックス、カテゴリ、テキスト、またはこの場合はコンディショニング画像へのパスなど、さまざまなタイプのデータを含めることができます。
metadata.jsonl ファイルを作成しましょう:
import json from pathlib import Path def create_metadata(data_dir, output_file): metadata = [] try: with open(f"{data_dir}/captions.jsonl", "r") as f: for line in f: data = json.loads(line) file_name = Path(data["image"]).name metadata.append( { "image": data["image"], "conditioning_image": f"conditioning_images/{file_name}", "text": data["text"], } ) with open(f"{data_dir}/metadata.jsonl", "w") as f: for line in metadata: f.write(json.dumps(line) + "\n") except (FileNotFoundError, json.JSONDecodeError) as e: print(f"Error processing data: {e}") # Example usage: data_dir = "my_dataset/data" create_metadata(data_dir)
これにより、ControlNet に必要なすべての情報を含む metadata.jsonl が作成されます。ファイル内の各行は、画像、調整画像、および関連するテキスト キャプションに対応します。
{"image": "images/00001.jpg", "conditioning_image": "conditioning_images/00001.jpg", "text": "This is the caption of the first image."} {"image": "images/00002.jpg", "conditioning_image": "conditioning_images/00002.jpg", "text": "This is the caption of the second image."}
metadata.jsonl ファイルを作成すると、ファイル構造は次のようになります。
my_dataset/ ├── README.md └──data/ ├── captions.jsonl ├── metadata.jsonl ├── conditioning_images │ ├── 00001.jpg │ └── 00002.jpg └── images ├── 00001.jpg └── 00002.jpg
最後に、metadata.jsonl ファイル内のすべてのデータを処理する読み込みスクリプトを作成する必要があります。スクリプトはデータセットと同じディレクトリに配置され、同じ名前を持つ必要があります。
ディレクトリ構造は次のようになります:
my_dataset/ ├── README.md ├── my_dataset.py └──data/ ├── captions.jsonl ├── metadata.jsonl ├── conditioning_images │ ├── 00001.jpg │ └── 00002.jpg └── images ├── 00001.jpg └── 00002.jpg
スクリプトでは、GeneratorBasedBuilder を継承し、次の 3 つのメソッドを含むクラスを実装する必要があります。
import datasets class MyDataset(datasets.GeneratorBasedBuilder): def _info(self): def _split_generators(self, dl_manager): def _generate_examples(self, metadata_path, images_dir, conditioning_images_dir):
データセット メタデータの追加
データセットに関する情報を指定するには多くのオプションがありますが、最も重要なものは次のとおりです。
# Global variables _DESCRIPTION = "TODO" _HOMEPAGE = "TODO" _LICENSE = "TODO" _CITATION = "TODO" _FEATURES = datasets.Features( { "image": datasets.Image(), "conditioning_image": datasets.Image(), "text": datasets.Value("string"), }, )
上でわかるように、いくつかの変数を「TODO」に設定しました。これらのオプションは情報提供のみを目的としており、読み込みには影響しません。
def _info(self): return datasets.DatasetInfo( description=_DESCRIPTION, features=_FEATURES, supervised_keys=("conditioning_image", "text"), homepage=_HOMEPAGE, license=_LICENSE, citation=_CITATION, )
データセットの分割を定義します
dl_manager は、Huggingface リポジトリからデータセットをダウンロードするために使用されますが、ここでは、load_dataset 関数で渡されるデータ ディレクトリ パスを取得するために使用します。
ここでデータへのローカル パスを定義します
注意
フォルダー構造に別の名前を選択した場合は、metadata_path、images_dir、およびconditioning_images_dir 変数を調整する必要がある場合があります。
def _split_generators(self, dl_manager): base_path = Path(dl_manager._base_path).resolve() metadata_path = base_path / "data" / "metadata.jsonl" images_dir = base_path / "data" conditioning_images_dir = base_path / "data" return [ datasets.SplitGenerator( name=datasets.Split.TRAIN, # These kwargs will be passed to _generate_examples gen_kwargs={ "metadata_path": str(metadata_path), "images_dir": str(images_dir), "conditioning_images_dir": str(conditioning_images_dir), }, ), ]
最後のメソッドは、matadata.jsonl ファイルをロードし、画像とそれに関連する調整画像とテキストを生成します。
@staticmethod def load_jsonl(path): """Generator to load jsonl file.""" with open(path, "r") as f: for line in f: yield json.loads(line) def _generate_examples(self, metadata_path, images_dir, conditioning_images_dir): for row in self.load_jsonl(metadata_path): text = row["text"] image_path = row["image"] image_path = os.path.join(images_dir, image_path) image = open(image_path, "rb").read() conditioning_image_path = row["conditioning_image"] conditioning_image_path = os.path.join( conditioning_images_dir, row["conditioning_image"] ) conditioning_image = open(conditioning_image_path, "rb").read() yield row["image"], { "text": text, "image": { "path": image_path, "bytes": image, }, "conditioning_image": { "path": conditioning_image_path, "bytes": conditioning_image, }, }
これらの手順に従って、ローカル パスから ControlNet データセットをロードできます。
# with the loading script, we can load the dataset ds = load_dataset("my_dataset") # (optional) # pass trust_remote_code=True to avoid the warning about custom code # ds = load_dataset("my_dataset", trust_remote_code=True)
ご質問がございましたら、お気軽に以下にコメントを残してください。
読み込みスクリプトの完全なコード:
import os import json import datasets from pathlib import Path _VERSION = datasets.Version("0.0.2") _DESCRIPTION = "TODO" _HOMEPAGE = "TODO" _LICENSE = "TODO" _CITATION = "TODO" _FEATURES = datasets.Features( { "image": datasets.Image(), "conditioning_image": datasets.Image(), "text": datasets.Value("string"), }, ) _DEFAULT_CONFIG = datasets.BuilderConfig(name="default", version=_VERSION) class MyDataset(datasets.GeneratorBasedBuilder): BUILDER_CONFIGS = [_DEFAULT_CONFIG] DEFAULT_CONFIG_NAME = "default" def _info(self): return datasets.DatasetInfo( description=_DESCRIPTION, features=_FEATURES, supervised_keys=("conditioning_image", "text"), homepage=_HOMEPAGE, license=_LICENSE, citation=_CITATION, ) def _split_generators(self, dl_manager): base_path = Path(dl_manager._base_path) metadata_path = base_path / "data" / "metadata.jsonl" images_dir = base_path / "data" conditioning_images_dir = base_path / "data" return [ datasets.SplitGenerator( name=datasets.Split.TRAIN, # These kwargs will be passed to _generate_examples gen_kwargs={ "metadata_path": metadata_path, "images_dir": images_dir, "conditioning_images_dir": conditioning_images_dir, }, ), ] @staticmethod def load_jsonl(path): """Generator to load jsonl file.""" with open(path, "r") as f: for line in f: yield json.loads(line) def _generate_examples(self, metadata_path, images_dir, conditioning_images_dir): for row in self.load_jsonl(metadata_path): text = row["text"] image_path = row["image"] image_path = os.path.join(images_dir, image_path) image = open(image_path, "rb").read() conditioning_image_path = row["conditioning_image"] conditioning_image_path = os.path.join( conditioning_images_dir, row["conditioning_image"] ) conditioning_image = open(conditioning_image_path, "rb").read() yield row["image"], { "text": text, "image": { "path": image_path, "bytes": image, }, "conditioning_image": { "path": conditioning_image_path, "bytes": conditioning_image, }, }
以上がステップバイステップ ガイド: ローカル パスから HuggingFace ControlNet データセットをロードするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。