pythonで物体の自動検出→トリミング→リサイズまで

# やったこと
静止画から物体を自動検出するために、selective searchというpythonのライブラリを使ってみました。
実行環境：Windows7-32bit, python3.6, Anaconda
selective searchは以下のコマンドでインストールできます。

```
pip install selectivesearch
```

#実行結果
元の画像
![fifth_corner.jpg](https://qiita-image-store.s3.amazonaws.com/0/158180/c9f8bb86-3d09-1ad2-9891-a1bd9a56fc79.jpeg)

実行結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/158180/3643425e-5a8e-22c0-ec6b-d4635350fa56.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/158180/7de91d25-d648-1bd2-c92b-94584cc700bc.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/158180/6e524391-dc14-407f-26b1-7737bb551582.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/158180/4653d5c3-b819-1993-64ee-1898fe28f484.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/158180/cde9d263-58e1-dbd0-9f2f-a9a25cb64619.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/158180/35aab649-4349-0f6c-0ebb-939cd8f5d3fe.png)

何も無いところ（路面の傷かな？）が検出されましたが、ライダーとバイクもちゃんと抽出できています。

物体検出される領域のサイズやアスペクト比を変更すると、ヘルメット、タイヤ、グローブ等も検出されました。これらのパラメータは検出したい物によって、調整が必要みたいです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/158180/08f6f122-81b0-b5d6-57d3-c154a3641b33.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/158180/75a82a74-78fa-acdb-0079-97a094ddae81.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/158180/13266d8c-e978-aa99-b4b0-d6b4a604a9b4.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/158180/f2f8ddbc-fbee-0ce6-c09e-2bc3cbad6dd9.png)

他にも色々と検出されましたが、数が多いので割愛しました。

#コード

```python:selective_search.py
# -*- coding: utf-8 -*-
import skimage.data
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import selectivesearch
 
def main():
 
    # loading image
    img = skimage.data.imread('fifth_corner.jpg') # 画像ファイルを指定します。
    print("image shape " + str(img.shape))
 
    # 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 small pixels
        if r['size'] < 30000: # 物体検出される領域の大きさを指定します。
            continue
        
        # distorted rects
        x, y, w, h = r['rect']
        if w / h > 2.0 or h / w > 2.0: # 物体検出される領域のアスペクト比を指定します。
            continue
        
        candidates.add(r['rect'])
 
    print("number of object " + str(len(candidates)))
    
    for x, y, w, h in candidates:
        
        # draw original image
        fig, ax = plt.subplots(ncols=3, nrows=1, figsize=(10, 10))
        ax[0].imshow(img)
        
        # draw rectangles on the original image
        rect = mpatches.Rectangle(
            (x, y), w, h, fill=False, edgecolor='red', linewidth=1)
        ax[0].add_patch(rect)
        
        # trim image and draw
        img2 = img[y:y+h, x:x+w]
        ax[1].imshow(img2)
        
        # reshape trimed image and draw
        img3 = skimage.transform.resize(img2, (64, 64))
        ax[2].imshow(img3)
    
    plt.show()
 
if __name__ == "__main__":
    main()
```