DataSpider でやり残したこと(不真面目)

はじめに

「退職まであと数日か」と考えると会社を辞めることより DataSpider を気軽に触れなくなることにとても寂しさを感じました。そこで最後に DataSpider で何か作って遊ぼうかなと思っていたところ、二郎 AI のニュースが流れてきて「これだ!」と思い二番煎じで遊んでみました。 withnews.jp

作りたいもの

テレビでもリアルでも良いのですが、初めての人を見たときに「あっ、あの人 AKB にいそうだな」とか「ジャニーズ っぽいな」とか思うことありませんか?ありますよね?もしそれが共感できない人でも、女優やタレントでも所属事務所ごとに系統(〇〇っぽさ)があることはなんとなく理解できるかと思います。

ヲタ界隈でも「○○っぽい顔」みたいな考え方があって、自分自身でも「あ~、この子は典型的なハロプロ顔だな~」とか思うことがあります。 この○○っぽいというのは中々言語化が難しいもので、それだったら AI に学習させて AI に判断してもらおうと思いまして、DataSpider + 画像認識 AI を使って遊ぶことにしました。

下準備

正直これが一番大変でした。 今回はとりあえず「ハロプロ顔」「AKB 顔」「乃木坂顔」の判別ができれば良しとしてそれぞれのスコアリングをしたいと思います。そのためにはそれぞれのグループごとに画像を集めて AI に学習させる必要があります。 当然まずはハロプロから。オフィシャルページに行って総勢 58 名分の画像を取得してとりあえずローカルに保存します。(豆知識:funaki(2).jpg,morito(2).jpg というように同じ名前が2つありますが、この子達はハロプロ内で複数のグループを掛け持ちしているので両方の写真を使いました)

f:id:dsstsukky:20190325140215j:plain

続いて、乃木坂 46。ここで問題発生!ハロプロのページは右クリックで保存できたのに、乃木坂 46 と AKB48 のページは右クリックが禁止されていて画像が保存できませんでした。早くも暗礁に乗り上げたか?と思いましたが、調べてみたら Chrome 拡張で右クリックを有効化するものがありました。

chrome.google.com

これを使ってなんとか乃木坂 46 の画像を取得。続いて、AKB 48 のページも右クリック保存ができなかったけど「Enable right click」のおかげで解決!どうしても画像保存したかったらスクショ撮れば良いですし、正直右クリック禁止して意味あるのかな?とか思いました。制限かけてないハロプロ最高!

ハロプロのファイル名は全部その子の名字にしていたのですが、AKB48 は名前を変更するモチベーションが無かったので、ファイル名そのままです(ごめんなさい)。しかも何故か 1 人だけ png の子がいました。

f:id:dsstsukky:20190325141323j:plain

とりあえずそんなこんなで画像を集めました。精度を高めるためにはもっとたくさん集めた方が良いでしょうが、とりあえずは ハロプロ:58名、乃木坂46:47名、AKB48:115名の画像を使って学習させていこうと思います。

IBM Watson Visual Recognitionでやってみる

画像認識 AI は Microsoft(Face API)も IBM Watson (Visual Recognition)も両方使ったことはあるのだけれど、今回やりたい「グループ化してそのグループ化に属するか判断する」というのは Watson でやったことがあって比較的すぐできそうな感覚があったのでまずは Watson でやってみました。

やること

  1. Create a classifier でカスタム分類器を作成する

  2. 判別したい画像を分類器に渡して結果を取得する

これだけですね。 API リファレンスを見ながらまずは カスタム分類器を作ります。カスタム分類器というのはチュートリアルでの直訳(英語では classifier )なのですが、「判定エンジン」みたいに置き換えたほうが理解しやすいかもしれません。デフォルトで用意されている判定エンジンにアイドルの画像を渡すと「women」や「person」などと判定されてしまうので、カスタム分類器を作成しましょう。

Visual Recognition - IBM Cloud API Docs

カスタム分類器の作成は非常に簡単で、Curl コマンドにするとこんな感じです。

curl -X POST -u "apikey:{apikey}" -F "helloproject_positive_examples=@helloproject.zip" -F "akb48_positive_examples=@akb48.zip" -F "nogizaka46_positive_examples=@nogizaka46.zip" -F "name=idol" "https://gateway.watsonplatform.net/visual-recognition/api/v3/classifiers?version=2018-03-19"

フォームパラメータで classname を指定して、その class の positive_examples (つまり、今回だとハロプロの画像の塊 zip)を渡します。同様に、akb48,nogizaka46 というクラスを作成して、一緒にそのクラスのサンプル画像を渡しています。{apikey}は実際の APIKEY に置き換える必要があります。あと、思ったんですが他のクラウドサービスはヘッダーで認証が多いと思うんですが、Watson は Basic 認証なんですね。 これを DataSpider で実装するとこんな感じで、アイコン 2 つだけで実装できてしまいます。

f:id:dsstsukky:20190325143649j:plain

f:id:dsstsukky:20190325143701j:plain

f:id:dsstsukky:20190325145829j:plain

f:id:dsstsukky:20190325150215j:plain

これで「idol」という名前のカスタム分類器が作成できたので、ここに画像を送り込んでみましょう。上手く行けばその画像がどのグループっぽい画像か判断してくれるはずです。使う画像はアイドルが憧れるアイドル鈴木愛理ちゃんの画像を使います。

www.airisuzuki-officialweb.com

使う APIClassify an imageです。これを使ってカスタム分類器に対して画像を送信し結果を取得します(とても簡単なので説明は省きます)。

戻ってきた結果を確認すると

                "classifier_id": "idol_1176938397",
                "name": "idol",
                "classes": [
                    {
                        "class": "helloproject",
                        "score": 0.892
                    }
                ]

としっかりと鈴木愛理ちゃんの顔がハロプロ認定されたようです。

続いて、AKB の元エース前田あっちゃんの画像を送ってみたのですが・・・結果がこれまたハロプロ顔。

ここで気づいたのですが、元々の画像写真がアーティスト写真(通称:アー写)を使っているためグループごとに衣装が偏ってしまい、私服っぽいとハロプロで学生服っぽいと AKB48、OL っぽい服装だと乃木坂と判定されてしまうようです。

・・・ということでここで方針転換。 とはいってもこれ以上画像を集めるのは大変なので、「同一人物だと判断する」という機能に特化した Microsoft の Cognitive Services (Face API) を使うことにしました。

(その 2 へ続く)