かえるのプログラミングブログ

プログラミングでつまずいたところとその解決策などを書いていきます。

herokuで python3 + opencv を動かす 2018/09/16

かえるるる(@kaeru_nantoka)です。
 

今回は、heroku 環境で python3 + opencv を動かす という内容で書いていきます。

方法は主に二つありまして
i ) docker 環境を構築する。
i i ) build pack を利用する。

で、今回は後者で実装していきます。

この時参考にさせて頂いた記事(https://takasa-5.blogspot.com/2018/02/opencv-4-heroku-python3-opencv.html?m=1)でとても簡潔にわかりやすく書かれていました。

こちらをベースに設定ファイルを少し調整し、私が動作を確認できた内容になっています。

ソースコードGitHub にあげておりますので参考にしていただければ幸いです。

GitHub - osuossu8/python3_opencv_tutorial )


***目次***

1:経緯

2:結論

3:ソースコードの説明

4:heroku 側の設定

5:まとめ

********



1: 経緯

私が機械学習を用いた画像判別LINE Bot を作成し、heroku にデプロイしたときの話です。

例のごとくアプリケーションエラーが出てきていつものように heroku  logs --app アプリ名でログを確認してみると、「 import cv2 」 のところでエラーが出ているようでした。

ググってみると、

・素のheroku環境では cv2 を読み込めない

・heroku 側の設定で buildpack というものを追加し、機能を拡張する

・Aptfile という設定ファイルを作成し、buildpack に対する命令を書き込む

といった手順を踏む必要があるらしいとわかりました。

 

2: 結論

⬆︎のリンクで書かれていた内容 + Aptfileに2行追加する

という形で私の場合は動くようになりました。

 

3: ソースコードの説明

今回のディレクトリ構成は以下のような感じになっています。

python3_opencv/

  • main.py *
  • requirements.txt **
  • Aptfile ***
  • shiogao_model2.h5 ****
  • runtime.txt
  • Procfile

特に今回のポイントになる部分を以下で解説します。 

i ) main.py

ブラウザ上で hello world ! と出力されるだけのプログラムです。

f:id:kaeru_nantoka_py:20180916223336p:plain

(⬆︎ うまく行った時のログです。)


あくまで今回の目的は、

・cv2 のimportでエラーが出ないようにすること

機械学習モデルを load して、ロードできているか確認する(おまけ)

ですので、「機械学習で使用するライブラリを import した上でエラーが出ずにプログラムが実行された状態」をわかりやすく実現するために簡潔な処理だけ入れています。

因みに、コメントアウトしてる load_model あたりの# を外すと、hello world ! が表示されなくなり、ログで以下のようなものが確認できるはずです。

f:id:kaeru_nantoka_py:20180916220021p:plain

理由はモデルに投入する画像データを想定するサイズでインプットする処理が抜けているからです。
しかし、 model.summary() が実行されてログが確認できていることから、from keras.models import load_model がきちんと読み込まれていることがわかります。

i i ) requirements.txt

heroku 環境に pip install して欲しいライブラリを記述します。今回は、
Flask, pillow, keras, tensorflow,
opencv-python

を記述しています。
バージョン名を記述しなければ、heroku 対応しているバージョンを勝手にとってきてくれます。

i i i ) Aptfile

今回のポイントです。
buildpack と一緒に組み合わせて heroku 機能を拡張するようなものと認識しております。(詳しい方教えてください。。)
libsm6, libice6 は参考にさせて頂いた記事で書かれていたものです。

この二行のみの状態でデプロイしたところ、記事のようにうまくいかなかったのでログを見ながら追加したのが以下の二行です。

linfontconfig1
libxrender1

これらを記述したところエラーがなくなりました!


f:id:kaeru_nantoka_py:20180916223436p:plain

(⬆︎ うまくいかなかった時のログです。 import cv2 が云々怒っています。)

i v ) shiogao_model2.h5

こちらは別件で組んだ画像判別モデルです。
これをきちんと読み込めますよ〜と実演するためのファイルなのでなんでも良いです。


4: heroku 側の設定

settings の buildpack  のところに urlを追加する形で実装します。

f:id:kaeru_nantoka_py:20180916215759p:plain

  • buildpackとは?

公式のリンクを貼っておきます。
 
Heroku buildpack | Heroku


5: まとめ

現在機械学習が流行っており、私のようにローカルで作成したものをデプロイしたい!という同じ気持ちを持った方々に届いたら嬉しいです。

タイトルは python3 + opencv となっていますが、 ソースコードではおまけで ローカルで学習させたモデルを loadしてsummaryを確認するというような内容も組み込んでいますのでお役に立てればと思ってます。

以上、ありがとうございました。