kivantium活動日記

プログラムを使っていろいろやります

Faster R-CNNの紹介

はじめに

今までいろんな画像処理のプログラムを書いてきましたが、その多くで物体検出のアルゴリズムを使っています。

ご注文は機械学習ですか?結城友奈はサンタであるなどの記事ではOpenCVでアニメ顔検出をやってみたで紹介したlbpcascade_animefaceを使いました。これは2001年のViolaとJonesの論文で提案された方法に1994年(くらい)に提案されたLBP特徴量を組み合わせた、2008年の論文の方法を応用したもの(多分)です。

友利奈緒判定botではdlibによるHOG特徴を用いた物体検出がすごいで紹介したHOG特徴量とSVMを組み合わせた方法を使っています。これは2005年の人検出に関する論文の方法を使ったものです。

どのプログラムでも物体検出した後の判定精度はそれなりに高いのに、物体検出の精度の低さが全体の完成度を下げている感じになってしまっていました。2005年といえばもう10年前の方法です。検出部分にもDeep Learningを使って精度を上げたいところです。

Deep Learningを使った物体検出アルゴリズムとしては2014年のR-CNNが有名です。R-CNNはSelective Searchなどの手法を用いて物体の候補領域を探した後、それぞれの領域に対してCNNを使って特徴量を抽出しSVMで物体かどうかを判定する感じのアルゴリズムです。Chainer で Deep Learning: model zoo で R-CNN やりたい - StatsFragmentsなどで実装が紹介されています。

しかし、dlibを用いたselective searchでも試したようにSelective Searchではかなりたくさんの候補領域が提示されるのでそのそれぞれに対してCNNの計算を行うのは非常に計算が大変です。論文には"only 10 seconds on a modern multi-core CPU"と書いてありますが、忙しい現代社会において10秒はonlyと呼べる長さではありません。もっと高速な手法を使う必要があります。

そこで「Selective Searchでは特徴量が似た部分をくっつけるという感じの割と雑な処理をしてるけど、この部分にCNNを使えばもっと少ない数の候補領域を見つけられて高速処理できるんじゃね?これ研究して論文書けば一躍世界のkivantiumじゃん!」と考えていたのですが……残念ながらそのような研究がすでにMicrosoft Researchから発表されていたのを昨日発見しました。ひどいクリスマスプレゼントです。

ところで彼らの研究も大変なようで2015年4月にR-CNNの作者がFast R-CNNを発表した直後の2015年6月にFaster R-CNNという改良アルゴリズムが別の人によって発表されていました。(といっても両者ともMicrosoft Researchなので何らかの協力関係はあるはずですが、それにしてもタイトルがひどい煽り合いです)

このFaster R-CNNはその名の通り高速でほぼリアルタイムでの物体検出が可能なようです。ソースコードが公開されていたのでとりあえずそれを動かしてみました。

中身を理解するにはこの説明スライドで基本アイデアを理解してから論文本体を読むのが分かりやすいと思います。

(2016/07/31 追記: オタク機械学習勉強会でkivantiumという人が発表したスライドが参考になるので貼っておきます。31枚目からR-CNNの話です)

公開されているソースコードには

があります。MATLABは持っていないのでPython版を試すことにしました。

環境構築

READMEを見ればだいたい分かりますがメモ。GPU持ってないのでCPU環境で構築しました。(これで正しいと思いますが後述の通り最終的に動かなかったことに留意してください。)

依存ライブラリのインストール

だいたいCaffeのインストールに必要なものと同じですがいくつか追加しました。

sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler libatlas-base-dev libgflags-dev libgoogle-glog-dev liblmdb-dev
sudo apt-get install python-dev python-pip python-opencv python-skimage
sudo apt-get install --no-install-recommends libboost-all-dev
git clone https://github.com/BVLC/caffe.git
cd caffe/python
for req in $(cat requirements.txt); do sudo pip install $req; done
sudo pip install easydict
wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64/cuda-repo-ubuntu1404_7.5-18_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1404_7.5-18_amd64.deb
sudo apt-get update
sudo apt-get install cuda

コンパイル

git clone --recursive https://github.com/rbgirshick/py-faster-rcnn.git
cd ~/py-faster-rcnn/lib
make
cd ../caffe-fast-rcnn/
cp Makefile.config.example Makefile.config

Make.configのCPU_ONLY := 1とWITH_PYTHON_LAYER := 1の行のコメントアウトを解除します。

make
make pycaffe

これでインストールは終了です。

デモの実行

./data/scripts/fetch_faster_rcnn_models.sh

でモデルをダウンロードした後、

./tools/demo.py --cpu

とすればデモを実行できるはずです。。。

が、手元のメモリ1GBのサーバーで実行しようとしたところメモリ不足で落ちたので結果が出力されませんでした。
サンタさん、いい子にしていたので僕にGPUマシンと置く場所と電気代をください。

おまけ

R-CNNのRはRegionのRですが、Recurent CNNという別のRCNNもあるようです (Recurrent Convolutional Neural Networks for Scene Parsing)。ところでこの論文は2013年のものなのですが、2014年にもRecurrent Convolutional Neural Network for Object Recognitionという論文が出ています。後者の論文では前者のモデルに対して"These models are different from RCNN where recurrent connections exist within the same layer, not between layers."という記述があるので両者は同じ名前ですが別物のようです。

R CNNと単に呼ぶと少なくとも3種類のものが存在するので注意が必要そうです。

同じような事例としてLSTMとCNNの組み合わせがありました。[1506.04214] Convolutional LSTM Network: A Machine Learning Approach for Precipitation NowcastingではLSTMとCNNを組み合わせて時系列の予測を行っているのに対し、[1508.06615] Character-Aware Neural Language Modelsではlstm-char-cnnという名前でソースコードを公開しているのですが、こちらはCNNで読み込んだ文字情報にLSTMの言語モデルを使うという組み合わせをしているようです。Deep Learningの有力手法は限られているので組み合わせて新手法を作ろうとするとどうしても名前が重複してしまうようです。

2ヶ月差で改良手法が投稿される事例や名前がかぶる事例を見て、Deep Leaning研究の競争の激しさを痛感させられました。