merge_captions_to_metadata.py 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import argparse
  2. import json
  3. from pathlib import Path
  4. from typing import List
  5. from tqdm import tqdm
  6. import library.train_util as train_util
  7. import os
  8. def main(args):
  9. assert not args.recursive or (args.recursive and args.full_path), "recursive requires full_path / recursiveはfull_pathと同時に指定してください"
  10. train_data_dir_path = Path(args.train_data_dir)
  11. image_paths: List[Path] = train_util.glob_images_pathlib(train_data_dir_path, args.recursive)
  12. print(f"found {len(image_paths)} images.")
  13. if args.in_json is None and Path(args.out_json).is_file():
  14. args.in_json = args.out_json
  15. if args.in_json is not None:
  16. print(f"loading existing metadata: {args.in_json}")
  17. metadata = json.loads(Path(args.in_json).read_text(encoding='utf-8'))
  18. print("captions for existing images will be overwritten / 既存の画像のキャプションは上書きされます")
  19. else:
  20. print("new metadata will be created / 新しいメタデータファイルが作成されます")
  21. metadata = {}
  22. print("merge caption texts to metadata json.")
  23. for image_path in tqdm(image_paths):
  24. caption_path = image_path.with_suffix(args.caption_extension)
  25. caption = caption_path.read_text(encoding='utf-8').strip()
  26. if not os.path.exists(caption_path):
  27. caption_path = os.path.join(image_path, args.caption_extension)
  28. image_key = str(image_path) if args.full_path else image_path.stem
  29. if image_key not in metadata:
  30. metadata[image_key] = {}
  31. metadata[image_key]['caption'] = caption
  32. if args.debug:
  33. print(image_key, caption)
  34. # metadataを書き出して終わり
  35. print(f"writing metadata: {args.out_json}")
  36. Path(args.out_json).write_text(json.dumps(metadata, indent=2), encoding='utf-8')
  37. print("done!")
  38. def setup_parser() -> argparse.ArgumentParser:
  39. parser = argparse.ArgumentParser()
  40. parser.add_argument("train_data_dir", type=str, help="directory for train images / 学習画像データのディレクトリ")
  41. parser.add_argument("out_json", type=str, help="metadata file to output / メタデータファイル書き出し先")
  42. parser.add_argument("--in_json", type=str,
  43. help="metadata file to input (if omitted and out_json exists, existing out_json is read) / 読み込むメタデータファイル(省略時、out_jsonが存在すればそれを読み込む)")
  44. parser.add_argument("--caption_extention", type=str, default=None,
  45. help="extension of caption file (for backward compatibility) / 読み込むキャプションファイルの拡張子(スペルミスしていたのを残してあります)")
  46. parser.add_argument("--caption_extension", type=str, default=".caption", help="extension of caption file / 読み込むキャプションファイルの拡張子")
  47. parser.add_argument("--full_path", action="store_true",
  48. help="use full path as image-key in metadata (supports multiple directories) / メタデータで画像キーをフルパスにする(複数の学習画像ディレクトリに対応)")
  49. parser.add_argument("--recursive", action="store_true",
  50. help="recursively look for training tags in all child folders of train_data_dir / train_data_dirのすべての子フォルダにある学習タグを再帰的に探す")
  51. parser.add_argument("--debug", action="store_true", help="debug mode")
  52. return parser
  53. if __name__ == '__main__':
  54. parser = setup_parser()
  55. args = parser.parse_args()
  56. # スペルミスしていたオプションを復元する
  57. if args.caption_extention is not None:
  58. args.caption_extension = args.caption_extention
  59. main(args)