自分で収集した顔グラを使い、AIで顔認識。

先日、ソニーのNeural Network Console(略称NNC)のサンプルを使い、画像認識をしました。
https://minokamo.tokyo/2021/07/24/3886/
本日は、自分で集めた画像を使い、確認をします。
使用する画像は、コロプラの白猫プロジェクトのキャラの顔グラを集めます。
googleの画像検索で収集します。

ソフトはVOVSOFTのピクチャーダウンローダーを使用して一気に収集します。しかし、思った画像があまりありませんでした。
そこで、実際にタブレットでプレイしている白猫プロジェクトの画像をスクショして収集することにしました。ミラーリングしたタブレットでキャラを一人一人表示して、キャプチャーしていきます。約500のキャラの画像をキャプチャーしていきます。

さらに、このスクショをトリミングする作業が残っています。
トリミングするソフトはRalpha Image Resizerというフリーソフトを使用します。キャプチャーした画像をこのソフトで読み込みます。30枚くらいづつ読み込むことにしました。


顔の部分だけを正方形でトリミングしていきます。顔が同じ位置にあれば一括でトリミングできるのですが、キャプチャーした画像は当然ながらずれが生じているので、一枚一枚確認しながら切り抜いていきます。ずれてはいないが、顔が大きく収まりきらない時や、他の顔グラに比べて小さい時は、そこも調整していきます。


この作業後は、わかりやすいように、画像のファイル名を規則性がある名前に一括変更します。


また、画像はすべて正方形であるが、サイズが違います。サイズはファイルの容量ではなく、縦横の大きさの事です。すべてが同じサイズではないので一括で統一します。使用したソフトは「リサイズ超簡単Pro」というものです。集めて編集した画像のサイズは80×80前後であったが、50×50にリサイズすることにしました。

次にこれらの画像をNeural Network Consoleで使用できる準備をします。わかりやすいようにCドライブに適当なフォルダを作成し、その中にソースとアウトプット用のフォルダを作成します。
ここでは、gazouというフォルダをCドライブに作成し、その中にsoとoutというフォルダを作成しました。さらにsoの中にフォルダを2つ作成します。


ここで、はじめて目的を述べます。白猫プロジェクトで私の推しキャラのカスミをAIが判断できるかということです。もちろん他のキャラも多数用意してあります。カスミの顔グラを14枚、その他のキャラの顔グラを467枚用意してあります。
カスミの画像をsoの中に新規でフォルダを作成し、そこに全部入れます。他の画像も新規でフォルダを作成して入れておきます。カスミ用のフォルダをg1、その他のキャラの画像を入れるフォルダをg0としておきました。

さて、ここまでで準備はほぼ整いました。早速NNCを起動して設定をおこないましょう。
まずはデータセットをクリックするとそこにImage Classificationがあるのでそれを選択します。画像分類のことです。すると設定画面が現れます。


ソースディレクトリと出力ディレクトリに先ほどのフォルダのパスを入力します。

ソースディレクトリ C:\gazou\so
出力ディレクトリ  C:\gazou\out

変形方法はトリミングを、出力カラーチャンネルを3(RGBカラー)を選択します。今回の画像は白黒ではないですからね。
出力幅、高さはそれぞれ50と入力します。作成した正方形の顔グラのサイズになります。割合ですがカスミの画像が他に比べて少ないので出力ファイル1を70%にして、2を30%としました。前者が学習データで、後者が評価データとなります。


この設定で適用ボタンをクリックすると、適当に画像を割り振ってくれます。336枚と145枚に割り振ってくれました。9対1などと設定して、評価データにカスミの顔グラが1枚もないと困ります。
これでデータセットは完了しました。

今度はプロジェクトに進み、画像だけを入れ替え、サンプルを使い回すことにします。前回と同様にlogistic_regressionを使用することにします。一度やってみて精度が悪い時はもう少し複雑なプロジェクトを選択することにします。レイヤーのInputを選択するとプロパティが左下に現れるので、自分の画像に合わせた数値を入力します。


まだこのままではサンプルの画像なので、作成した画像に入れ替えます。データセットをクリックしてtrainingにおいて出力ファイル1を選択し、Validationにおいて出力ファイル2を選択します。これで画像が入れ替わるはずです。


これで学習する準備が整いました。編集画面で学習となっていることを確認し、実行ボタンをクリックします。

学習完了後は、左上の編集画面が学習になっており、右上が評価となっております。ここでも実行ボタンをクリックします。

評価完了後は、混同行列を選択すると結果を見ることができます。これは素晴らしい結果です。


CSVファイルも作成されるので確認することができます。学習結果リストを右クリックします。「学習結果のフォルダを開く」を選択するとエクスプローラが開き、CSVファイルを確認することができます。過去に行った学習もあるので、今、行ったことは一番上にあるはずです。

confusion_matrix_y.csvを開くと先に述べた精度を確認することができます。output_result.csvを開くと145件の評価の結果を確認できます。
前回みたいにA列が示しているフォルダの画像を、エクセルに一覧表示してみましょう。
VBAを使用して下記のコードを標準モジュールに記述します。

Sub Folder_url_Picture()
Dim Pshp As Shape
Dim xRg As Range
Dim xCol As Long
On Error Resume Next
Application.ScreenUpdating = False
Set Rng = ActiveSheet.Range("A2:A146")
For Each cell In Rng
filenam = cell
ActiveSheet.Pictures.Insert(filenam).Select
Set Pshp = Selection.ShapeRange.Item(1)
If Pshp Is Nothing Then GoTo lab
xCol = cell.Column + 3
Set xRg = Cells(cell.Row, xCol)
With Pshp
.LockAspectRatio = msoFalse
If .Width > xRg.Width Then .Width = xRg.Width * 2 / 3
If .Height > xRg.Height Then .Height = xRg.Height * 2 / 3
.Top = xRg.Top + (xRg.Height - .Height) / 2
.Left = xRg.Left + (xRg.Width - .Width) / 2
End With
lab:
Set Pshp = Nothing
Range("A2").Select
Next
Application.ScreenUpdating = True
End Sub

ここからが本当の解説になります。
混同行列でカスミと認識されたのは4枚中1枚のみということです。これは良い結果とはいえません。他のキャラの顔グラでは、カスミとご判断したものは0だったので総合ではよい結果となっていたのです。

そこで、プロジェクトを変更してみます。binary_cnnに変更して確認します。
レイヤーは先に述べたことと同様にして変更し、データセットもサンプルと作成した顔グラに変更します。1回の学習と評価では先ほどと結果は変わりませんでした。
コンフィグ画面にて構造自動検索を有効にすると、文字通り自動でレイヤーを入れ替えて構成を組んでくれます。

ユーザーが自分で停止ボタンをおさないとずっと続きます。ある程度、繰り返した後、評価を実行します。左側にある「学習結果リスト」に履歴が残りますので、良さそうなものを評価します。
また、右側にあるオーバービューでは構成が変化していきます。

何回も学習した中で良い結果の構成が見つかりました。混同行列でカスミと認識された顔グラが4枚中3枚に増えました。ただし、他のキャラのうち1枚だけがカスミと誤認識されました。
前のプロジェクトより、こちらが良いといえます。

タイトルとURLをコピーしました