dondakeshimoの丸太

データサイエンス/Webアプリケーション/

node + opencvに踊らされた話するわ

Open CV

言わずと知れた汎用画像処理ライブラリ。 最近知ったのはIntel社が出しているということ。 とりあえずかなりすごいという印象。 今回、行いたかったのは顔認識を行って顔部分を切り取って背景に乗っけるというもの。

went-went-takkun135.hatenablog.com

これの続きです! node上でopencvを扱えるライブラリも出ていたので、 こいつはサクッと行けるだろうとタカをくくっていたのですが、、、
ということで、今回露頭に彷徨いながら無理だったこととできたことを書きます。

Mac OS Xに導入

開始前の状態

実は自分のMacにはずいぶん前に師匠が入れてくれていたので、 そもそもopencvが存在する状態ではありました。 また、node-opencvはopencv2系のみをサポートしており、 ずいぶん前に入れていたことが功を制し、もう

npm install --save opencv

だけで行けると思ってたのですが、エラー。。

エラーに次ぐエラーと調査に次ぐ調査

brew update

エラーログを調べると明らかにopencvがないと言っていて、 パソコンを調べると明らかにopencvが入っているという矛盾。 昔に入れたから何かしらが変わったのかと思ってとりあえずは、

brew update opencv

そしたら、hey hey!opecv3にあげるならupgradeにしないと! 的なこと言われてfu*kってなりました。 結果、npmは微動だに認識せず。

brew unlink, brew reinstall

とりあえず、片っ端から再インストール系のコマンドを試していきましたが

なんの成果も得られませんでしたぁぁ!!

実行ファイルをリンク

結論から言うと、下記のコードを打ち込めばなんとかなりました。 opencvのバージョンは自分のものに直しました。

brew link --force opencv3
ln -s /usr/local/Cellar/opencv3/3.1.0_3/share/OpenCV/3rdparty/lib/libippicv.a /usr/local/lib/

Error: opencv@5.0.0 install · Issue #398 · peterbraden/node-opencv · GitHub

コマンドを眺める限り実行ファイルがbrewのカゴの中から 飛び立てなかったようですね。 これはopencvが悪いと言うよりは、 node-opencvがopenvを認識する範囲が狭すぎたことが原因の仮説です。

npm install opencv

これはこれで地獄を見ました。 謎のエラーが出続けるのですよ。 今回の一件でnode-pre-gypと言う謎のライブラリとELIFECYCLEなるエラーコードを 心底憎むようになりました。

様々なものをアップデート

とりあえずこれをしてみなよ!ってどっかのISSUEで言っていた諸々updateをやりました

npm install node-pre-gyp
npm install node-gyp
npm update -g npm

しかし効果はいまいちのようだ。

腹たったのでとりあえずnode_moduleを削除

一回ぶち消してもう一回installして見ました。 案の定ダメでした。
が、
少し収穫、sharpなる画像のサイズ変更モジュールとの依存関係がうまく言ってないっぽい?

腹たったのでとりあえずnode_moduleを削除2

依存関係か、なるほどと思い、その時相当尖っていた筆者はもう一度node_moduleを削除。

npm install -save opencv
npm install

と言う順番でinstallを敢行。 なぜだろう、動いてしまった。 原因はおそらくだがsharpとの依存関係で何かしらの悪さがあったのだろう

実はこれすればよかった説

npm dedupe

って打ち込むとなんかバグってる依存関係直してくれるらしいので、 最初からこれして入ればよかったかもしれないですね。

AWS Elastic Beanstalkに導入

結論から言いますが、できませんでした。

Elastic Beanstalkについてざっと

ソースコードをデプロイしたら、その他諸々の設定を自動でこなしてくれるAWSの1サービス。 nodeのものを使う場合、基本的にはpackage.jsonを勝手に読み込んでくれるため、 本当に特に設定なしで使える(はず)。 拡張設定を行いたい場合.ebextensionsと言うディレクトリを作成し、 その中にyaml形式かな?でコマンド等を書き込んでいく。

yumopencvのライブラリがない問題

Amazon Linuxのパッケージマネージャーはyumのはずなんですけど、 yumには一発でopencvが入るものが内容です。 正確には公式サイトに

sudo yum install numpy opencv*

で一発だよって書いているんですが、amazonyumは少し普通と違うのかな? 了解した。じゃあ生コードから入れるっきゃねーな。

とりあえずssh接続で確認

いきなり.ebextensionsにコマンド頑張って書き込んでミスりまくってたら恥ずかしいので、 まずはssh接続して、内部で試してみました。

sudo yum install -y cmake
sudo git clone https://github.com/Itseez/opencv.git /opt/elasticbeanstalk/eb_infra/opencv
cd /opt/elasticbeanstalk/eb_infra/opencv
sudo git checkout 2.4.13.2
sudo cmake ./
sudo make
sudo make install

これ最終形態ではあるんで、ここに来るまでの紆余曲折はあったものの 基本的にこれでインストールぽいことができていたと思います。 usr/local/binopencv_versionみたいなコマンドが存在することを 確認しただけではありますが。

.ebextensionsに記述

上記のコマンドをそのまま写しました。 そのまま順番に01-command, 02-commandとやって最初試すと、 04-command.gitディレクトリがないとのたまい始めたので、 これはもしかしたら並列処理で進んでる可能性があると考え、 全部&&で結んで一行のコードにしてやりました。 そしたら通ったので、elasticbeanstalkはおそらく 番号まで振らしておきながら 並列でコマンドをかけてやがります。

npm install 。。。

再度ここで壁にぶつかりました。 もうnode使うのやめろよと言う悪魔の声を 宗教上の理由で! と言う意味不明のパワーワードで搔き消しながら進んでいこうとしたのですが、 序盤に行ったようにnpm installを自動で実行してくれるため、 順番を変えたりできないんですよね。。 内部のPythonコードを書き換えたりしてみたのですがダメでした。

Game Over

でございました。

結論

OpenCV使うならPythonがいいと思う。


追記(2017/10/2)

上でグダグダぐちぐち言っておりますが、原因がわかったと思われます。

Unsupported platform for fsevents@1.1.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

エラーコードにこれが含まれていました、依存ライブラリがもしかしたらそもそもlinuxはサポートしていなかったのかもしれない。。 お騒がせいたしました。