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はサポートしていなかったのかもしれない。。 お騒がせいたしました。

Exif情報を抹消する最速の手法を思いついた気がする

iPhoneで撮った写真

iPhoneで撮った写真には大量のメタ情報が含まれています。 それらをまとめてExif情報っていうらしいんですけど、 普通に写真を扱いたい時に邪魔じゃないですか。 写真をアップロードして表示とかする時に、 あいつのせいで勝手に回転してたりするのがどうも気に食わない時があったんですよね。 ということでそれを削除するというのが今回の目標です。

検索結果と最初にやっていた解決法

Exif情報を消し去ってくれるアプリの宣伝等がヒットしました。 アプリ入れるの面倒だなとなんとなく思い別の記事を見ると、 プレビューアプリ使って、pngにフォーマット変換したらExif消えるよって書いていたので、 pngに変換して見ると、pngって重たいんですね、データサイズが5倍くらいになってしまったので これはいかんとそれを再度jpegに変換。 これをiPhoneからAirdropで送られて来た写真に対し繰り返していました。

気づいてしまった最速の手法

  1. iPhoneからラインで公式アカウントなどに画像を送信します
  2. PCでそのラインを開き画像をダウンロードします
  3. Exif情報が消えます

なるほど、ライン様様ですね。 アップロードの際にExif情報消してくれるらしいですね。

欠点

まとまった大量の画像などには適用しづらいかもです。 アルバム機能使ったらいいかもですけど、 Airdropの方が早いし、そういう時はサクッとアプリを入れてしまえばいいのかなと。

機械学習の勉強会「夏のトップカンファレンス論文読み会」に参加して来た

勉強会?的なものに初?挑戦

すみません。文字化けみたいになりました。 本日abejaさんが企画する 夏のトップカンファレンス論文読み会 に参加して来ました! abejaさんの名前からわかる通り、機械学習の論文読み会です。 企業が主催する勉強会というものに参加したのが初めてのようなもので、 (何回か就活系で行ったことある気もする)しれっと緊張してました。

abeja-innovation-meetup.connpass.com

参加動機として、日頃から参加させていただいている実装クラブのスラックに 本読み会の情報が流れて来て、先輩に筆者のようなへぼエンジニアが参加しても意義はあるのか? と、問うたところ 「正直よくわからん!」 と言われたので行って来ました!笑 予習ばっちしって状態で行く予定でしたが、何も間に合わず前半の人が何を話すかの把握程度での 参加となってしまいましたが、 その中で筆者がなんとなく思ったことなどをまとめていきます。

ディープラーニングは今尚最盛期

まだまだディープラーニングへの熱は冷めてない模様。 一部のトップリサーチャーなどはもう飽きたという声も上がりつつも、 全体のトレンドとしてはまだまだ来ている。 一方で、火付け役となったDCNNは論文がガンガン出てくるような状況ではなく、 GANやRNNなどのCNN以外のディープラーニングの技術が来ている様子。 CNNに関してはこれまでにでた技術を礎として、 その上に何を構築するかのフェーズに入ってきているとのこと、 そんな中、

CNNの畳み込み方には改善の余地がある

という論文を読んでくださったのがyosuke_shinyaさん。 少し、内容が難しくて理解できていない部分の方が多いのですが、 ざっくり言うと既存の画像認識では矩形を設定して畳み込んでいるが、 絶対矩形じゃない方が制度出るよね!その効率的なアルゴリズム考えたよ! みたいな感じだと思います。 すみません。やっぱり何もわかってないかもです。 既存の画像認識で難しかった小さい物体の検出や精度向上が期待されるみたいです!

DNNの見える化

DNNといえばブラックボックスで そのくせにハイパーパラメータが大量にあって、 いや、なんか知らんけどめっちゃいいの出てきたすごない? みたいな分野かなと思っていたのですが、 実際結構そう言う部分があってそこに問題意識もあるようで、 中間層の見える化が進んでいるようです。 これができるようになったらハイパーパラメータの数が減るかもしれないし、 ハイパーパラメータの最適化もすぐ済ませることができると思うから お買い得技術だなと思って聞いていました。

データがやはり大事だが…

データ作成をしている人たちがちゃんといてだな

質のいいデータこそが質の良いモデル作成に必須であることは周知の事実らしいですが、 金銭的コストも時間的コストも持って行かれてかつ、 面白くない という問題だらけのデータ作成問題?アノテーション問題が横たわっているらしいです。 逆にそこに目をつけてデータを売ったり、 有益なデータセットを作成するのも大事な仕事、研究だったようで、 データが命 っていうことはなんども聞いていた気がしたけど、 データ産業の大きさがなんとなく体感できてよかったなと思いました。 また、片岡さんという方がおっしゃっていましたが、 データセットを作るような研究をしていると 問題を出す側に回ることができるそうで、そうすることで 時代を引っ張るような大きな流れを生み出すリサーチャーになれる可能性が出てくるとのこと。 なるほどです。

