Rumah >pembangunan bahagian belakang >Tutorial Python >Panduan Langkah demi Langkah: Memuatkan Set Data HuggingFace ControlNet daripada Laluan Setempat
Huggingface menyediakan pilihan yang berbeza untuk memuatkan set data. Apabila memuatkan set data imej setempat untuk ControlNet anda, adalah penting untuk mempertimbangkan aspek seperti struktur set data, laluan fail dan keserasian dengan alatan pengendalian data Huggingface.
Anggap anda telah mencipta imej penyaman udara anda dan anda mempunyai struktur folder berikut:
my_dataset/ ├── README.md └──data/ ├── captions.jsonl ├── conditioning_images │ ├── 00001.jpg │ └── 00002.jpg └── images ├── 00001.jpg └── 00002.jpg
Dalam struktur ini, folder conditioning_images menyimpan imej penyaman anda, manakala folder imej mengandungi imej sasaran untuk ControlNet anda. Fail captions.jsonl menyimpan kapsyen yang dipautkan kepada imej ini.
{"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."}
Nota
Fail kapsyen (atau fail metadata berikut) juga boleh menjadi fail csv. Walau bagaimanapun, jika anda memilih CSV, berhati-hati dengan pemisah nilai, kerana teks mungkin mengandungi koma, yang boleh membawa kepada isu penghuraian.
Fail metadata ialah cara yang baik untuk memberikan maklumat tambahan tentang set data anda. Ia boleh merangkumi pelbagai jenis data, seperti kotak sempadan, kategori, teks atau dalam kes kami, laluan ke imej penyaman udara.
Mari buat fail 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)
Ini akan mencipta metadata.jsonl yang mengandungi semua maklumat yang kami perlukan untuk ControlNet kami. Setiap baris dalam fail sepadan dengan imej, imej penyaman dan kapsyen teks yang berkaitan.
{"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."}
Setelah anda mencipta fail metadata.jsonl, struktur fail anda sepatutnya kelihatan seperti ini:
my_dataset/ ├── README.md └──data/ ├── captions.jsonl ├── metadata.jsonl ├── conditioning_images │ ├── 00001.jpg │ └── 00002.jpg └── images ├── 00001.jpg └── 00002.jpg
Akhir sekali, kita mesti mencipta skrip pemuatan yang mengendalikan semua data dalam fail metadata.jsonl. Skrip hendaklah terletak dalam direktori yang sama dengan set data dan harus mempunyai nama yang sama.
Struktur direktori anda sepatutnya kelihatan seperti ini:
my_dataset/ ├── README.md ├── my_dataset.py └──data/ ├── captions.jsonl ├── metadata.jsonl ├── conditioning_images │ ├── 00001.jpg │ └── 00002.jpg └── images ├── 00001.jpg └── 00002.jpg
Untuk skrip, kita perlu melaksanakan kelas yang diwarisi daripada GeneratorBasedBuilder dan mengandungi tiga kaedah ini:
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):
Menambah Metadata Set Data
Terdapat banyak pilihan untuk menentukan maklumat tentang set data anda, tetapi yang paling penting ialah:
# Global variables _DESCRIPTION = "TODO" _HOMEPAGE = "TODO" _LICENSE = "TODO" _CITATION = "TODO" _FEATURES = datasets.Features( { "image": datasets.Image(), "conditioning_image": datasets.Image(), "text": datasets.Value("string"), }, )
Seperti yang anda lihat di atas, saya telah menetapkan beberapa pembolehubah kepada "TODO". Pilihan ini adalah untuk tujuan maklumat sahaja dan tidak menjejaskan pemuatan.
def _info(self): return datasets.DatasetInfo( description=_DESCRIPTION, features=_FEATURES, supervised_keys=("conditioning_image", "text"), homepage=_HOMEPAGE, license=_LICENSE, citation=_CITATION, )
Tentukan Pemisahan Set Data
dl_manager digunakan untuk memuat turun set data daripada repo Huggingface tetapi di sini kami menggunakannya untuk mendapatkan laluan direktori data yang dihantar dalam fungsi load_dataset.
Di sini kami mentakrifkan laluan setempat ke data kami
Nota
Jika anda telah memilih nama yang berbeza untuk struktur folder anda, anda mungkin perlu melaraskan pembolehubah metadata_path, images_dir dan 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), }, ), ]
Kaedah terakhir memuatkan fail matadata.jsonl dan menjana imej serta imej dan teks pelaziman yang berkaitan.
@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, }, }
Mengikuti langkah ini, anda boleh memuatkan set data ControlNet daripada laluan setempat.
# 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)
Jika anda mempunyai sebarang soalan, sila tinggalkan komen di bawah.
Kod penuh untuk skrip pemuatan:
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, }, }
Atas ialah kandungan terperinci Panduan Langkah demi Langkah: Memuatkan Set Data HuggingFace ControlNet daripada Laluan Setempat. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!