kohya_ss / tools /caption.py
ABCCCYYY's picture
Upload folder using huggingface_hub
cff1674 verified
# This script will create the caption text files in the specified folder using the specified file pattern and caption text.
#
# eg: python caption.py D:\some\folder\location "*.png, *.jpg, *.webp" "some caption text"
import argparse
import os
import logging
from pathlib import Path
def create_caption_files(image_folder: Path, file_pattern: str, caption_text: str, caption_file_ext: str, overwrite: bool):
# Split the file patterns string and remove whitespace from each extension
patterns = [pattern.strip() for pattern in file_pattern.split(",")]
# Use the glob method to match the file pattern
for pattern in patterns:
files = image_folder.glob(pattern)
# Iterate over the matched files
for file in files:
# Check if a text file with the same name as the current file exists in the folder
txt_file = file.with_suffix(caption_file_ext)
if not txt_file.exists() or overwrite:
txt_file.write_text(caption_text)
logging.info(f"Caption file created: {txt_file}")
def writable_dir(target_path):
""" Check if a path is a valid directory and that it can be written to. """
path = Path(target_path)
if path.is_dir():
if os.access(path, os.W_OK):
return path
else:
raise argparse.ArgumentTypeError(f"Directory '{path}' is not writable.")
else:
raise argparse.ArgumentTypeError(f"Directory '{path}' does not exist.")
def main():
# Set up logging
logging.basicConfig(level=logging.INFO, format='%(levelname)s: %(message)s')
# Define command-line arguments
parser = argparse.ArgumentParser()
parser.add_argument("image_folder", type=writable_dir, help="The folder where the image files are located")
parser.add_argument("--file_pattern", type=str, default="*.png, *.jpg, *.jpeg, *.webp", help="the pattern to match the image file names")
parser.add_argument("--caption_file_ext", type=str, default=".caption", help="the caption file extension.")
parser.add_argument("--overwrite", action="store_true", default=False, help="whether to overwrite existing caption files")
# Create a mutually exclusive group for the caption_text and caption_file arguments
caption_group = parser.add_mutually_exclusive_group(required=True)
caption_group.add_argument("--caption_text", type=str, help="the text to include in the caption files")
caption_group.add_argument("--caption_file", type=argparse.FileType("r"), help="the file containing the text to include in the caption files")
# Parse the command-line arguments
args = parser.parse_args()
# Create the caption files
create_caption_files(args.image_folder, args.file_pattern, args.caption_text, args.caption_file_ext, args.overwrite)
if __name__ == "__main__":
main()