[第一回] DeepLearningは電気羊の夢を見るか

灰原さんを検出するAIをつくりたい

自動キャプチャ機能はつくったのだが、そこから目的の人物がいるかどうかで分類を行いたい。

枚数が枚数(大体20000枚近くある)なので正解率は別に100%である必要はなく、大体90%もあればいいのではないかと思っている。

しかも、目的の人物が「いる」ならほぼ確実に(99%以上)で認識し、「いないにもかかわらずいる」と認識する誤認識はある程度許容できるというような条件である。

学習用のデータと実際のアニメキャプチャは全然解像度が違うので、まずはアニメキャプチャからアニメ顔を認識し、認識した範囲について目的の人物かどうかをチェックするという二つの異なる処理が必要になってくるわけである。

今回の処理のフローチャート

ともすれば、まず最初にしなければいけないのはアニメ顔認識である。

アニメ顔検出機

顔検出機というのは実は別にディープラーニングを用いなくても古典的な手法で極めて高い確率で認識できることがわかっている。

簡単に原理を説明すると、「目と口(点)が三角形に配置されていてその周りがほとんど同じ色(顔の皮膚の色)であれば人間の顔」という具合である。

もちろん、実際にはもっと複雑なことをしているのだが基本的な原理はそんな感じである。

ただ、人間の顔とアニメ顔では目の大きさがかなり異なるなど違いがあるのでそのまま人間用の顔検出機を利用するわけにはいかない。

ところが、このようにアニメ顔検出器を作成して公開してくれている方がいたのでこれを利用することにした。

この記事を読むと、精度はわからないもののしっかりとアニメ顔認識ができていることがわかる。

どうやらこの顔検出機を上手く利用することができそうだ。

顔検出

フォルダの中にあるPNG画像を逐次読み込んでその顔領域を抽出し、別ファイルで保存するプログラムを書くことにした。

実際の動作ではスクリーンショット自体を判別したいので別ファイルで保存する必要はない。

今回は顔検出機の動作チェックとプログラミング練習を目的としている。

とりあえず熟年夫婦感が溢れている以下の画像から顔認識を試みました。

映画「天国へのカウントダウン」より
import os
import cv2

classifier = cv2.CascadeClassifier('lbpcascade_animeface.xml')

image = cv2.imread('1556819436.jpg')

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = classifier.detectMultiScale(gray_image)
print(faces)

コードは参考サイトと全く同じように書きました。

さて、これで無事に認識してくれればいいのですが、何故か出力が空っぽになってしまいました…

つまりこれは顔認識ができていないということです。

環境がおかしいのかな?と思って参考サイトと同じく画像で顔認識を試みたところ、ちゃんと6人分認識されました。

えっ、コナンの作画は古いから顔だと認識されていない可能性ありますかこれ??

私に天使が舞い降りた

私に天使が舞い降りたでは片目が隠れているにもかかわらず正しく検出することができた。

とある科学の超電磁砲

とある科学の超電磁砲では初春は正しく認識できたが、黒子が認識できていないのがわかる。

まとめ

正直なところ、名探偵コナンの作画に対してlibcascade_animeface.xmlの検出器の精度が低すぎる。

つまり、このままでは利用できない可能性が極めて高い。

じゃあ「コナン専用の検出器つくればいいんじゃないの?」っていう風になるので、次はアニメ顔検出器の作り方と実際に作ってみてその精度について解説していきたいと思います。

シェアする