読者です 読者をやめる 読者になる 読者になる

Stimulator

機械学習とか好きな技術話とかエンジニア的な話とかを書く

Random Forest for kazoo04 recognition

 

 //--挨拶--

 みなさんこんにちは。Kazoo04 Advent Calender 7日目を担当します、@vaaaaanquish ことばんくしです。よろしくお願いします。突然ですがみなさん、

 

"みなさん、かずー氏好きですか?"

 

…そうですね。まあまあですね。今回はそんなKazoo04に捧げる記事を書いていきたいと思います。技術的、専門的な難しい内容は全然出てこないので気軽にどうぞ。

 

 

 //--背景--

  「Kazoo04に会ってみたい」ここ数年、このようなワードがインターネットを闊歩するようになりました。人類の歴史、インターネットの歴史から見ても、ここまでKazoo04が切望された時代はおそらく初めてなのではないでしょうか。これは、Kazoo04によって生み出された言葉やクラスタが世界に多大な影響を与えた証拠であると言えるでしょう。しかしながら、Kazoo04は一個人であり、人の身。神ではありません。Kazoo04複数存在せず、その身は多忙を極めています。地球上に存在する70億人からKazoo04を見つける事、それは宇宙に広がる星々から彗星を見つけるに等しいと言えるでしょう。

 

 "もし、街中でKazoo04とすれ違ってしまっていたら?"

 

そうです。みなさんもKazoo04と会うチャンス、Kazoo04チャンス*1を常に与えられているのです。しかし、みなさんがそのKazoo04チャンスを逃さないようにするには街に繰り出し、常にKazoo04を意識し、認識する必要があるのです。

 

 

 //--物体認識技術--

 私は"機械学習"を研究テーマとし活動しています。近年では、画像に写ったモノを認識するタスク、"一般物体認識"、"特定物体認識"の分野においても機械学習がホットなワードとなっています。例として、最近発表されたGoogleの一般物体認識技術のいくつかを見てみましょう。

 

Google MapsのStreet Viewの画像認識アルゴリズムがCAPTCHAのほとんどを解読 - TechCrunch

こちらでは、ストリートビューに写っている街区番号画像から数値を解読したり、有名なCAPTCHAの認識を行っています。今話題のニューラルネット"Deep Learning"の一種を使い、その精度は90%を超えています。

 

Research Blog: A picture is worth a thousand (coherent) words: building a natural description of images

こちらは、写真からの物体検出、シーン認識ですね。人がモーターバイクに乗った画像を入力にニューラルネット(Deep Learning)によって「A person riding a motorcycle on a dirt road」という文章を生成しています。

 

 このような研究成果は、身の回りにも溢れ始めています。

Research Blog: Improving Photo Search: A Step Across the Semantic Gap

 こちらでは、Google+Picasaに投稿した画像をニューラルネット(Deep Learning)を用いて画像認識、シーン認識によってラベル付けを行っています。Google+のアカウントがあれば、画像を投稿し"dog"や"car"で検索する事で結果を得られます。

 

このように、機械学習を用いて画像内に写っている物を分類(認識)する技術が多く研究されており、その精度は年々向上しています。Googleは多くの企業や大学教授を買収し結果を出し、Facebookは個人識別の"Deep Face"*2Microsoftも画像ラベル付けと"Project Adam"*3を発表しています。

 

 

 //--機械学習--

 機械学習の学習器は、以下の様に多くのデータを用いてパラメータを調整し、望みの解を出せるような学習を行います(教師あり学習の場合)。

 

f:id:vaaaaaanquish:20141207163844p:plain

 

 

 //--Kazoo04識別問題--

 GoogleFacebookみたいに学習した学習器を使ってこんな事が出来ればいいよね。

 

f:id:vaaaaaanquish:20141207164159p:plain

 

 

 //--かずー氏データ少ない問題--

 機械学習では主に"大量のデータ"を用いて"学習"を行うと説明しました。データは正解情報を持つポジティブデータと、誤答であるネガティブデータを必要とします。ネガティブデータは背景っぽい画像や適当な人画像データセットから用意できました。必要なのはポジティブデータ。Kazoo04を認識する上で必要なデータ…そう、Kazoo04の写真です。まずはインターネットでKazoo04の画像を検索してみました。

 

