愚痴

2016年12月 8日 (木)

Microsoft Cognitive Servicesがうらやましいのでパチもんを作ってみた

Fujitsu Advent Calendar 2016の8日目です。 なお、このエントリは個人の立場で書いております。

ディープラーニング関連の話を書こうと思います。 とはいえ、あまり技術的なものではないです。 技術的にすごい話は11日目のsakaiakiraさんや、 他の方が書くでしょう。 ここでは、ディープラーニングを勉強していて湧き上がる心の叫びのようなものを取り上げ、 その勢いでとあるサービスを特に意味なく実装することを試みます。

思うこと

要約すると、だいたい以下になるんですけど、

  • MicrosoftのCognitive Servicesがうらやましいという妬み
  • 自分がろくなデータを持っていないという悲憤

念のため。 これは私個人の話です。 富士通としてはディープラーニングをばりばりやっているところがあるはず。

今、多くのソフトウェア開発者がそうだと思いますが、 私もディープラーニングをぼちぼち勉強したりしております。 私としては、 ディープラーニングそのものももちろん興味深いのですが、 それをプラットフォームにしたり、 サービスにしたりといった方面により興味を持っています。

そういう意味で、 各クラウドの機械学習サービスだとか、 Microsoft Cognitive Servicesだとか、 GoogleのCloud Vision APIだとかを「いいなー」と見ています。

特に、 Microsoft Cognitive Servicesいいですね。 このCognitive Servicesには色々なサービスが含まれています。 LUIS(Language Understanding Intelligent Service)とかも重要そうですが、 私のお気に入りはEmotion APIです。 ディープラーニングの面白さがシンプルに出ていると思う。

Emotion APIは、 画像を送りつけると、 その中から人間の顔を検出し、 どういう感情を持っているかを推測します。 こんな感じ。

Emotion APIの画面

この例では、 お子さんの顔を検出して、 "happiness"とか"anger"とか8種類の観点での「確率」を計算しています。 この値はこの裏で動いている学習済みモデルの計算結果であり、 正確には確率とは言えないと思うんだけど、 全部足すと1になるように調整されているようなので、 確率っぽい数字になっています。 ここでは「確率」と言っちゃいます。 この例では"surprise"成分90%ですね。

Emotion API本体はJSONを返すWeb APIですが、 以下のWebページでAPIの動きを試すことができます(上の図はこのページ)。

Emotion API (Microsoft Cognitive Services)

Emotion APIは今年春先のBuildイベントで発表されました。 その際に私は「ほほう」と思ったもんで、 いろんな画像を突っ込んでみてブログを書きました。

Microsoft Cognitive ServicesのEmotion APIを使ってみた (使って色々思いを馳せた編) (2016年4月2日)

でですね、 こういうのを提供できるっていうのは、 大量に自前データを持っているからだと思うのです。 Microsoftも色々言われながら、 Bingやめなかったのが生きてますね。 API化するなら、自前データだよなあ(「自前って何」と考えると意外と難しいけど)。

ひるがえって自分なのですが、 いろいろお勉強して、 いっちょやってみよー、 と周りを見回すと、 ろくなデータがないのです。 今まで生きてきて私は何をしていたのだろうかと思ってしまいます。 ディープラーニング学習させるには、 従来とは桁違いの量のデータが必要だと思います。 かろうじて量があるのはテキストベースのデータなのですが、 自然言語は一筋縄ではいかないしなあ。 今の業務上も、あんまり処理するよによさげなデータが出てこない。

そこを工夫してデータを探し出したり、 公開情報をあさったり、 データを持っている誰かのところに出向いたり、 なんとか考えるんだ、というのは分かります。 分かります。 が、個人的にブログでぶっちゃけるぐらいはいいだろう。 「きちんとラベル付けられた大量で自前のかっこいいデータがほしい!(なるべく汎用API化できそうなやつ)」

ということで

以上で言いたいことは大体尽くしているのですが、 それだけではなんですので、 この思いをコードに託し、 Emotion APIの如きサービスを立ち上げてみました。

このサービスは、 顔の画像を送りつけると、 いくつかの観点それぞれに該当する「確率」を返します。 Emotion APIが"happiness"とか"anger"の「確率」を返すのと同様です。 その分類の数はEmotion APIの8分類をはるかに凌駕する10分類です。

