example.make_npKnown_parallel のソースコード

"""
npKnown.npzファイルを並列処理で作成するスクリプト.

Summary:
    このスクリプトは、指定されたディレクトリ以下のサブディレクトリを並列処理し、
    各サブディレクトリ内にnpKnown.npzファイルを効率的に作成します。
    並列処理を利用することで、従来の逐次処理よりも高速にファイルを生成できます。

Features:
    - 並列処理を使用して実行速度を向上。
    - サブディレクトリごとにnpKnown.npzファイルを作成。
    - 既存のnpKnown.npzファイルをスキップする仕組み。

Requirements:
    - ttkbootstrap
    - concurrent.futures
    - face01lib.load_preset_image

Usage:
    ターミナルで以下のコマンドを実行してスクリプトを起動します。

    ```bash
    python3 example/make_npKnown_parallel.py
    ```

Example:
    実行後、ディレクトリ選択ダイアログが表示されます。
    選択したディレクトリ内のすべてのサブディレクトリに対して、
    並列処理を利用してnpKnown.npzファイルが生成されます。

Source code:
    `make_npKnown_parallel.py <https://github.com/yKesamaru/FACE01_DEV/blob/master/example/make_npKnown_parallel.py>`__
"""

import os
import sys
from concurrent.futures import ProcessPoolExecutor
from tkinter import filedialog

import ttkbootstrap as ttk

dir: str = os.path.dirname(__file__)
parent_dir, _ = os.path.split(dir)
sys.path.append(parent_dir)
from face01lib.load_preset_image import LoadPresetImage


[ドキュメント] def select_directory(): root = ttk.Window(themename="minty") root.withdraw() selected_directory = filedialog.askdirectory( title="ディレクトリを選択。`assets/data/a`を選択してみましょう。", initialdir=os.getcwd()) root.destroy() return selected_directory
[ドキュメント] def process_subdir(dirpath): load_preset_image_obj = LoadPresetImage() # 各プロセスでインスタンスを生成 npz_file_path = os.path.join(dirpath, 'npKnown.npz') if os.path.exists(npz_file_path): print(f"{npz_file_path} は既に存在します。処理をスキップします。") return image_files = [file for file in os.listdir(dirpath) if file.lower().endswith('.png')] if image_files: print(f"{npz_file_path} を作成します...") load_preset_image_obj.load_preset_image( deep_learning_model=1, RootDir=dirpath, preset_face_imagesDir=dirpath ) print(f"{npz_file_path} を作成しました。") else: print(f"{dirpath} に画像ファイルが見つかりませんでした。処理をスキップします。")
[ドキュメント] def create_npz_for_all_subdirs_parallel(root_dir, num_processes=4): subdirs = [os.path.join(dirpath) for dirpath, _, _ in os.walk(root_dir)] with ProcessPoolExecutor(max_workers=num_processes) as executor: executor.map(process_subdir, subdirs)
if __name__ == '__main__': root_dir = select_directory() if not root_dir: print("ディレクトリが選択されませんでした。プログラムを終了します。") sys.exit() create_npz_for_all_subdirs_parallel(root_dir, num_processes=4)