f:id:vaaaaaanquish:20141207164244j:plain

キレそうです。

 

そこで私は裏ルートを使用しました。

なんと偶然にも私はKazoo04と大学が同じ!なんとなんと偶然にもKazoo04と研究室が同じ!ということで、研究室の画像サーバを漁って、Kazoo04の画像をスクレイピングする作業を決死の手動で行いました。

 ここだけの話、Kazoo04はシャイなのか研究室カメラの写真が少なかったです。とても困りました。「大学生にもなって"俺写真写るの嫌いなんだよ"とか言ってたのかなアイツwwキモww」と思いました。

 画像の少なさには、画像を歪ませたり回転、位置変更、大きさ変更によって学習データを増やし、誤差にも強い学習を行う方法(Over Sampling,Data Augmentation,Elastic Distortion,...etc)を利用しました。一般的には固定的なロゴ認識に強くなったり不均衡データを補強するものが多いですが、Kazoo04の画像の少なさが目立ったので採用しました。後輩がちょうど研究しているので、参考資料も多かった上、この辺りはOpenCVやImageライブラリを適当に使ってよしなに書けますからね。後は、株式会社ウサギィに行った際にKazoo04を盗撮する等してデータを増やしました。

 そんなこんなで私のKazoo04フォルダには、合宿先で浴衣なKazoo04やフットサルで汗を流すKazoo04、歪んだKazoo04、逆さのKazoo04がもうKazooKazooしました。まさにKa動物園04ってね。

 

f:id:vaaaaaanquish:20141207164340j:plain

 

 

 //--RandomForest--

学習器には"RandomForest"を用います。何故数ある学習器の中からRandomForestを選ぶかと言うと、


Random Forest とその派生アルゴリズム - Sideswipe

Kazoo04が紹介しているからです!

 あのKazoo04が紹介している学習器が精度出ない訳ありません。Kazoo04が良いと言えば良い。Kazoo04がYesと言えばYesなのです。

  RadomForestは「決定木を沢山作って多数決を取る」機械学習アルゴリズムの一種です。Kazoo04も紹介しているように、学習が高速で精度がよく、ノイズに対しても強い等の特徴を持った学習器です。ありがたい事に、OpenCVPython機械学習ライブラリとして有名なscikit-learn*4に実装されており、使いやすさの点でも強力な機械学習器の一つです。今回はscikit-learnのRandomForestクラスを使いました。

 

 

  //--特徴量設計--

 機械学習の生成モデル(学習器)にデータを入れる際に、生のデータ(画像であればRGB値)をそのまま入力すると、計算量が膨大かつ学習が難しくなってしまうという問題が知られています。そこで画像の特徴をベクトル量として抽出してから入力にするのが一般的です。今回は、

・メインとなるのは"Kazoo04"か"そうじゃないか"の二値分類であること

・人間でありかつKazoo04の顔である事を判断すること

・実装が面倒なのでライブラリとかで適当に出来ること

を考えてSURF特徴量*5とHOG特徴量*6を利用しました。特徴点抽出と勾配の特徴抽出でなんとかしてみましょう。SURFはOpenCV、HOG特徴量はPythonのImageライブラリに入っているのでそれを利用します。

 

 

  //--学習まとめ--

 特徴抽出をおこなったあとscikit-learnが対応している入力形式にします。大きさを調整したりリスト形式にしたりよしなにしてやります。後はscikit-learnのRandomForestモデルを設定、入力して学習させます。今回のパラメータは大体こんな感じ。

f:id:vaaaaaanquish:20141207164926p:plain

今回の学習構造を書くとこう。 本来は主成分分析を用いたりもしますが、少し面倒なのでこう。

 

f:id:vaaaaaanquish:20141207165001p:plain

 

 

  //--画像認識--

 学習し終わった学習器によって実際の画像からKazoo04を認識させます。では、Google検索で出てきたKazoo04が写っている写真を利用してやってみます。

方法としてはこう。

f:id:vaaaaaanquish:20141207165029p:plain

1.RandomForest入力サイズの窓を作り特徴量を取って検出

2.人が写っていると判断したら赤枠で囲む

3.窓を少しずつ移動させる