高価なデータを効果的に利用するという観点

坂井さんという方が発表していらっしゃった内容は、 半教師なし学習です。 正直な話、今日の読み会に出席してトレンドなどとこの発表を聞くまでは 教師の有無に関してわかっているようで何もわかっていませんでした。 教師なしとはつまり強化学習であると思っていたくらいです。 半教師で精度が出せる話を丁寧にしていただいたのですが、 これまた正直な話、多分半分もわかっていないです。 ただ、概念的な説明からしていただいて、そっちの方は理解できたかなと。 ラベル付きのデータセットはコストがかかるので、 ラベルがないデータをうまく使って、コストを抑えることができないか、 また、現実的にラベル付きデータを作成しながら学習させるよりも 大量のラベルなしデータでさらに精度の良い学習ができないか。 というのがモチベーションだと思います。 その中で発表していただいたのはうまくラベル付きとなしを混ぜて行くというもので、 案外それでも精度が出るらしいです。 なるほどです。

今回の勉強会を終えて

わかったこと

  • DCNNに関してはかなりモジュール化が進んでいる
  • DCNNを使って何かをするために最新の技術をサーベイしまくるとかはもう必要なさそう
  • データは死ぬほど重要だから大事に扱う
  • データのうまい使い方はいくらでも出てきそうだからサーベイした方が良さそう?
  • 勉強会に参加することでモチベーションが上がる
  • 機械系の筆者が行くような企業がいっぱい来てたからみんなDL勉強中
  • インターンこそ現代就活最大の武器
  • セカンドエキスパートは最強らしい
  • DNNはツールだから自分の専門に持ち帰ると良い
    • そうすることでDNNのメンターもつくかも!
  • とりあえず実装して遊ぶことから始める
  • (その場では)わからなくてもいいから勉強会に参加するのは大事
  • 大企業でDLの企画?を通すのはなかなか難しい
  • やっぱり数学も大事かも

これからやるべきこと

  • とりあえず実装 -> 現在3D GANを実装というか実装済みのものを理解せんとしてます
  • 最低限の数学的知識を得る(特に表記がわからないという絶望的状況からの脱却)
  • 情報蒐集の網を広げる -> このような勉強会があればまた参加したいなと

以上です!雑なまとめですみません!何か情報があれば教えてくれるとありがたいです。発表者の皆さんお疲れ様でした!

node.jsのgmライブラリでCopyOpacityするのに1日ハマった話するわ

gmライブラリ

node.jsにおける画像編集の鉄板?ライブラリである。 バックでGraphicsMagick(ImageMagick)が動いており、 それらをnode.jsの機能のように使うことをapiなのだろうか。 今回はこのgmライブラリを使ってはまりまくったので、 後に筆者のような愚かな人間が生まれないように記事を書く。 多少心が荒んでいるので、丁寧語が抜けていることをお許し願いたい。

今回やりたかったこと

blog.yug1224.com

サムネイルを作る目的ではないが、 こちらの記事にあるようにmaskとなるpngファイルから 透過値をコピーして、丸く切り取るようなことがしたかった。 また、作業に際し速度が必要であったため、 ImageMagickではなくGraphicsMagickを使うことにした。

compositeとconvert

おそらく、ちゃんとした区分があるのだろうが、筆者のなんとなくの理解では

  • 画像の変換系はconvert
  • 画像の合成系はcomposite

である。 GraphicsMagickにある、コマンドはそんなに多くない。 というかむしろほとんどのことは convertですませるのだろう。 convertを使う場合、基本的に画像ファイルの引数は二つだ。 ここで、問題が生じる。 maskを用いた透過値のコピーには引数が3つ必要なのである。 上記ページからもわかる通り、このような場合はcompositeを用いる他ない。

gmライブラリの仕様上注意

今回のメインディッシュである。 gmライブラリは今のところ、convertコマンドしかサポートしていないのだ。 これが何を意味するかというと,

gmライブラリで今回の目的が達成できない

最終的な筆者のソリューションは、おそらくみなさんが行なっているであろう。 child_processを使って、シェルに直接実行してもらう方針である。

