【LINEbot】Pythonで女優識別botを作ろう Part3【入力用データ作成編】

こんにちは。

 

今回は、第2回に引き続き、モデル構築前のデータ処理に関して解説していきます。

 

 

第2回の記事はこちらです。

>>【LINEbot】Pythonで女優識別botを作ろう Part2【画像収集編】

 

 

画像認識モデルを構築する際に、場合によってはモデル構築時に画像を読み込んでいくことが多いかもしれませんが、今回はあらかじめ別のファイルで画像を入力用のデータに加工していきます。

 

 今回の内容

  • 前処理を施す
  • 画像を入力用に変換する処理

 

では、さっそく見ていきましょう!

 

画像に手を加える前に、、

さっそく画像に対して、処理を加えていきたいのですが、前回のスクレイピングで収集した画像には、余分な画像がそこそこ含まれているので、こういった画像を削除していきます。

 

この処理の自動化についても考えてみたのですが、今の僕の技術では良い案が思いつかなかったため、手作業で行います。

 

今回、削除の対象となるものは以下のような画像です。

 

  • 2人以上の人が写っている画像
  • 顔がほとんど見えない画像
  • 全く別の人の画像

 

 

「橋本環奈」で検索して集めた画像での一例

2人以上の人が写っている

 

 

顔がほとんど見えない(これは微妙だけど念のため削除)

 

 

全く別の人

 

正直言って、この作業が一番面倒です。。。

 

OpenCVで顔検出させて自動削除することも試みたのですが、精度が悪かったのでダメでした。

(何か代案がある方は教えてください!)

 

では、余分な画像を削除し終わったので、次の章では実際に画像を入力用に変換していきます。

 

 

入力用に変換

この章では画像に複数の前処理を施し、モデル入力用に変換していきます。

 

ここで紹介するコードは、モデル学習コードと切り離しているものですが、モデル学習用コードの中に記述してもらっても構いません。

(場合によっては入力用のデータを保存する手間が省けます。)

 

確認ですが、各女優の画像を格納しているフォルダはこのような構造になっているという前提です。

 

 

 

入力用データを作成するコードはこちらです。

 

 

なるべくコメントを入れるようにしたので、少し読んでもらえれば理解できるかと思います。

 

では、簡単に解説していきます。

 

 

13~26行目の  CenterTopCrop  クラスは、自作した前処理のクラスになります。

こちらが該当コードです。

 

 

この前処理では、コメントに書いてあるように、画像の中央上部を指定したサイズの正方形で切り取ります。

実は、この前処理はある仮設に基づいて施しています。

 

それは、画像内にある顔の位置は中央上部付近にあるだろう、という仮説です。

 

先ほども述べたように、OpenCVで顔付近だけを検出して切り取ると、ちょっとでも横を向いているだけで顔を検出できなくなったため、大体この辺に顔があるだろ、という範囲を切り取っています。

 

逆に言うと、極端に画像の端の方に顔があると、モデル学習時にノイズとなる可能性があるので削除した方がいいです。

 

 

40~75行目までの関数 create_datasets  では、画像フォルダを展開し、入力用データにまとめる処理を行っています。

 

 

引数には、上の方で確認したimagesフォルダのパスと、画像に施す前処理を渡します。

 

この関数の中では、各女優のフォルダを展開し、すべての画像に対して前処理をかけています。

前処理を終えたデータを全て積み重ね、ラベルとともにタプルでまとめます。

 

また、各女優に与えるラベルは、関数の冒頭で定義した data_labels に基づいて付与します。

 

返り値として設定されている datasets  は最終的に以下のような構造となっています。

datasets[0]  にすべての画像データが格納されており、 datasets[1] にはすべての画像のラベルが格納されている。

datasets[0][i] の画像データと datasets[1][i] のラベルはそれぞれ i で対応している。

 

返り値として帰ってくる値は、モデル学習時に簡単に使用できる形でまとめられているので、この返り値をそのままpickle化して保存します。

 

pickle化は、96,97行目のこの部分で行っています。

 

 

おわりに

今回は、画像データをPyTorchへの入力用データに変換する処理を解説してみました。

 

少し長いコードなので難しく見えますが、細かく見ていくと単純なことのみを行っているので、何度も読み直してみてください。

 

次回は、最後の方で保存したデータを使って、モデルを構築していきます。

 

では、今回はここまでとします。

お疲れさまでした。

 

追記:第4回を更新しました。

>>【LINEbot】Pythonで女優識別botを作ろう Part4【モデル構築編】