人工知能（機械学習）で、第６感の可視化に挑戦 その①

第６感をAIで可視化できないか？という試みの　第１弾になります。
全体のお話はこちら
[人工知能（機械学習）で、第６感の可視化に挑戦](https://qiita.com/nanako_ut/items/44ecdb4f76d13dc276d6)

# はじめに
今回の範囲はこちらになります。
AIの学習に使うデータを用意することが今回のゴールです。

![gaiyou_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/170139/ccd59e7b-28f7-c35a-7a14-6a9ba7d5bf8e.jpeg)

# 画像収集
## 著作権
インターネット上にある画像を学習データとして使う場合、著作権が問題になりえますが、
情報解析を行うことを目的とする場合においては問題ないようです。

下記サイトを参考にさせてもらいました。

- [Webスクレイピングの法律周りの話をしよう！](https://qiita.com/nezuq/items/3cc9772118ad112c18dc)
- [「日本は機械学習パラダイス」　その理由は著作権法にあり](http://www.itmedia.co.jp/news/articles/1710/10/news040.html)
- [スクレイピングによってウェブ上の情報を収集し、自社でデータベース作成してもよいのですか？](http://it-bengosi.com/blog/web-scraping2/)
- [機械学習パラダイス（上野達弘）](https://rclip.jp/2017/09/09/201708column/)

## 手段

画像検索エンジンのAPIを使う、スクレイピングする、という手段があるようです。

下記サイトが参考になりました。

- [Yahoo、Bing、Googleでの画像収集事情まとめ](https://qiita.com/ysdyt/items/565a0bf3228e12a2c503)
- [指定した人物の顔画像を自動収集するプログラムの公開と使い方](https://qiita.com/Umemiya/items/747934f18b00c026ce83)
- [Webスクレイピングの注意事項一覧](https://qiita.com/nezuq/items/c5e827e1827e7cb29011)


# OpenCVで顔部分を抜き出し
選手は当然球団ロゴ入りの帽子をかぶっています、
帽子のロゴを顔の特徴と捉えてしまわないように、集めた画像から顔っぽい部分を抜き出します。
画像処理ライブラリのOpenCVを使うことで、顔検出が簡単にできるようです。

## 参考サイト
こちらを参考にさせてもらいました。

- [【入門者向け解説】openCV顔検出の仕組と実践(detectMultiScale)](https://qiita.com/FukuharaYohei/items/ec6dce7cc5ea21a51a82)
- [簡単にできるOpenCVを使った顔検出](https://ai-coordinator.jp/opencv)
- [ザッカーバーグ氏の顔部分を抽出し切り抜く](https://qiita.com/AkiyoshiOkano/items/72f3e4ba9caf514460ee)

## ソース（python）
フォルダにある元画像全てを対象に、顔部分を抜き出します。

```python:face_choice.py

import cv2
import numpy as np
import os

# 分類器(以下から取得)
# https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml
cascade_path = './model/haarcascade_frontalface_default.xml'

# 入出力ディレクトリ
input_path = './data/train/yashu/'
save_path = './data_face/train/yashu/'

#カスケード分類器の特徴量を取得する
faceCascade = cv2.CascadeClassifier(cascade_path)

# 顔検知に成功した数(デフォルトで0を指定)
count = 0

# 指定したフォルダにある全画像を繰り返し処理
file_list = os.listdir(input_path)
for file_name in file_list:
    file_path = input_path + file_name
    #print(file_path)
    # ファイル読み込み
    img = cv2.imread(file_path, cv2.IMREAD_COLOR)
    # グレースケール変換
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 物体認識（顔認識）の実行
    faces = faceCascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=1, minSize=(30, 30))
    if len(faces) > 0:
        for x, y, w, h in faces:
            # 顔を抜き出し保存
            cv2.imwrite(save_path + 'face_' + str(count) + '.jpg', img[y:y+h, x:x+w])
            count += 1
    else:
        print('NoFace: ' + file_name )
```

## 実行後

無事、抜き出せて・・・ません。。。
お手製ドアラ人形は、顔と認識できなかったようです。
**大丈夫です。人の顔なら、ちゃんと抜き出せます。**  （私の手芸テクの問題でしょう・・・）
<img width="316" alt="dra_judge_doara.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/170139/a6b84a54-a41c-9669-63b8-69ab508587b0.png">




# OpenCVでデータの水増し

学習には大量の画像が必要です。
選手の画像が少ないので、画像処理ライブラリのOpenCVを使って、画像を加工してみます。

## 参考サイト
データの水増しについてはこちらが参考になりました。

- [機械学習のデータセット画像枚数を増やす方法](https://qiita.com/bohemian916/items/9630661cd5292240f8c7)

## ソース（python）
openCVで元の画像を二極化した画像を追加しました。

```python:face_choice.py

# 二値化
_ ,binary = cv2.threshold(img[y:y+h, x:x+w], 120, 255, cv2.THRESH_BINARY)
cv2.imwrite(save_path + 'binary_' + str(count) + '.jpg', binary)

```

## 実行後
無事、新しい画像が追加されました。

<img width="481" alt="dra_judge_doara_plus.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/170139/27470475-d646-d720-4f39-77e08238f211.png">

# まとめ
実行ソースはこちらにアップしております。[github](https://github.com/nanako-ut/keras-vgg16/tree/master/tools)

# 次回
[投手と野手学習モデルを作成](https://qiita.com/nanako_ut/items/d35d74b7d692659b1e03)