TensorFlowを使ってDir en greyの顔分類器を作ってみた - ④顔抽出編

# はじめに
- OpenCVの特性をそこまで知らなくても実行できますが、OpenCVが正常に読み込めるかが鍵になってきます。

# プログラム
```py:face_detect.py
# -*- coding:utf-8 -*-

import cv2
import numpy as np
import os.path
from pathlib import Path

# 先ほど集めてきた画像データのあるディレクトリ
input_data_path = '{ディレクトリパス}'

# 切り抜いた画像の保存先ディレクトリ
save_path = '{ディレクトリパス}'
# 保存先ディレクトリを作成
Path(save_path).mkdir(parents=True, exist_ok=True)

# OpenCVのデフォルトの分類器のpath。(https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xmlのファイルを使う)
cascade_path = '/usr/local/Cellar/opencv3/3.2.0/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml'
faceCascade = cv2.CascadeClassifier(cascade_path)

# 収集した画像の枚数(任意で変更)
image_count = 1100

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

# 集めた画像データから顔が検知されたら、切り取り、保存する。
for i in range(image_count):
  file_name = input_data_path + str(i) + ".jpg"
  if os.path.isfile(file_name):
    img = cv2.imread(file_name, cv2.IMREAD_COLOR)
    assert img is not None, Path(file_name).absolute()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    face = faceCascade.detectMultiScale(gray, 1.1, 3)

    if len(face) > 0:
      for rect in face:
        # 顔認識部分を赤線で囲み保存(今はこの部分は必要ない)
        # cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (0, 0,255), thickness=1)
        # cv2.imwrite('detected.jpg', img)
        x = rect[0]
        y = rect[1]
        w = rect[2]
        h = rect[3]

        cv2.imwrite(save_path + '{ファイル名}' + str(face_detect_count) + '.jpg', img[y:y+h, x:x+w])
        face_detect_count = face_detect_count + 1
    else:
      print('image' + str(i) + ':No Face')
  else:
      print('image' + str(i) + ':No File')
```

# 実行
```zsh
python face_detect.py
```

# 補足と言い訳
- haarcascade_frontalface_default.xmlはfindして探してください。
- 画像が上手く読めないファイルがあります。けっこうあります。
- 画像は読めても上手く顔を抽出できないファイルがあるので、手で消してください。
# 全ページリンク
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ①紹介編](http://qiita.com/neriai/items/bd7bc36ec42c8ef65b2e)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ②環境構築編](http://qiita.com/neriai/items/c0114af9c2eae627b6ce)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ③画像収集編](http://qiita.com/neriai/items/bac92c54ca77ebb32ecc)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ④顔抽出編](http://qiita.com/neriai/items/cedc0de9e3722f53287a)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑤学習データ準備編](http://qiita.com/neriai/items/b525b6c9beb5b5d2f8fb)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑥学習プログラム編](http://qiita.com/neriai/items/6a662a49054bc544806d)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑦学習モデル編](http://qiita.com/neriai/items/bd4b880e968fd41119f1)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑧学習実行編](http://qiita.com/neriai/items/791e6f4dd8d08775542b)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑨データ可視化編](http://qiita.com/neriai/items/a7b47127462ecf0fcc1d)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑩顔分類試験編](http://qiita.com/neriai/items/652ced2227b0283ce35e)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑪Web公開準備編](http://qiita.com/neriai/items/bb88858cb5004cbb24d9)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑫Web公開編](http://qiita.com/neriai/items/808ee49e276060457c14)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑬遊んでみる編（最終回）](http://qiita.com/neriai/items/6c984fa1e7876e5140cf)