Z-Image-GGUF模型微调数据准备利用Python进行图像预处理与标注想用Z-Image-GGUF模型生成更符合你心意的图片吗比如让它专门为你画特定风格的插画或者精准生成你公司产品的宣传图直接拿网上随便找的图片去训练效果往往不尽人意。问题的关键常常出在数据上。模型微调就像教一个聪明的学生你喂给它什么样的“教材”它就能学会什么样的“知识”。杂乱无章、大小不一、描述不清的图片只会让它学得一头雾水。今天我们就来聊聊怎么用Python亲手为你的Z-Image-GGUF模型准备一份高质量的“专属教材”——也就是微调数据集。整个过程并不复杂核心就是两件事把图片处理得整整齐齐再给每张图片配上准确、丰富的文字描述。下面我就带你一步步走完这个流程从零开始准备好你的数据。1. 准备工作搭建你的Python工具箱工欲善其事必先利其器。在开始处理图片之前我们需要先把几个好用的Python库安装好。它们各自有擅长的领域组合起来就能搞定所有事情。打开你的命令行终端比如Windows的CMD或PowerShellMac/Linux的Terminal依次输入下面的命令来安装这些库pip install Pillow opencv-python torch torchvision transformers简单解释一下这几个库是干什么的Pillow (PIL)这是Python里处理图片最常用、最基础的库打开、保存、调整大小、转换格式都靠它。opencv-python (cv2)功能更强大的图像处理库在做一些复杂的变换或者数据增强时特别有用。torch torchvisionPyTorch深度学习框架及其视觉工具包。我们主要用torchvision里的一些现成数据增强方法以及为后续可能用到的模型加载做准备。transformersHugging Face出品的库集成了大量预训练模型。我们将用它来加载一个能自动给图片打标签生成描述的模型。安装完成后你可以创建一个新的Python脚本文件比如叫做prepare_dataset.py然后把下面我们要讲的代码都写进去。2. 第一步图像预处理——让图片“整齐划一”收集来的原始图片可能千奇百怪有的大有的小有的是PNG有的是JPEG。第一步我们要把它们统一成模型喜欢的格式和尺寸。2.1 统一尺寸和格式Z-Image-GGUF这类文生图模型通常有固定的输入分辨率比如512x512或768x768。统一尺寸能保证训练稳定。同时将格式统一为JPEG或PNG也能避免一些兼容性问题。下面的代码定义了一个函数可以批量将图片调整到目标大小并转换成统一的格式。from PIL import Image import os def preprocess_images(input_dir, output_dir, target_size(512, 512), output_formatJPEG): 批量预处理图片调整尺寸、转换格式。 参数: input_dir: 原始图片所在的文件夹路径。 output_dir: 处理后的图片保存路径。 target_size: 目标尺寸默认为(512, 512)。 output_format: 输出格式如JPEG, PNG。 # 如果输出文件夹不存在就创建它 os.makedirs(output_dir, exist_okTrue) # 支持的图片格式 valid_extensions (.jpg, .jpeg, .png, .bmp, .gif) processed_count 0 for filename in os.listdir(input_dir): if filename.lower().endswith(valid_extensions): try: # 构建完整的文件路径 input_path os.path.join(input_dir, filename) # 生成输出文件名可以保持原名只改后缀 name_without_ext os.path.splitext(filename)[0] output_filename f{name_without_ext}.{output_format.lower()} output_path os.path.join(output_dir, output_filename) # 用PIL打开并处理图片 with Image.open(input_path) as img: # 转换为RGB模式避免RGBA等模式问题 if img.mode ! RGB: img img.convert(RGB) # 调整尺寸。使用LANCZOS重采样质量较好 img_resized img.resize(target_size, Image.Resampling.LANCZOS) # 保存图片 img_resized.save(output_path, formatoutput_format) processed_count 1 print(f已处理: {filename} - {output_filename}) except Exception as e: print(f处理图片 {filename} 时出错: {e}) print(f\n预处理完成共处理了 {processed_count} 张图片。) # 使用示例假设你的原始图片在 ./raw_images想输出到 ./processed_images if __name__ __main__: preprocess_images(./raw_images, ./processed_images, target_size(768, 768), output_formatJPEG)运行这段代码它就会把你raw_images文件夹里的图片全部转换成768x768大小的JPEG图片并保存到processed_images文件夹。2.2 基础数据增强可选但推荐如果你的图片数量不够多或者希望模型能学到更鲁棒的特征可以做一点简单的数据增强。比如随机水平翻转、小幅度的裁剪这能模拟现实世界中物体角度的变化。这里我们用torchvision来方便地实现。注意数据增强是在训练过程中实时进行的而不是预先处理好存下来。下面是一个如何在数据加载时加入增强的示例from torchvision import transforms # 定义训练时用的数据增强管道 train_transform transforms.Compose([ transforms.Resize((768, 768)), # 首先缩放到稍大的尺寸 transforms.RandomCrop(768), # 随机裁剪回目标尺寸 transforms.RandomHorizontalFlip(p0.5), # 50%概率水平翻转 transforms.ToTensor(), # 将PIL图像转为Tensor # 可以加入归一化具体数值取决于你的模型要求 # transforms.Normalize(mean[0.5, 0.5, 0.5], std[0.5, 0.5, 0.5]), ]) # 定义验证/测试时用的转换通常不做增强只做缩放和Tensor转换 val_transform transforms.Compose([ transforms.Resize((768, 768)), transforms.ToTensor(), # transforms.Normalize(...), ])你可以在后续创建PyTorch的Dataset类时将这些transform应用到加载的图片上。这样每次模型读取图片时都会得到一张经过随机增强的、略有不同的版本能有效提升模型的泛化能力。3. 第二步自动图像标注——给图片配上“文字说明书”这是最关键的一步。我们需要为每张处理好的图片生成一段准确的文字描述。手动写太耗时我们可以借助一个现成的视觉-语言模型比如BLIP来自动完成这个工作。3.1 使用BLIP模型生成描述BLIP模型能很好地理解图片内容并生成连贯的描述。下面的代码演示了如何批量处理图片文件夹为每张图生成描述并保存到文本文件。from transformers import BlipProcessor, BlipForConditionalGeneration from PIL import Image import torch import os def generate_captions_with_blip(image_dir, output_text_filecaptions.txt, model_nameSalesforce/blip-image-captioning-base): 使用BLIP模型为文件夹内的所有图片生成描述。 参数: image_dir: 处理好的图片文件夹路径。 output_text_file: 保存描述的文件名。 model_name: 使用的BLIP模型名称。 # 检查是否有GPU可用有的话会快很多 device cuda if torch.cuda.is_available() else cpu print(f使用设备: {device}) # 加载BLIP模型和处理器 print(正在加载BLIP模型这可能需要一点时间...) processor BlipProcessor.from_pretrained(model_name) model BlipForConditionalGeneration.from_pretrained(model_name).to(device) captions [] valid_extensions (.jpg, .jpeg, .png) for filename in sorted(os.listdir(image_dir)): # 排序便于对照 if filename.lower().endswith(valid_extensions): image_path os.path.join(image_dir, filename) try: # 打开图片 raw_image Image.open(image_path).convert(RGB) # 处理图片并生成描述 inputs processor(raw_image, return_tensorspt).to(device) out model.generate(**inputs, max_new_tokens50) # max_new_tokens控制描述长度 caption processor.decode(out[0], skip_special_tokensTrue) # 将图片文件名和描述对应存储 captions.append(f{filename}|{caption}) print(f{filename}: {caption}) except Exception as e: print(f处理图片 {filename} 生成描述时出错: {e}) captions.append(f{filename}|[生成描述失败]) # 将所有描述写入文件 with open(output_text_file, w, encodingutf-8) as f: f.write(\n.join(captions)) print(f\n描述已生成并保存到: {output_text_file}) return captions # 使用示例为./processed_images中的图片生成描述 if __name__ __main__: generate_captions_with_blip(./processed_images, image_captions.txt)运行后你会得到一个image_captions.txt文件里面每行内容像这样cat_001.jpg|a cute cat sitting on a windowsill。竖线|分隔了图片文件名和它的描述。3.2 描述文本的清洗与优化自动生成的描述可能不完美比如太笼统“一张图片”或者包含不相关的细节。我们可以写一些简单的规则来清洗和优化它们。def clean_and_enrich_captions(caption_file, cleaned_filecleaned_captions.txt): 清洗和优化描述文本。 with open(caption_file, r, encodingutf-8) as f: lines f.readlines() cleaned_lines [] for line in lines: if | not in line: continue filename, caption line.strip().split(|, 1) # 示例清洗规则你可以根据需求调整 # 1. 转换为小写可选取决于模型 caption caption.lower() # 2. 移除一些无意义的开头短语 useless_prefixes [a picture of, an image of, a photo of, a photograph of] for prefix in useless_prefixes: if caption.startswith(prefix): caption caption[len(prefix):].strip() # 确保句子首字母大写 if caption: caption caption[0].upper() caption[1:] # 3. 确保句子以句号结束如果模型训练需要 if caption and not caption.endswith(.): caption caption . # 4. 你可以在这里添加更多规则比如替换同义词、添加风格标签等。 # 例如如果图片都是“水墨画风格”可以统一追加标签 # caption caption , ink wash painting style. cleaned_lines.append(f{filename}|{caption}) # 保存清洗后的描述 with open(cleaned_file, w, encodingutf-8) as f: f.write(\n.join(cleaned_lines)) print(f描述清洗完成保存到: {cleaned_file}) return cleaned_lines # 使用示例 clean_and_enrich_captions(image_captions.txt, cleaned_captions.txt)手动检查至关重要自动清洗后强烈建议你打开cleaned_captions.txt文件快速浏览一遍。对于重要的数据集花点时间手动修正一些明显错误的描述对最终的微调效果提升会非常大。4. 第三步组装与验证——创建最终的数据集现在我们有了处理好的图片和清洗过的描述文本最后一步是把它们组装成模型微调时能直接读取的格式并做最终检查。4.1 创建数据集清单文件常见的微调格式如LoRA训练通常需要一个描述文件里面列出了所有图片的路径和对应的描述。我们可以很容易地从之前的文本文件生成它。import os import json import random def create_dataset_manifest(image_dir, caption_file, output_jsonldataset.jsonl, val_ratio0.1): 创建数据集清单文件并划分训练集和验证集。 参数: image_dir: 图片文件夹路径。 caption_file: 清洗后的描述文件。 output_jsonl: 输出的JSONL格式文件名。 val_ratio: 验证集比例。 # 读取描述 with open(caption_file, r, encodingutf-8) as f: lines [line.strip() for line in f if line.strip()] items [] for line in lines: if | not in line: continue filename, caption line.split(|, 1) # 构建图片的绝对或相对路径 image_path os.path.join(image_dir, filename) # 确保图片文件存在 if os.path.exists(image_path): items.append({ image_file: image_path, text: caption }) else: print(f警告: 图片文件不存在已跳过 - {image_path}) # 随机打乱并划分数据集 random.shuffle(items) split_idx int(len(items) * (1 - val_ratio)) train_items items[:split_idx] val_items items[split_idx:] if val_ratio 0 else [] # 保存训练集清单 with open(train_ output_jsonl, w, encodingutf-8) as f: for item in train_items: f.write(json.dumps(item, ensure_asciiFalse) \n) # 保存验证集清单如果有 if val_items: with open(val_ output_jsonl, w, encodingutf-8) as f: for item in val_items: f.write(json.dumps(item, ensure_asciiFalse) \n) print(f数据集清单创建完成) print(f 训练集样本数: {len(train_items)}) print(f 验证集样本数: {len(val_items)}) print(f 文件已保存: train_{output_jsonl}, val_{output_jsonl}) # 使用示例 create_dataset_manifest(./processed_images, cleaned_captions.txt, val_ratio0.1)运行后你会得到train_dataset.jsonl和val_dataset.jsonl两个文件。这就是最终可以喂给微调脚本的数据集了。每一行都是一个JSON对象包含image_file图片路径和text描述文本。4.2 最终数据质量检查在开始漫长的训练之前最后做一次快速检查是值得的。下面这个简单的脚本可以帮你随机抽样查看一些数据对确保图片和描述是匹配且合理的。import json from PIL import Image import random def spot_check_dataset(jsonl_file, image_dir, sample_size5): 随机抽样检查数据集。 with open(jsonl_file, r, encodingutf-8) as f: lines f.readlines() samples random.sample(lines, min(sample_size, len(lines))) print(f\n 随机抽查 {len(samples)} 个样本 ) for i, line in enumerate(samples): data json.loads(line) img_path data[image_file] caption data[text] print(f\n样本 {i1}:) print(f 描述: {caption}) print(f 图片路径: {img_path}) # 尝试打开并显示图片在支持图形界面的环境中 try: img Image.open(img_path) print(f 图片尺寸: {img.size}, 模式: {img.mode}) # 如果你想实际显示图片可以取消下面这行的注释需要GUI环境 # img.show(titlefSample {i1}) img.close() except Exception as e: print(f 无法打开图片: {e}) # 检查训练集 spot_check_dataset(train_dataset.jsonl, ., sample_size3)5. 总结与后续步骤走完上面这三步一份为Z-Image-GGUF模型量身定制的微调数据集就准备好了。整个过程的核心其实就是标准化和自动化用Pillow/OpenCV把图片变得整齐用BLIP这样的模型给图片配上文字说明最后再把它们整理成训练需要的格式。我建议你在第一次操作时先用几十张图片跑通整个流程看看生成的描述质量如何数据清单文件是否正确。确认无误后再扩展到你的整个图片集。数据标注的质量对微调结果的影响非常大所以花在清洗和检查描述文本上的时间绝对是值得的。有了这个高质量的数据集接下来你就可以使用相应的微调脚本比如基于LoRA的来训练你的Z-Image-GGUF模型了。训练时记得在脚本中指定我们刚生成的train_dataset.jsonl和val_dataset.jsonl作为数据源。希望这份指南能帮你扫清数据准备阶段的障碍祝你训练出效果惊艳的专属模型获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
Z-Image-GGUF模型微调数据准备:利用Python进行图像预处理与标注
Z-Image-GGUF模型微调数据准备利用Python进行图像预处理与标注想用Z-Image-GGUF模型生成更符合你心意的图片吗比如让它专门为你画特定风格的插画或者精准生成你公司产品的宣传图直接拿网上随便找的图片去训练效果往往不尽人意。问题的关键常常出在数据上。模型微调就像教一个聪明的学生你喂给它什么样的“教材”它就能学会什么样的“知识”。杂乱无章、大小不一、描述不清的图片只会让它学得一头雾水。今天我们就来聊聊怎么用Python亲手为你的Z-Image-GGUF模型准备一份高质量的“专属教材”——也就是微调数据集。整个过程并不复杂核心就是两件事把图片处理得整整齐齐再给每张图片配上准确、丰富的文字描述。下面我就带你一步步走完这个流程从零开始准备好你的数据。1. 准备工作搭建你的Python工具箱工欲善其事必先利其器。在开始处理图片之前我们需要先把几个好用的Python库安装好。它们各自有擅长的领域组合起来就能搞定所有事情。打开你的命令行终端比如Windows的CMD或PowerShellMac/Linux的Terminal依次输入下面的命令来安装这些库pip install Pillow opencv-python torch torchvision transformers简单解释一下这几个库是干什么的Pillow (PIL)这是Python里处理图片最常用、最基础的库打开、保存、调整大小、转换格式都靠它。opencv-python (cv2)功能更强大的图像处理库在做一些复杂的变换或者数据增强时特别有用。torch torchvisionPyTorch深度学习框架及其视觉工具包。我们主要用torchvision里的一些现成数据增强方法以及为后续可能用到的模型加载做准备。transformersHugging Face出品的库集成了大量预训练模型。我们将用它来加载一个能自动给图片打标签生成描述的模型。安装完成后你可以创建一个新的Python脚本文件比如叫做prepare_dataset.py然后把下面我们要讲的代码都写进去。2. 第一步图像预处理——让图片“整齐划一”收集来的原始图片可能千奇百怪有的大有的小有的是PNG有的是JPEG。第一步我们要把它们统一成模型喜欢的格式和尺寸。2.1 统一尺寸和格式Z-Image-GGUF这类文生图模型通常有固定的输入分辨率比如512x512或768x768。统一尺寸能保证训练稳定。同时将格式统一为JPEG或PNG也能避免一些兼容性问题。下面的代码定义了一个函数可以批量将图片调整到目标大小并转换成统一的格式。from PIL import Image import os def preprocess_images(input_dir, output_dir, target_size(512, 512), output_formatJPEG): 批量预处理图片调整尺寸、转换格式。 参数: input_dir: 原始图片所在的文件夹路径。 output_dir: 处理后的图片保存路径。 target_size: 目标尺寸默认为(512, 512)。 output_format: 输出格式如JPEG, PNG。 # 如果输出文件夹不存在就创建它 os.makedirs(output_dir, exist_okTrue) # 支持的图片格式 valid_extensions (.jpg, .jpeg, .png, .bmp, .gif) processed_count 0 for filename in os.listdir(input_dir): if filename.lower().endswith(valid_extensions): try: # 构建完整的文件路径 input_path os.path.join(input_dir, filename) # 生成输出文件名可以保持原名只改后缀 name_without_ext os.path.splitext(filename)[0] output_filename f{name_without_ext}.{output_format.lower()} output_path os.path.join(output_dir, output_filename) # 用PIL打开并处理图片 with Image.open(input_path) as img: # 转换为RGB模式避免RGBA等模式问题 if img.mode ! RGB: img img.convert(RGB) # 调整尺寸。使用LANCZOS重采样质量较好 img_resized img.resize(target_size, Image.Resampling.LANCZOS) # 保存图片 img_resized.save(output_path, formatoutput_format) processed_count 1 print(f已处理: {filename} - {output_filename}) except Exception as e: print(f处理图片 {filename} 时出错: {e}) print(f\n预处理完成共处理了 {processed_count} 张图片。) # 使用示例假设你的原始图片在 ./raw_images想输出到 ./processed_images if __name__ __main__: preprocess_images(./raw_images, ./processed_images, target_size(768, 768), output_formatJPEG)运行这段代码它就会把你raw_images文件夹里的图片全部转换成768x768大小的JPEG图片并保存到processed_images文件夹。2.2 基础数据增强可选但推荐如果你的图片数量不够多或者希望模型能学到更鲁棒的特征可以做一点简单的数据增强。比如随机水平翻转、小幅度的裁剪这能模拟现实世界中物体角度的变化。这里我们用torchvision来方便地实现。注意数据增强是在训练过程中实时进行的而不是预先处理好存下来。下面是一个如何在数据加载时加入增强的示例from torchvision import transforms # 定义训练时用的数据增强管道 train_transform transforms.Compose([ transforms.Resize((768, 768)), # 首先缩放到稍大的尺寸 transforms.RandomCrop(768), # 随机裁剪回目标尺寸 transforms.RandomHorizontalFlip(p0.5), # 50%概率水平翻转 transforms.ToTensor(), # 将PIL图像转为Tensor # 可以加入归一化具体数值取决于你的模型要求 # transforms.Normalize(mean[0.5, 0.5, 0.5], std[0.5, 0.5, 0.5]), ]) # 定义验证/测试时用的转换通常不做增强只做缩放和Tensor转换 val_transform transforms.Compose([ transforms.Resize((768, 768)), transforms.ToTensor(), # transforms.Normalize(...), ])你可以在后续创建PyTorch的Dataset类时将这些transform应用到加载的图片上。这样每次模型读取图片时都会得到一张经过随机增强的、略有不同的版本能有效提升模型的泛化能力。3. 第二步自动图像标注——给图片配上“文字说明书”这是最关键的一步。我们需要为每张处理好的图片生成一段准确的文字描述。手动写太耗时我们可以借助一个现成的视觉-语言模型比如BLIP来自动完成这个工作。3.1 使用BLIP模型生成描述BLIP模型能很好地理解图片内容并生成连贯的描述。下面的代码演示了如何批量处理图片文件夹为每张图生成描述并保存到文本文件。from transformers import BlipProcessor, BlipForConditionalGeneration from PIL import Image import torch import os def generate_captions_with_blip(image_dir, output_text_filecaptions.txt, model_nameSalesforce/blip-image-captioning-base): 使用BLIP模型为文件夹内的所有图片生成描述。 参数: image_dir: 处理好的图片文件夹路径。 output_text_file: 保存描述的文件名。 model_name: 使用的BLIP模型名称。 # 检查是否有GPU可用有的话会快很多 device cuda if torch.cuda.is_available() else cpu print(f使用设备: {device}) # 加载BLIP模型和处理器 print(正在加载BLIP模型这可能需要一点时间...) processor BlipProcessor.from_pretrained(model_name) model BlipForConditionalGeneration.from_pretrained(model_name).to(device) captions [] valid_extensions (.jpg, .jpeg, .png) for filename in sorted(os.listdir(image_dir)): # 排序便于对照 if filename.lower().endswith(valid_extensions): image_path os.path.join(image_dir, filename) try: # 打开图片 raw_image Image.open(image_path).convert(RGB) # 处理图片并生成描述 inputs processor(raw_image, return_tensorspt).to(device) out model.generate(**inputs, max_new_tokens50) # max_new_tokens控制描述长度 caption processor.decode(out[0], skip_special_tokensTrue) # 将图片文件名和描述对应存储 captions.append(f{filename}|{caption}) print(f{filename}: {caption}) except Exception as e: print(f处理图片 {filename} 生成描述时出错: {e}) captions.append(f{filename}|[生成描述失败]) # 将所有描述写入文件 with open(output_text_file, w, encodingutf-8) as f: f.write(\n.join(captions)) print(f\n描述已生成并保存到: {output_text_file}) return captions # 使用示例为./processed_images中的图片生成描述 if __name__ __main__: generate_captions_with_blip(./processed_images, image_captions.txt)运行后你会得到一个image_captions.txt文件里面每行内容像这样cat_001.jpg|a cute cat sitting on a windowsill。竖线|分隔了图片文件名和它的描述。3.2 描述文本的清洗与优化自动生成的描述可能不完美比如太笼统“一张图片”或者包含不相关的细节。我们可以写一些简单的规则来清洗和优化它们。def clean_and_enrich_captions(caption_file, cleaned_filecleaned_captions.txt): 清洗和优化描述文本。 with open(caption_file, r, encodingutf-8) as f: lines f.readlines() cleaned_lines [] for line in lines: if | not in line: continue filename, caption line.strip().split(|, 1) # 示例清洗规则你可以根据需求调整 # 1. 转换为小写可选取决于模型 caption caption.lower() # 2. 移除一些无意义的开头短语 useless_prefixes [a picture of, an image of, a photo of, a photograph of] for prefix in useless_prefixes: if caption.startswith(prefix): caption caption[len(prefix):].strip() # 确保句子首字母大写 if caption: caption caption[0].upper() caption[1:] # 3. 确保句子以句号结束如果模型训练需要 if caption and not caption.endswith(.): caption caption . # 4. 你可以在这里添加更多规则比如替换同义词、添加风格标签等。 # 例如如果图片都是“水墨画风格”可以统一追加标签 # caption caption , ink wash painting style. cleaned_lines.append(f{filename}|{caption}) # 保存清洗后的描述 with open(cleaned_file, w, encodingutf-8) as f: f.write(\n.join(cleaned_lines)) print(f描述清洗完成保存到: {cleaned_file}) return cleaned_lines # 使用示例 clean_and_enrich_captions(image_captions.txt, cleaned_captions.txt)手动检查至关重要自动清洗后强烈建议你打开cleaned_captions.txt文件快速浏览一遍。对于重要的数据集花点时间手动修正一些明显错误的描述对最终的微调效果提升会非常大。4. 第三步组装与验证——创建最终的数据集现在我们有了处理好的图片和清洗过的描述文本最后一步是把它们组装成模型微调时能直接读取的格式并做最终检查。4.1 创建数据集清单文件常见的微调格式如LoRA训练通常需要一个描述文件里面列出了所有图片的路径和对应的描述。我们可以很容易地从之前的文本文件生成它。import os import json import random def create_dataset_manifest(image_dir, caption_file, output_jsonldataset.jsonl, val_ratio0.1): 创建数据集清单文件并划分训练集和验证集。 参数: image_dir: 图片文件夹路径。 caption_file: 清洗后的描述文件。 output_jsonl: 输出的JSONL格式文件名。 val_ratio: 验证集比例。 # 读取描述 with open(caption_file, r, encodingutf-8) as f: lines [line.strip() for line in f if line.strip()] items [] for line in lines: if | not in line: continue filename, caption line.split(|, 1) # 构建图片的绝对或相对路径 image_path os.path.join(image_dir, filename) # 确保图片文件存在 if os.path.exists(image_path): items.append({ image_file: image_path, text: caption }) else: print(f警告: 图片文件不存在已跳过 - {image_path}) # 随机打乱并划分数据集 random.shuffle(items) split_idx int(len(items) * (1 - val_ratio)) train_items items[:split_idx] val_items items[split_idx:] if val_ratio 0 else [] # 保存训练集清单 with open(train_ output_jsonl, w, encodingutf-8) as f: for item in train_items: f.write(json.dumps(item, ensure_asciiFalse) \n) # 保存验证集清单如果有 if val_items: with open(val_ output_jsonl, w, encodingutf-8) as f: for item in val_items: f.write(json.dumps(item, ensure_asciiFalse) \n) print(f数据集清单创建完成) print(f 训练集样本数: {len(train_items)}) print(f 验证集样本数: {len(val_items)}) print(f 文件已保存: train_{output_jsonl}, val_{output_jsonl}) # 使用示例 create_dataset_manifest(./processed_images, cleaned_captions.txt, val_ratio0.1)运行后你会得到train_dataset.jsonl和val_dataset.jsonl两个文件。这就是最终可以喂给微调脚本的数据集了。每一行都是一个JSON对象包含image_file图片路径和text描述文本。4.2 最终数据质量检查在开始漫长的训练之前最后做一次快速检查是值得的。下面这个简单的脚本可以帮你随机抽样查看一些数据对确保图片和描述是匹配且合理的。import json from PIL import Image import random def spot_check_dataset(jsonl_file, image_dir, sample_size5): 随机抽样检查数据集。 with open(jsonl_file, r, encodingutf-8) as f: lines f.readlines() samples random.sample(lines, min(sample_size, len(lines))) print(f\n 随机抽查 {len(samples)} 个样本 ) for i, line in enumerate(samples): data json.loads(line) img_path data[image_file] caption data[text] print(f\n样本 {i1}:) print(f 描述: {caption}) print(f 图片路径: {img_path}) # 尝试打开并显示图片在支持图形界面的环境中 try: img Image.open(img_path) print(f 图片尺寸: {img.size}, 模式: {img.mode}) # 如果你想实际显示图片可以取消下面这行的注释需要GUI环境 # img.show(titlefSample {i1}) img.close() except Exception as e: print(f 无法打开图片: {e}) # 检查训练集 spot_check_dataset(train_dataset.jsonl, ., sample_size3)5. 总结与后续步骤走完上面这三步一份为Z-Image-GGUF模型量身定制的微调数据集就准备好了。整个过程的核心其实就是标准化和自动化用Pillow/OpenCV把图片变得整齐用BLIP这样的模型给图片配上文字说明最后再把它们整理成训练需要的格式。我建议你在第一次操作时先用几十张图片跑通整个流程看看生成的描述质量如何数据清单文件是否正确。确认无误后再扩展到你的整个图片集。数据标注的质量对微调结果的影响非常大所以花在清洗和检查描述文本上的时间绝对是值得的。有了这个高质量的数据集接下来你就可以使用相应的微调脚本比如基于LoRA的来训练你的Z-Image-GGUF模型了。训练时记得在脚本中指定我们刚生成的train_dataset.jsonl和val_dataset.jsonl作为数据源。希望这份指南能帮你扫清数据准备阶段的障碍祝你训练出效果惊艳的专属模型获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。