2018年2月10日土曜日

OpenCV で星座検出(4) - Heroku と Python3 と OpenCV

前回の投稿からだいぶ間が空き、内容もかなり変わってきます。
まだまだ改良を続けたい星座検出プログラムですが、星座の写った写真を全然持ってないよ~ということでした。
そこで、webサービスという形にして利用できるようにすれば写真を集められるのではないかと考えたのでした……。
というわけで今回はwebサービスとしてスタートアップするためにどんなことをしたのかメモ書きします。


1. サーバ

安定して動かせるかもわからない、ユーザもいるかわからないという状況でサーバレンタルするのは怖いです。お金もないし。
そういうときに便利なのが PaaS(Platform as a Service) とかいうやつで、何だこれはというとインターネットを通じてサーバ使えるよ~みたいな感じなのかな。
今回は Heroku というサービスを利用します。
GUI音遊びアプリでも じつはこのサービスを使っていましたが、静的ページ(なんにも情報を送らず、サーバとクライアントのインタラクションがない)だったのでそんなに苦労することはなかったです。
今回想定しているのは、

「ユーザがローカルの星景写真を選んでサーバへ送信」
   ↓
「サーバで画像を処理してクライアントへ返信」
   ↓
「クライアントで表示し、ユーザは星座情報をゲットできる」

みたいな流れなので、インタラクションがあります。
つまりサーバもクライアントも両方書かないといけません。いやですね~
てかローカル通信しか書いたことないわ!

2.ことの顛末

Python で書いた星座検出プログラムと組み合わせたいので、サーバも Python で書きました。flask-socketio というモジュールでわりと簡単にいったように思います。ネットに参考になるサイトがいっぱいある時代に生まれてよかった!
このへんはたくさんの先人たちにお任せして、ここでは今回一番大変だったことを伝えたいです。

まず僕はどうやって Heroku 上でサーバーって動くんだろう?と疑問に思いました。
依存パッケージとかの構築ってどうなっとんじゃいと。
これは単純で、Heroku では(Python の場合)、「requirements.txt」に依存パッケージを書いて、「Procfile」に始動のためのコマンドを書いておけばちゃんとやっといてくれるらしいです!
すごいすごいと思いながら調べて調べて書いて書いて起動!
……opencv-python がないって怒られました。
確かにPython3 への OpenCV 導入ってなんかめんどくさい手順を踏んでました(windowsだけ?)。

じゃあどうやって Heroku 上で Python3 向け OpenCV を入れるの?となりますよね。
[heroku python opencv] [検索]すると、何件か出てきました。

こんな感じ
 みんな Docker というのを使っています。HerokuでOpenCVを使うためのdocker imageの作り方はわかりやすくまとまっていまして、
・誰かが必要な環境を作ってくれたbuildpackを使う
・自分で必要な環境を作るDockerを使う
のふたつから選ぶようでした。
まずbuildpackを探していくつか入れてみたのですが、どうしてもうまくいかず Docker を試すことに。さっき調べて出てきたサイトや Docker 公式サイトでやり方をいろいろ勉強して……できそうと感じたのでいざインストール!
インストール中に出てきたウインドウの図
できませんでした!
Windows 10 Homeではダメだそうです!
金払いたくないから Heroku でやろうとしてるのに Pro 買えってさ!!!!

3. 解決方法

というわけでここから先は
・Windows 10 Home を使っている
・Heroku 上で Python3系 OpenCV を使いたい
・python と opencv 入れる buildpack はなんかダメだった
という人向けの解決策です。 

そんなに難しいことはなくて、Docker でやってることを複数の buildpack で解決しただけです。
①まずこんな感じで buildpack を入れます

https://github.com/heroku/heroku-buildpack-apt
順番は多分けっこう大事です。1番目のは Python 使うためにいれるやつで、2番目のが肝です。heroku 環境構築時に Aptfile というファイルを読んで apt-get してきてくれるという buildpack です!かゆいところに手が届きますね。

②こんな感じで Aptfile を作ります
libsm6
libice6

③requirements.txt に opencv-python を追加します
それっぽいのがエラー吐いてたらそっちは消しておきましょう

これで終わり!!
無料でできた!!!!!!!(重要)

4. おわりに

「heroku python opencv」で調べて僕と全く同じ状況になってしまった人がなるべく早くここにたどり着いて解決することを祈ります。

続く

1 件のコメント:

  1. これのせいで3日間ぐらい悩んでました。。。ありがとう!!!

    返信削除