では、そのサービスを試してみましょう。 Web APIももちろん用意していますが、 とっつきやすいWeb GUIもあります。 操作はEmotion APIの画面と一緒です。 先程のEmotion APIのお子さんの画像を入れてみると、こんな感じ。 スタイルが本物に比べるとしょぼいけど、気にしない。

Digit APIの画面

はい。 このサービスでは、 顔がどの数字(0-9)に一番似ているかを判定します。 顔の領域の検出機能は残念ながらありません。 というか、入力画像が顔であるかどうかも実は気にしていません。

お察しの通り、 このサービスはディープラーニングにおける"Hello World"たるMNISTをそのまま動かしています。 0-9の手書き数字を認識させるというやつですね。 手書き数字を識別するために訓練されたモデルに 何の関係もない画像を無慈悲に流し込むという鬼畜のごとき所業です。 CNNの無駄遣い。 しかも、 MNISTの入力に合わせるため、 入力画像は問答無用に28 x 28のグレースケールにリサイズします。

要するに、 学習すべきいけてるデータを持たないので、 思い余ってMNISTをそのままAPIにしてみました。 サービスのURLは以下です。

Ipponshimeji Cognitive Services - Digit API

【2017年1月17日追記】 このサービスの稼働は年末で終了させました。

モデルの学習は、 Microsoft Cognitive Toolkit (CNTK)を使っています。 以下のサンプルの03_OneConvDropout.cntkをほぼそのまま実行しています。

CNTK/Examples/Image/GettingStarted/ (GitHub)

ただし、最後の出力だけ変えています。 目的がクラス分けではないので、各ノードの値をSoftmaxを通して「確率」が出力となるようにしています。 この変更も含め、 サービスのソースもGitHubに置いています

CNTKの評価ライブラリの利用については、 はまったところもあるので、 覚えていればまたブログに書きたい。

注意事項など

このサービスはアドベントカレンダーの期間中くらいは動かすつもりです。 Azure Web AppsのB1インスタンス1個(1コア)で弱々と動かしています。 スケールさせるような余裕はありません。 まあ、そんなことはないと思いますが、アクセスする酔狂な人が大量にきたらパンクするかもしれない。

また、判定した画像は保存していません。 ローカルマシンのファイルをアップロードして判定させた場合でも、 そのファイルは保存しません。 メモリ上だけで処理しています。 ただ、「全体でリクエストがいくつあったか」「判定結果」だけはログを取ります。 どの数字に似た画像が多いのかはちょっと興味あるし。

あと、再度念押しですが、このサービスは個人的に勉強がてら作って試しているものです。

おわりに

このサービスの実用性はまったく無いんですけど、 せっかく作ったので、 「誰の顔が一番数字の4に近いか」勝負とか、 忘年会の余興にでもご活用ください。

何人かの写真をぱしゃぱしゃ撮って、 スコアを出して順位をつけるスマホアプリとか作ってくれてもええんやで。

2016年8月25日 (木)

帰省メモ:伊予灘のこと

盆休みに妻子を連れて愛媛県八幡浜市に墓参帰省しました。 せっかくですので、色々懐かしかったことなど書き残しておこうと思います。 まずは、伊予灘のこと。

今、車で松山から八幡浜へ行くには、 内陸を走って、 内子-大洲-夜昼トンネルがメインルートとなるでしょう。 が、私のお気に入りは、 伊予灘にそって長浜-瞽女ヶ峠バイパスを通るルートです。

伊予市を出て、 予讃線の旧線沿いに三秋信号所跡の峠を越えて伊予灘に出ると、 そこから磯崎まで、のたりとした伊予灘が延々と続きます。 こんな感じ。

伊予灘

私はこの伊予灘のとぼけた風情が好きです。 途中の下灘駅は青春18きっぷのポスターになったりしてますね。 そういえば、 下灘駅を通り過ぎる際に、 ちょうどJR四国の観光列車の「伊予灘ものがたり」が駅に停まっていました。 この列車もいつか乗ってみたい。

伊予灘ものがたり

