Rumah >pembangunan bahagian belakang >Tutorial Python >Panduan Langkah demi Langkah: Memuatkan Set Data HuggingFace ControlNet daripada Laluan Setempat

Panduan Langkah demi Langkah: Memuatkan Set Data HuggingFace ControlNet daripada Laluan Setempat

PHPz
PHPzasal
2024-08-16 18:02:36864semak imbas

Step-by-Step Guide: Loading a HuggingFace ControlNet Dataset from a Local Path

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.

Buat Fail Metadata

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

Buat Skrip Memuatkan

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:

  • _info menyimpan maklumat tentang set data anda.
  • _split_generators mentakrifkan pecahan.
  • _generate_examples menjana imej dan label untuk setiap pemisahan.
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:

  • ciri menentukan jenis lajur set data.
    • imej ialah ciri Imej
    • conditioning_image ialah ciri Imej
    • teks ialah nilai rentetan
  • supervised_keys yang menentukan ciri input.
# 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

  • laluan metadata_path bagi fail metadata.jsonl
  • laluan images_dir ke imej
  • laluan penyaman_imej_dir ke imej penyaman

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn