参考教程:Docshttps://datawhaler.feishu.cn/wiki/KxI2wIeAJiRQWhkRt9dcqlNVnFR?from=from_copylink
精读baseline
代码整理
使用通义千问辅助理解baseline代码
起首将baseline中的代码全部整理在一起:
- !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
复制代码 分析主体架构
输入prompt:
你是一个优秀的python开发工程师,如今我们必要你帮我们分析这个代码的主体框架,你必要把代码按照工作流分成几部分,用中文答复我的问题。
{此处更换成baseline代码}
返回的结果:
这段代码可以分为几个主要的工作流程部分来理解:
1. 环境准备和依赖安装
起首是一系列的包安装与卸载命令:
- 安装 `simple-aesthetics-predictor` 和 `data-juicer`。
- 卸载 `pytorch-lightning` 并安装 `peft`, `lightning`, `pandas`, `torchvision`。
- 安装 `DiffSynth-Studio`。
这部分主要是为了确保所需的库已经安装并且版本正确。
2. 数据集加载与处置惩罚
接着是从 ModelScope 加载了一个名为 `lowres_anime` 的数据集,并将其生存到指定目录下。这部分包罗了对数据会合的每张图片举行转换为 RGB 模式并生存,同时将图片路径和对应的标签文本写入 JSONL 文件中。
3. 数据过滤与预处置惩罚
通过配置文件 `data_juicer_config.yaml` 来界说如何使用 `data-juicer` 过滤数据集。这里界说了图片的尺寸和宽高比的过滤条件。然后运行 `dj-process` 命令来实行数据过滤,并输出过滤后的结果到新的 JSONL 文件中。
4. 数据整理与特征提取
这部分代码将过滤后的数据集整理成 DataFrame,并生存为 CSV 文件。接着使用 CLIP 模型来盘算图像和文本之间的相似度分数。
5. 自界说数据集与数据加载器
界说了一个 PyTorch 的 `Dataset` 类 `CustomDataset` 用于读取 CSV 文件中的数据,并创建了一个 `DataLoader` 用于批量加载数据。然后使用 CLIP 模型来进一步处置惩罚这些数据。
6. 图像生成
这部分代码使用 `StableDiffusionPipeline` 来根据不同的提示(prompts)生成一系列二次元风格的图像,并生存到文件中。
7. 图像归并展示
最后一步是将生成的多个图像归并成一个大图以便于展示和比力。
总结起来,整个代码流程包罗了环境配置、数据集加载、数据预处置惩罚、特征提取、模型练习数据准备以及图像生成和展示等多个步骤。每个步骤都是前一步骤的底子,渐渐构建起一个完整的图像生成和分析体系。
返回结果的截图如下:
逐行解释代码
输入prompt:
你是一个优秀的python开发工程师,如今我们必要你帮我们逐行分析这个代码,用中文答复我的问题。
{此处更换成baseline代码}
返回的结果:
这段代码主要分为几个部分:安装和卸载一些Python包,加载数据集并处置惩罚图像数据,使用Data-Juicer举行数据洗濯,盘算图像与文本的相似度,创建自界说数据集,以及使用StableDiffusionPipeline生成图像。
下面是逐行的解释:
安装和卸载Python包
- # 安装simple-aesthetics-predictor包
- !pip install simple-aesthetics-predictor
- # 安装data-juicer包的开发版本
- !pip install -v -e data-juicer
- # 卸载pytorch-lightning包
- !pip uninstall pytorch-lightning -y
- # 安装peft, lightning, pandas 和 torchvision包
- !pip install peft lightning pandas torchvision
- # 安装DiffSynth-Studio包的开发版本
- !pip install -e DiffSynth-Studio
复制代码 加载数据集
- # 导入MsDataset类,用于加载数据集
- from modelscope.msdatasets import MsDataset
- # 加载名为'AI-ModelScope/lowres_anime'的数据集,subset_name为'default',split为'train',cache_dir指定缓存目录
- 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)
- # 创建data-juicer输入数据目录,如果不存在则创建
- os.makedirs("./data/data-juicer/input", exist_ok=True)
- # 打开文件以写入metadata.jsonl文件
- with open("./data/data-juicer/input/metadata.jsonl", "w") as f:
- # 遍历数据集
- for data_id, data in enumerate(tqdm(ds)):
- # 将图像转换为RGB格式并保存到指定路径
- 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
- # 定义Data-Juicer配置字符串
- data_juicer_config = """
- # 全局参数
- project_name: 'data-process'
- dataset_path: './data/data-juicer/input/metadata.jsonl' # 指定数据集文件路径
- np: 4 # 处理数据集的子进程数量
- text_keys: 'text'
- image_key: 'image'
- image_special_token: '<__dj__image>'
- export_path: './data/data-juicer/output/result.jsonl'
- # 数据处理流程
- 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
- """
- # 写入Data-Juicer配置文件
- 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输出
- # 导入pandas和其他必要库
- import pandas as pd
- import os, json
- from PIL import Image
- from tqdm import tqdm
- # 创建输出图像目录,如果不存在则创建
- os.makedirs("./data/data-juicer/output/images", exist_ok=True)
- # 读取Data-Juicer处理后的结果
- with open("./data/data-juicer/output/result.jsonl", "r") as f:
- texts, file_names = [], []
- for line in tqdm(f):
- # 解析每行JSON数据
- metadata = json.loads(line)
- texts.append(metadata["text"])
- file_names.append(metadata["image"][0])
- # 将文本和文件名转换为DataFrame并保存为CSV文件
- df = pd.DataFrame({"text": texts, "file_name": file_names})
- df.to_csv("./data/data-juicer/output/result.csv", index=False)
- # 显示DataFrame内容
- df
复制代码 使用CLIP模型盘算相似度
- # 导入CLIP模型和处理器
- from transformers import CLIPProcessor, CLIPModel
- import torch
- # 加载预训练的CLIP模型和处理器
- 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
- # 计算概率
- probs = logits_per_image.softmax(dim=1)
- # 显示概率
- probs
复制代码 创建自界说数据集
- # 导入PyTorch相关库
- 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)
复制代码 使用StableDiffusionPipeline生成图像
- # 导入StableDiffusionPipeline
- import torch
- from diffusers import StableDiffusionPipeline
- # 设置随机种子以确保结果可重复
- torch.manual_seed(1)
- # 加载预训练的StableDiffusion模型
- 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")
- # 使用不同提示生成多个图像
- # (此处省略了重复的代码,每个调用都生成一张图像并保存)
复制代码 归并生成的图像
- # 导入PIL库
- 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
复制代码 这段代码实行了一系列复杂的操作,从加载数据集开始,颠末图像处置惩罚、数据洗濯、盘算相似度、创建数据集,最后使用StableDiffusionPipeline生成图像,并将它们归并成一个大图。
返回结果的截图如下:
实战演练:基于话剧的连环画制作
数据准备
使用通义千问生成提示词。
prompt准备:
你是一个文生图专家,我们如今要做一个实战项目,就是要编排一个文生图话剧
话剧由8张场景图片生成,你必要输出每张图片的生图提示词
具体的场景图片
1、女主正在上课
2、开始睡着了
3、进入梦乡,梦到自己站在路
4、王子骑马而来
5、两人相谈甚欢
6、一起坐在马背上
7、下课了,梦醒了
8、又回到了学习生活中
生图提示词要求
1、风格为古风
2、根据场景确定是使用全身照旧上半身
3、人物描述
4、场景描述
5、做啥事情
例子: 古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,深思,上半身,赤色长裙
返回结果:
好的,根据您的要求,我会为每个场景创作一组生图提示词。我们来逐一订定这些提示词:
第一张图片 - 女主正在上课
风格: 古风
描述: 水墨画,一个穿着蓝色长裙的女子,黑色长发束起,上半身特写,坐在古色古香的教室里,专注地听着老师讲解,手中握着毛笔。
场景: 木质布局的教室,墙壁挂着书法作品,桌案上摆放着笔墨纸砚。
正在做的事情: 聚精会神听讲,偶尔低头在纸上记载。
第二张图片 - 开始睡着了
风格: 古风
描述: 水墨画,同一女子,黑色长发披散,身穿淡紫色长袍,上半身,头轻轻靠在桌上,嘴角挂着微笑,似乎正在做梦。
场景: 教室配景,周围的同学都在认真听课,只有她沉浸在梦乡之中。
正在做的事情: 在课桌上轻眠。
第三张图片 - 进入梦乡,梦到自己站在路上
风格: 古风
描述: 水墨画,女子全身像,穿着华丽的衣裳,站在一条青石小径上,四周是昏黄的云雾和古树。
场景: 一条通往远方的小径,两旁是古树参天,远处山峦叠嶂。
正在做的事情: 微微闭目,仿佛在感受天然的气息。
第四张图片 - 王子骑马而来
风格: 古风
描述: 水墨画,一位英俊的青年骑着一匹白马渐渐而来,身穿金色镶边的长袍,眼神温柔,望向女子的方向。
场景: 同样的小径,但此刻阳光洒落,王子与马的身影映照在小径上。
正在做的事情: 骑马接近女子,准备邀请她一同前行。
第五张图片 - 两人相谈甚欢
风格: 古风
描述: 水墨画,女子与王子并肩而立,两人面带笑容,眼神交流,身着华美的服饰。
场景: 小径旁的一片开阔地带,花丛中设有石桌石凳,四周环境清静精美。
正在做的事情: 相互交谈,分享彼此的故事。
第六张图片 - 一起坐在马背上
风格: 古风
描述: 水墨画,女子与王子并排坐在马上,女子穿着轻盈的绿色长裙,王子穿着蓝色长袍,两人相视而笑,马儿在林间小道上渐渐前行。
场景: 林间小道,绿树成荫,鸟语花香。
正在做的事情: 共骑一马,欣赏沿途风景。
第七张图片 - 下课了,梦醒了
风格: 古风
描述: 水墨画,女子睁开眼,表情从惊讶变为微笑,黑色长发散落,身穿淡紫色长袍,上半身特写。
场景: 依旧是在教室里,同学们陆续离开。
正在做的事情: 从梦中醒来,发现自己仍然坐在教室里。
第八张图片 - 又回到了学习生活中
风格: 古风
描述: 水墨画,女子重新投入学习状态,黑色长发束起,身穿蓝色长裙,上半身特写,用心致志地书写。
场景: 教室内,其他同学也在笃志苦读,墙上挂着字画。
正在做的事情: 用心学习,笃志读书写字。
根据返回的结果得当调解,整理成如下表格:
图片编号
| 场景描述
| 正向提示词
| 反向提示词
| 图片1 | 女主正在上课
| 古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,深思,上半身,赤色长裙
| 貌寝,变形,嘈杂,模糊,低对比度
| 图片2 | 开始睡着了
| 古风,水墨画,一个黑色长发少女,坐在教室里,趴在桌子上睡着了,上半身,赤色长裙
| 貌寝,变形,嘈杂,模糊,低对比度
| 图片3 | 进入梦乡,梦到自己站在路旁
| 古风,水墨画,一个黑色长发少女,站在路边,上半身,赤色长裙
| 貌寝,变形,嘈杂,模糊,低对比度
| 图片4 | 王子骑马而来
| 古风,水墨画,一个英俊少年,骑着白马,上半身,白色衬衫
| 貌寝,变形,嘈杂,模糊,低对比度
| 图片5 | 两人相谈甚欢
| 古风,水墨画,一个英俊少年,白色衬衫,一个黑色长发少女,赤色长裙,两个人一起聊天,开心,上半身
| 貌寝,变形,嘈杂,模糊,低对比度
| 图片6 | 一起坐在马背上
| 古风,水墨画,一个英俊少年,白色衬衫,一个黑色长发少女,赤色长裙,两个人一起骑着马,全身
| 貌寝,变形,嘈杂,模糊,低对比度
| 图片7 | 下课了,梦醒了
| 古风,水墨画,一个黑色长发少女,坐在教室里,下课铃声响了,同学们开始走动,从睡梦中醒来,深思,上半身,赤色长裙
| 貌寝,变形,嘈杂,模糊,低对比度
| 图片8 | 又回到了学习生活中
| 古风,水墨画,一个黑色长发少女,坐在教室里,盯着黑板,认真上课,上半身,赤色长裙
| 貌寝,变形,嘈杂,模糊,低对比度
| 修改提示词并生成图片
修改提示词并运行baseline代码,可以从“加载模型”这一步开始运行,加载Task01中练习的LoRA权重。
结果展示
测试美学分数
运行以下代码获得美学分数:
- import torch, os
- from PIL import Image
- from transformers import CLIPProcessor
- from aesthetics_predictor import AestheticsPredictorV2Linear
- from modelscope import snapshot_download
- model_id = snapshot_download('AI-ModelScope/aesthetics-predictor-v2-sac-logos-ava1-l14-linearMSE', cache_dir="models/")
- predictor = AestheticsPredictorV2Linear.from_pretrained(model_id)
- processor = CLIPProcessor.from_pretrained(model_id)
- device = "cuda"
- predictor = predictor.to(device)
- def get_aesthetics_score(image):
- inputs = processor(images=image, return_tensors="pt")
- inputs = {k: v.to(device) for k, v in inputs.items()}
- with torch.no_grad():
- outputs = predictor(**inputs)
- prediction = outputs.logits
- return prediction.tolist()[0][0]
- def evaluate(folder):
- scores = []
- for file_name in os.listdir(folder):
- if os.path.isfile(os.path.join(folder, file_name)):
- image = Image.open(os.path.join(folder, file_name))
- scores.append(get_aesthetics_score(image))
- if len(scores) == 0:
- return 0
- else:
- return sum(scores) / len(scores)
- score = evaluate("./test1") # 换成自己的结果文件夹
- print(score)
复制代码 输出结果:

得到结果大于6,根据赛题规则,图片符合要求。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |