こんにちは!
今回、自分の面倒な作業を解消するためにOSSのPythonライブラリを開発したので、紹介します
uv add flowimdsもしくは、pip install flowimdsで使用できます!
以下、リポジトリです
Github:https://github.com/mori-318/flowimds
開発を始めた背景
私には、長年の疑問がありました
なぜ画像を一括処理する良い感じのライブラリが存在しないんだ!!!!
自分で簡単に実装することもできますし、最近ならAIに頼むだけで実装できますが、これを毎回行なったり、メンテナンスすることは面倒ですよね、、、
そこで、自分でライブラリを開発して公開すれば良いのではないかとなりました笑
また、OSS開発に興味があったため、OSSとして開発をすることにしました
flowimdsの紹介
簡単な使用方法
インストール
uv add flowimds
もしくは、
pip install flowimds
一番基本的なコードは、以下になります!
# ライブラリのインポート
import flowimds as fi
# どのような画像処理を行うかを設定
pipeline = fi.Pipeline(
steps=[
fi.ResizeStep((128, 128)), # 画像を128x128のサイズにリサイズ
fi.GrayscaleStep(), # グレースケール化
],
)
# 処理対象のフォルダを選択して、処理を実行
result = pipeline.run(input_path = "input_dir")
# 指定したディレクトリパスに画像を保存
result.save(output_path = "output_dir")
flowimdsの特徴
- シンプルで簡単に画像一括処理を実装することができます
- 並列処理などの高速化のための工夫を行なっているため、処理速度が結構早いです!
- 入力ディレクトリの構造を保った出力ディレクトリの生成ができます
- ossライブラリのため、改善点や欲しい機能などあれば、開発者としてライブラリに反映させることができます
- etc ..
その他機能
上記の基本的なコード以外に使用できる機能を以下に示します!
- runでは、画像ディレクトリパス(input_path)以外に、画像パスのリスト、2次元numpy配列のリストを指定できます
- ResizeStepやGrayscaleStep以外にも、roteteStepやflipStepなど他の処理を組み合わせることができます
- Pipeline定義時に、引数でlog=Trueにすることで、詳細なログ出力を行うことができます
- etc ..
OpenCVを使った簡単な一括処理スクリプトとの処理速度比較
画像1万枚に対して、同じ内容の画像処理を行った場合の処理速度を比較してみます
検証環境は、以下のとおりです!
- M3 Macbook Air
- メモリ:16GB、ストレージ:512GB
使用したコードは以下です!
- OpenCVを用いた簡単な画像一括処理スクリプト
import os
import glob
import time
import cv2
def process(input_dir, output_dir):
start = time.time()
image_paths = glob.glob(os.path.join(input_dir, "*"))
os.makedirs(output_dir, exist_ok=True)
for image_path in image_paths:
image = cv2.imread(image_path)
resized_image = cv2.resize(image, (128, 128)) # 128x128へのリサイズ
gray_image = cv2.cvtColor(resized_image, cv2.COLOR_BGR2GRAY) # グレースケール化
cv2.imwrite(os.path.join(output_dir, os.path.basename(image_path)), gray_image)
end = time.time()
print(f"処理時間: {end - start:.3f}秒")
if __name__ == "__main__":
process("tmp", "out")
- flowimdsを用いた画像一括処理スクリプト
import time
import flowimds as fi
def process(input_dir, output_dir):
start = time.time()
# 処理内容の定義
pipeline = fi.Pipeline(
steps=[
fi.ResizeStep((128, 128)), # 画像を128x128のサイズにリサイズ
fi.GrayscaleStep(), # グレースケール化
],
)
result = pipeline.run(input_path = input_dir)
result.save(output_dir)
end = time.time()
print(f"処理時間: {end - start:.3f}秒")
if __name__ == "__main__":
process("tmp", "out")
結果
| OpenCVスクリプト | flowimdsスクリプト |
|---|---|
| 9.7秒 | 3.1秒 |
上記のように、flowimdsの方が高速なことがわかります!
最後に
今回は、私が開発した画像一括処理のためのPython OSSライブラリ、flowimdsを紹介しました
今後も、機能追加など行なっていくつもりです
また、もしこのプロジェクトに参加したかったり、改善点やアイディアがある場合は、ぜひコントリビューターとしてプロジェクトに参加して欲しいです!
一緒に進化させていきましょう!!!
