マルチプロセスを活用した画像処理の高速化
データサイエンスや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("ぼかし処理が完了しました。")コードの説明
apply_filter関数:- 画像パスを受け取り、Pillowの
Imageモジュールを使って画像を開きます。 ImageFilter.BLURを使ってぼかしフィルタを適用し、
フィルタ処理された画像を保存します。- 処理した画像のパスを返すようにしています。
- 画像パスを受け取り、Pillowの
get_jpg_files関数:- 指定されたフォルダからすべての
.jpgファイルを検索し、フルパスをリストにして返します。 - フォルダ内のファイルを一括で取得する際に、大文字・小文字を区別せずに
.jpg拡張子を検索します。
- 指定されたフォルダからすべての
__main__関数:- 画像が保存されているフォルダパスを指定し、
get_jpg_files関数で対象の画像ファイルリストを取得します。 Pool(4)で4つのプロセスを立ち上げ、各画像ファイルに対して並列処理を行います。
- 画像が保存されているフォルダパスを指定し、
マルチプロセスによる並列化の利点
処理時間の短縮
通常、1つのプロセスで画像を1枚ずつ順番に処理すると、CPUの1コアしか使用しないため処理が遅くなります。特に、数百枚、数千枚といった大量の画像を処理する場合、この方法では非常に非効率です。しかし、multiprocessingライブラリを使って複数のプロセスで並列処理を行うと、複数の画像を同時に処理できるため、処理時間が大幅に短縮されます。
CPUリソースの効率的な活用
マルチプロセスでは、コンピュータに搭載されている複数のCPUコアをフル活用できます。
シングルプロセスでは1つのコアしか使用しませんが、
マルチプロセスを使うことで複数のコアが並行して処理を行い、処理効率が向上します。
実行環境の設定
必要なライブラリ
このコードを実行するためには、Pillowライブラリが必要です。
以下のコマンドでインストールできます。
pip install pillow
実行手順
- スクリプトをPythonファイルとして保存します(例:
multiprocessing.py)。 - ターミナルを開き、スクリプトのあるディレクトリに移動します。
- 以下のコマンドを実行し、処理時間を計測します:
time python multiprocessing.py
このコマンドにより、スクリプトの実行時間が自動的に計測され、
使用するプロセス数に応じたパフォーマンスの違いを確認できます。
実行結果
スクリプトが実行されると、指定したフォルダ内のすべてのJPEG画像にぼかしフィルタが適用され、ファイル名の先頭に「filtered_」という接頭辞が付いて保存されます。
まとめ
このように、multiprocessingを使うことで、CPUリソースを最大限に活用し、大量の画像処理を効率的に行うことができます。データサイエンティストやエンジニアが扱う大規模データにおいて、並列処理は非常に強力なツールです。特に、今回のような画像処理のタスクでは、処理時間を大幅に短縮できるため、プロジェクトの進行スピードを向上させることが可能です。


コメント