Heroku上でOpenCVを動かすというのをやってみた。HerokuのDocker機能を使う必要があるらしいのだが、これがどうも最近アップデートされていて、最新版でやってみた系の記事が少ない。
Container Registry GA - Deploy Docker images to Heroku | Heroku Dev Center
というわけで自分でやってみた。意外と簡単だった。
サンプルアプリケーションの取得&デプロイ
まずはチュートリアルのGetting Startedセクションを見てサンプルアプリケーションを取得&デプロイし、動作を確認する。
Container Registry & Runtime (Docker Deploys) | Heroku Dev Center
push がうまくいかず二回ほど叩いたりしたが、まあ順当にhello worldが出るところまで進む。
OpenCV入りPython環境に修正
これをベースに、Dockerfileを編集してOpenCV入りのPython環境を作る。やることは:
- ベースイメージをalpineからheroku/heroku:16に変更
- alpineの語彙をubuntuの語彙に置き換え(apk→apt-get, adduser -D→useradd -mなど)
- apt-getにpython-opencvを追加
で、最終的な変更はこんな感じになる。
Fix to import opencv, but an old version · tomoto/poke-gymbadge@df8d4ff · GitHub
これをheroku container:push webすればOK。これでOpenCVがPythonのWebアプリから使えるようになった。まったく簡単だ。
ただ、これだとOpenCVのバージョンが2.xになってしまう。まあこれでも別にいいのだが、できれば3.xを使いたい(引数や定数が微妙に違う)ので、もうちょっと調べてみる。
OpenCVを3.xにする
調べてみたら、既にやってる人がいた!最初調べたときに目に留まらなかったのは何故だろう。
PythonとOpenCVを動かすためにHerokuとDockerに入門した流れ - Qiita
これを参考にDockerfileとrequirements.txtを書き換える。opencvをapt-getではなくpipでインストールし、apt-getでは前提ライブラリのlibsm6だけを入れる。これでOpenCVが3.xになる。変更点はこうなる。
Fix to import opencv, latest version · tomoto/poke-gymbadge@8b5869e · GitHub
ところでapt-getのモジュール名はopencv-pythonで、pipのモジュール名はpython-opencvなのはややこしい。なんとかしてほしい。
アプリケーションコードを書く
あとは普通にOpenCVアプリを書くだけ。こんなんを作ってみた。
ポケモンGOのジムリスト(左)をアップロードすると、バッジポイントの青いバーを読み取って次レベルまでの必要バッジポイントを書き込んで返してくれる(右)。
→