概要
自作の画像認識モデルを使用し、ユーザーが入力した画像からアニメキャラクターを検出します。
デモ
使用技術
- Python: 3.6.9
- Django: 3.1.3
- OpenCV: 4.1.2.30
- TensorFlow: 2.3.0
その他は以下のStackShareから確認できます。
キャラクター識別モデルの作成について
データセット作成の流れ
- 動画ファイルからキャラクターの顔画像だけを保存
- 得られた顔画像をキャラクター別に分ける(手作業)
- 正解ラベルと画像をNumPyファイルに変換(データセット作成完了)
- モデルの構造を定義して学習
- モデルの精度に満足したらモデルを保存して完成
※補足
1について、アニメキャラクターの顔検出自体は他の方によって作成されたOpenCVで使用できるカスケード分類器があるので、それを使用してアニメに登場するすべてのキャラクターの顔画像を検出して保存します。
モデルを使用した画像認識処理
サイト上では入力された画像から補足で紹介したカスケード分類器によって画像に描かれているアニメキャラクターの顔画像を検出し、検出された顔画像一枚一枚に関して自作のモデルを使ってキャラクターの名前を推測します。推測結果は名前と確率が返される様になっており(たとえば、A=70%,B=20%,C=10%なら「A」と「70%」が返される)、推測の確率が閾値を超えていれば返された結果を画像に描写し、閾値以下ならばデータセットにいないキャラクターとして画像に描写します。そして、結果が描写された画像を画面上に表示します。
作成に関して
今回のWebアプリは大学時代に研究していた深層学習の画像認識分野を取り入れ、誰でも手軽にAIを体験できるものにしました。キャラクター認識モデルの作成はデータセットの作成からすべて自分でプログラムを書いて実装しました。
作成中に苦労したのは、JPGやPNGなどの画像データを入力データとする画像認識モデルに対し、ユーザーから入力された画像データはバイナリデータとして扱われるということでした。バイナリデータから画像データへの変換はBytesIOを使用することで解決しましたが、その過程でPillowを使用しなければならず、Pillowは次の工程で使用するOpenCVと画像データの配列の扱い方が異なるため、PillowからOpenCVへの画像の受け渡しを注意して行わなければなりませんでした。認識モデルは画像の配列データをもとに判別を行うため、画像データの受け渡しの際にRGBの順番や上下が逆になってしまうとモデルが認識を誤ってしまいます。そのため、私はJupyter Lab上でデータの受け渡しの度に画像を描写し、確認することでユーザーから入力された画像を適切にモデルへと入力できるようにしました。