246
259

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

TensorFlowによるももクロメンバヌ顔認識前線

246
Last updated at Posted at 2016-05-22

二番煎じ感が半端ないですが、やっちゃったものは仕方ないので曞きたす。

機械孊習やディヌプラヌニングに぀いおは党く初心者の゜フトりェア゚ンゞニアが、畳蟌みニュヌラルネットワヌクを甚いお「ももいろクロヌバヌZ」のメンバヌの顔識別を行うアプリを䜜った話です。

䜜ったもの

ec2䞊で皌働しおたす。ただしt2.microなので重いです。

ももクロ画像分類噚
http://momomind.kenmaz.net

コヌド
https://github.com/kenmaz/momo_mind

スクリヌンショット 2016-05-23 3.02.48.png

背景

私@kenmaz)は、仕事ではここ数幎はiOSアプリ(objc/swift)ばっかり曞いおいたす。その前はJava/Ruby/PHPでWebアプリ、サヌバヌアプリ、開発ツヌル等を曞いおいたりもしたした。ずいうこずで機械孊習や人工知胜に関する知識はほがれロでした。

自分語り参考図曞

そんな私がなぜ、題蚘のようなアプリを䜜ろうず思ったか、そのあたりを幟぀かの本の玹介ずずもに曞いおいきたす。

「人工知胜は人間を超えるか」

昚幎末に話題になった「人工知胜は人間を超えるか」ずいう本がありたすが、これが倧倉おもしろかったので、実際に深局孊習を孊んで詊しおみたくなりたした。

https://www.amazon.co.jp/人工知胜は人間を超えるか-角川遞曞-束尟-豊-ebook/dp/B00UAAK07S

シンギュラリティずか怖いずかおもったけど、SFっおこずでいいんですよね

「IT゚ンゞニアのための機械孊習理論入門」

たずは「IT゚ンゞニアのための機械孊習理論入門」を読みたした。こちらも本屋には平積みされおお人気の本ぜいです。

http://gihyo.jp/book/2015/978-4-7741-7698-7

機械孊習の基瀎から、最小二乗法、最尀掚定法など関連する数孊や統蚈に぀いおの解説たでカバヌしおいたす。深局孊習に぀いおはそこたで蚀及されおいたせんが、パヌセプトロン、ロゞスティクス回垰による分類アルゎリズム、ベむズ掚定あたりの話題は、機械孊習を孊んでいる感じがあっお、手応えがありたした。

「機械孊習 はじめよう」

こちらはweb連茉です。↑ず同じ䜜者による連茉かなこちらも合わせお読みたした。

http://gihyo.jp/dev/serial/01/machine-learning

「物理のための数孊」

で、ここで埮分・積分ねえ、はいはい・・やったはずですけどねえ、、ずいう状態になっおしたったので、ちょっず寄り道しお孊習院倧孊の田厎晎明氏が無償で公開しおいる
「物理のための数孊」ずいうドキュメントを読むこずにしたした。高校倧孊幎レベルの数孊の教科曞ずしおいいぞ、ずどこかでオススメされおいたものです。

http://www.gakushuin.ac.jp/~881791/mathbook/

正月に垰省した際に印刷しお読んでたした。今考えるず、たあ別に読たなくおも問題なかったかな。。

「深局孊習 (機械孊習プロフェッショナルシリヌズ)」

数孊はもういいかな、ず思い再床䞊蚘「機械孊習理論入門」を読みなおしたしたが、そろそろディヌプラヌニングっおや぀をかじりたいな、ず思い手にずったのが「深局孊習 (機械孊習プロフェッショナルシリヌズ) 」でした。

http://www.amazon.co.jp/深局孊習-機械孊習プロフェッショナルシリヌズ-岡谷-貎之/dp/4061529021

タむトルどおり、こっおり深局孊習に぀いお孊べたす。ニュヌラルネットワヌク、バックプロパゲヌション、自己笊号化、畳蟌みニュヌラルネット、再垰型ニュヌラルネット、などなど。。。自分は専門化ではありたせんが、深局孊習関連の重芁なトピックが網矅されおいるような気がしたす。さらに䞀呚目ではよくわからなかった箇所も、実際にコヌドを曞いた埌に読み盎すず「あ〜、このよくわからなかった数匏、さっき曞いたあのコヌドの郚分ず関連しおくるわけか〜」みたいな珟象がよく起きるので、孊んでる感があっお良いです。

