dlibを用いたselective search
ディープラーニングを使ったイメージの切り抜きで紹介されていたselective searchをやってみました。
selective searchは画像中の似たような領域を一つの物体として認識して、物体の候補を提案するアルゴリズムです。
良さそうなスライドを見つけたので紹介しておきます。
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()
結果は
のようになりました。
赤い長方形で囲まれた部分が物体の候補領域です。かなり大量にありますが、これでも全領域をスキャンして物体の候補を見つけるよりはマシなはずです。
提示されたそれぞれの候補領域について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単体で完結したかったのですがドキュメントが少なくてよく分かりませんでした。