機械学習を自分の手でやってみたいけど、データセットのつくり方がわからないという疑問を解決します。本記事では機械学習用のデータセットのつくり方についてまとめておきます。対象は、Tensorflow、keras等のチュートリアルコードを動かしてみた方です。機械学習についてまったく知らないという方はまずはチュートリアルコードを動かしてみるのがおすすめです。https://www.tensorflow.org/beta/tutorials/keras本題に入る前に少し余談です。TensorflowやMNISTのチュートリアルは、データセットのダウンロードから読み込みまで全部コード内でやってくれます。そのため、コード中で何が起きてるのかいまいち理解できなくてモヤモヤした経験がありました。私はデータセットに対して疑問が残ってしまったので、データセットを1からつくってみたいと思った次第です。スポンサーリンクさて、ここから本題に入ります。本記事で作成した機械学習用データセットは、以下のようなものです。顔画像(カスケードファイルにより処理)不要データを自分で取り除く必要ありラベル付けをしていないということで、本記事で作成したデータセットは分類問題を学習するためにそのまま投げ入れることはできないので注意して下さい。GANs(敵対生成ネットワーク)により顔画像を生成するために作成したので、今回は画像なら顔部分を切り出し、リサイズしたデータセットになります。顔認識はカスケードファイルを用いて行いましたが、顔ではない部分を切り出していることが多々ありますので、そこは手作業で削除等の処理が必要です。(↓の画像のimg780.jpgとか)最終的に作成できたデータセットはこんな感じです。↑のようなデータセットをつくるためには、以下の手順が必要です。Webから画像をスクレイピング顔部分の切り出し取得画像を整形(リサイズ、不適な画像を処理)個人的に一番しんどいのはなんといってもスクレイピングする部分です。自作しようとしたけど無理でした。KomatsuさんのQiita記事で紹介されているコードを丸々使っています。画像を大量に取得できればあとは画像を処理するだけです。手順2、3については、1つのスクリプトとしてまとめて処理していきます。それでは手順に沿ってデータセットのつくり方を解説します。1.24.11.Webから画像をスクレイピングWebから画像をスクレイピングして、データセットのもととなる大量の画像をスクレイピングします。画像収集をする)から、丸々お借りしています。urllib.parseの3つが別々のものになったため、3つにわけて宣言する必要があるので注意して下さい。スクレイピングする際は、コンソール上で以下のコードで実行できます。100なお、検索する画像の数は私の場合だと1000枚までしか取得できませんでした。調べてないので確定できませんが、おそらくリクエスト制限にひっかかっているためだと思います。そのため、1000枚以上の画像を取得するにはスクリプトを変更するか、地道に集めるしかないようです。試しにデータセットをつくるためなら十分な数を集められます。収集したデータは、以下のパスにフォルダとして保存されます。スクリプトのあるディレクトリ\data\検索キーワード名フォルダ/私の場合は、”woman+face”、”woman+model+face”の2つのキーワードで1000ずつスクレイピングし、エラーを除いて約700枚のデータを収集しました。2.顔部分の切り出し+3.取得画像を整形(リサイズ、不適な画像を処理)画像を取得できればあとは画像処理するだけです。顔部分をカスケードファイルを用いて認識、切り出し、全画像のサイズを統一します。カスケードファイルとはOpenCVの公開している顔の特徴をまとめたデータになります。画像とカスケードファイルを照らし合わせて、顔がどの部分にあるかを調べます。以下のリンク先からカスケードファイルをダウンロードしましょう。Cascadefileカスケードファイルはたくさんありますが、今回は以下のファイル名のものをダウンロードしてください。保存先は画像処理用のスクリプト(.py)と同じディレクトリにしてください。コードは以下になります。1else:passこのスクリプトでは2つのディレクトリパスを指定しているので、ご自身の環境に合わせて変更してください。スクリプトについて説明をしておきます。globopencv-pythonとglobの宣言です。globは画像をまとめて取得する際に使用します。cv2.CascadeClassifier(HAAR_FILE)カスケードファイルを読み込みます。”内にカスケードファイルのパスを指定するだけでOK。ファイル名(output)のフォルダを作成しといてください。スクリプトのあるディレクトリ/data/outputの順になるように配置します。img_list:加工元の画像ディレクトリを指定します。globにより.jpgのファイル全てのファイル名を取得します。画像ファイル名の配列です。load_img_listに画像を読み込みます。1else:passわかりにくいのでコメントで全部書きました。注意していただきたいのが、カスケードファイルを用いた顔認識では、1枚の画像から複数の顔を検出できます。このスクリプトでは、複数の顔が検出された場合、それら全ての顔を書き出すようになっています。face_rectsに画像1枚から検出されるすべての顔座標が格納されています。実際に動かしてみると、加工前はこんな感じ。加工後は以下のようになります。加工前後で画像が異なるのは取得する画像の順番が0→1→2の順でないためです。globでは0→1→10→100の順に読み込んでいます。画像の順番は変わりますがあまり気にしなくても大丈夫でしょう。全部処理されているので安心してください。あとは処理した画像の中から、不要なデータを取り除くだけです。上の一覧にはおかしなものは見当たりませんが、データセットの中にはちょくちょく誤認された画像が含まれています。横向いているのもできれば避けた方がいいかもしれません。ここの作業も自動化したかったのですが、方法がわからず私は手作業で行いました。数千枚なら間違い探しも一時間もかからないと思うのでここはわりきって手作業するのがはやいです。これで顔画像データセットの完成です。画像の番号を順番に整列したい方は以下のスクリプトを実行してください。1data/output_rowにファイル名が整列して保存されます。今回は以上となります。この手順によって30分程度で数千枚程度のデータセットをつくれるかと思います。お試しでニューラルネットワークに学習させるには十分な量だと思うのでぜひ試してみてください!最後まで読んでいただきありがとうございました。2019/05/31Amazon楽天ブックスYahooAmazonの情報を掲載していますTwitterFacebookスポンサーリンク関連記事Pythonで画像編集するOpenCVコードをまとめてみたPythonを使ってTwitterで自動いいねをしてみた。管理人プロフィール当サイト(your-3d.com)の管理人のゆあーさんと申します。このサイトでは、私がZBrushやunityなどで調べたことを共有出来たらいいなと思い開設しました。読んでくださった皆様のお役に立てたら幸いです。https://your-3d.booth.pm/プロフィールページ作りました。【Python】CSV形式でデータを扱う方法Mecabで形態素解析:品詞分解する方法【Python】Tensorflow-gpuインストール時の注意点:Win初心者がPythonで顔認識してみた【カスケードファイル】Atomのインストール&日本語化の手順を詳しく解説【Windows】Pythonで画像をスクレイピングしてみた。3d管理人のゆあーさんです。生まれは北国、現在は東京に住んでます。趣味はプログラミング、モデリング、あとブログです。このブログに書いている内容ですね。ゲームもたまにしてます。