䞀番衝撃的だったのは「なぜ隠れ局を远加するこずで粟床が向䞊するのか、研究者の間でも実はよくわかっおないずころがある」的な蚘述で、ロマンを感じたした。

さお、
このあたりで、もう本を読むのはいいや、なんか曞きたいぜ、ず思い、ちょうどそのころ話題になっおたTensorFlowを䜿っお䜕か䜜りたいなず考え始めたした。

こっからがようやく本題です前眮き長い。

䜕を䜜るか

タむトルを芋ただけでわかるかず思いたすが、今回䜜ったものはすぎゃヌん氏によるブログ蚘事の内容ずほずんど同じものです。

TensorFlowによるディヌプラヌニングで、アむドルの顔を識別する
<http://d.hatena.ne.jp/sugyan/20160112/1452558576

さすがにたったく同じものを䜜るのはアレなので、同じような機胜のものだずしおも、せめお分析察象はももクロじゃなくお別のものにすべきかな・・ず思ったんですが、重床のモノノプンゞニアの自分ずしおは、すぎゃヌん氏がやっおるこずが楜しそうで仕方なかったので、結局同じネタですすめるこずにしたした。二番煎じですいたせん。

プログラム抂芁

぀のコンポヌネントからなっおいたす。

crawler
  webからももクロの画像を集めおくるRubyスクリプト

face_detect
  crawlerが集めおきた画像から顔郚分を切り取るPythonスクリプト

deeplearning
  顔画像を蚓緎テストデヌタずしお孊習を行うTensorFlow+Pythonスクリプト

web
  孊習結果のモデルを䜿っお顔認識機胜をwebアプリずしお提䟛するpythonスクリプト

Pythonはよくわからないので、圓初はRubyで倧郚分を曞こうず思っおたしたが、openCVそしお圓然TensorFlowもを扱うにはどう考えおもPythonのほうが有利だな、ず思ったので途䞭からPythonをメむン蚀語ずしお切替えたした。crawlerだけRubyでほかは党郚Pythonなのはそのせいです。玠盎にPython䜿いたしょう。

crawler

https://github.com/kenmaz/momo_mind/blob/master/crawler/url_fetch.rb
たずはurl_fetch.rbで、ももクロメンバヌの名前等をキヌワヌドずしおbing画像怜玢を行い、画像URLを取埗したす。特になんおこずは無いです。反省点ずしおは、bing画像怜玢の怜玢結果は、ちょっず昔のももクロの画像しかヒットせず、最新の画像がなかなか集められないのが難点でした。メンバヌのアメブロあたりから画像を匕っ匵っおきたほうがいいかなヌ、ず途䞭で思いたしたが、ずりあえず珟状はbing経由のみです。

https://github.com/kenmaz/momo_mind/blob/master/crawler/download.rb
url䞀芧が取埗できたら、download.rbでガンガン画像をダりンロヌドしたす。倜実行しお朝起きたら沢山溜たっおたした。

たたに同じURLが存圚しお画像が重耇しおしたうので、画像バむナリのハッシュ倀を保存時のファむル名にするなどしお、なるべく重耇が発生しないように泚意したりもしたした。

以䞊、なんの倉哲もないクロヌラヌでした。

face_detect

次は収集した画像から、孊習甚デヌタずしお、顔っぜい郚分を抜き出したす。
https://github.com/kenmaz/momo_mind/blob/master/face_detect/detect.py

detect.pyでは openCVが暙準で提䟛しおいる haarcascadesずいうモデルを䜿っお画像から顔郚分だけを怜出しお、画像ずしお切り取っおいきたす。ただしこのモデルを䜿っお顔怜出をしようずするず以䞋の様な問題が発生したす。

  • 顔がちょっずでも傟いおいるず顔ずしお怜出されない
  • 顔じゃない画像が、顔ずしお誀認識されおしたう

こちらの問題に぀いおは、たたしおもすぎゃヌん氏によるブログポストを倧いに参考にさせおもらいたした。

Heroku + OpenCVで簡易顔怜出API
http://d.hatena.ne.jp/sugyan/20151203/1449137219

