#Datawhale AI夏令营第4期#AIGC方向 文生图 Task2

打印 上一主题 下一主题

主题 1619|帖子 1619|积分 4857

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Task2任务:对baseline的代码有一个更加细致的明确,然后学习如何借助AI来提升我们的自学习能力.
前沿知识:相识一下 AI生图技术 的能力&范围

AI生图技术,通常指的是使用人工智能(尤其是深度学习)来生成图像的技术。这类技术可以用于多种应用场景,好比图像增强、艺术创作、虚拟角色生成、产物可视化等。AI生成图片的能力非常广泛,可以生成各种范例的图片。
根据描述生成的一张图片:一个充满将来感的都会夜景,高楼林立,霓虹灯闪烁。
示例如下(图片由通义生成)

能力


  • 图像合成与创造
    AI可以根据给定的描述或者条件生成全新的图像,例如根据文本描述生成对应的图像。
  • 风格迁徙
    技术可以或许将一种图像的艺术风格应用到另一种图像上,实现风格的转换。
  • 图像修复与增强
    对于含糊、损坏或分辨率低的图像,AI可以帮助恢复细节,提高清楚度。
  • 个性化定制
    用户可以通过调整参数来自定义生成的内容,如改变图像中的颜色、样式或场景结构。
  • 高效生成
    一旦模子训练完成,可以快速生成大量的图像,这对于需要大量视觉素材的应用非常有用。
  • 多模态生成
    结合文本、音频等多种输入情势生成图像,增加交互性和多样性。
范围性


  • 数据偏见
    AI生图模子大概会放大训练数据中存在的偏见,导致生成的内容有失公正。
  • 创造性限定
    尽管AI可以生成新的图像,但它缺乏人类的创造力和想象力,很难完全模拟人类艺术家的独特风格。
  • 细节缺失
    在某些情况下,生成的图像大概在细节上不够准确或存在逻辑错误。
  • 计算资源需求高
    高质量的图像生成通常需要大量的计算资源,这对小型团队或个人用户来说大概是个挑战。
  • 伦理和隐私问题
    使用AI生成人脸或其他敏感信息大概导致侵犯隐私和伦理问题。
  • 版权问题
    生成的图像假如与已有的作品过于相似,大概会引发版权争议。
  • AI翻车:
    我们如今还可以经常在各类自媒体的文章中看到“AI翻车”的案例,那些往往也是需要解决的难点,某些“翻车”现象,也许在业界已有干系的解决方案。
目前大部分的模子,已经具备了去除 “AI味” 的能力,且大概存在容易误导他人的情况,这时间我们想辨别大概需要非常仔细地——


  • 观察图片的细节。仔细检查人物的面部特性,尤其是眼睛和嘴巴
  • 检查光线和阴影。分析图片中的光源是否同等,阴影的方向是否与光源符合,是否存在不天然的光线或阴影
  • 分析像素。放大图片,探求是否有含糊或像素化的部分。
  • 注意背景。检查背景中是否有不协调的元素,好比物体边沿是否平滑,背景中是否有不天然的重复模式。
而这些细节上的AI特性,也许就是我们在某些特定场景下需要解决的挑战。
补充:Deepfake技术
Deepfake技术是一种使用深度学习技术来创建高度传神且难以甄别的音视频内容的方法。这项技术最广为人知的应用之一是换脸,即将一个人的脸部更换成另一个人的脸部,同时保持声音、面部心情和身材动作的同等性。Deepfake技术的核心是生成式对抗网络(Generative Adversarial Networks, GANs),它通过两组相互竞争的人工智能模子来生成险些可以以假乱真的内容。
Part1:磨刀准备逐一认识通义千问

通义千问是具有信息查询、语言明确、文本创作等多能力的AI助手。我们可以看到,编程与技术支持能力是它的刚强之一。
主要功能模块:

  • 对话,支持文字输入,文件上传等模式,我们本次课程主要使用当前模块;
  • 效率,各种学习办公小工具;
  • 智能体,通义的智能体应用市场,各人可以根据自己的需求找到很多故意思的小应用。
