multiprocessingを用いた高速化処理

Python

マルチプロセスを活用した画像処理の高速化

データサイエンスやAIのプロジェクトでは、大量のデータを処理することが頻繁にあります。
特に、画像処理のようなリソース集約型のタスクでは、処理時間が大幅にかかることがしばしばです。こうしたケースにおいて、コンピュータの複数のCPUコアを活用して並列処理を行う「マルチプロセス」が非常に有効です。

今回は、Pythonの標準ライブラリであるmultiprocessingを使って、複数の画像に対するフィルタ処理を並列化し、高速化を図る手法について説明します。


画像処理の概要

今回の画像処理では、Pillow(PIL)ライブラリを使用して、複数のJPEG形式の画像に対して「ぼかしフィルタ」を適用します。複数の画像を順番に処理するのではなく、並列に処理することで処理時間を短縮します。

使用するコード

まず、必要なPythonコードは以下の通りです。

from multiprocessing import Pool
from PIL import Image, ImageFilter
import os

# フィルタ処理を適用する関数
def apply_filter(image_path):
    img = Image.open(image_path)
    img = img.filter(ImageFilter.BLUR)  # ぼかしフィルタを適用
    img.save(f"filtered_{os.path.basename(image_path)}")
    return f"Processed {image_path}"

# JPEGファイルをフォルダから取得する関数
def get_jpg_files(folder_path):
    # 結果を格納するリスト
    jpg_paths = []

    # 指定されたフォルダ内のファイルをループ
    for filename in os.listdir(folder_path):
        # ファイル名が.jpgで終わるかチェック(大文字小文字を区別しない)
        if filename.lower().endswith('.jpg'):
            # フルパスを作成
            full_path = os.path.join(folder_path, filename)
            # フルパスをリストに追加
            jpg_paths.append(full_path)

    return jpg_paths

# メイン処理
if __name__ == "__main__":
    # 画像ファイルのパスを一括取得
    folder_path = 'your_images_filepath'
    image_files = get_jpg_files(folder_path)  # 処理する画像ファイルのリスト

    # 4つのプロセスを使用して並列処理
    with Pool(4) as p:
        p.map(apply_filter, image_files)
    
    print("ぼかし処理が完了しました。")

コードの説明

  1. apply_filter関数:
    • 画像パスを受け取り、PillowのImageモジュールを使って画像を開きます。
    • ImageFilter.BLURを使ってぼかしフィルタを適用し、
      フィルタ処理された画像を保存します。
    • 処理した画像のパスを返すようにしています。
  2. get_jpg_files関数:
    • 指定されたフォルダからすべての.jpgファイルを検索し、フルパスをリストにして返します。
    • フォルダ内のファイルを一括で取得する際に、大文字・小文字を区別せずに.jpg拡張子を検索します。
  3. __main__関数:
    • 画像が保存されているフォルダパスを指定し、get_jpg_files関数で対象の画像ファイルリストを取得します。
    • Pool(4)で4つのプロセスを立ち上げ、各画像ファイルに対して並列処理を行います。

マルチプロセスによる並列化の利点

処理時間の短縮

通常、1つのプロセスで画像を1枚ずつ順番に処理すると、CPUの1コアしか使用しないため処理が遅くなります。特に、数百枚、数千枚といった大量の画像を処理する場合、この方法では非常に非効率です。しかし、multiprocessingライブラリを使って複数のプロセスで並列処理を行うと、複数の画像を同時に処理できるため、処理時間が大幅に短縮されます。

CPUリソースの効率的な活用

マルチプロセスでは、コンピュータに搭載されている複数のCPUコアをフル活用できます。
シングルプロセスでは1つのコアしか使用しませんが、
マルチプロセスを使うことで複数のコアが並行して処理を行い、処理効率が向上します。


実行環境の設定

必要なライブラリ

このコードを実行するためには、Pillowライブラリが必要です。
以下のコマンドでインストールできます。

pip install pillow

実行手順

  1. スクリプトをPythonファイルとして保存します(例: multiprocessing.py)。
  2. ターミナルを開き、スクリプトのあるディレクトリに移動します。
  3. 以下のコマンドを実行し、処理時間を計測します:
time python multiprocessing.py

このコマンドにより、スクリプトの実行時間が自動的に計測され、
使用するプロセス数に応じたパフォーマンスの違いを確認できます。


実行結果

スクリプトが実行されると、指定したフォルダ内のすべてのJPEG画像にぼかしフィルタが適用され、ファイル名の先頭に「filtered_」という接頭辞が付いて保存されます。


まとめ

このように、multiprocessingを使うことで、CPUリソースを最大限に活用し、大量の画像処理を効率的に行うことができます。データサイエンティストやエンジニアが扱う大規模データにおいて、並列処理は非常に強力なツールです。特に、今回のような画像処理のタスクでは、処理時間を大幅に短縮できるため、プロジェクトの進行スピードを向上させることが可能です。

コメント

タイトルとURLをコピーしました