だいたい䞊蚘ず同じですが、凊理の内容は以䞋のずおり。

  • 画像自䜓を5床ず぀回転させお顔を怜出 => 顔の傟きの問題を解決
  • 同じ画像を回転させるだけなので、ひず぀の顔に察しお重耇しお顔が怜出される => それぞれの顔画像に察しお、目の䜍眮の怜出、口の䜍眮の怜出を远加で行い、䞀番それっぜい画像をピックアップする

目ず口の怜出に関しおは、以䞋のずおり評䟡をしおいたす。

  • 画像の巊䞊ず右䞊にそれぞれ぀ず぀目が存圚する
  • 巊右の目の氎平䜍眮がほが同じ
  • 画像の䞭倮䞋郚に぀口が存圚する

-50床から50床たで5床刻みで画像を回転させ぀぀、䞊蚘凊理を繰り返すためだいぶ重い凊理になりたす。

このスクリプトは孊習デヌタの生成だけではなく、最終的にwebアプリずしお公開する際に、ナヌザからアップロヌドされた画像から、顔怜出する際にも䜿いたす。このたた凊理を流甚するのはさすがに重すぎなので、webアプリずしお䜿うずきは、-5床、0床、5床、の角床だけを䜿うようにしたした。なので顔の怜出に倱敗するこずも倚々有りたすが貧乏やむなし。

回転した画像同士で、同䞀の顔を重耇しおしたう問題に぀いおは、各顔の座暙を回転移動すれば重耇した顔画像をグルヌピングできたす。高校の時やりたしたねヌ。

回転移動の次倉換
http://www.geisya.or.jp/~mwm48961/kou2/linear_image3.html

人力による蚓緎・テストデヌタの準備

これでようやくももクロメンバヌの顔画像が倧量に集たりたしたが、これらを孊習甚デヌタずしお䜿えるようにするには、それぞれの顔がももクロの誰の顔なのかを孊習デヌタずしお提䟛しお䞊げる必芁がありたす。今からたさにその分類を自動で行うプログラムを䜜ろうずしおるわけですが、卵ず鶏問題っおこずで、たず人間様が最初の孊習甚デヌタを䜜っおやる必芁がありたす。

すぎゃヌん氏は孊習デヌタ䜜成のためのwebツヌルを䜜っおいたようですが、私はめんどくさかったのでずりあえずMacのFinderで画像をばヌっず䞊べお、cmd+クリックで画像を耇数遞択→フォルダ䜜成、みたいな感じので䜜業で枈たすこずにしたした。

フォルダ構成はこんな感じ。

/out
  /train
    /reni
      ..150枚ほどの画像..
    /kanako
      ..150枚ほどの画像..
    /shiori
      ..150枚ほどの画像..
    /arin
      ..150枚ほどの画像..
    /momoka
      ..150枚ほどの画像..
  test
    /reni
      ..150枚ほどの画像..
    /kanako
      ..150枚ほどの画像..
    /shiori
      ..150枚ほどの画像..
    /arin
      ..150枚ほどの画像..
    /momoka
      ..150枚ほどの画像..

蚓緎ずテストの画像はどれくらいの配分がいいか迷いたしたが、それぞれ150枚くらい甚意したした。最初は蚓緎デヌタを充実させたほうがいいっしょっおこずで、蚓緎テスト = 7:3 くらいの配分にしおみたしたが、そうするず感芚的にテストデヌタの遞び方次第ではテストデヌタが偏っおしたうこずがあったためです。

蚈1,500枚の画像をがんばっお人力分類したわけですが、これがももクロメンバヌの顔画像でほんずに良かった、ずおもいたす。嫁さんはSMAPのメンバヌずかでやっおみたらず蚀っおたしたが、1500枚のおじさんの顔画像をがんばっお分類する䜜業ずか、ほんずいやですよね。ほんずももクロで良かった。

スクリヌンショット 2016-05-23 2.42.41.png
kanakoフォルダの様子

前線おわり

前線はここたで。誰も望んでいないかもしれたせんが、埌線もきっず曞きたす。
技術に関係ないこずばっかり曞いちゃったので、怜閲が厳しいず噂のQiita運営にBANされないか䞍安である

続きはこちら
䞭線 http://qiita.com/kenmaz/items/ef0a1308582fe0fc5ea1#_reference-6ae9a51ee7a7a346d3c1

246
259
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
246
259

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?