• このエントリーをはてなブックマークに追加

今なら、継続入会で月額会員費が1ヶ月分無料!

【簡単】Chainer/Deelで手軽に学習済みCaffemodelを読み込んで性別や年齢判定に使う【便利】
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

【簡単】Chainer/Deelで手軽に学習済みCaffemodelを読み込んで性別や年齢判定に使う【便利】

2016-09-25 11:13

     前回、ついにChainerのCaffeFunctionを改造したことで、いろいろなCaffemodelを取り込んで使う時にもう「Chainerの内部で落ちてるから使い方わからんオワタ」と思わなくて済むようになった。しかし改めてChainerはわかりやすくて素晴らしい。

     ちなみにCaffeモデルは公開されているものでも簡単に使えるやつと使えないやつがある。
     ものによってはCaffeモデルだけでなく改造済みのCaffeとセットで公開されているものもあり、ちょっとノイローゼになりそうな気分である。それを移植しようとすると、改造済みのCaffeの中身も調査しなければならず、まあ単純に関数が増えたとかならまだいいんだけど、どうもそういうわけでもないケースも散見されて悩ましい。つらい


     まあいいや。
     そういうわけで、いろいろすぐに使えるやつを試して見たんだけど、とりあえず性別判定と年齢判定、それと場所判定が面白そうだし手軽に使えたので、もっと汎用的なcaffenetというクラスを追加してみた。

     早速試してみよう。

     今回から、なんとpipでdeelをインストールできるようになったのでさらに簡単になったぞ。


     手順としては

    $ git clone http://github.com/uei/deel
    $ cd deel
    $ python setup.py install
    $ cd misc
    $ ./getPretrainedModels.sh
    $ cd ..

      で準備OK

     まずはゴトーの写真でも見せてみる。

    e68fd5e1f68eb77528752d74c85d47790f04c3d7

     酒を飲んでいい感じになったゴトーの写真(goto.png)を見せると
    $ python examples/gender.py goto.png

    #1 | male | 100.0%

    #2 | female |  0.0%


     おお!ちゃんと男性として認識されているではないか!

     ちなみにgender.pyはこんな感じ

    055f405b28cda21951b2dcf24b824cee9632f8dd

     男と女の2クラス分類である。
     同じように、年齢をあてるage.pyというサンプルもある。

    $ python examples/age.py goto.png

    #1 | 38-43 | 36.6%

    #2 | 8-13 | 21.2%

    #3 | 25-32 | 16.0%

    #4 | 60- | 10.6%

    #5 | 0-2 |  7.0%

    #6 | 48-53 |  5.0%

    #7 | 15-20 |  1.9%

    #8 | 4-6 |  1.7%


     さっきと同じ写真を見せると、どうもだいぶ年配に見られているようだ。大丈夫か?ゴトー!

     さらに、MITがプリトレインドモデルを配っている、「場所推定」をするサンプルMITplacenet.pyも作ったのでこれも試してみよう。

    ce9fa7451821a7fbf70c57bdc52eed9c5603bb4b

     シン・ゴジラでよく見た人が登場する聖地・泉岳寺を見せてみよう。
     果たしてどうなるかな?

    $ python examples/MITplacenet.py sengakuji.png 

    Loading googlelet_places205_train_iter_2400000.caffemodel

    #1 | /t/train_station/platform 191 | 52.6%

    #2 | /s/subway_station/platform 180 | 42.9%

    #3 | /t/train_railway 185 |  2.4%

    #4 | /r/railroad_track 148 |  1.1%

    #5 | /a/airport_terminal 1 |  0.4%

    #6 | /g/gas_station 87 |  0.1%

    #7 | /s/shopfront 166 |  0.1%

    #8 | /p/phone_booth 140 |  0.1%

    #9 | /c/corridor 54 |  0.0%

    #10 | /h/hospital 94 |  0.0%

    #11 | /l/laundromat 110 |  0.0%

    #12 | /i/ice_cream_parlor 99 |  0.0%

    #13 | /m/museum/indoor 126 |  0.0%

    #14 | /m/motel 120 |  0.0%

    #15 | /c/coffee_shop 49 |  0.0%

    #16 | /l/locker_room 114 |  0.0%

    #17 | /c/crosswalk 60 |  0.0%

    #18 | /a/aquarium 5 |  0.0%

    #19 | /s/supermarket 175 |  0.0%

    #20 | /l/lobby 113 |  0.0%


     ドン! すげえ!
     さすが200万以上の画像を学習しただけはある。
     一位に「トレインステーション」二位に「地下鉄の駅」ともにプラットフォームを意味していて、さらに4位までがなんらかの駅であると推定している。5位のエアポートターミナルにも似たような雰囲気あるし、いやーいきなりここまでくるとは思わなかった。


     ちょっと違う感じのところも見せてみるか

    9fbaaf4192d7948a65619ace2177e3f58d37fa36

     新宿の焼肉屋。けっこう美味かった。
     さあ、ここで見てみると

    $ python examples/MITplacenet.py shinjuku.png 

    Loading googlelet_places205_train_iter_2400000.caffemodel

    #1 | /s/shopfront 166 | 37.6%

    #2 | /a/alley 2 |  9.5%

    #3 | /b/bar 18 |  5.9%

    #4 | /c/coffee_shop 49 |  5.1%

    #5 | /c/crosswalk 60 |  4.4%

    #6 | /p/plaza 143 |  2.9%

    #7 | /b/bookstore 27 |  2.6%

    #8 | /c/clothing_store 46 |  2.4%

    #9 | /b/building_facade 32 |  2.4%

    #10 | /p/phone_booth 140 |  2.1%

    #11 | /m/market/outdoor 124 |  2.0%

    #12 | /c/candy_store 39 |  2.0%

    #13 | /i/inn/outdoor 104 |  1.8%

    #14 | /r/restaurant 152 |  1.7%

    #15 | /i/ice_cream_parlor 99 |  1.3%

    #16 | /b/bakery/shop 36 |  1.3%

    #17 | /o/office_building 130 |  1.2%

    #18 | /g/gift_shop 88 |  1.2%

    #19 | /h/hotel/outdoor 98 |  1.1%

    #20 | /f/food_court 77 |  1.0%



     店の前(shopfront) あ、当たってる・・・!!
     alleyってなんだ?路地か。
     バー、コーヒーショップ

     凄いなあ
     まあだいたいあってるじゃん。

     もうひとつ、屋内はどうよ

    a617c0b66eab091f448cdd174b969f838fa61075

     四谷の飲み屋。さあここはどうだ!?
     ドン!

    $ python examples/MITplacenet.py yotsuya.png 

    Loading googlelet_places205_train_iter_2400000.caffemodel

    #1 | /r/restaurant_kitchen 153 | 36.2%

    #2 | /c/coffee_shop 49 | 14.5%

    #3 | /r/restaurant 152 |  9.5%

    #4 | /b/bar 18 |  8.8%

    #5 | /k/kitchenette 109 |  7.6%

    #6 | /k/kitchen 108 |  6.8%

    #7 | /b/bakery/shop 36 |  3.3%

    #8 | /f/food_court 77 |  3.0%

    #9 | /i/ice_cream_parlor 99 |  1.6%

    #10 | /r/restaurant_patio 154 |  1.4%

    #11 | /c/cafeteria 37 |  1.3%

    #12 | /g/galley 84 |  0.9%

    #13 | /a/assembly_line 10 |  0.8%

    #14 | /d/dining_room 64 |  0.4%

    #15 | /b/butchers_shop 34 |  0.3%

    #16 | /t/television_studio 182 |  0.3%

    #17 | /d/dinette/home 70 |  0.3%

    #18 | /s/supermarket 175 |  0.2%

    #19 | /m/market/outdoor 124 |  0.2%

    #20 | /a/airport_terminal 1 |  0.2%


     レストラン・キッチン! コーヒーショップ、レストラン、バー
     すげえなあ
     凄いと思うのは食べ物がどこにも写ってないこと。
     そしてMITの学習データセットにこういう店はとても少ないだろうということだ。

     ちなみにこれもものすごく簡単なコードで書ける。

    01a6383c856466aa45fcd9d48969baacd3ff2449

    まあほとんどGoogleNetそのまんまだから敢えて今回追加したCaffeNetを使わなくてもいいんだけどね。

    ChainerのCaffeFunctionをラッパーしたCaffeNetクラスを使うと、Caffeで学習されたモデルの任意のレイヤーを取り出せる。しかも何度も変換しないように一度読み込んだモデルはcacheディレクトリにpickleで保存される。二回目からは読み込みが高速化されるという仕組みだ。

    うーむ。楽しいのう、楽しいのう。



    チャンネル会員ならもっと楽しめる!
    • 会員限定の新着記事が読み放題!※1
    • 動画や生放送などの追加コンテンツが見放題!※2
      • ※1、入会月以降の記事が対象になります。
      • ※2、チャンネルによって、見放題になるコンテンツは異なります。
    ブログイメージ
    電脳ヒッチハイクガイド
    更新頻度: 毎週月曜日
    最終更新日:
    チャンネル月額: ¥1,080 (税込)

    チャンネルに入会して購読

    コメントを書く
    コメントをするには、
    ログインして下さい。