はじめに
画像処理で速度を必要とするアプリケーションを作っているところ、前処理でアプリに組み込まないスクリプトをPythonで組んだ時の話です。
「標準ライブラリを使えばpipで新しいライブラリをインストールする必要がないから楽なんだよな。。
どのくらいに性能差があるのだろうか」
ということで速度検証してみました。
速度検証
速度検証対象
- OpenCV:4.6.0.66
- Pillow:9.1.1
画像の左右上下が分かりやすく、速度差を出すため容量も高いものを選びました。
使用した画像は以下のPixabayのCDD20さんの画像を使わせて頂きました。
速度検証結果
実際に実行してみた結果をまとめてみました。
実行項目 | OpenCV | Pillow |
---|---|---|
読み込み | 0.1060 | 0.0075 |
回転(時計回り) | 0.0273 | 0.1271 |
回転(反時計回り) | 0.0230 | 0.0395 |
回転(180度回転) | 0.0164 | 0.0324 |
縦連結 | 0.0190 | 0.0527 |
横連結 | 0.0343 | 0.0594 |
リサイズ | 0.015 | 0.0767 |
考察
まず知っておいてほしいことが以下のライブラリの位置付けで実際には得意分野があったりします。
おいおい、それなら比べる必要ないだろと思う人!!案外、予想外の結果も出るものなので気になったら検証をすべきだと私は思います。
- Pillow(PIL): 画像処理ライブラリ
- OpenCV: コンピュータビジョンライブラリ
以上のことからPillowは純粋に画像を操作することに長けるのですが、逆にOpenCVは画像認識等のAIを使う上で分析しやすいようにndarray形式になっており、コンピュータビジョン系に向いています。
-
読み込み
情報量が多い OpenCV がどうしても読み込み速度になると遅くなるようです。
逆に PIL は画像処理ができる情報のみでいいので速度は雲泥の差です。 -
回転
ndarray形式で持っているOpenCVは単純に数値変換で済むのでやはり「OpenCV > PIL」という結果になりました。それを踏まえても時計回りがやけに時間がかかていることが気になりますね。。 -
連結
やはり、こちらにおいても結果は「OpenCV > PIL」になりました。縦結合においては2倍以上のスコアを出しています。 -
リサイズ
これは、雲泥の差ですね。OpenCVが4枚終わってもPILは1枚も終わっていないので、OpenCVで1時間かかる作業を5時間近くかけてやるとなると大量のデータにこの処理を行うときは考え物ですね。
まとめ
今回は簡単な画像処理と速度のみに注目してしまいましたが、画像処理のできることにおいては完全にPIL勝ちです。ですが、OpenCVは読み込み速度の遅さがネックでした。ほかの速度を帳消しにしそうな勢いだったので純粋にOpenCVの方が速いとも言いずらい結果になりました。
いかがだったでしょうか。こういう検証も意外な結果が出たりして面白いとは思いませんか?
では、また次回に。。