海沿いに走っていると、 そのうち沖に青島が見えてきます。 最近では猫の島として有名です。 私の母親が一時期ここの小学校の先生をしていたそうです。 もう半世紀前の話です。 小学校はとっくに廃校になっています。 (車の窓にティッシュの箱が映り込んでいるのは気にしない)

青島

今でこそ海沿いに二車線のきれいな道ができていますが、 これは海岸を少し埋め立てて造ったもので、 予讃線のすぐ脇が海でした。 串駅の先の川とか、河口が大きく山側に入り込んでいて、 汽車が海の上の橋を渡るような感じだったなあ。

そういえば、この「串」という駅名、 子供の頃めっちゃかっこええと思っていました。 しかもこの駅、 短いプラットホームが無造作にあるだけの無人駅です。 こういうあまりにしょぼい無人駅はこの辺りにいくつかありますが、 こいつらは駅名表示板でも一人前扱いされていませんでした。 例えば、下灘駅の駅名看板は今でこそこうなっていますが、

下灘駅

Wikipedia 下灘駅より

国鉄時代は次の駅が「きたなだ」でその下に括弧書きで「(くし)」と書かれてました。 正規の駅と見なされていなかった。 そういうところもたまらなかった。 高野川とか西大洲とかもそんな扱いだったはず。 市坪もそうだったっけな。

長浜は、 国鉄時代、伊予市から大洲までの間での唯一の急行停車駅でした。 今は青島への港であることと、肱川あらしが有名でしょうか。 むかし、竜宮城を模した風情の水族館があり、 行ったことがあります。 売店で海ほうずきを50円で買った覚えがある。 調べてみたら昭和60年に閉館していました。 今は長浜高校がなんやら活動しているらしい。

ながこう水族館は、 大洲の竜宮城!

(そういえば、長浜は今は大洲市なのか)

長浜から先は肱川を遡って大洲へ向かう予讃線(旧線)と別れて、 さらに海沿いを進みます。 そのうち遠くに伊方原発が見えてきます。 この写真だとちょっとわからないか。 遠く霞んでいるあたりにあるはず。 この日、 ちょうど原発再稼働の日だったらしく、 色々騒いでいたらしい。

櫛生あたり

このあたり、 青っぽい岩がよくあります。 こんな感じ。

青い岩

こういった岩は中央構造線沿いに分布しており、 きれいなやつは「伊予の青石」として庭石にしたりします。

で、喜木津の手前から瞽女トンネルに入り、 宇和海側へ抜けます。 この瞽女トンネルができる前、 瞽女ヶ峠を越えるのが大変でした。 なので、八幡浜へは大洲経由がメインルートだったのでしょうが、 このトンネルができてから、 時間的にはそんなに大きく変わらないんじゃないかな。

私が子供の頃、 四国の国鉄線はすべて非電化で、 急行がメインの長距離列車でした。 予讃線の特急は「しおかぜ」が日に3往復だけだった。 で、松山を越えて宇和島方面へ行く急行といえば、 急行「うわじま」でした。 国鉄色のキハ58系ですよ。 わたしのtwitterアイコンはこの「うわじま」のヘッドマークです。 (ちなみに、このアイコン、写真ではなく、ペイントブラシで描いた図形です。 十年ほど前に何の気なしに描いてみたら意外とそれらしくできたので、そのまま使っています)

当時、 予讃線はまだ内子経由のルートができておらず、 この海沿いの旧線が本線でした。 足場が悪いせいか、 この旧線を「うわじま」は時速40-50キロくらいでとろとろと走ります。 伊予市から次の停車駅の長浜まで、30分かかっていました。 これ、「うわじま」全線で最長区間じゃないかな。 さらにその後、長浜から大洲まで25分くらいかかります。 子供の頃は、帰省のたびにこの区間が死ぬほど長く感じていました。

ところが、 今となってはこの風景が原体験のように刷り込まれており、 急行「うわじま」がリバイバル運転された際の前面展望DVDなど買い込んでいて、 なんか気分が落ち込んで調子が悪いときに虚ろな目でだらだらと見ていたりするのです。

PC303 リバイバル急行「うわじま」(DVD2巻組作品)

子供の頃はこの30分が苦行だったのに、 今はそれを好んで延々見ているわけですよ。

久しぶりにそのルートを走って、懐かしかったです。

週末元気があれば、 宇和海側のことも書きたい。