Microsoft Cognitive Serviceによる諏訪ななか検出器

鞠莉「ほんと、ダイヤは大好きなのね、すわわが」

果南「・・・うーん・・・」

鞠莉「私は、すわわのストーカーだから」

果南「・・・むにゃむにゃ」


果南「・・・はっ」
鞠莉「はぁーい、起きたかしら果南」
果南「なんか私のことのような、私のことじゃないような、変な夢見てた・・・」
ダイヤ「鞠莉さん、人が寝てる間に変なこと吹き込むのはよくないですわよ」

鞠莉「まあまあ、私もダイヤも果南がダイスキ! ってことで、好きな人の写真は何枚あっても使いきれないものデース」
果南「ちょっと待て使うって何さっ!」
鞠莉「あら、具体的な説明が?」
果南「・・・いや、いい」

鞠莉「最近は人工知能の時代、ネットの海から目当ての画像を探すのもお手軽になってきたわ」
ダイヤ「Googleの画像検索なんかもずいぶん進歩した感がありますわね」
鞠莉「そう。でもアレは、あくまで画像のメタデータを使って検索しているもののはず。私たちは、もう一歩先を行ってみたいと思うの」
果南「人工知能に私の画像を探させると・・・はぁ」

鞠莉「今回のキーワードはズバリ顔認識!MicrosoftのCognitive Serviceというのがあって、AI関係の色々なAPIを提供しているの。その中から、Face APIというのを使ってみるわ」
ダイヤ「顔認識・・・スパイ映画とかで建物の出入りに使ってたりする技術ですわね」
鞠莉「そう!顔の特徴を学習して、個人識別を行う技術が顔認識!・・・だけど、残念ながら私たちの顔だと難しいみたいなの」
果南「・・・それって」
鞠莉「えーと、次元の壁、みたいな?」
ダイヤ「・・・まあ、普通はリアルな人間の顔を対象に開発しますわね」

鞠莉「そんなわけで今回は、もう一人の松浦果南こと諏訪ななかちゃんの画像を探してみるわ」
ダイヤ「その路線に行くわけですわね・・・」
果南「・・・ごめんよすわわ、私の代わりに実験台に・・・」


鞠莉「人工知能といえばPython・・・っていうのがどうしてなのかよくわかってないんだけど、とにかくPythonにしましょう」
ダイヤ「Pythonは以前ここでBiBiがやっていましたわね。何度読んでもエリチカお姉さまは最高でしたわ!」
鞠莉「あのときの知識を受け継いで、ちょっと古いけどPythonは2.7でいくわね」

鞠莉「必要なのはPythonの開発環境の他に、Cognitive Serviceを使うためのAzureのアカウント、画像検索用にGoogle Custom Serch APIを使うためのGoogleのアカウント」
果南「お金かかるの?」
鞠莉「んー・・・気にしたこともなかったわ」
ダイヤ「この金持ちに費用の話を聞くだけ無駄ですわ。えーと・・・回数とかの制限はありますけど、どちらも無料で使えますわ」
果南「よかった。ほら、うちの店も決して繁盛はしてないしさ」

鞠莉「その辺の準備だけど・・・長いし、他に譲ってもいいかしら?」
ダイヤ「手抜きするつもりですの?」
鞠莉「ノー!すでにあちこちで解説されているものを、ここで改めて説明するのも効率が悪いと思っただけデース!」
果南「まあ、それはいいんじゃない?画像付きで説明してるサイトたくさんあるみたいだし」
ダイヤ「・・・それもそうですわね」
鞠莉「最終的に必要なのは、Cognitive ServiceのAPIキーと、Google Custom SearchのAPIキーとエンジンID。これだけ用意できれば先に進めるわ」

鞠莉「いくつか参考サイトを貼っておくから、レッツファイト!」


Microsoft Cognitive Servicesの登録方法

Google Custom Search API を使って画像検索をしてみた


鞠莉「それじゃ、Face APIの説明からいくわね。今回は、ある画像に対して特定の人物が写っているかを判断するのがゴールよ」
ダイヤ「となると・・・その、特定の人物に関する情報を用意する必要がありますわね」
鞠莉「イエース!ではダイヤ、ダイヤのPCのすわわフォルダから何枚か画像をピックアップするのデース!あ、できるだけ顔のはっきり写った画像がいいわ」
ダイヤ「そうですね・・・では、これと、これと・・・」
果南(なんでそんなフォルダあるんだよ・・・)
鞠莉「とりあえず5枚もあれば最初の素材には十分ね」
ダイヤ「あまり大量に用意してもAPI消費するだけですわね」

