kivantium活動日記

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

dlibを用いたselective search

ディープラーニングを使ったイメージの切り抜きで紹介されていたselective searchをやってみました。

selective searchは画像中の似たような領域を一つの物体として認識して、物体の候補を提案するアルゴリズムです。

良さそうなスライドを見つけたので紹介しておきます。

www.slideshare.net

Selective SearchのPython実装にはdlibの他にも

があるようです。これ以外にもあったら教えて欲しいです。

dlibのインストール

記事ではMatlab実装を使っていましたが、ここではdlibの実装を使います。

いつもの通りUbuntu 14.04を想定していますが、cmakeとboost-pythonがあれば他の環境でも動くはずです。
まずはdlibをdlib C++ Libraryからダウンロードします。
解凍したフォルダのpython_examplesに移動して

sudo apt-get install libboost-python-dev cmake
./compile_dlib_python_module.bat 
sudo cp dlib.so /usr/local/lib/python2.7/dist-packages/

を実行すれば終了です。

ver. 18.18からは

python setup.py install

でいいようです。

selective searchの実行

サンプルコードを少しいじっただけです。
ちなみに。dlibのselective searchの実装はSegmentation as Selective Search for Object Recognitionを下にしているようです。

#!/usr/bin/python

import dlib
from skimage import io

image_file = 'image.jpg'
img = io.imread(image_file)
# Locations of candidate objects will be saved into rects
rects = []
dlib.find_candidate_object_locations(img, rects, min_size=1000)

win = dlib.image_window()
win.set_image(img)
for k, d in enumerate(rects):
    print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
        k, d.left(), d.top(), d.right(), d.bottom()))
    win.add_overlay(d)
dlib.hit_enter_to_continue()

結果は
f:id:kivantium:20150725183445p:plain:w400
のようになりました。
赤い長方形で囲まれた部分が物体の候補領域です。かなり大量にありますが、これでも全領域をスキャンして物体の候補を見つけるよりはマシなはずです。

提示されたそれぞれの候補領域についてCaffeなどで分類を行えば物体検出を行うことができるはずなので今度はそれをやってみたいと思います。

候補領域を保存する場合はOpenCVと連携して

#!/usr/bin/python

import dlib
from skimage import io
import cv2

image_file = '../examples/faces/2009_004587.jpg'
dlib_img = io.imread(image_file)
# Locations of candidate objects will be saved into rects
rects = []
dlib.find_candidate_object_locations(dlib_img, rects, min_size=500)

cv_img = cv2.imread(image_file)
for index, d in enumerate(rects):
    print("Detection {}: Left: {} Top: {} Right: {} Bottom: {}".format(
        index, d.left(), d.top(), d.right(), d.bottom()))
    cv2.imwrite('candidate'+str(index)+'.jpg', cv_img[d.top():d.bottom(), d.left():d.right()])

とすれば出来ます。dlib単体で完結したかったのですがドキュメントが少なくてよく分かりませんでした。