Datawhale AI夏令营第四期 AIGC方向 task02 初学者笔记

Datawhale AI夏令营第四期 AIGC方向 task02 初学者笔记

    正在检查是否收录...

一、Prompt工程介绍:
1、概念:

Prompt工程,也称为提示工程或指令工程,是在自然语言处理(NLP)领域中一种重要的技术和方法。它主要用于指导预训练的大规模语言模型(Large Language Models, LLMs)生成高质量、准确且有针对性的输出。通过设计、实验和优化输入提示词(Prompt),Prompt工程能够引导预训练语言模型生成所需的响应或完成特定任务。

2、构成要素:
引导语或指示语:明确告诉模型需要完成什么样的任务。

下文信息:提供必要的背景知识,帮助模型更好地理解问题。

任务描述:明确地描述期望模型执行的具体任务。

输出格式指示:如果需要特定格式的输出,需要在Prompt中指明。

角色设定:为模型定义一个角色,以缩小问题范围并减少歧义。

3、应用:
指导模型行为:通过精确的Prompt,可以明确地告诉模型需要执行什么任务,比如回答问题、创作故事、提供建议等。

提高输出内容准确性:精心设计的Prompt可以帮助模型生成更准确、相关度更高的内容。

减少输出内容偏差:通过提供适当的指导,可以减少模型可能产生的偏见或错误信息。

规定输出格式:对于需要特定格式的输出,如表格、列表、段落等,可通过Prompt指定输出格式。

促进创造性应用:规范的Prompt可以激发模型创造力,生成新颖的想法、故事或艺术作品。

灵活调整:通过修改Prompt,可以在不改变模型本身的情况下调整其输出,从而实现快速迭代和测试。

二、代码展示:

!pip install simple-aesthetics-predictor !pip install -v -e data-juicer !pip uninstall pytorch-lightning -y !pip install peft lightning pandas torchvision !pip install -e DiffSynth-Studio from modelscope.msdatasets import MsDataset ds = MsDataset.load( 'AI-ModelScope/lowres_anime', subset_name='default', split='train', cache_dir="/mnt/workspace/kolors/data" ) import json, os from data_juicer.utils.mm_utils import SpecialTokens from tqdm import tqdm os.makedirs("./data/lora_dataset/train", exist_ok=True) os.makedirs("./data/data-juicer/input", exist_ok=True) with open("./data/data-juicer/input/metadata.jsonl", "w") as f: for data_id, data in enumerate(tqdm(ds)): image = data["image"].convert("RGB") image.save(f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg") metadata = {"text": "二次元", "image": [f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg"]} f.write(json.dumps(metadata)) f.write("\n") data_juicer_config = """ # global parameters project_name: 'data-process' dataset_path: './data/data-juicer/input/metadata.jsonl' # path to your dataset directory or file np: 4 # number of subprocess to process your dataset text_keys: 'text' image_key: 'image' image_special_token: '<__dj__image>' export_path: './data/data-juicer/output/result.jsonl' # process schedule # a list of several process operators with their arguments process: - image_shape_filter: min_width: 1024 min_height: 1024 any_or_all: any - image_aspect_ratio_filter: min_ratio: 0.5 max_ratio: 2.0 any_or_all: any """ with open("data/data-juicer/data_juicer_config.yaml", "w") as file: file.write(data_juicer_config.strip()) !dj-process --config data/data-juicer/data_juicer_config.yaml import pandas as pd import os, json from PIL import Image from tqdm import tqdm texts, file_names = [], [] os.makedirs("./data/data-juicer/output/images", exist_ok=True) with open("./data/data-juicer/output/result.jsonl", "r") as f: for line in tqdm(f): metadata = json.loads(line) texts.append(metadata["text"]) file_names.append(metadata["image"][0]) df = pd.DataFrame({"text": texts, "file_name": file_names}) df.to_csv("./data/data-juicer/output/result.csv", index=False) df from transformers import CLIPProcessor, CLIPModel import torch model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32") processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32") images = [Image.open(img_path) for img_path in df["file_name"]] inputs = processor(text=df["text"].tolist(), images=images, return_tensors="pt", padding=True) outputs = model(**inputs) logits_per_image = outputs.logits_per_image # this is the image-text similarity score probs = logits_per_image.softmax(dim=1) # we can take the softmax to get the probabilities probs from torch.utils.data import Dataset, DataLoader class CustomDataset(Dataset): def __init__(self, df, processor): self.texts = df["text"].tolist() self.images = [Image.open(img_path) for img_path in df["file_name"]] self.processor = processor def __len__(self): return len(self.texts) def __getitem__(self, idx): inputs = self.processor(text=self.texts[idx], images=self.images[idx], return_tensors="pt", padding=True) return inputs dataset = CustomDataset(df, processor) dataloader = DataLoader(dataset, batch_size=8) for batch in dataloader: outputs = model(**batch) logits_per_image = outputs.logits_per_image probs = logits_per_image.softmax(dim=1) print(probs) import torch from diffusers import StableDiffusionPipeline torch.manual_seed(1) pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v-1-4", torch_dtype=torch.float16) pipe = pipe.to("cuda") prompt = "二次元,一个紫色长发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌,手持话筒" negative_prompt = "丑陋、变形、嘈杂、模糊、低对比度" guidance_scale = 4 num_inference_steps = 50 image = pipe( prompt=prompt, negative_prompt=negative_prompt, guidance_scale=guidance_scale, num_inference_steps=num_inference_steps, height=1024, width=1024, ).images[0] image.save("example_image.png") image from PIL import Image torch.manual_seed(1) image = pipe( prompt="二次元,日系动漫,演唱会的观众席,人山人海,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,舞台上衣着华丽的歌星们在唱歌", negative_prompt="丑陋、变形、嘈杂、模糊、低对比度", cfg_scale=4, num_inference_steps=50, height=1024, width=1024, ) image.save("1.jpg") torch.manual_seed(1) image = pipe( prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,露出憧憬的神情", negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,色情擦边", cfg_scale=4, num_inference_steps=50, height=1024, width=1024, ) image.save("2.jpg") torch.manual_seed(2) image = pipe( prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,露出憧憬的神情", negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,色情擦边", cfg_scale=4, num_inference_steps=50, height=1024, width=1024, ) image.save("3.jpg") torch.manual_seed(5) image = pipe( prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙,对着流星许愿,闭着眼睛,十指交叉,侧面", negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,扭曲的手指,多余的手指", cfg_scale=4, num_inference_steps=50, height=1024, width=1024, ) image.save("4.jpg") torch.manual_seed(0) image = pipe( prompt="二次元,一个紫色中等长度头发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌", negative_prompt="丑陋、变形、嘈杂、模糊、低对比度", cfg_scale=4, num_inference_steps=50, height=1024, width=1024, ) image.save("5.jpg") torch.manual_seed(1) image = pipe( prompt="二次元,一个紫色长发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌,手持话筒", negative_prompt="丑陋、变形、嘈杂、模糊、低对比度", cfg_scale=4, num_inference_steps=50, height=1024, width=1024, ) image.save("6.jpg") torch.manual_seed(7) image = pipe( prompt="二次元,紫色长发少女,穿着黑色连衣裙,试衣间,心情忐忑", negative_prompt="丑陋、变形、嘈杂、模糊、低对比度", cfg_scale=4, num_inference_steps=50, height=1024, width=1024, ) image.save("7.jpg") torch.manual_seed(0) image = pipe( prompt="二次元,紫色长发少女,穿着黑色礼服,连衣裙,在台上唱歌", negative_prompt="丑陋、变形、嘈杂、模糊、低对比度", cfg_scale=4, num_inference_steps=50, height=1024, width=1024, ) image.save("8.jpg") import numpy as np from PIL import Image images = [np.array(Image.open(f"{i}.jpg")) for i in range(1, 9)] image = np.concatenate([ np.concatenate(images[0:2], axis=1), np.concatenate(images[2:4], axis=1), np.concatenate(images[4:6], axis=1), np.concatenate(images[6:8], axis=1), ], axis=0) image = Image.fromarray(image).resize((1024, 2048)) image 

三、代码分析:
1、数据处理:

数据加载与预处理:

首先,使用modelscope.msdatasets加载了一个名为AI-ModelScope/lowres_anime的数据集,这是一个二次元低分辨率动漫图像的数据集。接着,通过遍历数据集中的每个样本,将图像转换为RGB格式并保存到指定路径。同时,为每个图像生成一个包含文本("二次元")和图像路径的元数据文件metadata.jsonl。

数据清洗与过滤:

使用data-juicer工具(通过dj-process命令)对图像数据进行进一步处理,包括形状过滤和长宽比过滤,以确保图像满足一定的质量要求。处理后的结果保存在result.jsonl文件中,并转换成CSV格式以便于后续操作。

2、图像-文本相似度分析(使用CLIP模型):
加载预训练的CLIP模型(CLIPModel.from_pretrained("openai/clip-vit-base-patch32"))和对应的处理器(CLIPProcessor)。将清洗后的图像和对应的文本("二次元")作为输入,通过CLIP模型计算图像-文本的相似度得分。使用CustomDataset和DataLoader将数据和模型整合到PyTorch的数据加载流程中,以便进行批量处理。

