YOLOv3で独自データの物体検知（犬と猫の検知）をしてみよう①【スクレイピングとVoTTの使い方編】

初投稿です。
画像分類の記事が多く、物体検知関係の記事が少ないと思ったので記述します。

次②→
『https://qiita.com/osakasho/items/757df802bd34f907cb43 』

作業環境
PC:Windows
言語：Python3
インストール：Node.js(npmコマンドが使えるように)
IDLEなど：PycharmとAnaconda
モデル学習：GoogleColab を利用します。
Pythonとターミナルが使える状態なら問題なく動作する（とおもいます。）

#ゴールのイメージ
画像のどこに犬と猫が存在するか表示する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/a5d06a3c-c9c1-3567-58e3-9c4bc7aa9eae.png)


#参考資料等
以下の記事を参照しました。
スクレイピング・画像収集（https://qiita.com/Ikko_Kojima/items/4d943c60ff5e886a0544）

YOLOv3関係全て(https://sleepless-se.net/2019/06/21/how-to-train-keras%E2%88%92yolo3/)
※正直、「眠れない夜」さんの記事ですべて解決します。それくらいわかりやすく凄い記事です。

#スクレイピング・画像収集(リサイズ)
まずは、作業用ディレクトリを作りましょう。

```
mkdir AIprojects_test
cd AIprojects_test
mkdir images
mkdir save_annotations
```
次に、画像収集するために「Google_images_download」を入れて、ダウンロードします。

```
pip install google_images_download
googleimagesdownload -ri -cd "chromedriver.exe" -l 100  -k "犬"
googleimagesdownload -ri -cd "chromedriver.exe" -l 100  -k "猫"
```

すると、ディレクトリの「ダウンロード」に「犬」と「猫」フォルダが生成され、100枚ずつ画像がダウンロードされました。犬フォルダと猫フォルダの中を画像をすべて先ほど作成した「images」の中にコピーしましょう。

```
├── AIprojects_test
    ├── save_annotations
 　 └── images
         └──犬と猫の画像たち
```

となっているはずです。
ここで、画像サイズを均等にするためにリサイズします。

resize_images.pyを作成します。

```python

import os
import sys
from glob import glob

from PIL import Image


def resize_images(images_dir, image_save_dir, image_size):

    os.makedirs(image_save_dir, exist_ok=True)

    img_paths = glob(os.path.join(images_dir, '*'))

    for img_path in img_paths:
        # resize
        image = Image.open(img_path)
        rgb_im = image.convert('RGB')
        rgb_im.thumbnail([image_size,image_size])

        # make background
        back_ground = Image.new("RGB", (image_size,image_size), color=(255,255,255))
        back_ground.paste(rgb_im)

        # make path
        save_path = os.path.join(image_save_dir, os.path.basename(img_path))
        end_index = save_path.rfind('.')
        save_path = save_path[0:end_index]+'.jpg'
        #print('save',save_path)
        back_ground.save(save_path,quality=95,format='JPEG')


def _main():
    images_dir =  'images/'  # input directory
    image_save_dir = 'resize_images/'  # output directory
    image_size = 224
    if len(sys.argv) > 1:
        image_size = int(sys.argv[1])
    resize_images(images_dir=images_dir, image_save_dir=image_save_dir, image_size=image_size)


if __name__ == '__main__':
    _main()
```
```python resize_images.py```で画像を全て224×224pxにリサイズし、新規フォルダ「resize_images」が作成されます。

ディレクトリ構成が

```
└── AIprojects_test
　　├──  save annotations 
 　 ├──  images
    |   └──犬と猫の画像たち
    |
    ├──  resize_images
    |   └──リサイズされた犬と猫の画像たち
    |
    └── resize_images.py
```
となっていれば、OKです。

#VoTTを使ってアノテーションする
物体検知で一番しんどい作業がアノテーションです。
アノテーションとは正解データを作ることで、これには、マイクロソフトのVoTTを利用します。
VoTTはこのしんどい作業をGUIで楽にしてくれたものです。さすが天下のMicrosoft様、一生ついていきます。
以下の作業ディレクトリで以下の順序で実行してください。

```
 git clone https://github.com/Microsoft/VoTT.git
 cd VoTT
 npm ci
 npm start
```
しばらく待つと、以下のような画面が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/8386c992-9a7b-a2b5-5e84-e5d5817e73a9.png)
「New Project」を選択し、すると以下のような設定画面が出てきますので、
設定を記述します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/e72af63e-980f-7900-514a-2253c90863a9.png)
SourceConeectionとは画像の参照先です。先ほどの「resize_images」フォルダを選択しましょう。
TargetConnectionは、アノテーションの保存先です。作成しておいた「save_annotations」に選択します。
最後に、緑色の「Save Connection」をクリックします。

次に、出力の設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/94d216fd-976b-203c-1e20-a3c9efb4fd5e.png)
Export Settingsを開き、ProviderをPascal VOCに設定し、Save Export Settingsで保存します。

とうとう、アノテーションを実施します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/f20c46d5-2a12-47a5-e4f9-d15cc1191efa.png)

１、まず、Tagsを作ります。今回は犬と猫なので、dog, catの2種類を作りました。
２、次に、犬の部分をクリックで囲います。
３、犬を囲ったので、dogをクリック
４、「↓」で次の画像へ、「↑」は前に戻ります。
５、保存と出力です。すべてのアノテーションが終えたら、出力しましょう。

出力後、「save_annotations」フォルダにデータが保存されているので、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/59913c38-df3c-6b12-26be-8a55b369fb60.png)
「ano_data」に圧縮！！！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/493888/9b721a0a-ad36-5ff0-5e91-aefff7c84776.png)

今回はここまでで終了です。お疲れ様でした！！！！！

#最後に
次は、今回使ったデータをもとにYOLOｖ３で学習をさせ、テストしてみます。
それでは、また。