我们在学习中,遇到任务问题都可以向《通义千问》提问,AI期间,学习效率大大提升。通义千问就是我们日常学习工作的AI助手。
Part2:精读baseline——从零入门AI生图

1.分析代码的主题架构;
我们可以使用通义千问来辅助我们明确代码,原始代码如下:
  1. !pip install simple-aesthetics-predictor
  2. !pip install -v -e data-juicer
  3. !pip uninstall pytorch-lightning -y
  4. !pip install peft lightning pandas torchvision
  5. !pip install -e DiffSynth-Studio
  6. from modelscope.msdatasets import MsDataset
  7. ds = MsDataset.load(
  8.     'AI-ModelScope/lowres_anime',
  9.     subset_name='default',
  10.     split='train',
  11.     cache_dir="/mnt/workspace/kolors/data"
  12. )
  13. import json, os
  14. from data_juicer.utils.mm_utils import SpecialTokens
  15. from tqdm import tqdm
  16. os.makedirs("./data/lora_dataset/train", exist_ok=True)
  17. os.makedirs("./data/data-juicer/input", exist_ok=True)
  18. with open("./data/data-juicer/input/metadata.jsonl", "w") as f:
  19.     for data_id, data in enumerate(tqdm(ds)):
  20.         image = data["image"].convert("RGB")
  21.         image.save(f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg")
  22.         metadata = {"text": "二次元", "image": [f"/mnt/workspace/kolors/data/lora_dataset/train/{data_id}.jpg"]}
  23.         f.write(json.dumps(metadata))
  24.         f.write("\n")
  25. data_juicer_config = """
  26. # global parameters
  27. project_name: 'data-process'
  28. dataset_path: './data/data-juicer/input/metadata.jsonl'  # path to your dataset directory or file
  29. np: 4  # number of subprocess to process your dataset
  30. text_keys: 'text'
  31. image_key: 'image'
  32. image_special_token: '<__dj__image>'
  33. export_path: './data/data-juicer/output/result.jsonl'
  34. # process schedule
  35. # a list of several process operators with their arguments
  36. process:
  37.     - image_shape_filter:
  38.         min_width: 1024
  39.         min_height: 1024
  40.         any_or_all: any
  41.     - image_aspect_ratio_filter:
  42.         min_ratio: 0.5
  43.         max_ratio: 2.0
  44.         any_or_all: any
  45. """
  46. with open("data/data-juicer/data_juicer_config.yaml", "w") as file:
  47.     file.write(data_juicer_config.strip())
  48. !dj-process --config data/data-juicer/data_juicer_config.yaml
  49. import pandas as pd
  50. import os, json
  51. from PIL import Image
  52. from tqdm import tqdm
  53. texts, file_names = [], []
  54. os.makedirs("./data/data-juicer/output/images", exist_ok=True)
  55. with open("./data/data-juicer/output/result.jsonl", "r") as f:
  56.     for line in tqdm(f):
  57.         metadata = json.loads(line)
  58.         texts.append(metadata["text"])
  59.         file_names.append(metadata["image"][0])
  60. df = pd.DataFrame({"text": texts, "file_name": file_names})
  61. df.to_csv("./data/data-juicer/output/result.csv", index=False)
  62. df
  63. from transformers import CLIPProcessor, CLIPModel
  64. import torch
  65. model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
  66. processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
  67. images = [Image.open(img_path) for img_path in df["file_name"]]
  68. inputs = processor(text=df["text"].tolist(), images=images, return_tensors="pt", padding=True)
  69. outputs = model(**inputs)
  70. logits_per_image = outputs.logits_per_image  # this is the image-text similarity score
  71. probs = logits_per_image.softmax(dim=1)  # we can take the softmax to get the probabilities
  72. probs
  73. from torch.utils.data import Dataset, DataLoader
  74. class CustomDataset(Dataset):
  75.     def __init__(self, df, processor):
  76.         self.texts = df["text"].tolist()
  77.         self.images = [Image.open(img_path) for img_path in df["file_name"]]
  78.         self.processor = processor
  79.     def __len__(self):
  80.         return len(self.texts)
  81.     def __getitem__(self, idx):
  82.         inputs = self.processor(text=self.texts[idx], images=self.images[idx], return_tensors="pt", padding=True)
  83.         return inputs
  84. dataset = CustomDataset(df, processor)
  85. dataloader = DataLoader(dataset, batch_size=8)
  86. for batch in dataloader:
  87.     outputs = model(**batch)
  88.     logits_per_image = outputs.logits_per_image
  89.     probs = logits_per_image.softmax(dim=1)
  90.     print(probs)
  91. import torch
  92. from diffusers import StableDiffusionPipeline
  93. torch.manual_seed(1)
  94. pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v-1-4", torch_dtype=torch.float16)
  95. pipe = pipe.to("cuda")
  96. prompt = "二次元,一个紫色长发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌,手持话筒"
  97. negative_prompt = "丑陋、变形、嘈杂、模糊、低对比度"
  98. guidance_scale = 4
  99. num_inference_steps = 50
  100. image = pipe(
  101.     prompt=prompt,
  102.     negative_prompt=negative_prompt,
  103.     guidance_scale=guidance_scale,
  104.     num_inference_steps=num_inference_steps,
  105.     height=1024,
  106.     width=1024,
  107. ).images[0]
  108. image.save("example_image.png")
  109. image
  110. from PIL import Image
  111. torch.manual_seed(1)
  112. image = pipe(
  113.     prompt="二次元,日系动漫,演唱会的观众席,人山人海,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,舞台上衣着华丽的歌星们在唱歌",
  114.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  115.     cfg_scale=4,
  116.     num_inference_steps=50, height=1024, width=1024,
  117. )
  118. image.save("1.jpg")
  119. torch.manual_seed(1)
  120. image = pipe(
  121.     prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,露出憧憬的神情",
  122.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,色情擦边",
  123.     cfg_scale=4,
  124.     num_inference_steps=50, height=1024, width=1024,
  125. )
  126. image.save("2.jpg")
  127. torch.manual_seed(2)
  128. image = pipe(
  129.     prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙坐在演唱会的观众席,露出憧憬的神情",
  130.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,色情擦边",
  131.     cfg_scale=4,
  132.     num_inference_steps=50, height=1024, width=1024,
  133. )
  134. image.save("3.jpg")
  135. torch.manual_seed(5)
  136. image = pipe(
  137.     prompt="二次元,一个紫色短发小女孩穿着粉色吊带漏肩连衣裙,对着流星许愿,闭着眼睛,十指交叉,侧面",
  138.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度,扭曲的手指,多余的手指",
  139.     cfg_scale=4,
  140.     num_inference_steps=50, height=1024, width=1024,
  141. )
  142. image.save("4.jpg")
  143. torch.manual_seed(0)
  144. image = pipe(
  145.     prompt="二次元,一个紫色中等长度头发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌",
  146.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  147.     cfg_scale=4,
  148.     num_inference_steps=50, height=1024, width=1024,
  149. )
  150. image.save("5.jpg")
  151. torch.manual_seed(1)
  152. image = pipe(
  153.     prompt="二次元,一个紫色长发小女孩穿着粉色吊带漏肩连衣裙,在练习室练习唱歌,手持话筒",
  154.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  155.     cfg_scale=4,
  156.     num_inference_steps=50, height=1024, width=1024,
  157. )
  158. image.save("6.jpg")
  159. torch.manual_seed(7)
  160. image = pipe(
  161.     prompt="二次元,紫色长发少女,穿着黑色连衣裙,试衣间,心情忐忑",
  162.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  163.     cfg_scale=4,
  164.     num_inference_steps=50, height=1024, width=1024,
  165. )
  166. image.save("7.jpg")
  167. torch.manual_seed(0)
  168. image = pipe(
  169.     prompt="二次元,紫色长发少女,穿着黑色礼服,连衣裙,在台上唱歌",
  170.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  171.     cfg_scale=4,
  172.     num_inference_steps=50, height=1024, width=1024,
  173. )
  174. image.save("8.jpg")
  175. import numpy as np
  176. from PIL import Image
  177. images = [np.array(Image.open(f"{i}.jpg")) for i in range(1, 9)]
  178. image = np.concatenate([
  179.     np.concatenate(images[0:2], axis=1),
  180.     np.concatenate(images[2:4], axis=1),
  181.     np.concatenate(images[4:6], axis=1),
  182.     np.concatenate(images[6:8], axis=1),
  183. ], axis=0)
  184. image = Image.fromarray(image).resize((1024, 2048))
  185. image
复制代码
这段代码包罗1)安装和卸载Python包、2)数据处置惩罚、3)使用CLIP模子举行图像-文本匹配、4)创建PyTorch数据集和数据加载器、5)使用Stable Diffusion生成图像,6)最终归并这些图像。
2.逐行解析代码
这段代码主要完成以下功能:

  • 安装和卸载一些Python包;
  • 从ModelScope加载一个名为lowres_anime的数据集,并生存图像到指定目录;
  • 创建并处置惩罚一个用于数据清洗的JSONL文件;
  • 使用data-juicer工具过滤和处置惩罚数据集;
  • 将处置惩罚后的数据集转换为CSV格式;
  • 根据数据集通过DiffSynth做Lora微调;
  • 加载Lora微调后的模子;
  • 设置提示词,用微调后的模子生成图片。
Part3:实战演练逐一基于话剧的连环画制作

我们假定一个剧本,具体的场景图片
1、女主正在上课
2、开始睡着了
3、进入梦乡,梦到自己站在路旁
4、王子骑马而来
5、两人相谈甚欢
6、一起坐在马背上
7、下课了,梦醒了
8、又回到了学习生活中
然后我们在通义千问的辅助下,生成提示词:

 我们再修改润色一下,最终得到的提示词如下:
图片编号
场景描述
正向提示词
反向提示词
图片1
女主正在上课
古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,深思,上半身,红色长裙
丑陋,变形,嘈杂,含糊,低对比度
图片2
开始睡着了
古风,水墨画,一个黑色长发少女,坐在教室里,趴在桌子上睡着了,上半身,红色长裙
丑陋,变形,嘈杂,含糊,低对比度
图片3
进入梦乡,梦到自己站在路旁
古风,水墨画,一个黑色长发少女,站在路边,上半身,红色长裙
丑陋,变形,嘈杂,含糊,低对比度
图片4
王子骑马而来
古风,水墨画,一个英俊少年,骑着白马,上半身,白色衬衫
丑陋,变形,嘈杂,含糊,低对比度
图片5
两人相谈甚欢
古风,水墨画,一个英俊少年,白色衬衫,一个黑色长发少女,红色长裙,两个人一起聊天,开心,上半身
丑陋,变形,嘈杂,含糊,低对比度
图片6
一起坐在马背上
古风,水墨画,一个英俊少年,白色衬衫,一个黑色长发少女,红色长裙,两个人一起骑着马,满身
丑陋,变形,嘈杂,含糊,低对比度
图片7
下课了,梦醒了
古风,水墨画,一个黑色长发少女,坐在教室里,下课铃声响了,同学们开始走动,从睡梦中醒来,深思,上半身,红色长裙
丑陋,变形,嘈杂,含糊,低对比度
图片8
又回到了学习生活中
古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,认真上课,上半身,红色长裙
丑陋,变形,嘈杂,含糊,低对比度
接下来我们运行baseline代码:
  1. torch.manual_seed(0)
  2. image = pipe(
  3.     prompt="古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,深思,上半身,红色长裙",
  4.     negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
  5.     cfg_scale=4,
  6.     num_inference_steps=50, height=1024, width=1024,
  7. )
  8. image.save("1.jpg")
复制代码
 结果展示如下:





小搭档们,喜欢的话,点赞收藏关注吧。 



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表