目录
一、任务要求
task2 主要是精读 baseline 代码,我在上一篇关于 task1 的文章中已经完成了这个工作,所以实际上 task2 已经做完了。下面主要写一些自己的认识和尝试。
二、个人认识
首先,在阅读 task2 文档的时候,示例生成的竟然也是古风的图片,这似乎意味着数据集对模型的影响不大?或者不会决定模型生成图片的风格?在我更换了数据集之后,发现数据集的影响似乎只限于人物面部的变化,的确不改变图片整体。后面会详细介绍。
另外,关于模型优化的问题,可以通过调节模型训练参数来实现,也可以改变基础模型。但是我并没有进行相关操作,主要原因有两个:一是在现有免费的实例下,GPU占用率已经非常高了,如果进一步增加模型复杂度,很有可能会爆显存;二是我个人感觉现有模型表现已经比较符号我的预期,训练速度也比较快,没必要调参。
三、新的尝试
上一篇提到更换数据集,在经历了一系列尝试之后,终于简单地应用成功了。主要步骤如下:
-
准备原始数据
图片需要自己查找,我使用爬虫简单地在百度图片获取了100张左右的图片。使用selenium动态爬虫,代码如下:import json import time import requests from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait # 古风动漫图片 url = ("https://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=utf8&word=%E5%8A%A8%E6%BC%AB%E4" "%BA%BA%E7%89%A9%E5%8F%A4%E9%A3%8E&fr=ala&ala=1&alatpl=normal&pos=0&dyTabStr=MCwzLDEsMiwsNyw2LDUsMTIsOQ%3D%3D") options = webdriver.ChromeOptions() # options.add_argument('headless')//隐藏浏览器 # 设置 ChromeDriver 路径 driver_path = "下载的chromedriver.exe的路径" service = Service(driver_path) browser = webdriver.Chrome(service=service, options=options) browser.get(url) time.sleep(3) browser.maximize_window() wait = WebDriverWait(browser, 10) for i in range(5): browser.execute_script("window.scrollTo(0, 3000);") time.sleep(3) uls = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//ul[@class='imglist clearfix pageNum0']"))) count = 0 for ul in uls: lis = ul.find_elements(By.XPATH, "//li//img") for li in lis: try: src = li.get_attribute("data-show-ext") if src is not None: in_url = json.loads(src)["url"] response = requests.get(in_url) # 图片保存路径 with open(f"./images/baidu/{count}.jpg", "wb") as f: f.write(response.content) count += 1 except Exception as e: print(e)
当然这只是简单的示例,要想构建比较好的数据集,这点图片根本不够,而且图片质量也参差不齐,有时间可以去尝试其他图片网站。
- 数据调整
因为在 data_juicer 数据处理时,配置了图片过滤,要求长或宽为1024且宽高比在0.5到2.0之间,所以我们需要简单地处理一下原始的图片,否则可能没有满足条件的图片。
下面是简单的缩放图片示例,使用了PIL库import os import glob from PIL import Image def resize_image(input_image_path, output_image_path, target_size): original_image = Image.open(input_image_path) width, height = original_image.size # 确定目标尺寸是宽还是高 if width > height: # 如果宽度大于高度,则以宽度为基准进行缩放 new_width = target_size new_height = int((target_size / float(width)) * height) else: # 如果高度大于或等于宽度,则以高度为基准进行缩放 new_height = target_size new_width = int((target_size / float(height)) * width) resized_image = original_image.resize((new_width, new_height), Image.Resampling.LANCZOS) resized_image.save(output_image_path) def batch_resize_images(directory, output_directory, size): if not os.path.exists(output_directory): os.makedirs(output_directory) for img_path in glob.glob(os.path.join(directory, '*.jpg')): filename = os.path.basename(img_path) output_path = os.path.join(output_directory, filename) resize_image(img_path, output_path, size) # 使用方法 directory = './images/baidu' # 原始路径 output_directory = './images/new_baidu' # 输出路径 target_size = 1024 # 目标尺寸的一边长度 batch_resize_images(directory, output_directory, target_size)
这里只考虑了一边为1024,没有考虑宽高比,可以再进行适当的裁剪。
- 创建数据集
这一步花费了挺长时间,主要是对魔搭平台的数据集创建不太熟悉。
首先在个人中心的下拉菜单中选择“创建数据集”,填写必要的信息,这一步比较简单。
然后需要去完善自动生成发README.md文件。这里可以参考官方的文档“数据集文件规范”。另外关于 markdown 文件的 yaml 元数据配置,官方同样提供了模板,只需要在README.md编辑页面,点击右上角的“使用模板编辑器”,填入必要的字段,就能自动生成 yaml 代码。将其粘贴到 md 文档的开头,使用 --- 包裹起来即可。
之后就是上传数据集文件了。这里数据集文件的组织形式很关键,否则可能无法预览、无法正常使用。具体可以参考官方文档“数据集介绍”。我这里是图像类型,选择的组织形式是比较简单的基于文件夹的构建方式。我也尝试过压缩为 zip 文件,编写配置 metadata 的方式,但是没有正常预览,在使用数据集时也会报错“BadZipFile: File is not a zip file”。有点苦恼,后面再尝试吧(反正现在也能用,只是不太优雅)。 - 应用数据集
只需要修改代码中下载数据集的代码,改成下载自己的数据集from modelscope.msdatasets import MsDataset ds = MsDataset.load( '替换为自己的数据集,格式为"用户名/数据集英文名"', subset_name='子数据集名称', split='数据split名称', cache_dir="/mnt/workspace/kolors/data" # 保存路径 )
四、任务效果
task2 模型没有变化,只是修改了一下生成图片的描述,依然是古风,下面贴上几张使用原数据集和自己数据集的图片,相同的描述,对比一下,人物脸部有一些变化,自己的数据集动漫风确实更强一些(也出现了比较抽象的手)。
原数据集
新数据集