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에 필요한 모든 정보가 포함된 메타데이터.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
마지막으로 메타데이터.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에서 상속되고 다음 세 가지 메서드를 포함하는 클래스를 구현해야 합니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!