Your 3D

機械学習用の顔画像データセットのつくり方【Python】

機械学習を自分の手でやってみたいけど、データセットのつくり方がわからないという疑問を解決します

 

本記事では機械学習用のデータセットのつくり方についてまとめておきます。

対象は、Tensorflow、keras等のチュートリアルコードを動かしてみた方です。

機械学習についてまったく知らないという方はまずはチュートリアルコードを動かしてみるのがおすすめです。

Basic classification: Classify images of clothing  |  TensorFlow Core

 

本題に入る前に少し余談です。TensorflowやMNISTのチュートリアルは、データセットのダウンロードから読み込みまで全部コード内でやってくれます

そのため、コード中で何が起きてるのかいまいち理解できなくてモヤモヤした経験がありました。なので私はデータセットに対して疑問が残ってしまったので、データセットを1からつくってみたいと思った次第です。

 

さて、ここから本題に入ります。

本記事で作成した機械学習用データセットは、以下のようなものです。

  • ラベルなし
  • リサイズ処理
  • 顔画像(カスケードファイルにより処理)
  • 不要データを自分で取り除く必要あり

 

ラベル付けをしていないということで、本記事で作成したデータセットは分類問題を学習するためにそのまま投げ入れることはできないので注意して下さい。

GANs(敵対生成ネットワーク)により顔画像を生成するために作成したので、今回は画像なら顔部分を切り出し、リサイズしたデータセットになります。

顔認識はカスケードファイルを用いて行いましたが、顔ではない部分を切り出していることが多々ありますので、そこは手作業で削除等の処理が必要です。(↓の画像のimg780.jpgとか)

 

最終的に作成できたデータセットはこんな感じです。

↑のようなデータセットをつくるためには、以下の手順が必要です。

  1. Webから画像をスクレイピング
  2. 顔部分の切り出し
  3. 取得画像を整形(リサイズ、不適な画像を処理)

 

個人的に一番しんどいのはなんといってもスクレイピングする部分です。自作しようとしたけど無理でした。

なので、以下で紹介するスクレイピング用コードはShunta KomatsuさんのQiita記事で紹介されているコードを丸々使っています

画像を大量に取得できればあとは画像を処理するだけです。手順2、3については、1つのスクリプトとしてまとめて処理していきます。

 

それでは手順に沿ってデータセットのつくり方を解説します。

<開発環境>

・Python3.6.5

・glob 0.6

・opencv-python 4.0.0.21

・urllib3 1.24.1

 

スポンサーリンク

1.Webから画像をスクレイピング

Webから画像をスクレイピングして、データセットのもととなる大量の画像をスクレイピングします。

使用したスクリプトはShunta KomatsuさんのQiita記事(API を叩かずに Google から画像収集をする)から、丸々お借りしています。

ただし、Python3系では、urllibはurllib.request, urllib.error, urllib.parseの3つが別々のものになったため、3つにわけて宣言する必要があるので注意して下さい

 

スクレイピングする際は、コンソール上で以下のコードで実行できます。

なお、検索する画像の数は私の場合だと1000枚までしか取得できませんでした。調べてないので確定できませんが、おそらくリクエスト制限にひっかかっているためだと思います。

そのため、1000枚以上の画像を取得するにはスクリプトを変更するか、地道に集めるしかないようです。

しかし、試しにデータセットをつくるためなら十分な数を集められます。

 

収集したデータは、以下のパスにフォルダとして保存されます。

スクリプトのあるディレクトリ\data\検索キーワード名フォルダ/

 

私の場合は、”woman+face”、”woman+model+face”の2つのキーワードで1000ずつスクレイピングし、エラーを除いて約700枚のデータを収集しました。

 

 

スポンサーリンク

2.顔部分の切り出し+3.取得画像を整形(リサイズ、不適な画像を処理)

画像を取得できればあとは画像処理するだけです。

顔部分をカスケードファイルを用いて認識、切り出し、全画像のサイズを統一します

カスケードファイルとはOpenCVの公開している顔の特徴をまとめたデータになります。画像とカスケードファイルを照らし合わせて、顔がどの部分にあるかを調べます。

以下のリンク先からカスケードファイルをダウンロードしましょう。

OpenCV Cascadefile

 

カスケードファイルはたくさんありますが、今回は以下のファイル名のものをダウンロードしてください。保存先は画像処理用のスクリプト(.py)と同じディレクトリにしてください。

 

顔認識、画像整形用のコードは以下になります。

 

このスクリプトでは2つのディレクトリパスを指定しているので、ご自身の環境に合わせて変更してください。

 

スクリプトについて説明をしておきます。

opencv-pythonとglobの宣言です。

globは画像をまとめて取得する際に使用します。

 

カスケードファイルを読み込みます。” ”内にカスケードファイルのパスを指定するだけでOK。

 

load_img_list:画像ファイルのリスト

face_cut:顔認識して切り出した画像ファイルを格納する変数

output_path:出力画像の保存先 ファイル名(output)のフォルダを作成しといてください。スクリプトのあるディレクトリ/data/outputの順になるように配置します。

img_list:加工元の画像ディレクトリを指定します。globにより.jpgのファイル全てのファイル名を取得します。

 

img, img_list: 画像ファイル名の配列です。

load_img_listに画像を読み込みます。

 

わかりにくいのでコメントで全部書きました。

注意していただきたいのが、カスケードファイルを用いた顔認識では、1枚の画像から複数の顔を検出できます

このスクリプトでは、複数の顔が検出された場合、それら全ての顔を書き出すようになっています。

face_rectsに画像1枚から検出されるすべての顔座標が格納されています。

 

 

実際に動かしてみると、加工前はこんな感じ。

加工後は以下のようになります。

加工前後で画像が異なるのは取得する画像の順番が0→1→2の順でないためです。globでは0→1→10→100の順に読み込んでいます。

まあ画像の順番は変わりますがあまり気にしなくても大丈夫でしょう。全部処理されているので安心してください

 

あとは処理した画像の中から、不要なデータを取り除くだけです。

上の一覧にはおかしなものは見当たりませんが、データセットの中にはちょくちょく誤認された画像が含まれています。横向いているのもできれば避けた方がいいかもしれません。

ここの作業も自動化したかったのですが、方法がわからず私は手作業で行いました数千枚なら間違い探しも一時間もかからないと思うのでここはわりきって手作業するのがはやいです

 

これで顔画像データセットの完成です。画像の番号を順番に整列したい方は以下のスクリプトを実行してください。

data/output_rowにファイル名が整列して保存されます。

 

 

今回は以上となります。

この手順によって30分程度で数千枚程度のデータセットをつくれるかと思います。

お試しでニューラルネットワークに学習させるには十分な量だと思うのでぜひ試してみてください!

最後まで読んでいただきありがとうございました。

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

斎藤 康毅
3,600円(11/21 09:39時点)
Amazonの情報を掲載しています

Pythonで機械学習入門: 深層学習から敵対的生成ネットワークまで

大関真之
2,640円(11/21 14:44時点)
Amazonの情報を掲載しています