move functions out of main body for image preprocessing for easier hijacking

This commit is contained in:
AUTOMATIC 2022-11-08 08:37:05 +03:00
parent c5334fc56b
commit 8011be33c3

View File

@ -35,64 +35,62 @@ def preprocess(process_src, process_dst, process_width, process_height, preproce
deepbooru.release_process() deepbooru.release_process()
def listfiles(dirname):
return os.listdir(dirname)
def preprocess_work(process_src, process_dst, process_width, process_height, preprocess_txt_action, process_flip, process_split, process_caption, process_caption_deepbooru=False, split_threshold=0.5, overlap_ratio=0.2, process_focal_crop=False, process_focal_crop_face_weight=0.9, process_focal_crop_entropy_weight=0.3, process_focal_crop_edges_weight=0.5, process_focal_crop_debug=False):
width = process_width
height = process_height
src = os.path.abspath(process_src)
dst = os.path.abspath(process_dst)
split_threshold = max(0.0, min(1.0, split_threshold))
overlap_ratio = max(0.0, min(0.9, overlap_ratio))
assert src != dst, 'same directory specified as source and destination' class PreprocessParams:
src = None
dstdir = None
subindex = 0
flip = False
process_caption = False
process_caption_deepbooru = False
preprocess_txt_action = None
os.makedirs(dst, exist_ok=True)
files = os.listdir(src) def save_pic_with_caption(image, index, params: PreprocessParams, existing_caption=None):
shared.state.textinfo = "Preprocessing..."
shared.state.job_count = len(files)
def save_pic_with_caption(image, index, existing_caption=None):
caption = "" caption = ""
if process_caption: if params.process_caption:
caption += shared.interrogator.generate_caption(image) caption += shared.interrogator.generate_caption(image)
if process_caption_deepbooru: if params.process_caption_deepbooru:
if len(caption) > 0: if len(caption) > 0:
caption += ", " caption += ", "
caption += deepbooru.get_tags_from_process(image) caption += deepbooru.get_tags_from_process(image)
filename_part = filename filename_part = params.src
filename_part = os.path.splitext(filename_part)[0] filename_part = os.path.splitext(filename_part)[0]
filename_part = os.path.basename(filename_part) filename_part = os.path.basename(filename_part)
basename = f"{index:05}-{subindex[0]}-{filename_part}" basename = f"{index:05}-{params.subindex}-{filename_part}"
image.save(os.path.join(dst, f"{basename}.png")) image.save(os.path.join(params.dstdir, f"{basename}.png"))
if preprocess_txt_action == 'prepend' and existing_caption: if params.preprocess_txt_action == 'prepend' and existing_caption:
caption = existing_caption + ' ' + caption caption = existing_caption + ' ' + caption
elif preprocess_txt_action == 'append' and existing_caption: elif params.preprocess_txt_action == 'append' and existing_caption:
caption = caption + ' ' + existing_caption caption = caption + ' ' + existing_caption
elif preprocess_txt_action == 'copy' and existing_caption: elif params.preprocess_txt_action == 'copy' and existing_caption:
caption = existing_caption caption = existing_caption
caption = caption.strip() caption = caption.strip()
if len(caption) > 0: if len(caption) > 0:
with open(os.path.join(dst, f"{basename}.txt"), "w", encoding="utf8") as file: with open(os.path.join(params.dstdir, f"{basename}.txt"), "w", encoding="utf8") as file:
file.write(caption) file.write(caption)
subindex[0] += 1 params.subindex += 1
def save_pic(image, index, existing_caption=None):
save_pic_with_caption(image, index, existing_caption=existing_caption)
if process_flip: def save_pic(image, index, params, existing_caption=None):
save_pic_with_caption(ImageOps.mirror(image), index, existing_caption=existing_caption) save_pic_with_caption(image, index, params, existing_caption=existing_caption)
def split_pic(image, inverse_xy): if params.flip:
save_pic_with_caption(ImageOps.mirror(image), index, params, existing_caption=existing_caption)
def split_pic(image, inverse_xy, width, height, overlap_ratio):
if inverse_xy: if inverse_xy:
from_w, from_h = image.height, image.width from_w, from_h = image.height, image.width
to_w, to_h = height, width to_w, to_h = height, width
@ -116,14 +114,40 @@ def preprocess_work(process_src, process_dst, process_width, process_height, pre
yield splitted yield splitted
def preprocess_work(process_src, process_dst, process_width, process_height, preprocess_txt_action, process_flip, process_split, process_caption, process_caption_deepbooru=False, split_threshold=0.5, overlap_ratio=0.2, process_focal_crop=False, process_focal_crop_face_weight=0.9, process_focal_crop_entropy_weight=0.3, process_focal_crop_edges_weight=0.5, process_focal_crop_debug=False):
width = process_width
height = process_height
src = os.path.abspath(process_src)
dst = os.path.abspath(process_dst)
split_threshold = max(0.0, min(1.0, split_threshold))
overlap_ratio = max(0.0, min(0.9, overlap_ratio))
assert src != dst, 'same directory specified as source and destination'
os.makedirs(dst, exist_ok=True)
files = listfiles(src)
shared.state.textinfo = "Preprocessing..."
shared.state.job_count = len(files)
params = PreprocessParams()
params.dstdir = dst
params.flip = process_flip
params.process_caption = process_caption
params.process_caption_deepbooru = process_caption_deepbooru
params.preprocess_txt_action = preprocess_txt_action
for index, imagefile in enumerate(tqdm.tqdm(files)): for index, imagefile in enumerate(tqdm.tqdm(files)):
subindex = [0] params.subindex = 0
filename = os.path.join(src, imagefile) filename = os.path.join(src, imagefile)
try: try:
img = Image.open(filename).convert("RGB") img = Image.open(filename).convert("RGB")
except Exception: except Exception:
continue continue
params.src = filename
existing_caption = None existing_caption = None
existing_caption_filename = os.path.splitext(filename)[0] + '.txt' existing_caption_filename = os.path.splitext(filename)[0] + '.txt'
if os.path.exists(existing_caption_filename): if os.path.exists(existing_caption_filename):
@ -143,8 +167,8 @@ def preprocess_work(process_src, process_dst, process_width, process_height, pre
process_default_resize = True process_default_resize = True
if process_split and ratio < 1.0 and ratio <= split_threshold: if process_split and ratio < 1.0 and ratio <= split_threshold:
for splitted in split_pic(img, inverse_xy): for splitted in split_pic(img, inverse_xy, width, height, overlap_ratio):
save_pic(splitted, index, existing_caption=existing_caption) save_pic(splitted, index, params, existing_caption=existing_caption)
process_default_resize = False process_default_resize = False
if process_focal_crop and img.height != img.width: if process_focal_crop and img.height != img.width:
@ -165,11 +189,11 @@ def preprocess_work(process_src, process_dst, process_width, process_height, pre
dnn_model_path = dnn_model_path, dnn_model_path = dnn_model_path,
) )
for focal in autocrop.crop_image(img, autocrop_settings): for focal in autocrop.crop_image(img, autocrop_settings):
save_pic(focal, index, existing_caption=existing_caption) save_pic(focal, index, params, existing_caption=existing_caption)
process_default_resize = False process_default_resize = False
if process_default_resize: if process_default_resize:
img = images.resize_image(1, img, width, height) img = images.resize_image(1, img, width, height)
save_pic(img, index, existing_caption=existing_caption) save_pic(img, index, params, existing_caption=existing_caption)
shared.state.nextjob() shared.state.nextjob()