ロボット研究者の戯言

Python で画像の読み込みが遅い

   

Python で画像の読み込みが遅い

最近,物体検出プログラムを作成しているのですが,処理時間を計測してみるとやたらと遅いことが分かりました.

1枚の画像に対して1枚くらいかかっている…

少し詳しく調べると,内訳は以下のようになっていました.

  1. PILで画像の読み込み → 0.862 [ms]
  2. PIL形式からnumpy形式への変換 → 910.225 [ms]
  3. ディープニューラルネットによる推論 → 21.362 [ms]

画像の読み込みそのものは1ミリ秒以下なのですが,numpyへの変換で時間がかかっていることが分かります.
(お気づきの通り,この記事のタイトルは厳密に言うと間違っています)

これでは高速な物体検出モデルを使用する意味がない!

以下が画像読み込み部分のコードです(ライブラリのインポートは省略)

ということで,上のコードに代わる,画像をnumpy形式で高速に読み取る方法を探しました.

OpenCVを使う

他にも方法があるかもしれませんが,OpenCVを使うとかなり高速化できたので,そのコードを以下に載せておきます.

OpenCVのimreadを使うといきなりnumpy形式で読み込まれます.

しかし,OpenCVでは色の順番がBGR(青,緑,赤)となっているため必要に応じてcvtColorでRGB(赤,緑,青)に変換します.
(PILでは読み込んだ時点でRGBの並びになっています)

処理時間を計測したところ,

  1. imread関数で画像の読み込み → 9.692 [ms]
  2. cvtColor関数でRGBに変換 → 0.696 [ms]

となりました.画像を読み込んでからnumpy形式に変換するまで,約10ミリ秒しかかかっていません.

以前の方法では約911ミリ秒かかっていたので,なんと99.1倍速くなりました!!笑

もしかすると,PILを使っても高速にnumpy配列に変換する方法があるかもしれませんので,ご存知の方はぜひ教えてください.

 - Python, 機械学習 , , , ,