kohya_ss / kohya_gui /group_images_gui.py
zengxi123's picture
Upload folder using huggingface_hub
fb83c5b verified
import gradio as gr
import subprocess
from .common_gui import get_folder_path, scriptdir, list_dirs, setup_environment
import os
import sys
from .custom_logging import setup_logging
# Set up logging
log = setup_logging()
PYTHON = sys.executable
def group_images(
input_folder,
output_folder,
group_size,
include_subfolders,
do_not_copy_other_files,
generate_captions,
caption_ext,
):
if input_folder == "":
log.info("Input folder is missing...")
return
if output_folder == "":
log.info("Please provide an output folder.")
return
log.info(f"Grouping images in {input_folder}...")
run_cmd = [
fr"{PYTHON}",
f"{scriptdir}/tools/group_images.py",
fr"{input_folder}",
fr"{output_folder}",
str(group_size),
]
if include_subfolders:
run_cmd.append("--include_subfolders")
if do_not_copy_other_files:
run_cmd.append("--do_not_copy_other_files")
if generate_captions:
run_cmd.append("--caption")
if caption_ext:
run_cmd.append("--caption_ext")
run_cmd.append(caption_ext)
env = setup_environment()
# Reconstruct the safe command string for display
command_to_run = " ".join(run_cmd)
log.info(f"Executing command: {command_to_run}")
# Run the command in the sd-scripts folder context
subprocess.run(run_cmd, env=env)
log.info("...grouping done")
def gradio_group_images_gui_tab(headless=False):
from .common_gui import create_refresh_button
current_input_folder = os.path.join(scriptdir, "data")
current_output_folder = os.path.join(scriptdir, "data")
def list_input_dirs(path):
nonlocal current_input_folder
current_input_folder = path
return list(list_dirs(path))
def list_output_dirs(path):
nonlocal current_output_folder
current_output_folder = path
return list(list_dirs(path))
with gr.Tab("Group Images"):
gr.Markdown(
"This utility will group images in a folder based on their aspect ratio."
)
with gr.Group(), gr.Row():
input_folder = gr.Dropdown(
label="Input folder (containing the images to group)",
interactive=True,
choices=[""] + list_input_dirs(current_input_folder),
value="",
allow_custom_value=True,
)
create_refresh_button(
input_folder,
lambda: None,
lambda: {"choices": list_input_dirs(current_input_folder)},
"open_folder_small",
)
button_input_folder = gr.Button(
"πŸ“‚",
elem_id="open_folder_small",
elem_classes=["tool"],
visible=(not headless),
)
button_input_folder.click(
get_folder_path,
outputs=input_folder,
show_progress=False,
)
output_folder = gr.Dropdown(
label="Output folder (where the grouped images will be stored)",
interactive=True,
choices=[""] + list_output_dirs(current_output_folder),
value="",
allow_custom_value=True,
)
create_refresh_button(
output_folder,
lambda: None,
lambda: {"choices": list_output_dirs(current_output_folder)},
"open_folder_small",
)
button_output_folder = gr.Button(
"πŸ“‚",
elem_id="open_folder_small",
elem_classes=["tool"],
visible=(not headless),
)
button_output_folder.click(
get_folder_path,
outputs=output_folder,
show_progress=False,
)
input_folder.change(
fn=lambda path: gr.Dropdown(choices=[""] + list_input_dirs(path)),
inputs=input_folder,
outputs=input_folder,
show_progress=False,
)
output_folder.change(
fn=lambda path: gr.Dropdown(choices=[""] + list_output_dirs(path)),
inputs=output_folder,
outputs=output_folder,
show_progress=False,
)
with gr.Row():
group_size = gr.Slider(
label="Group size",
info="Number of images to group together",
value=4,
minimum=1,
maximum=64,
step=1,
interactive=True,
)
include_subfolders = gr.Checkbox(
label="Include Subfolders",
value=False,
info="Include images in subfolders as well",
)
do_not_copy_other_files = gr.Checkbox(
label="Do not copy other files",
value=False,
info="Do not copy other files in the input folder to the output folder",
)
generate_captions = gr.Checkbox(
label="Generate Captions",
value=False,
info="Generate caption files for the grouped images based on their folder name",
)
caption_ext = gr.Dropdown(
label="Caption file extension",
choices=[".cap", ".caption", ".txt"],
value=".txt",
interactive=True,
allow_custom_value=True,
)
group_images_button = gr.Button("Group images")
group_images_button.click(
group_images,
inputs=[
input_folder,
output_folder,
group_size,
include_subfolders,
do_not_copy_other_files,
generate_captions,
caption_ext,
],
show_progress=False,
)