Datawhale AI夏令营第四期—task2—baseline精读

学习目的:跑通了baseline,对baseline的代码也有了一个基本的理解,在Task1的基础上继续深入。

今天的任务是对baseline的代码有一个更加细致的理解,然后学习如何借助AI来提升自学习能力,从而在后面的学习工作中从容迎接各种挑战。从中学大模型的提问技巧来实现快速学习,学会如何制作一个话剧连环画。

1.AI生成图片拿下国际摄影大奖,外媒炸锅……

AI生成图片的快速发展,使诸多领域措手不及,如:摄影、美术等艺术领域正在面临前所未有的颠覆。我们所认为的“有图有真相”,甚至理解的现实也将不断被挑战...

插入一段小常识,提醒大家警惕Deepfake技术

Deepfake是一种使用人工智能技术生成的伪造媒体,特别是视频和音频,它们看起来或听起来非常真实,但实际上是由计算机生成的。这种技术通常涉及到深度学习算法,特别是生成对抗网络(GANs),它们能够学习真实数据的特征,并生成新的、逼真的数据。

Deepfake技术虽然在多个领域展现出其创新潜力,但其滥用也带来了一系列严重的危害。在政治领域,Deepfake可能被用来制造假新闻或操纵舆论,影响选举结果和政治稳定。经济上,它可能破坏企业形象,引发市场恐慌,甚至操纵股市。法律体系也面临挑战,因为伪造的证据可能误导司法判断。此外,深度伪造技术还可能加剧身份盗窃的风险,成为恐怖分子的新工具,煽动暴力和社会动荡,威胁国家安全。

对所有人来说,定期关注AI生图的最新能力情况都十分重要:

而这些细节上的AI特性,也许就是我们在某些特定场景下需要解决的挑战。

  • 对于普通人来说,可以避免被常见的AI生图场景欺骗,偶尔也可以通过相关工具绘图

  • 对于创作者来说,通过AI生图的工具可以提效,快速制作自己所需要的内容

  • 对于技术人来说,了解AI生图的能力的玩法,可以更好地针对自己的业务进行开发和使用,甚至攻克难题开发更实用的工具

  • 再来从工具视角回顾一下AI生图的历史

  • 最早的AI生图可追溯到20世纪70年代,当时由艺术家哈罗德·科恩(Harold Cohen)发明AARON,可通过机械臂输出作画。

  • 现代的AI生图模型大多基于深度神经网络基础上训练,最早可追溯到2012年吴恩达训练出的能生成“猫脸”的模型。

    它使用卷积神经网络(CNN)训练,证明了深度学习模型能够学习到图像的复杂特征。

    2015年,谷歌推出了“深梦”(Deep Dream)图像生成工具,类似一个高级滤镜,可以基于给定的图片生成梦幻版图片——

    2021 年 1 月 OpenAI 推出DALL-E模型(一个深度学习算法模型,是GPT-3 语言处理模型的一个衍生版本),能直接从文本提示“按需创造”风格多样的图形设计——

    在当时,就已经被一些媒体评价为:“ 秒杀50%的设计行业打工人应该是没有问题的,而且是质量和速度双重意义上的“秒杀” ”。

    一般来说,AI生图模型属于多模态机器学习模型,通过海量的图库和文本描述的深度神经网络学习,最终的目标是可以根据输入的指示(不管是文本还是图片还是任何)生成符合语义的图片

    插入一个小八卦

    AI生图在很长一段时间很难被人们所广泛接纳,一方面是生成的内容没有可用的生产场景,还有很大程度可能是由于“恐怖谷效应”——

    其核心观点是:随着仿真物(如机器人、玩偶等)模拟真实性程度的变化,人们对其亲和力也会产生变化,一般规律是亲和力随着仿真程度增高而增高,但当仿真程度达到一个临界点时,人的亲和反应会陡然跌入谷底,突然产生排斥、恐惧、困惑等负面心理。

    通过学习大量画家的作品,AI生图模型 往往可以照猫画虎绘制出类似的画作,在2022年8月AI生图真正走进了大众的视野,让各个领域无法忽视

    当时让AI生图破圈的是AI绘画作品《太空歌剧院》,该作品在美国科罗拉多州举办的新兴数字艺术家竞赛中获得了比赛“数字艺术/数字修饰照片”类别一等奖,引起了当时“艺术家们 Not Happy”的社会舆论。

  • AI生图的难点和挑战有哪些?

  • 往前一年,AI绘画还不会画“手”——画出的手往往不符合逻辑,如六根手指,手部线条扭曲等,也因为当时这个情况,产生了很多解决这个问题的相关技术,如:给图片里的人手打上标记,像把手掌、拇指、食指啥的,都给清楚地标出来;

    我们现在还可以经常在各类自媒体的文章中看到“AI翻车”的案例,那些往往也是需要解决的难点,某些“翻车”现象,也许在业界已有相关的解决方案。

    通俗来说,AI生图模型获得图片生成能力主要是通过 学习 图片描述 以及 图片特征,尝试将这两者进行一一对应,存储在自己的记忆里。

    在我们需要的时候,通过输入的文字,复现出来对应的图片特征,从而生成了我们需要的图片。

    关于AI是否真正理解了图片背后所代表的世界的特征,是否理解了图片的含义,这个一直是科研界和产业界存在争议的话题

    由于每个模型用于训练的数据是有限的且不一定相同的,它们能匹配的描述和特征也是有限的,所以在风格、具体事物上,不同的模型会有很大的生成差异,且可能存在诸多与现实不符的情况。

    目前已经应用AI生图的行业主要有电商、游戏、设计等,大家感兴趣可以去查看相关研报

    在大部分生图场景下,我们可能经常会觉得图片存在“AI味”,这很长一段时间也是科研界和相关从业人员非常头大的问题。

    *AI味:AI生成的图片和实际生活场景/艺术家创作的绘画/摄影/三维作品 相比,存在强烈的违和感,或是细节处理,或是画面逻辑性存在问题,一言就能被看出是“AI出品”

    目前大部分的模型,已经具备了去除 “AI味” 的能力,且可能存在容易误导他人的情况,这时候我们想辨别可能需要非常仔细地——

  • 观察图片的细节。仔细检查人物的面部特征,尤其是眼睛和嘴巴

  • 检查光线和阴影。分析图片中的光源是否一致,阴影的方向是否与光源相符,是否存在不自然的光线或阴影

  • 分析像素。放大图片,寻找是否有模糊或像素化的部分。

  • 注意背景。检查背景中是否有不协调的元素,比如物体边缘是否平滑,背景中是否有不自然的重复模式。

2.通义千问

一键直达:通义tongyi.ai_你的全能AI助手 (aliyun.com)

task1代码如下:

 

!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

要求通义解释全部代码,结果如下:

要求其解释部分代码结果如下:

此外,还可以进行角色扮演:

 

你是一个优秀的python开发工程师,现在我们需要你帮我们分析这个代码的主体框架,你需要把代码按照工作流分成几部分,用中文回答我的问题。{此处替换前面的代码}

下面是逐行代码注释:

 

# 安装 Data-Juicer 和 DiffSynth-Studio !pip install simple-aesthetics-predictor # 安装simple-aesthetics-predictor !pip install -v -e data-juicer # 安装data-juicer !pip uninstall pytorch-lightning -y # 卸载pytorch-lightning !pip install peft lightning pandas torchvision # 安装 peft lightning pandas torchvision !pip install -e DiffSynth-Studio # 安装DiffSynth-Studio

# 从魔搭数据集中下载数据集AI-ModelScope/lowres_anime from modelscope.msdatasets import MsDataset #引入数据集模块msdatasets ds = MsDataset.load( 'AI-ModelScope/lowres_anime', subset_name='default', split='train', cache_dir="/mnt/workspace/kolors/data" # 指定缓存目录 ) # 从魔搭数据集中下载数据集AI-ModelScope/lowres_anime,赋值给参数ds

# 生成数据集 import json, os # 导入json和os模块 from data_juicer.utils.mm_utils import SpecialTokens # 导入SpecialTokens from tqdm import tqdm # 导入tqdm进度条管理 os.makedirs("./data/lora_dataset/train", exist_ok=True) # 创建文件夹./data/lora_dataset/train os.makedirs("./data/data-juicer/input", exist_ok=True) # 创建文件夹./data/data-juicer/input with open("./data/data-juicer/input/metadata.jsonl", "w") as f: for data_id, data in enumerate(tqdm(ds)): # 遍历数据集ds image = data["image"].convert("RGB") # 将数据集的图片转换为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)) # 将索引数据写入文件./data/data-juicer/input/metadata.jsonl f.write("\n")

# 配置data-juicer,并进行数据筛选过滤 # 配置过滤的规则 data_juicer_config = """ # global parameters project_name: 'data-process' # 名称 dataset_path: './data/data-juicer/input/metadata.jsonl' # 你前面生成的数据的索引文件 np: 4 # 线程数 text_keys: 'text' # 文件./data/data-juicer/input/metadata.jsonl的描述的字段名 image_key: 'image' # 文件./data/data-juicer/input/metadata.jsonl的图片字段名 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 # 最小宽度1024 min_height: 1024 # 最小高度1024 any_or_all: any # 符合前面条件的图片才会被保留 - image_aspect_ratio_filter: # 图片长宽比过滤 min_ratio: 0.5 # 最小长宽比0.5 max_ratio: 2.0 # 最大长宽比2.0 any_or_all: any # 符合前面条件的图片才会被保留 """ # 保存data-juicer配置到data/data-juicer/data_juicer_config.yaml with open("data/data-juicer/data_juicer_config.yaml", "w") as file: file.write(data_juicer_config.strip()) # data-juicer开始执行数据筛选 !dj-process --config data/data-juicer/data_juicer_config.yaml

# 通过前面通过data-juicer筛选的图片索引信息./data/data-juicer/output/result.jsonl,生成数据集 import pandas as pd # 导入pandas import os, json # 导入os和json from PIL import Image # 导入Image from tqdm import tqdm # 导入tqdm进度条管理 texts, file_names = [], [] # 定义两个空列表,分别存储图片描述和图片名称 os.makedirs("./data/lora_dataset_processed/train", exist_ok=True) # 创建文件夹./data/lora_dataset_processed/train with open("./data/data-juicer/output/result.jsonl", "r") as file: # 打开前面data-juicer筛选的图片索引文件./data/data-juicer/output/result.jsonl for data_id, data in enumerate(tqdm(file.readlines())): # 遍历文件./data/data-juicer/output/result.jsonl data = json.loads(data) # 将json字符串转换为对象 text = data["text"] # 获取对象中的text属性,也就是图片的描述信息 texts.append(text) # 将图片的描述信息添加到texts列表中 image = Image.open(data["image"][0]) # 获取对象中的image属性,也就是图片的路径,然后用这个路径打开图片 image_path = f"./data/lora_dataset_processed/train/{data_id}.jpg" # 生成保存图片的路径 image.save(image_path) # 将图片保存到./data/lora_dataset_processed/train文件夹中 file_names.append(f"{data_id}.jpg") # 将图片名称添加到file_names列表中 data_frame = pd.DataFrame() # 创建空的DataFrame data_frame["file_name"] = file_names # 将图片名称添加到data_frame中 data_frame["text"] = texts # 将图片描述添加到data_frame中 data_frame.to_csv("./data/lora_dataset_processed/train/metadata.csv", index=False, encoding="utf-8-sig") # 将data_frame保存到./data/lora_dataset_processed/train/metadata.csv data_frame # 查看data_frame

# 下载可图模型 from diffsynth import download_models # 导入download_models download_models(["Kolors", "SDXL-vae-fp16-fix"]) # 下载可图模型 # DiffSynth-Studio提供了可图的Lora训练脚本,查看脚本信息 !python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py -h

# 执行可图Lora训练 import os cmd = """ python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py \ # 选择使用可图的Lora训练脚本DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py --pretrained_unet_path models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors \ # 选择unet模型 --pretrained_text_encoder_path models/kolors/Kolors/text_encoder \ # 选择text_encoder --pretrained_fp16_vae_path models/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors \ # 选择vae模型 --lora_rank 16 \ # lora_rank 16 表示在权衡模型表达能力和训练效率时,选择了使用 16 作为秩,适合在不显著降低模型性能的前提下,通过 LoRA 减少计算和内存的需求 --lora_alpha 4.0 \ # 设置 LoRA 的 alpha 值,影响调整的强度 --dataset_path data/lora_dataset_processed \ # 指定数据集路径,用于训练模型 --output_path ./models \ # 指定输出路径,用于保存模型 --max_epochs 1 \ # 设置最大训练轮数为 1 --center_crop \ # 启用中心裁剪,这通常用于图像预处理 --use_gradient_checkpointing \ # 启用梯度检查点技术,以节省内存 --precision "16-mixed" # 指定训练时的精度为混合 16 位精度(half precision),这可以加速训练并减少显存使用 """.strip() os.system(cmd) # 执行可图Lora训练

# 加载lora微调后的模型 from diffsynth import ModelManager, SDXLImagePipeline # 导入ModelManager和SDXLImagePipeline from peft import LoraConfig, inject_adapter_in_model # 导入LoraConfig和inject_adapter_in_model import torch # 导入torch # 加载LoRA配置并注入模型 def load_lora(model, lora_rank, lora_alpha, lora_path): lora_config = LoraConfig( r=lora_rank, # 设置LoRA的秩(rank) lora_alpha=lora_alpha, # 设置LoRA的alpha值,控制LoRA的影响权重 init_lora_weights="gaussian", # 初始化LoRA权重为高斯分布 target_modules=["to_q", "to_k", "to_v", "to_out"], # 指定要应用LoRA的模块 ) model = inject_adapter_in_model(lora_config, model) # 将LoRA配置注入到模型中 state_dict = torch.load(lora_path, map_location="cpu") # 加载LoRA微调后的权重 model.load_state_dict(state_dict, strict=False) # 将权重加载到模型中,允许部分权重不匹配 return model # 返回注入LoRA后的模型 # 加载预训练模型 model_manager = ModelManager( torch_dtype=torch.float16, # 设置模型的数据类型为float16,减少显存占用 device="cuda", # 指定使用GPU进行计算 file_path_list=[ "models/kolors/Kolors/text_encoder", # 文本编码器的路径 "models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors", # UNet模型的路径 "models/kolors/Kolors/vae/diffusion_pytorch_model.safetensors" # VAE模型的路径 ] ) # 初始化图像生成管道 pipe = SDXLImagePipeline.from_model_manager(model_manager) # 从模型管理器中加载模型并初始化管道 # 加载并应用LoRA权重到UNet模型 pipe.unet = load_lora( pipe.unet, lora_rank=16, # 设置LoRA的秩(rank),与训练脚本中的参数保持一致 lora_alpha=2.0, # 设置LoRA的alpha值,控制LoRA对模型的影响权重 lora_path="models/lightning_logs/version_0/checkpoints/epoch=0-step=500.ckpt" # 指定LoRA权重的文件路径 )

# 生成图像 torch.manual_seed(0) # 设置随机种子,确保生成的图像具有可重复性。如果想要每次生成不同的图像,可以将种子值改为随机值。 image = pipe( prompt="二次元,一个紫色短发小女孩,在家中沙发上坐着,双手托着腮,很无聊,全身,粉色连衣裙", # 设置正向提示词,用于指导模型生成图像的内容 negative_prompt="丑陋、变形、嘈杂、模糊、低对比度", # 设置负向提示词,模型会避免生成包含这些特征的图像 cfg_scale=4, # 设置分类自由度 (Classifier-Free Guidance) 的比例,数值越高,模型越严格地遵循提示词 num_inference_steps=50, # 设置推理步数,步数越多,生成的图像细节越丰富,但生成时间也更长 height=1024, width=1024, # 设置生成图像的高度和宽度,这里生成 1024x1024 像素的图像 ) image.save("1.jpg") # 将生成的图像保存为 "1.jpg" 文件

# 图像拼接,展示总体拼接大图 import numpy as np # 导入numpy库,用于处理数组和数值计算 from PIL import Image # 导入PIL库中的Image模块,用于图像处理 images = [np.array(Image.open(f"{i}.jpg")) for i in range(1, 9)] # 读取1.jpg到8.jpg的图像,转换为numpy数组,并存储在列表images中 image = np.concatenate([ # 将四组图像在垂直方向上拼接 np.concatenate(images[0:2], axis=1), # 将第1组(images[0:2])的两张图像在水平方向上拼接 np.concatenate(images[2:4], axis=1), # 将第2组(images[2:4])的两张图像在水平方向上拼接 np.concatenate(images[4:6], axis=1), # 将第3组(images[4:6])的两张图像在水平方向上拼接 np.concatenate(images[6:8], axis=1), # 将第4组(images[6:8])的两张图像在水平方向上拼接 ], axis=0) # 将四组拼接后的图像在垂直方向上拼接 image = Image.fromarray(image).resize((1024, 2048)) # 将拼接后的numpy数组转换为图像对象,并调整大小为1024x2048像素 image # 输出最终生成的图像对象,用于显示图像

如果对代码还不太理解,还可以追问:

 

我对其中{替换成你的问题}还是不太理解,给我再详细介绍一下。

但是有一个问题,多次追问后,可能AI对最初的代码已经没有印象,发生乱回答的情况,此时不妨再将全部代码粘贴一次,使回答更准确。