鞠莉「じゃあ次に、Face APIのデータ構造の説明をします。Person GroupとPersonとFace、この3つのデータを使っていくわ」
果南「名前から何となく察しはつくね」
鞠莉「Personというのが個人を表すもの。Faceはその顔の情報で、1Personに対して複数Faceが登録できるわ」
ダイヤ「それで先ほど、画像を複数枚選んだのですね」
鞠莉「そういうこと。Person Groupは、複数Personを扱うときにグループ化するための構造よ」

鞠莉「Cognitive Serviceに人物を学習させるにはこういう手順を踏むわ」

  1. Person Groupを作る
  2. Person GroupにPersonを追加する
  3. PersonにFaceを追加する
  4. 学習を実行する

鞠莉「じゃあここまで、レッツコーディング!」

鞠莉「こんなところね」
ダイヤ「KEYは各自取得したものを使ってください、はお約束ですわね」
果南「長いけど、Cognitive ServiceのWebAPIを叩いてるだけかな」
鞠莉「そうね。APIリファレンスもあるし、読める範囲内じゃないかしら」

Face API Reference

鞠莉「さっきの4段階の処理を、コマンドラインオプションでそれぞれ実行できるようにしてあるわ」
果南「じゃあ、早速やってみようか」
鞠莉「すわわだけだと面白くないので、よく一緒にいるあいにゃこと鈴木愛奈ちゃんもセットで学習させてみるわね」
ダイヤ「有紗さんは・・・」
鞠莉「ありしゃは、ダイヤ的には破廉恥な写真が多いのではなくて?」
ダイヤ「くっ・・・」

> python face.py -cg nanaainya
creating person group…
person group nanaainya successfully created.

> python face.py -cp nanaka_suwa nanaainya
Creating person…
person nanaka_suwa successfully created.
7a03b421-7ede-415a-b569-9c1a1640420d

> python face.py -cp aina_suzuki nanaainya
Creating person…
person aina_suzuki successfully created.
ae206f29-02a1-4647-9f3b-b43fa5ef424e

鞠莉「こうやって、Person GroupとPersonを作ります。すわわとあいにゃの2人分、Personができたから、次は顔を登録するわ」
ダイヤ「画像の出番ですわね」
鞠莉「あいにゃフォルダも用意しておいたから、それぞれの画像を登録してみましょう」

> python face.py -af trainingdata\nanaka_suwa 7a03b421-7ede-415a-b569-9c1a1640420d nanaainya
Adding person face…
{u’error’: {u’message’: u’No face detected in the image.’, u’code’: u’InvalidImage’}}
Adding person face…
Adding person face…
Adding person face…
Adding person face…

> python face.py -af trainingdata\aina_suzuki ae206f29-02a1-4647-9f3b-b43fa5ef424e nanaainya
Adding person face…
{u’error’: {u’message’: u’No face detected in the image.’, u’code’: u’InvalidImage’}}
Adding person face…
Adding person face…
Adding person face…
Adding person face…
{u’error’: {u’message’: u’No face detected in the image.’, u’code’: u’InvalidImage’}}

鞠莉「選んだ画像によってはエラー吐いたりすることもありマース」
果南「顔が認識できなかったってこと?」
鞠莉「画像の中から顔を探して特徴を認識するから、そもそも顔が見つからない写真はアウトね」
ダイヤ「今だとななかさんは4枚、愛奈さんは3枚登録されてることになりますわね」
鞠莉「他の画像探して追加で登録してもいいけど、とりあえずこの枚数で進んでもOKよ」

鞠莉「最後に、ここまでで登録した人物と顔をCognitive Serviceに学習させます」

> python face.py -tr nanaainya

鞠莉「これはすぐに学習が始まるんじゃなくてキューに入れるだけだから、実際に処理が始まるのはまた後ね」
ダイヤ「気長に待ちましょうか」


鞠莉「待ってる間に、学習結果を使って顔の認識をするプログラムを作りましょう」
ダイヤ「面白くなってきますわね」

