hogehoge, world.

米国カリフォルニアから日本に一時帰国中のソフトウェアエンジニアがIT・自転車・音楽・天体写真・語学などについて書く予定。

Heroku上でPython & OpenCVを動かす

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。これでOpenCVPythonの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アプリを書くだけ。こんなんを作ってみた。

Gym Badge XP Calculator

ポケモンGOのジムリスト(左)をアップロードすると、バッジポイントの青いバーを読み取って次レベルまでの必要バッジポイントを書き込んで返してくれる(右)。

f:id:tomoto335:20171209190638p:plainf:id:tomoto335:20171209190644p:plain