4.Kazoo04っぽさを判別するため赤枠の中をさらにRandomForestで走査

を繰り返しします。この方法は、物体の大きさ変化に弱くなることが考えられますが、今回はスケール変化のみで対応しました。

 

 

  //--結果--

 以上の方法でなんとなくそれとなく適当にPythonで書いてみました。その結果がこちらです。今回は、株式会社ウサギィ様がHTML Japan Cap2014で表彰された際の写真をお借りしました。

 

これが

f:id:vaaaaaanquish:20141207165449j:plain

こう

f:id:vaaaaaanquish:20141207165134j:plain

 

走査するスケールを大きくはしましたが、赤枠が沢山出てしまっています。k-meansを使って沢山集まっている部分をまとめます。平均をとるイメージでこう

f:id:vaaaaaanquish:20141207165553j:plain

 

良い感じですね。ではもう一枚。

f:id:vaaaaaanquish:20141207165840j:plain

そしてこう

f:id:vaaaaaanquish:20141207165902j:plain

 

細かい走査の際に顔部分も自動で切り取ってみます。顔画像をメインでスクレイピングしたので顔の部分はお手の物です。

f:id:vaaaaaanquish:20141207165938p:plain

ああ…Kazoo04…///

 

 そんなこんなでKazoo04を自動で認識し、切り取る事が出来ました。いくつか研究室の画像をテスト画像にして試しましたが、大体Kazoo04でした。細身でメガネでクールなヘアスタイルの同期が居なかった事に感謝ですね。1日講義受けながら適当に書いたら、案外すんなり出来たので良かったなといった感じです。画像のスクレイピングとラベル付けには二日掛けました。後、自分の写真も入れまくって、角度次第でKazoo04と認識される場所が10%くらいある事もわかりました。愛ゆえにKazoo04に近付いている証拠かも知れませんね。

 

 

  //--反省--

 せっかくなのでとことん、しっかり解説しようとか思いましたが、研究が忙しかったので断念しました。Webサービスにしようと思った手前手持ちに公開できるサーバがなかったり、図編集のソフトが死んで手書きにしたり、結果相当に精度が良かった画像だけブログに載せたり、グダグダなAdvent Calenderの足を引っ張る方になってしまいました。Kazoo04の画像が少なかったのと、特徴量設計が甘かったのは痛かったのか、メガネで細身な人が5~10%程でKazoo04になってしまったのも悔しいです。この手のプロジェクトによくありがちな「学習用のデータを作っている時に飽きる」現象も体験し、これやってる暇があったら研究するよなと強く思いました。こんなことばかりやってるからいつもKazoo04に怒られるんですね。精進します。

 

 

  //--あとがき--

 なんかまあちゃんとデータとか特徴とか分かってればライブラリ使って気軽に教師あり学習が行える世の中になってしまいました(ありがたい)。今回TeX数式を入れるのが面倒それなりに分かりやすいように書いたつもりですが、機械学習だけでなく情報工学は物理やら数学やらの塊みたいな感じです。自分の研究室でこんなゼミ発表したら数式で頭の先からひざまで殴られるレベルです。機械学習に関しては、このような記事が出る程に、様々な知識を要し複雑化しているとも感じます。


機械学習をこれから始める人に押さえておいてほしいこと - Qiita

それでも、この分野に興味を持ってもらえればと思いもあって、少しだけ考えて書きました。最新の研究では、ここに書いたものを応用した沢山の面白い技術が出てきています。他にも機械学習界隈の成長は著しく、ニュースサイト等でも多く見られるようになっています。一緒に超絶楽しい最適化をやってくれる人、機械学習使って面白い事をやってくれる人が増える事をそれなりに想ってます。

 

 

 

 

P.S.

くろていは"Kazoo04"として殆ど認識されませんでした。おわり。

*1:かずー氏に会える機会の総称

*2:参考 http://research.preferred.jp/2014/03/face-verification-deepface-and-pyramid-cnn/

*3:参考 http://www.itmedia.co.jp/news/articles/1407/15/news039.html

*4:機械学習Pythonライブラリ、SVMからDeep Learning、Random Forestまで充実している 

*5:画像から特徴点を探し出しベクトル量にする手法

*6:エッジのヒストグラムを用いてベクトル量にする手法