catalinaの備忘録

ソフトウェアやハードウェアの備忘録。後で逆引きできるように。

opencv-contribのedge-boxesを試す

恒例となりつつあるホリデーシーズン前のOpenCV最新版がリリースされました。

https://opencv.org/opencv-3-4.html

個人的に興味があるのはこのあたりです。

  • 本家DNNモジュール
    • YOLOやfaster-rcnnなど、RCNNの実装
    • YOLOもRCNNもバックエンドでOpenCLアクセラレーションをサポート
    • JSからDNN叩けるよ!
  • contribのximgprocモジュール

今回はObjectProposalを試してみます。YOLOとかのDNNまわりも興味ありますが、こちらははDeepLearningマジ勢の方々がすでにいろいろ試してくれていますので。こういうのは私は後追いでいかせてもらいます。

というか、上記のリリースノート見る限り、「JSからDNN叩けば裏で勝手にOpenCLアクセラレーションが走ってGPGPU的なことやるよ」に読めるのですが、もうなんか言葉で表現できないですね。

ちなみにNVidiaGPUでも一応OpenCLインターフェース備えてるので、OpenCLカーネルを叩き込んであげれば動きはするようです。速度比較まではしてませんが。。。

さて、前置きが長くなりましたが、edge-boxesを試す理由は、カードゲームのAR化と汎用化を考えたとき、カードの領域は画像データ上ではエッジとなることが多いので、このアルゴリズムでラクできるんじゃないかなという考えからです。

一般的にはR-CNNの前段で使うことが多いようです。

ObjectProposalとは

おおざっぱに言うと、ある画像を与えたとき「このあたりがオブジェクトかもしれないよ」という候補領域を提案することをいいます。

問題領域としては画像のセグメンテーションになるようです。

objectProposalのアルゴリズムは色々ありますが、今回はedge-boxesを試します。

edge-boxesとは

Microsoftの研究部門であるMicrosoftResearchが考えてくれたアルゴリズムです。論文はこのあたりから。

https://www.microsoft.com/en-us/research/publication/edge-boxes-locating-object-proposals-from-edges/

動かしてみる

とりあえず動かしてみます。

ビルドする

まずopencvをビルドするときに、次の2つを設定しておきます。

  • contribモジュールの追加
  • サンプルプログラムの生成

サンプルプログラムは

https://github.com/opencv/opencv_contrib/blob/master/modules/ximgproc/samples/edgeboxes_demo.cpp

にあるので、ビルド時間を少しでも短縮したいときはこれだけをあとでビルドしてもいいです。

実行するためのデータを用意する

こういうデータはopencv_extraリポジトリに置かれているので、cloneしときます。

実際に使うデータはこいつです。 https://github.com/opencv/opencv_extra/blob/master/testdata/cv/ximgproc/model.yml.gz

どうしてモデルデータが必要なの?

モデルデータというと機械学習アルゴリズムで出てくることが多いので、edge-boxes自体も機械学習なのかと勘違いしてしまいますが、edge-boxes自体は機械学習を含みません。

edge-boxesアルゴリズムに入力するための構造化されたエッジ情報を生成するモジュール(StructuredEdgeDetection)がモデルデータを必要としているだけです。

StructuredEdgeDetectionがそういうものなので、それに従います。

いざ、実行

コマンドラインから次のように実行します。

edgeboxes_demo model.yml.gz test.jpg

これでオブジェクト領域候補を書き込んだ画像が表示されます。 仮想環境にsshで作業していてウインドウ表示できない人はコードを修正して画像ファイルに落とすようにすればOKです。

#if 0
  imshow("im", im);
  waitKey(0);
#else
  imwrite("output.jpg", im);
#endif

結果

f:id:Catalina1344:20170530225057j:plain
input
f:id:Catalina1344:20171230235431j:plain
output
不要な領域も抽出していますが、そういうものなので。おおむね期待通りといったところです。

パラメータチューニングしようと思いましたがマニュアル見てもよくわかんないので、論文と照らし合わせる必要があります。

https://docs.opencv.org/3.4.0/d4/d0d/groupximgprocedgeboxes.html

論文の数式中のα、β、ηとかをそのままパラメータにするのは優しくない。。。

感想と今後の展望

2017年は色々なことに挑戦しました。

特に私がやりたいARを実現するために、AIを活用するという目論見も可能性は見えてきた点はGoodです。

7月以降は少々別のことをやっていて、このブログの更新が滞っていた点はbadかなと。ちょうど本業のほうでも色々変化がありましたので、余裕がなかったという事情もありはするのですが。。。

本業はDeepLearningでもARでもないのですが、クラウドサービスに触れる機会を頂けたので、興味深く取り組んでいます。 ただ言われたことだけやってても眠いだけなので、自分でサービス立ち上げる時を想定して、たとえばDeepLearningをクラウドで実行するにはどう応用していけばいいのだろう?などをモチベーションとして取り組んでいます。

少し話題が変わりますが、別のブログ立ち上げて色々メモしつつ楽しむようになりました。 キーワードとしては「3Dモデリング」「3Dプリンタ」「コスプレ」あたりでしょうか。

http://catalina-cosplay.hatenablog.jp/

実際に3Dプリンタで色々と作ってみて改めて思ったことは、 「私が作りたいのは『仮想世界』とか『現実世界を便利にする』とかではなく、『仮想世界と現実世界の融合』なんだな」ってことです。

たとえば今のARとか3Dプリンタで作ったものを工夫すれば、こんなのができるだろうと思っています。

  • Hololensを装着して超電磁砲(レールガン)発射を体験できる
  • Hololensを装着して聖ジョージの聖域(セントじょーじのせいいき) を幻想破壊を体験できる
  • Hololensを装着して海馬コーポレーションのデュエルシステムを体験できる

などなど。

要は空想科学とか魔法とか使えると思っています。

今そこに自分が実現したいことを実現する手段があるなら、僕は全力でやっていきたいと思います。

理想だけ述べるなら独立すればいいんですが、算段がないのに独立はリスクが高すぎるんですよね。なので来年も本業をこなしつつ趣味でサービス開発をするという生活かなと思っています。

それではみなさん良いお年を。