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

相关推荐

  • html5怎样插入csv数据表_html5csv表格嵌入与格式化显示【实操】

    可在HTML5页面中用JavaScript实现CSV数据展示:一、File API本地读取;二、fetch加载远程CSV;三、预转JSON再渲染;四、用PapaParse库高兼容解析,均需解析后生成HTML表格。 如果您希望在HTML5页面中直接展示CSV格式的数据,但浏览器本身不支持原生解析CSV…

    2025年12月23日
    000
  • 使用Scrapy高效抓取并整合Div内不定数量P标签文本

    本文旨在指导如何使用scrapy框架高效地从网页中抓取特定 元素内不定数量的 标签内容。我们将探讨如何利用xpath表达式精准定位并提取所有目标 标签,并通过python的字符串连接方法,将这些分散的文本内容整合为一个单一字段,以便于数据存储和后续处理,解决仅保存最后一个 标签的问题。 引言:处理动…

    2025年12月23日 好文分享
    000
  • Scrapy教程:高效抓取并整合多个P标签内容至单一字段

    本教程详细讲解如何使用scrapy框架高效抓取html页面中不确定数量的` `标签内容,并将其整合为一个单一字符串字段,以便于数据存储和导出。文章通过分析常见错误,提供优化的xpath表达式和python代码实现,确保所有目标文本都能被正确提取并聚合。 1. 理解多P标签抓取的需求与挑战 在网页抓取…

    2025年12月23日
    000
  • 如何使用Scrapy和XPath高效抓取div中可变数量的p标签并合并存储

    本文详细介绍了如何利用scrapy框架和xpath表达式,从网页中准确提取特定`div`元素内数量不定的` `标签内容,并将其合并为单个字符串进行存储。通过分析常见问题,提供了一种简洁高效的解决方案,确保所有段落内容都能被正确抓取并导出到csv文件,避免只存储最后一个段落的错误。 在进行网页抓取时,…

    2025年12月23日
    000
  • JavaScript中处理表格数据:将扁平数组行转换为结构化对象记录

    本教程详细介绍了如何在javascript中将从google sheets或excel等表格数据源获取的扁平数组(数组的数组)转换为更具语义化和易于操作的结构化对象数组。我们将利用array.prototype.reduce()方法,通过索引映射和数组切片技术,高效地将每一行数据转换为包含明确属性的…

    2025年12月23日
    000
  • JavaScript数据转换:将扁平数组重塑为结构化对象数组

    本教程详细介绍了如何使用javascript将常见的扁平二维数组(例如从电子表格获取的数据)转换为结构化的对象数组。通过运用`array.prototype.reduce()`方法,我们将学习如何遍历原始数据,并根据预设的键值对创建新的对象,同时处理嵌套数组的生成,从而提升数据可读性和易用性。 数据…

    2025年12月23日
    000
  • 运行jmeter怎么生成HTML报告_jmeter生成HTML报告步骤【指南】

    首先通过监听器保存测试结果为CSV文件,再使用命令行或GUI生成HTML报告;具体步骤包括配置聚合报告监听器并导出数据、通过jmeter -g ./result.csv -o ./report_output命令生成报告,或在GUI中选择“选项”→“生成HTML报告”并指定输入输出路径,最后打开输出目…

    2025年12月23日
    000
  • 利用R语言通过API和JSON解析高效提取网页链接与数据

    本文旨在指导读者如何使用R语言中的`httr2`包,通过访问网页的底层JSON数据源来高效提取链接地址和下载文件,尤其适用于那些点击后直接触发下载的链接。我们将探讨如何识别、请求、解析JSON数据,并从中提取特定信息,最终实现无需浏览器自动化即可获取所需链接和文件的目的。 1. 挑战与解决方案概述 …

    2025年12月23日
    000
  • PowerShell管道扫描,HTML里CSS链接全体检!

    首先读取HTML文件中的CSS链接,使用PowerShell的Get-Content和正则表达式提取href属性中以.css结尾的URL;接着验证链接可达性,通过Invoke-WebRequest发送HEAD请求,判断状态码是否为200;最后生成扫描报告,将结果导出为CSV文件并在控制台用红色高亮显…

    2025年12月23日
    000
  • Linux Mnemosyne间隔重复,HTML+CSS学习曲线飙升!

    掌握Mnemosyne结合HTML与CSS的学习方法:一、配置支持富文本的卡片类型,使用内联样式增强视觉记忆;二、通过CSV批量导入含HTML代码的卡片,提升录入效率;三、自定义模板统一设置HTML结构与CSS样式,实现个性化排版;四、排查标签闭合与CSS兼容性问题,确保正确渲染。 如果您在使用Li…

    2025年12月23日
    000
  • 在Python中动态嵌入变量到HTML iframe src属性的教程

    本教程详细阐述了如何在python中利用f-string(格式化字符串字面量)将python变量动态地嵌入到html的` 动态生成HTML与Python变量的融合 在Web开发或数据可视化场景中,我们经常需要根据Python程序中的数据动态生成HTML内容。一个常见的需求是将Python变量的值注入…

    2025年12月23日
    000
  • R语言中通过解析Web服务JSON源获取文件链接的教程

    本教程将指导如何在r语言环境中,利用`httr2`和`tidyverse`库,通过直接访问web服务的底层json数据源来高效获取文件下载链接,例如csv文件。这种方法避免了模拟浏览器交互或直接下载文件,提供了一种更稳定、程序化的数据链接提取策略,并涵盖了从json中解析链接到实际下载文件的完整流程…

    2025年12月23日
    000
  • Java Web应用:高效实现多文件ZIP打包与下载

    本教程详细阐述了在java web应用中,如何高效且正确地将多个文件打包成zip格式并提供给浏览器下载。文章分析了常见错误,并推荐使用直接流式传输到http响应输出流的方法,结合try-with-resources确保资源妥善管理,避免内存溢出和下载内容不完整的问题,从而实现稳定可靠的文件下载功能。…

    2025年12月23日
    000
  • 通过API/JSON直接获取网页下载链接:R语言实战

    在R语言中,当需要获取网页上的文件下载链接而不触发直接下载时,模拟用户界面操作(如右键点击)并非总是最有效的方法。本教程将展示如何利用网站提供的API或JSON数据源,通过httr2等R包直接访问并提取所需链接,从而实现更高效、稳定的数据获取,并避免不必要的下载行为。 1. 简介:绕过UI操作的优势…

    2025年12月23日
    100
  • 通过API/JSON源高效获取网页数据与下载链接

    本教程旨在指导如何在不进行ui交互(如右键点击)的情况下,通过直接访问和解析web应用程序的底层json api,程序化地获取特定文件(如csv)的下载链接。该方法比传统的浏览器自动化(如rselenium)更为高效和稳定,适用于需要批量获取数据或避免直接触发文件下载的场景,并演示了如何使用r语言中…

    2025年12月23日
    000
  • R语言中从JSON数据源提取文件下载链接的策略

    本教程旨在介绍一种在r语言中高效获取文件下载链接的方法,尤其适用于当链接点击后会直接触发下载而非跳转页面的场景。我们将通过直接访问并解析网站的底层json数据源来提取目标链接,避免了复杂的浏览器自动化操作,并提供了使用`httr2`和`tidyverse`系列包进行数据请求、json解析及可选文件下…

    2025年12月23日
    000
  • Flask Session数据传递至另一路由并实现CSV下载教程

    本文档旨在解决Flask应用中,如何将API调用获取的数据,通过session传递到另一个路由,并最终实现将数据以CSV格式下载的功能。我们将详细讲解如何使用session存储数据,并在下载路由中读取并处理数据,最终生成可下载的CSV文件。同时,也会讨论session大小限制以及替代方案。 问题分析…

    2025年12月23日
    000
  • R语言:使用purrr::safely()处理循环中的错误,避免中断并收集结果

    本文详细介绍了在R语言中,如何利用purrr包的safely()函数来健壮地处理迭代过程中的错误。当循环因遇到无效数据(如无法访问的网址或不存在的文件)而中断时,safely()能够捕获错误,允许循环继续执行,并为失败的项返回预设的默认值(如NA行),从而避免手动筛选数据,提高代码的鲁棒性和开发效率…

    2025年12月22日
    000
  • PHP处理动态HTML表格数据:基于表单提交的实现方法

    本文旨在解决如何将客户端动态生成的HTML表格数据,通过标准表单提交方式传递给PHP后端进行处理的问题,避免了使用AJAX或数据库的复杂性。核心在于确保动态生成的表格单元格内部包含带有正确name属性的表单元素,使得PHP可以通过$_POST超全局变量接收到结构化的数据。 理解表单数据提交机制 在h…

    2025年12月22日
    000
  • 如何实现自定义提示

    掌握自定义提示需构建迭代工作流,通过明确目标、设定角色、提供上下文、结构化输出、示例引导、迭代优化、负面提示和链式思考,实现AI输出的精准控制与高效协同。 实现自定义提示,核心在于理解与AI模型交互的本质,并将其从“提问”升级为“引导”。它不是简单的抛出问题,而是通过精心设计的语言结构、上下文信息、…

    2025年12月22日
    000

发表回复

登录后才能评论
关注微信