preprocess.py 3.7 KB
Newer Older
1 2
import os
from PIL import Image, ImageOps
3 4
import platform
import sys
5
import tqdm
6
import time
7 8

from modules import shared, images
9 10 11
from modules.shared import opts, cmd_opts
if cmd_opts.deepdanbooru:
    import modules.deepbooru as deepbooru
12

13

14
def preprocess(process_src, process_dst, process_width, process_height, process_flip, process_split, process_caption, process_caption_deepbooru=False):
15 16 17 18 19
    try:
        if process_caption:
            shared.interrogator.load()

        if process_caption_deepbooru:
20 21 22
            db_opts = deepbooru.create_deepbooru_opts()
            db_opts[deepbooru.OPT_INCLUDE_RANKS] = False
            deepbooru.create_deepbooru_process(opts.interrogate_deepbooru_score_threshold, db_opts)
23 24 25 26 27 28 29 30 31 32 33 34 35 36

        preprocess_work(process_src, process_dst, process_width, process_height, process_flip, process_split, process_caption, process_caption_deepbooru)

    finally:

        if process_caption:
            shared.interrogator.send_blip_to_ram()

        if process_caption_deepbooru:
            deepbooru.release_process()



def preprocess_work(process_src, process_dst, process_width, process_height, process_flip, process_split, process_caption, process_caption_deepbooru=False):
A
alg-wiki 已提交
37 38
    width = process_width
    height = process_height
39 40 41
    src = os.path.abspath(process_src)
    dst = os.path.abspath(process_dst)

42
    assert src != dst, 'same directory specified as source and destination'
43 44 45 46 47 48 49 50 51

    os.makedirs(dst, exist_ok=True)

    files = os.listdir(src)

    shared.state.textinfo = "Preprocessing..."
    shared.state.job_count = len(files)

    def save_pic_with_caption(image, index):
52 53
        caption = ""

54
        if process_caption:
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
            caption += shared.interrogator.generate_caption(image)

        if process_caption_deepbooru:
            if len(caption) > 0:
                caption += ", "
            caption += deepbooru.get_tags_from_process(image)

        filename_part = filename
        filename_part = os.path.splitext(filename_part)[0]
        filename_part = os.path.basename(filename_part)

        basename = f"{index:05}-{subindex[0]}-{filename_part}"
        image.save(os.path.join(dst, f"{basename}.png"))

        if len(caption) > 0:
            with open(os.path.join(dst, f"{basename}.txt"), "w", encoding="utf8") as file:
                file.write(caption)
72 73 74 75 76 77 78 79 80 81 82 83

        subindex[0] += 1

    def save_pic(image, index):
        save_pic_with_caption(image, index)

        if process_flip:
            save_pic_with_caption(ImageOps.mirror(image), index)

    for index, imagefile in enumerate(tqdm.tqdm(files)):
        subindex = [0]
        filename = os.path.join(src, imagefile)
A
alg-wiki 已提交
84 85 86 87
        try:
            img = Image.open(filename).convert("RGB")
        except Exception:
            continue
88 89 90 91 92 93 94 95 96

        if shared.state.interrupted:
            break

        ratio = img.height / img.width
        is_tall = ratio > 1.35
        is_wide = ratio < 1 / 1.35

        if process_split and is_tall:
A
alg-wiki 已提交
97
            img = img.resize((width, height * img.height // img.width))
98

A
alg-wiki 已提交
99
            top = img.crop((0, 0, width, height))
100 101
            save_pic(top, index)

A
alg-wiki 已提交
102
            bot = img.crop((0, img.height - height, width, img.height))
103 104
            save_pic(bot, index)
        elif process_split and is_wide:
A
alg-wiki 已提交
105
            img = img.resize((width * img.width // img.height, height))
106

A
alg-wiki 已提交
107
            left = img.crop((0, 0, width, height))
108 109
            save_pic(left, index)

A
alg-wiki 已提交
110
            right = img.crop((img.width - width, 0, img.width, height))
111 112
            save_pic(right, index)
        else:
A
alg-wiki 已提交
113
            img = images.resize_image(1, img, width, height)
114 115 116
            save_pic(img, index)

        shared.state.nextjob()