4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【機械学習】Selective Searchを使って物体検出を行ってみる

Last updated at Posted at 2020-02-01

SelectiveSearchとは

画像の中から、"物体らしい"箇所を検出するタスク。おおまかな流れとして、矩形を複数用意し、画像の上をスライディングさせていき、"物体らしい"箇所を見つけ出す。物体が何であるかや特定の物体だけを検出するわけではない点に注意。例えば画像の中から車だけを見つけ出すことはできない。
物体検出手法で有名なR-CNNでも使われている有名なタスクであるが、調べてみると意外にも記事が少なかったので本記事でまとめた。

環境

  • Ubuntu16.04.3 LTS
  • Python:3.6
  • opencv-python:3.3.1.11

インストール

pip を使って簡単にインストールできる

pip install selective-search

opencvもpipでインストールしておく

対象画像

以下4つの画像を対象に実行してみる。なお画像はPascalVOC。

家具
000071.jpg 000108.jpg 000102.jpg

パタメーター設定

random

randomパラメータが存在するが、リファレンスに以下が書かれている

If random set to True, function will carry out pseudo random sorting. It only alters sequences of bounding boxes, instead of locations, which prevents heavily emphasis on large regions as combing proposals from up to 80 different strategies[1]. This only has a significant impact when selecting a subset of region proposals with high rankings, as in RCNN.

どうやらselectivesearchでは大きい矩形が優先されて提示されるらしい。RCNNなどを使って物体検出を行う際には、小さい物体の認識が行えなくなるため、randomを設定することで、大きい物体ばかりになることを防ぐ。

mode

selectivesearchには3つのモードが存在する

  • single
  • fast
  • quality

リファレンスによると次のような違いがある。
mode.png

すなわち、single,fast,qualityとなるに連れて、矩形の数、言い換えると試行の数が増える。一方で速度が落ちてしまうという問題もあり。以下が試行結果。

モード 家具
single 000071.jpg 000102.jpg 000108.jpg
fast 000071.jpg 000102.jpg 000108.jpg
quality 000071.jpg 000102.jpg 000108.jpg

single,fast,qualityとなるに連れ、推定されるオブジェクトが増えるが、これだけ多くの矩形を必要とするケースはほぼ無い。基本はsingleで実装すれば十分だと考えられる。

なおsingleを設定したとしても矩形が多すぎるため、今回実装する際には一定の大きさが無い矩形は出力を抑制することとした。

実装

ディレクトリ構成

├── pic #オリジナル画像
├── result #結果画像
│   ├── fast
│   ├── quality
│   └── single
└── exe.py #実行ファイル

実行ファイル

import cv2
import glob
from selective_search import selective_search


### パラメータ設定
MODE="single"
# MODE="fast"
# MODE="quality"
MINH=100
MINW=100


### 入出力ディレクトリ設定
ORGDIR="./pic/"
RSTDIR="./result/"+MODE+"/"


def search():

    ### 入力ファイルパス読み込み
    tgtpaths=glob.glob(ORGDIR+"*")

    for tgtpath in tgtpaths:

        ### 出力ファイルパス設定
        rstpath=tgtpath.replace(ORGDIR,RSTDIR)

        ### 対象画像読み込み
        tgtimg = cv2.imread(tgtpath, cv2.IMREAD_COLOR)

        ### SelectiveSearch実行
        boxes = selective_search(tgtimg, mode=MODE,random=False)

        for box in boxes:

            ### 一定の長さが無い矩形表示しない
            if abs(box[2]-box[0]) < MINW or abs(box[3]-box[1])<MINH:
                continue

            ### 矩形描画
            cv2.rectangle(tgtimg, (box[0],box[1]), (box[2],box[3]), (0,255,0), thickness=1)

        ### 出力
        print(rstpath)
        cv2.imwrite(rstpath, tgtimg)



if __name__=="__main__":
    search()

結果

家具
000071.jpg 000102.jpg 000108.jpg

selectivesearchにより”物体らしい”箇所が提示された。RCNNなどではこれらの候補を分類器にかけることで物体検出を行う。

参考

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?