3、图像生成(使用StableDiffusionPipeline):
加载预训练的StableDiffusion模型(StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v-1-4")),并配置到CUDA上进行加速。使用不同的prompt(包含详细的描述信息)和negative_prompt(排除不希望出现的元素)来指导模型生成图像。通过调整cfg_scale(引导强度)、num_inference_steps(推理步数)等参数来控制生成图像的质量和细节。将生成的图像保存到本地文件中,并进行展示或进一步处理。

四、实践:
1、更换提示词:


2、操作过程具体看task 01;

3、生成图片展示:

总结

### 文章总结
#### 一、Prompt工程介绍
**1. 概念**
- **Prompt工程**(也称为提示工程或指令工程)是自然语言处理(NLP)中的一种技术方法,用于指导预训练的大规模语言模型(LLMs)生成高质量、准确且有针对性的输出。通过精心设计、实验和优化输入提示词(Prompt),该技术能够引导模型执行特定任务。
**2. 构成要素**
- **引导语或指示语**:明确告诉模型任务要求。
- **下文信息**:提供必要背景知识,帮助模型理解问题。
- **任务描述**:详细阐述期望模型执行的具体任务。
- **输出格式指示**:如果需要特定格式的输出,需在Prompt中指定。
- **角色设定**:为模型定义角色,缩小问题范围并减少歧义。
**3. 应用**
- **指导模型行为**:精确控制模型任务执行,如回答问题、创作故事等。
- **提高输出准确性**:优化Prompt设计以提升内容的准确度和相关性。
- **减少偏差**:通过适当指导减少模型偏见和错误信息。
- **规定输出格式**:通过Prompt指定输出格式如表格、列表等。
- **促进创造性**:规范的Prompt激发模型创作能力。
- **灵活调整**:不改变模型本身,通过修改Prompt快速迭代和测试输出。
#### 二、代码展示
代码展示部分包括数据处理、图像-文本相似度分析(使用CLIP模型)、图像生成(使用StableDiffusionPipeline)。
- **数据处理**:使用`modelscope.msdatasets`加载数据集,对数据进行遍历、清洗与过滤,并保存到指定路径和文件格式。
- **图像-文本相似度分析**:利用CLIP模型计算图像与其描述文本("二次元")的相似度得分,利用`DataLoader`进行批量处理。
- **图像生成**:加载StableDiffusion模型,通过调整不同的prompt和negative_prompt,以及配置参数如引导强度和推理步数,生成高质量的二次元图像,并保存展示。
#### 三、代码分析
**1. 数据处理**
- 数据集加载与预处理:加载动漫图像数据集,转换并保存图像,生成元数据文件。
- 数据过滤:使用data-juicer工具进行图像形状和长宽比过滤,确保数据质量。
**2. 图像-文本相似度分析**
- 加载并使用CLIP模型,计算图像与文本描述("二次元")之间的相似度得分。
- 使用自定义数据集和`DataLoader`进行批量处理。
**3. 图像生成**
- 加载并配置StableDiffusion模型,使用CUDA加速生成图像。
- 通过精确控制的Prompt和negative_prompt引导模型生成多样化的二次元图像,调整参数优化图像质量。
#### 四、实践
建议通过**更换不同的提示词**(Prompt)来观察并体验图像生成的多样性和灵活性。具体操作可参考任务01中的详细步骤。生成的图片可以进一步展示或用于其他分析。 prompt二次元cliclipjsondiffusionstablediffusiontpu数据集git图像生成prompt工程预训练提示词模型生成数据处理演唱会文本相似度kolcsv
  • 本文作者:李琛
  • 本文链接: https://wapzz.net/post-19332.html
  • 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。
本站部分内容来源于网络转载,仅供学习交流使用。如涉及版权问题,请及时联系我们,我们将第一时间处理。
文章很赞!支持一下吧 还没有人为TA充电
为TA充电
还没有人为TA充电
0
  • 支付宝打赏
    支付宝扫一扫
  • 微信打赏
    微信扫一扫
感谢支持
文章很赞!支持一下吧
关于作者
2.3W+
5
0
1
WAP站长官方

锅炉引风机控制系统总体设计

上一篇

超逼真AI生成电影来了!《泰坦尼克号》AI重生!浙大&amp;amp;阿里发布MovieDreamer,纯AI生成电影引爆热议!

下一篇
  • 复制图片
按住ctrl可打开默认菜单