鞠莉「さっきのface.pyをインポートして使ってるわ。PersonのIDは定数として書いてしまったけど、パラメータで渡すとか外部ファイルから読むとか頑張ってもいいわね」
果南「これは画像ファイルじゃなくて、URLを使うの?」
鞠莉「どっちもできるんだけど、この後のことを考えてURLにしたわ」
ダイヤ「そういえば、画像検索とつなげるんでしたわね」


鞠莉「たぶん学習も終わってるでしょうし、動かしてみましょう」
ダイヤ「それっぽい画像も検索済みですわ。あ、ここには貼らないので、自分で確認しに行ってくださいまし」
果南「個人の写真絡みはいろいろあるからねー」

> python identify.py http://lovelive-schoolfestival.net/wp-content/uploads/2016/02/1451657175-25b3ec2591554559059407869902b113.jpg nanaainya
Identifying person…
nanaka_suwa

果南「あ、私・・・じゃない、すわわだ」
ダイヤ「なるほど・・・ちゃんと、認識できていますわね」
鞠莉「ええ、それじゃもう1枚」
ダイヤ「ななかさんと愛奈さんがいちゃついてる画像を用意しましたわ」

> python identify.py https://pbs.twimg.com/media/CYm9sMRUoAAzCp4.jpg:large nanaainya
Identifying person…
aina_suzuki
nanaka_suwa

ダイヤ「確かに、2人写っていることになってますわね」
鞠莉「こんなふうに、学習させた人物それぞれについて認識が行われるわ」
ダイヤ「ふふふ、これで推しカプの画像をいくらでも・・・いえ、何でもありませんわ」


鞠莉「では最後に、ここまでで作った認識プログラムを使って、Googleの画像検索結果からすわわ画像をかき集めてみましょう!」
ダイヤ「い、いよいよですわねっ!」
果南「この2人のテンションに身の危険を感じるよ・・・」

鞠莉「Google Custom SearchのAPIキーとエンジンIDの準備はOKね?それじゃ、こんなコードで・・・」

鞠莉「Windows向けなので、文字コードのところは実際の動作環境に合わせてね」
ダイヤ「KEYENGINE_IDは各自用意、ですわね」
鞠莉「APIはこのドキュメントを参照してね」

Custom Search JSON/Atom API

鞠莉「これを実行するには、さっきのface.pyと同じディレクトリに置いて、検索ワードとページ数を指定するの」
果南「ページ数?」
鞠莉「1回の検索で取ってこれる画像は10枚なの。で、ページ数を指定すると11枚目以降も取れるわ。今回のコードでは、全部で何ページ取ってくるかの指定よ」
ダイヤ「数字を大きくすればたくさん取れるわけですわね」
鞠莉「API的な制限があって、全部で100枚が上限よ」
果南「少なくない?」
鞠莉「もちろん、課金すれば無問題デース!」
果南「くっ・・・」

鞠莉「とりあえず1ページ、検索してみましょう」

>python imagesearch.py 諏訪ななか 1
Identifying person…
Identifying person…
Identifying person…
{u’error’: {u’message’: u’The length of faceIds is not in a valid range.’, u’code’: u’BadArgument’}}
Identifying person…
Identifying person…
Identifying person…
Identifying person…
Identifying person…
Identifying person…
Identifying person…
{u’error’: {u’message’: u’The length of faceIds is not in a valid range.’, u’code’: u’BadArgument’}}
done.

鞠莉「そうすると、検索結果の中からすわわの顔を認識した画像だけをダウンロードするわ」

検索結果

ダイヤ「画像検索では関係ないのが引っかかることありますから・・・これで確実に、本人の写真だけが手に入りますわね」
鞠莉「現状だと、検索結果のフィルタリング程度の使い道になるわね」
果南「最大100件だと、曖昧なキーワードで検索かけてもほとんど引っかからないもんね」
鞠莉「”声優”とかだと結果ゼロね」
果南「もっと大量の画像を検索できれば、純粋に顔だけで検索するシステムができるんだよね・・・」


鞠莉「これで、画像検索の結果を目で見て選り分けることなく、目的の人物の写った写真を手に入れられるようになったわ」
果南「上位100件だからまあ、あんまりマニアックなのは手に入らないと思うけどね」
ダイヤ「これをTwitterのAPIにつなげて生誕祭の日に画像を連投する仕組みを作れば・・・」
果南「それ、もはや祝ってるとは言わないよね?」


LINEで送る
Pocket


返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です