分步指南:从本地路径加载 HuggingFace ControlNet 数据集

分步指南:从本地路径加载 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 jsonfrom pathlib import pathdef 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)

这将创建一个metadata.jsonl,其中包含controlnet 所需的所有信息。文件中的每一行对应一个图像、一个条件图像和相关的文本标题。

{"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 的类,并包含以下三个方法:

_info 存储有关您的数据集的信息。_split_generators 定义分割。_generate_examples 为每个分割生成图像和标签。

import datasetsclass mydataset(datasets.generatorbasedbuilder):    def _info(self):    def _split_generators(self, dl_manager):    def _generate_examples(self, metadata_path, images_dir, conditioning_images_dir):

添加数据集元数据

有很多选项可用于指定有关数据集的信息,但最重要的是:

features 指定数据集列类型。图像是图像特征conditioning_image 是一个图像特征text 是一个字符串值指定输入特征的监督键。

# 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_pathmetadata.jsonl 文件的路径images_dir 图像的路径conditioning_images_dir 调节图像的路径

注意
如果您为文件夹结构选择了不同的名称,则可能需要调整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 文件并生成图像及其关联的调节图像和文本。

@staticmethoddef 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 datasetds = 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 osimport jsonimport datasetsfrom 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 数据集的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1349040.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 12:31:51
下一篇 2025年12月13日 12:32:08

相关推荐

  • 使用 Python 抓取 Google 财经的终极指南

    网络抓取已成为开发人员的一项基本技能,尤其是在提取有价值的财务数据时。谷歌财经是此类数据的热门来源,但抓取这些数据可能具有挑战性。本指南将引导您完成使用 python 抓取 google finance 的过程,涵盖基本和高级技术。无论您是初学者还是中高级开发人员,本文旨在通过实际示例和解决方案满足…

    2025年12月13日
    000
  • python需要安装哪些模块

    Python必需模块:操作系统模块(os):提供与操作系统交互的功能。系统模块(sys):包含有关Python解释器和运行时的系统信息。数学模块(math):提供数学函数和常量。字符串模块(string):提供处理字符串的函数。正则表达式模块(re):使用正则表达式进行字符串操作。文件处理模块(op…

    2025年12月13日
    000
  • python怎么导入csv文件

    使用 Python 导入 CSV 文件的步骤:导入 csv 库。用 open 函数打开文件并创建 CSV 读取器对象。使用迭代器方法迭代行,每行以列表形式返回。通过索引访问行中的列(索引从 0 开始)。 如何使用 Python 导入 CSV 文件 使用 Python 导入 CSV(逗号分隔值)文件可…

    2025年12月13日
    000
  • pandas怎么读取csv文件

    读取CSV文件的方法有使用read_csv()函数、指定分隔符、指定列名、跳过行、缺失值处理、自定义数据类型等。详细介绍:1、read_csv()函数是Pandas中最常用的读取CSV文件的方法。它可以从本地文件系统或远程URL加载CSV数据,并返回一个DataFrame对象;2、指定分隔符,默认情…

    2025年12月13日
    000
  • php数组怎么添加数据库中_PHP数组数据添加到数据库操作

    需将PHP数组转为SQL语句再插入数据库,常用方式有五种:一、PDO预处理批量插入;二、mysqli逐条插入;三、JSON编码存TEXT字段;四、ORM框架如Eloquent批量写入;五、LOAD DATA INFILE导入CSV。 如果需要将PHP数组中的数据插入数据库,必须先将数组结构转换为可执…

    2025年12月13日
    000
  • php中二维数组怎么写入到数据库_php二维数组入库技巧【步骤】

    PHP批量写入二维数组到数据库有五种方法:一、拼接多行INSERT语句;二、PDO预处理循环执行;三、事务包裹确保原子性;四、LOAD DATA INFILE高速导入CSV;五、INSERT IGNORE或ON DUPLICATE KEY UPDATE处理冲突。 如果您需要将PHP中的二维数组批量写…

    2025年12月13日
    000
  • php导入时设置不同的编码

    答案:处理PHP文件导入时需解决编码不一致问题。1. 读取CSV时用mb_convert_encoding或iconv将GBK转UTF-8;2. 推荐使用iconv函数并添加IGNORE参数提升容错;3. 利用mb_detect_encoding检测原始编码,再针对性转换;4. 处理Excel文件时…

    2025年12月13日
    000
  • Django导入PHP password_hash()用户密码的平滑迁移策略

    本文旨在提供一种将使用PHP `password_hash()`函数加密的旧系统用户密码,平滑迁移至Django新站点的实用教程。核心策略是引入一个临时的 `old_password` 字段来存储旧哈希,并通过自定义Django认证后端,在用户首次登录时利用 `bcrypt` 验证旧密码并将其升级为…

    2025年12月13日
    000
  • Django集成PHP password_hash()密码:用户平滑迁移策略

    本教程旨在解决将使用php `password_hash()`函数加密的用户密码迁移到django项目中的挑战。由于两种框架的密码哈希算法不兼容,直接导入会导致认证失败。文章将详细介绍一种实用的解决方案:通过在django用户模型中添加一个额外的字段来存储旧密码,并定制认证后端,实现在用户首次登录时…

    2025年12月13日
    000
  • php统计明细表源码怎么用_用php统计明细表源码教程

    答案:通过PHP连接数据库查询数据,构建HTML表格展示明细,添加分页控制显示数量,并支持导出CSV文件。具体步骤包括使用MySQLi或PDO连接数据库并执行SELECT语句获取数据;利用HTML的标签结构结合PHP循环输出每条记录,同时使用htmlspecialchars()防止XSS攻击;为提升…

    2025年12月13日
    000
  • php数据整理中如何把csv数据读成数组_php读取csv转数组与分隔符编码处理

    首先使用fgetcsv读取CSV文件并按指定分隔符解析为二维数组,若分隔符为分号或制表符需显式指定;其次检测文件编码(如GBK),通过mb_convert_encoding转换为UTF-8以避免中文乱码;对于小文件可采用file结合array_map与str_getcsv简化解析流程,注意处理BOM…

    2025年12月13日
    000
  • PHP中大型文件的高效读取与流式处理实践

    本文旨在探讨php处理大型文件时遇到的内存效率问题,并提供一种基于回调函数和流式处理的优化方案。通过逐行读取并即时处理数据,而非一次性加载全部内容到内存,该方法能显著降低资源消耗,特别适用于处理json格式的大型日志或数据文件,并实现高效的数据转换与导出,如转换为csv格式。 在PHP应用开发中,处…

    2025年12月12日
    000
  • PHP格式化CSV数据输出的技巧有哪些_PHP格式化CSV数据输出的实用方法分享

    使用fputcsv函数可安全导出PHP数据为CSV,避免格式错乱;需设置正确HTTP头并处理UTF-8 BOM以解决中文乱码;可通过参数自定义分隔符适应不同区域需求;导出大数据时应逐行输出并刷新缓冲区;预处理空值、换行符和特殊类型确保数据完整性。 当您需要将PHP生成的数据导出为CSV文件时,可能会…

    2025年12月12日
    000
  • PHP中“Undefined variable”错误解析与条件变量初始化策略

    本文深入探讨PHP中常见的“Undefined variable”错误,特别是在处理CSV文件生成SQL语句时,因条件逻辑不当导致变量未被初始化的场景。文章将分析问题根源,提供两种有效的解决方案:前置初始化和调整条件判断,并给出代码示例与最佳实践,旨在帮助开发者避免此类错误,提升代码健壮性。 理解P…

    2025年12月12日
    000
  • PHP 未定义变量:条件逻辑与文件解析中的变量初始化策略

    本文深入探讨php中因条件逻辑导致变量未定义的常见问题,特别是在文件解析场景。通过分析一个csv文件处理并生成sql建表语句的案例,揭示了变量`$primarykey`未被正确初始化的原因,并提供了通过调整循环条件来确保变量及时定义的解决方案,强调了变量初始化在条件编程中的重要性。 理解 PHP 中…

    2025年12月12日
    000
  • PHP未定义变量错误解析:CSV数据处理中的条件逻辑与变量初始化

    在PHP中处理CSV文件生成SQL建表语句时,常见的“Undefined variable”错误通常源于循环内条件判断不当,导致变量未被初始化。本文将通过一个具体案例,深入分析因if($line != 1)等条件限制,导致主键变量未定义的场景,并提供修改循环条件以确保变量正确初始化的解决方案,强调变…

    2025年12月12日
    000
  • php myadmin怎么用_PHPMyAdmin数据库管理工具使用方法教程

    首先登录PHPMyAdmin,通过浏览器访问http://localhost/phpmyadmin并输入账号密码;接着创建数据库,填写名称如test_db并选择排序规则;然后在数据库中新建数据表,设置字段名称、类型及主键;可通过“导入”功能上传SQL或CSV文件加载数据;也可使用“导出”功能将数据库…

    2025年12月12日
    000
  • 处理PHP中JSON文件集合并按键聚合数据的教程

    本教程旨在指导如何在PHP中高效处理一组JSON文件,解析其内容,并根据特定键(如`weeknr`)聚合数值型数据。文章将详细介绍如何使用`glob`函数获取文件列表,`json_decode`将JSON字符串转换为PHP关联数组,并演示一种优雅的数据聚合策略,最终生成按周汇总的日工时和电视时间数据…

    2025年12月12日
    000
  • 如何下载php csv文件_下载php处理csv文件的相关文件方法

    答案:PHP可通过设置header生成CSV下载,使用fputcsv写入数据并添加BOM解决中文乱码;读取时通过$_FILES获取上传文件,用fgetcsv逐行解析,注意编码转换与流操作细节。 下载和处理 PHP 中的 CSV 文件是开发中常见的需求,比如导出数据库数据为 CSV 或读取上传的 CS…

    2025年12月12日
    000
  • PHP:高效将文本数据转换为CSV格式并实现下载或保存

    本文旨在提供一个详细的教程,指导如何在PHP中将文本文件内容转换为CSV格式的字符串,并解决常见的末尾逗号问题。此外,还将深入探讨如何通过HTTP头实现CSV文件的浏览器下载,或将其保存为服务器上的本地文件,从而避免直接在屏幕上输出CSV字符串,确保用户能够以正确的格式获取并打开CSV数据。 文本文…

    2025年12月12日
    000

发表回复

登录后才能评论
关注微信