// gmモジュールがcompositeをサポートしていないため関数定義
internals.gmcomposite = function(maskImagePath, tempImagePath, newImagePath, callback) {
  var gmspawn = spawn('gm', ['composite', '-quality', 100, '-compose', 'CopyOpacity', maskImagePath, tempImagePath, newImagePath]);

  gmspawn.stdout.on('data', function(data) {
    console.log('stdout: ' + data);
  })

  gmspawn.stderr.on('data', function(data) {
    console.log('stderr: ' + data);
  })

  gmspawn.on('exit', function(code) {
    if (code !== 0) {
      callback(code, null)
    }else {
      callback(null, null)
    }
  })
};

これでひとまずは実行できた。 恥ずかしい話、ここにたどり着くまでに1日の時間を要した。

GraphicsMagickのややこしいオプション

今回、ここまで時間がかかったのにはgmがサポートしていなかったことと 合い重なってGraphicsMagickのオプションがわかりづらいと言うことがある なんと、

  • convertコマンドには-composite
  • compositeコマンドには-convert

オプションが存在するのだ。 筆者は永遠とgmライブラリの-compositeオプションを使い、 どのオペレータを用いればmaskを用いたCopyOpacityができるのか延々と悩んでいたわけである。

まとめ

え、今回の問題に直面した時の反省点ですか?…マジでわからん。。。 こう言う泥沼にハマった時の対処法誰か教えてください。。

werckerをmac(docker for mac)で動作させたわ

docker for mac

なんか最近出たらしいですね。 これまではdocker toolboxみたいなので、 virtualbox上でdockerを走らせていたらしいのですが、 virtualboxじゃない仮装アプリでなんかdockerの利点を最大限生かせるようになったのが docker for macみたいな記述があった気がします ただいかんせん新しいので、ドキュメントが少ない問題に直面しまして、 誰かの助けになればいいなと一筆した次第であります。

導入手順

wercker-cliを(macに)インストールします

$ brew install wercker/wercker/wercker-cli

macにwercker-cliがインストールされたら、

$ wercker build

で、勝手にdockerがimageを引っ張ってきてくれて使えるようになります。

ちょっと解説のようなもの(間違ってる説は結構ある)

docker toolboxだとvirtualbox上にLinuxカーネルを立てて、 その上にdockerを起動し、さらにその上にwerckerをインストールして起動します。 それに対し、docker for macは仮装環境は挟んでいるものの、 基本的にはOS Xカーネルを使うらしいので、 mac自体にwerckerがインストールされていないと使えない ということで、macの方のlocalにwercker-cliを入れてあげて、 docker上で起動すると、dockerの機能でimageを探してきてくれます!

引っかかったところ

あくまでmac上で起動されているため、 node.jsに置けるbcryptのようなlinuxOS Xで挙動の違うライブラリは macの方のバージョンを入れる必要があります。 そんなん知らんやん。。。 invalid ELFみたいなのが出てきたら用心してください!!

まとめ

dockerは勉強した方が良いな完全に。。。

Macに入れてる「最初に入れとくべき!」みたいなアプリの話するわ

Macに入っているAppの紹介

そういえば最初Mac買った時ってワクワクして開くまではいいけど 何すればいいかわからなくて、 ボソッと「カッケェ…」ってため息ついて閉じてたなと思って、、
そんな状態なあなた必見! 入れといたらやるじゃないかと言われるAppを紹介するぜ!

Alfred

www.alfredapp.com

こいつは死ぬほど定番ですね!どのランキングページにも出現します。 ところで、みなさんspotlight検索って知ってますか? 最近のマックだとcmd + spaceとかで起動できるのかな。 だいたいそれの上位互換です笑 UIが洗練されてて、早いらしい、地味にいろんなコマンドが使えて、カスタマイズできる。 まぁでも、最もこれを入れる利点としては 入れてることで上級者っぽくてかっこいい ってところでしょうね笑 一つだけ使う上で注意というかオススメがあるんですが、 デフォルトではalt + spaceでAlfred起動なんですが、 Ctrl + spaceに変更することを強く推します! 冷静にalt + spaceプラインドタッチとか無理でした笑

AppCleaner

AppCleaner

Windowsってコントロールパネルからアンインストールができるんですけど、 Macそういうのないんですよね、多分。 ということでこのアプリです。依存関係のファイルを検索してくれて、 削除してくれます。操作は簡単ドラッグ&ドロップ

Avast

www.avast.co.jp

無料のセキュリティアプリです! MacWindowsと比べて市場規模が1/10程度なので、 ウイルスに狙われることは少ないとは思いますが、 別段Windowsと比べて最強って訳ではないので、 Macに愛を捧げるならセキュリティソフト入れておくと良いと思います。 Avastは筆者が調べた時点でなんとなく一番良さげだった気がしますが、 Macのユーザーはガンガン増えているに伴って、 ウイルスもセキュリティも進化すると思うので、 入れるタイミングで調べると良いと思います!