3.实战演练一一基于话剧的连环画制作

数据准备——向通义询问关键提示词

 

     以下为通义的完整回答:

        

好的,根据您的要求,我会为每个场景编写生成图片的提示词。我们将保持一致的古风风格,并尽可能详细地描述每个场景。下面是为每个场景准备的提示词:

### 场景 1: 女主正在上课
- **古风,工笔画,一个身穿淡蓝色长袍的黑色长发少女,坐在教室里,聚精会神地看着老师讲解,上半身,背景是古色古香的木质桌椅,墙上挂着字画。**

### 场景 2: 开始睡着了
- **古风,淡墨勾勒,同一个黑色长发少女,头轻轻垂下,闭着眼睛,似乎进入了梦乡,上半身,背景是教室一角,窗外阳光洒落。**

### 场景 3: 进入梦乡,梦到自己站在路旁
- **古风,细腻描绘,一个黑色长发少女站在一条青石小道旁,四周环绕着竹林和盛开的桃花,全身,身穿淡绿色长裙,手里拿着一枝桃花,眺望着远方。**

### 场景 4: 王子骑马而来
- **古风,线条流畅,一位英俊的少年骑着白马缓缓而来,身穿白色锦袍,头戴金冠,马蹄轻扬,全身,背景是一片盛开的花海。**

### 场景 5: 两人相谈甚欢
- **古风,色彩柔和,黑色长发少女与白衣少年并肩而立,彼此交谈,两人都露出微笑,上半身,背景是古亭与湖水,远处山峦起伏。**

### 场景 6: 一起坐在马背上
- **古风,笔触细腻,少女与少年一同坐在马上,少女依偎在少年身后,两人目光注视前方,全身,背景是夕阳下的草原,马儿踏着轻盈的步伐。**

### 场景 7: 下课了,梦醒了
- **古风,淡雅风格,少女猛然睁开眼睛,回到现实,上半身,背景是教室内部,同学们正陆续离开。**

### 场景 8: 又回到了学习生活中
- **古风,色彩丰富,少女再次坐在书桌前,手捧书卷认真阅读,上半身,背景是教室内外忙碌的学生们,窗外是繁花似锦。**

这些提示词旨在为每个场景创建一个清晰的画面,同时保持古风风格的一致性。如果您需要对这些提示词进行调整或有任何其他需求,请随时告知!

同时我们要在通义的回答基础上,多多调整,争取打磨出一个最佳的提示词。结合AI内容,自己在AI结果上做一些调整,最终整理出来场景表格。

4.实战演练

在实战中出现的小问题:

重新安装了!pip,问题解决了!!!

向AI提问描述关键词:

出现新问题

原因是忘加逗号,被自己蠢笑了。。。(双引号不仅要求英文格式,后面还得加逗号!!!)

请AI帮忙!!!

代码如下(以第一张图片为例)

torch.manual_seed(0)
image = pipe(
    prompt="现代主义,一只强壮的黑猩猩,肌肉发达、表情愉悦,在一片茂密的热带雨林中,阳光透过树叶洒下斑驳光影,正伸出手臂,仿佛在与周围的树木互动,展现出它的活力和快乐",
    negative_prompt="丑陋、变形、嘈杂、模糊、低对比度",
    cfg_scale=4,
    num_inference_steps=50, height=1024, width=1024,
)
image.save("1.jpg")

第一次跑——失败

为什么科研人员也是猩猩???

这好像和描述没什么关系,再次修改描述词试试:

nice!!! 和预想的很相符了!!!

这一张较为满意了!!!

Tips:加载到一半时不要修改,否则会报错!

请看成果:

惊喜的是 AI并没有在画手上出现大问题!

更多的选择一一浅尝scepter webui

     1.浅尝功能

魔搭体验网址:魔搭社区

      2.官方定义

🪄SCEPTER is an open-source code repository dedicated to generative training, fine-tuning, and inference, encompassing a suite of downstream tasks such as image generation, transfer, editing. SCEPTER integrates popular community-driven implementations as well as proprietary methods by Tongyi Lab of Alibaba Group, offering a comprehensive toolkit for researchers and practitioners in the field of AIGC. This versatile library is designed to facilitate innovation and accelerate development in the rapidly evolving domain of generative models.

   3.核心组件

OK了 就到这里吧!!!

希望后续学习可以使对AI的理解更上一层楼!!!

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值