PIL(Pillow)による画像ファイルからの統計情報取得、処理時間が短くできました
さて、一番始めはヒストグラムを得る方法と言いつつ、いまになっては統計情報の方を得るのが目的となっているわけですが、画像処理ライブラリのPILを使ってプログラミングを作るところまで進みました。
ここに至るまでの経緯は以下のブログ記事に書いています。
ImageMagickのidentifyで得られる情報と、PIL(Pillow)のPIL.ImageStatで得られる情報は同じものというわけでは無いようです。そのへんは数値的に画像を処理すれば同じデータが得られると思いますが、目的としてはまったく同一のデータを得ることではないので割愛。とりあえずmeanの値だけ得られればいいかなと。
さてPILを使って同様なデータが得られるようになったといっても、identifyをシェルスクリプトで回した時よりも処理時間が短くなければ作った意味が勉強目的くらいにしかなりません。ということで両者で処理時間比較を行ってみることに。
ただ条件としてidentifyとPIL.ImageStatで得られる情報が異なるので比較といっても参考程度ということで。
扱うファイルはいつもタイムラプス動画で撮影している画像ファイルで、ファイル数は4345個。条件をなるべく近づけるために、PILの方も出力項目をidentifyと同じ5つに合わせました(ただ項目自体が違っているのは前述の通り)。
始めに言っておくと、identifyのシェルスクリプトというのは以下のようないくつもコマンドをパイプでつなげたものを全ファイル数に対して行う形式のため、始める前から処理時間かかりそうと思えます。始める前から勝負は見えているような気がしますが、まぁやってみましょう。
identify -verbose webcam-20181010-025515.jpg | grep 'Image statistics' -A 8 | tail +5| awk -F: '{print $2}
' | awk '{print $1}' | sed -z 's/\n/, /g' | awk '{print "02:55:15,", $0}'
全ファイル処理に要した時間は10分20秒。
ではPILを使って作ったPythonスクリプトはどうかというと、
結果は1分13秒。
書き直すと
- identifyの方 : 10分20秒
- PILの方 : 1分13秒
PILの方が圧倒的に速く約9倍も違うという結果が出ました。始めから勝負は見えてたんですけど、ここまで違いが出るとは。びっくり。
補足しておくとidentify自体が遅いというわけではないです。identifyでは出力項目が90近く、今回はそれをgrepやらawkやらで必要な部分以外を削ぎ落としています。一方PILを使った方は必要な項目のみを取得するよう作っています。なので単純な比較としては条件がまったくフェアではないです。あくまでもこの私が欲しい情報を取得する手法としての比較程度のお話になります。
さて、処理速度の違いはそれとして、出力内容ですが、meanの値が両者で若干異なっている模様。異なるといっても差はわずかなので処理アルゴリズムの違いなのかな?と思います。一応あとで総合的に比較して見ようと思います。
追記 2018年10月12日
データ比較
identifyとPILでmeanの値の差異を見るためにグラフにしてみました。紫のラインがidentifyで得られた数値から作ったもので、緑のラインがPILで得られた数値から作ったもの。ほぼ同じなので上に描画されている緑のラインしか見えていないですね。
そして、グラフの一部を以下のように拡大してもほぼ差異は見られません。
しかし、グラフの別の部分を拡大すると若干ながら差異があることが分かります。identifyの紫のラインがやや低くなっている模様。
違いが出るのは計算アルゴリズムの違いなのかと思いますが、全体としてはほぼ同じと見なせるかなと思います。厳密性にこだわるならアルゴリズムを土台にして一から組み立てていく必要がありますが、まぁさすがにそこまで首を突っ込みたいわけでもないので、この話はこんなところで一端終わりということにしておきましょう。
Amazon Python関連書籍など
コメント
コメントを投稿