Caffeine

download.cnet.com

こいつは優秀です。インストールするとツールバーにコーヒーカップが現れます。 コーヒーカップをクリックするとコーヒーが中に入って、 Macがスリープしなくなります。 意外とスリープしてほしくない時ってあるので、入れとけば良いと思います!

CheatSheet

www.cheatsheetapp.com

Cmdの長押しでショートカットのカンペを出してくれます! 最初はめちゃくちゃ使いました! ショートカットを覚えると生産性が4倍くらいになります(主観)

Dropbox

この子に関しては一言でいいかもです。便利!

Google Chrome

www.google.co.jp

最初にSafariから乗り換えた時にびっくりするくらい速度が早くなったのを覚えています。 周りを見た感じプログラミングをするならChromeFireFoxを入れておくのが ベターな気がしますね!特にWebエンジニア! プログラマでなければ、スマホとブラウザ合わせればなんでも便利かと笑

Hyper Switch

bahoom.com

デフォルトのCmd + tabで、アプリケーションの切り替えができるのをご存知ですか? あれの上位互換です(主観)。 アプリケーションごとではなく、ウィンドウごとの切り替えが可能になります! あと、サムネールとしてウィンドウの画像が貼られるので、 フォーカスしたいウィンドウが見つけやすい気がします!

iTerm

www.iterm2.com

プログラマの定番。なぜかターミナルでは物足りなかった強者が入れている。 という印象だったので入れて見た。 タブ分けができたりなんだか色々ターミナルの先を走っていたみたいですが、 今となってはターミナルも進化してどっちもどっち説が浮上しております。 これもあれですね、 とりあえず入れといたらちょっとイカす

LINE

タイピングの方が早い人は入れるべきですね

QR Journal

QRを読み込みます! なんでもいいと思いますが、焦ってQR読み込みしたい時のために先んじて入れておくと良いでしょう。 (そんな日はあるのか?)

終わり

なんかだいたいこんな感じな気がします! プログラマ向けのもの以外もしくは、 プログラマ向けのものは入れておくだけでMacがオシャレに見えるものを選んできました! お役に立てれば幸いです!

pythonのversion周りがなんかあれな話するわ

pythonのバージョンはややこしい

python以外に4つくらい他の言語に触れたことがあるのですが、 pythonに勝る美しい言語はないと思っています。 そんなpython最大の弱点が、version問題かなと。。 python2系とpython3系があるんですが、 互換性がないとかいうね。完全切り捨て御免とかいうね。 というわけで、いろんなバージョン管理方法があるわけですが、 筆者は pyenv を使わせていただいてます。 なんかいろんな記事をさらっと読んだ感じ、 virtualenvデファクトスタンダードで、 pyenv がかなりこなれてて、 venv とかいう公式のバージョン管理ソフトができたっぽい。

…いや、待て。なんでややこしいバージョン管理を簡潔にしたいのに、 その方法でまた悩まなあかんねん!! ってことで、師匠に教えてもらったpyenvから一歩も動くことなく、 盲目にこれがいいと信じながら使っております。

現在の管理状況

機械学習始めたらめっちゃバージョン管理必要になった

問題は 機械学習なんですよ 。 最近勉強会に参加させていただいていて、 発表者の方がちゃんとipynb形式でデモを実行できるように準備してくれるんですけど、 pythonのバージョンが割とまちまち… 具体的に機械学習で使うバージョンは多分

  • 2.7
  • 3.5
  • 3.6

だと思うんですけど、 2系と3系の相互互換がないのはいつものことで納得いくんですが、 何故3.5と3.6までうまくいかないんだ!? ということで、原因を探るよりも もうpyenvに全部入れてしまえばよくね!? ってなりました。 というわけで現在、筆者のpyenv管理下には上記のpythonバージョンを含んだ anacondaが3つぶち込まれています。それぞれに pytorchtensorflow がぶち込まれています。 なんか汚らしい気がするので、こういう状況での ベストプラクティスをどなたか教えてくださると嬉しいです。

pyenv-virtualenv

機械学習では使うの面倒だなってなりました。 誰かとコードを共有するってなったら Dockerでも勉強するか…と思っています。 それ以外の、例えばデスクトップアプリなどでは大活躍してくれていますが、 どんどん環境増えたら管理がまた面倒になるなと思って、 みなさんがどういう管理をしているか気になります。

まとめ

もう自分で使う分にはとりあえず依存関係考えずにやろうかなと 開発の段になった場合にDockerの導入か、 virtualenvの導入か、(pyenv-virtualenvは開発の仮想に向かなそう?) やらを考えることにしました!(必殺後回し戦法!)