Skip to content

使用nai3生成指定(随机角色(或者说前置tag)+固定tag+随机末尾tag)数量的图片并拼合+添加水印+整合

License

Notifications You must be signed in to change notification settings

ChenYFan-Tester/nai3_all_for_one

 
 

Repository files navigation

nai3_all_for_one

此项目改写自 https://github.com/wochenlong/nai3_train 因为本人自用原因,只保留了“随机角色(或者说前置tag)+固定tag+随机末尾tag”的组合,改写自random_characetrs_expression.py

原理1&2内的设置及相关运行配置请参阅 https://github.com/wochenlong/nai3_train/blob/main/README.md

如果你需要使用nai3生成指定(随机角色(或者说前置tag)+固定tag+随机末尾tag)数量的图片,并将一定数量的图像拼合为一个大图,然后将这些图片全部加上水印再整理到一个文件夹内,那么你需要这个项目

原理1:从1_character读取json作为前置tag,从2_prompt读取固定tag,从3_append_prompt读取末尾tag,结合到一起批量生成随机素材,放入4_generate_output文件夹

原理2:从json中随机/按顺序抽取前置tag,随机抽取末尾tag

原理3:all_for_one.py每次出图结束会检测4_generate_output文件夹内的图片数量,达到指定的9张执行以下程序(采用os.system+休眠来控制程序执行间隔,电脑配置过低请调高image_processing()内的休眠时间): 1.启动9imgs.py来拼合这9张图,输出到5_joint_output文件夹 2.分别启动marker.py和marker9.py来对9张图片和拼合图片打水印,输出到6_marker文件夹 3.在7_pack内新建文件夹,并将这总计20张图移动至此

备注(重要): 1.运行脚本前请先在项目文件"token.txt"内填入自己的nai3账号token 获取方法1: 在网页(https://novelai.net) 中登录你的 NovelAI 账号 - 打开控制台 (F12),并切换到控制台 (Console) 标签页 - 输入下面的代码并按下回车运行: javascript console.log(JSON.parse(localStorage.session).auth_token) - 输出的字符串就是你的授权令牌

获取方法2: 1710935456763

2.下次运行脚本前请清空7_pack文件夹内的文件,否则可能发生意外

3.因为本人是做头像的,因此大图片拼合都是1024*1024,其他尺寸并未研究,不过只是出图不拼合的话并不影响(建议直接用nai3_train)。

4.因此项目基本为本人自我定制的项目,最终生成图片数量必定为9的倍数,想要更改为其他数量清将all_for_one.py 225行左右的if generator.generate_files_num() == 9:的9修改 若要更改拼合数量请再将9imgs.py 参数IMAGE_ROW = 3和IMAGE_COLUMN = 3修改

安装运行环境

python -m venv venv
.\venv\Scripts\activate
pip install -r requirements.txt

运行

首先确认你已经认真搞好token.txt python all_for_one.py

参数

关键词

默认角色关键词(前置关键词)读取1_character内的genshin_poimiku

{
  "role": [
    "aether (genshin impact) ", #自定角色prompt,你可以把它当为前置关键词,role只是一个命名而已
    "..."
  ]
}

在all_for_one导入库语句下有注释,尾部关键词同理

# 用户自定义 角色 JSON 文件的路径
characters_path = r"./1_character/genshin_poimiku.json"
# 用户自定义 尾部关键词 JSON 文件的路径
append_prompt_path = r"./3_append_prompt/append_prompt.json"

图片拼合

IMAGES_PATH = r'.\4_generate_output\\'  # 图片集地址
IMAGES_FORMAT = ['.png', '.PNG']  # 图片格式,nai3默认保存格式
IMAGE_SIZE = 1024  # 每张小图片的大小
IMAGE_ROW = 3  # 图片间隔,也就是合并成一张图后,一共有几行
IMAGE_COLUMN = 3  # 图片间隔,也就是合并成一张图后,一共有几列,之所以叫9imges就是因为3*3=9,可以自己设定,但要随之更改all_for_one里面出图循环的判定数值if generator.generate_files_num() == 9:
IMAGE_SAVE_PATH = r'.\5_joint_output\0.png'  # 图片转换后的地址

水印

help的内容我懒得改了,水印的位置受字体大小&间距&倾斜角度的影响,为了大图和小图主体不受影响,调了很久的参数,因此有2个打水印的py文件

    parse = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter)
    parse.add_argument("-f", "--file", type=str, default="./4_generate_output", #读取图片的位置
                       help="image file path or directory")
    parse.add_argument("-m", "--mark", type=str, default="我是水印", help="watermark content") #default水印内容
    parse.add_argument("-o", "--out", default="./6_marker", #输出位置
                       help="image output directory, default is ./output")
    parse.add_argument("-c", "--color", default="#363433", type=str, #字体颜色
                       help="text color like '#363433', default is #fbc82f")
    parse.add_argument("-s", "--space", default=900, type=int, #字体大小
                       help="space between watermarks, default is 75")
    parse.add_argument("-a", "--angle", default=0, type=int, #倾斜角度
                       help="rotate angle of watermarks, default is 30")
    parse.add_argument("--font-family", default="./font/Inkfree.ttf", type=str, #字体读取,可以自己找好看字体
                       help=textwrap.dedent('''\
                       font family of text, default is './font/Inkfree.ttf'
                       using font in system just by font file name
                       for example 'PingFang.ttc', which is default installed on macOS
                       '''))
    parse.add_argument("--font-height-crop", default="1.2", type=str, #字体间距
                       help=textwrap.dedent('''\
                       change watermark font height crop
                       float will be parsed to factor; int will be parsed to value
                       default is '1.2', meaning 1.2 times font size
                       this useful with CJK font, because line height may be higher than size
                       '''))
    parse.add_argument("--size", default=125, type=int, #字体大小
                       help="font size of text, default is 50")
    parse.add_argument("--opacity", default=0.5, type=float, #透明度
                       help="opacity of watermarks, default is 0.15")
    parse.add_argument("--quality", default=300, type=int, #质量
                       help="quality of output images, default is 80")

About

使用nai3生成指定(随机角色(或者说前置tag)+固定tag+随机末尾tag)数量的图片并拼合+添加水印+整合

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Python 100.0%