ステーキ定食の画像から物体を選別できないかやってみた - ①物体検出編

# はじめに

[以前](http://qiita.com/neriai/items/448a36992e308f4cabe2)、OpenCVを使って物体検出を行いましたが、Selective Searchという名のライブラリがあるということで、どれくらい精度に違いがあるのか比較してみました。

また、[以前](http://qiita.com/neriai/items/c0114af9c2eae627b6ce)あまり理解していなかった環境構築周りも見直しがてらに別の方法で行ってみました。なのでちょこっと違います。

なお、試してみたところSelective SearchはPython3だと関数が異なるため正常に動作しません。

# Selective Search

[Selective Search](http://blog-jp.alpaca.ai/entry/2015/08/05/235408)

# パクリ元

[R-CNNとしてSelective search を使ってみた](http://qiita.com/Almond/items/7850cf81903fbe2a2c6c)

# 環境

|#|OS/ソフトウェア/ライブラリ|バージョン|
|:---|:---|:---|:---|:---|
|1|Mac OS X|EI Capitan|
|2|Python|2.7系|
|3|OpenCV|3.2系|
|4|Selective Search|
|5|matplotlib|2.0系|

# 構築

[以前](http://qiita.com/neriai/items/c0114af9c2eae627b6ce)と一緒
---

## 最新にアップデート
```zsh
brew update
```
## tap
```zsh
brew tap homebrew/python
brew tap homebrew/science
```
## Pythonのインストール
```zsh
brew install python
```

## パスの確認
```zsh
which python
/usr/local/bin/python ※1
```

※1 /usr/bin/pythonの場合、PATHを通してあげてください。
※ 反映されない場合ははコンソールの再起動をかけてみてください。

## PATHの設定
```zsh:.zshrc
if [ -d $(brew --prefix)/lib/python2.7/site-packages ];then
  export PYTHONPATH=$(brew --prefix)/lib/python2.7/site-packages:$PYTHONPAT
fi
```

## バージョンの確認
```zsh
python
Python 2.7.13 (default, Apr  4 2017, 08:46:44) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

---

ここから異なります

## Applicationsにリンクを貼る
```zsh
brew linkapps
```

## pipをインストール
```zsh
easy_install pip
```

## setuptoolsを最新版に更新
```zsh
pip install --upgrade setuptools
```

## pipを最新版に更新
```zsh
pip install --upgrade pip
```

## OpenCV3をインストール
```zsh
pip install opencv-python
```

## NumPyをインストール
```zsh
pip install numpy
```

## MatplotLibをインストール
```zsh
pip install matplotlib
```

## Selective Searchをインストール
```zsh
pip install selectivesearch
```

# 比較

## 画像

今回はこのステーキ定食を使います。
物体検出の比較元ソースコードは[以前](http://qiita.com/neriai/items/448a36992e308f4cabe2)を使います。
※OpenCVのバージョンの関係でfindContoursの戻り値の数が異なるのでご注意を。(http://amazarashi.me/archives/752)

![steak.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/cffe6794-71d5-e571-ca30-c278dcdda23a.jpeg)

## Selective Searchのソースコード

[R-CNNとしてSelective search を使ってみた](http://qiita.com/Almond/items/7850cf81903fbe2a2c6c)のまま使ってたりします。

```py:grouping_image.py
import cv2
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import selectivesearch

def main():
        # loading lena image
    img = cv2.imread("{画像パス}")

    # perform selective search
    img_lbl, regions = selectivesearch.selective_search(
        img, scale=500, sigma=0.9, min_size=10)

    candidates = set()
    for r in regions:
        # excluding same rectangle (with different segments)
        if r['rect'] in candidates:
            continue
        # excluding regions smaller than 2000 pixels
        if r['size'] < 2000:
            continue
        # distorted rects
        x, y, w, h = r['rect']
        if w / h > 1.2 or h / w > 1.2:
            continue
        candidates.add(r['rect'])

    # draw rectangles on the original image
    fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(6, 6))
    ax.imshow(img)
    for x, y, w, h in candidates:
        print(x, y, w, h)
        rect = mpatches.Rectangle(
            (x, y), w, h, fill=False, edgecolor='red', linewidth=1)
        ax.add_patch(rect)

        cv2.imwrite('{ディレクトリパス}' + str(x) + '.jpg', img[y:y + h, x:x + w])

    plt.show()

if __name__ == "__main__":
    main()
```

## 結果

いくつの料理や食べ物や調味料を輪郭抽出できるかを比較します。
レベルとしては器や皿１つに対して抽出できてかなので割りと厳し目にしてます。

### 通常の場合

２つ

![56.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/e2f6d9d2-8e18-e021-02b3-4e0b5892a9c1.jpeg)

![223.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/530de5a5-ae8b-1983-4a38-2c243953f9ef.jpeg)

### Selective Searchの場合

５つ

![57.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/90c5ceb3-1e39-ff35-61d2-53d9471acd80.jpeg)

![227.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/d2b58dc9-20fa-b190-ce87-1b22aacde9eb.jpeg)

![379.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/4e6bf75d-5aaa-5e68-37a2-d2d1e805b06b.jpeg)

![405.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/22f7175f-e911-419b-f58f-51b1a35ceb8f.jpeg)

![273.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/2e735b2a-6050-99b9-945a-4710e415b456.jpeg)

# 感想

- Selective Searchのほうが精度が良かった。
- Selective Searchでもステーキ定食なのにお肉は綺麗に検出されなかった。

![329.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/12e7d1e8-2046-9278-43d3-4d1e77c3281e.jpeg)

![238.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/a168978e-b805-a290-b25d-7989d54057a9.jpeg)

- 色々処理をしているのかSelective Searchは速度は多少（１０秒くらい？）かかった。
- PythonやOpenCVのバージョンの違いによって関数結構違いすぎて色々面倒くさい。
- 色々やってるわりにPythonやOpenCVを１から独力で書ける気がしない。

# 全ページリンク
- [PythonとOpenCVを使って物体検出をやってみた](http://qiita.com/neriai/items/448a36992e308f4cabe2)
- [ステーキ定食の画像から物体を選別できないかやってみた - ①物体検出編](http://qiita.com/neriai/items/d420b78f35033408ccda)
- [ステーキ定食の画像から物体を選別できないかやってみた - ②オーバーラップ数選別編](http://qiita.com/neriai/items/e718290e8b14b0594008)
- [ステーキ定食の画像から物体を選別できないかやってみた - ③類似画像ヒートマップ検出編](http://qiita.com/neriai/items/615c9233582a91a1396a)
- [ステーキ定食の画像から物体を選別できないかやってみた - ④クラスタリング編](http://qiita.com/neriai/items/6df233918513a51a7147)
- [ステーキ定食の画像から物体を選別できないかやってみた - ⑤類似画像特徴点検出編](http://qiita.com/neriai/items/e96d70fc3b89f050daa5)