67
1 Large Scale Jirou Classification NTT TECH CONFERENCE #2 2017 8 10 NTT

Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

  • Upload
    knjcode

  • View
    57.221

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

1

Large Scale Jirou Classificationディープラーニングによるラーメン二郎全店舗識別

NTT TECH CONFERENCE #2

2017年8月10日NTTコムウェア

土井 賢治

Page 2: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

2

本日の発表内容は 趣味で取り組んだ

成果をまとめたものです

Page 3: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

2

3 . 1

自己紹介

名前: 土井 賢治

所属: NTTコムウェア ビジネスインキュベーション本部

業務: 機械学習(主にディープラーニング) 道路不具合検出システム開発

Page 4: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

3 . 1

3 . 2

道路不具合検出システム

Page 5: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

3 . 3

出典: https://www.nttcom.co.jp/news/cf16113001.html

Page 6: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

3 . 3

4

本日の内容ラーメン二郎について

スクレイピング

ディープラーニングによる画像分類

学習、ファインチューニング

認識精度向上のための手法

Webサービス化mxnet-finetuner

Page 7: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

5 . 1

突然ですが

Page 8: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

5 . 1

5 . 2

どこの二郎かわかりますか?

Page 9: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

5 . 2

5 . 3

神田神保町店 品川店

Page 10: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

5 . 4

参照

神田神保町店の二郎画像:

品川店の二郎画像:http://f.hatena.ne.jp/multiplexer/20090919110638

http://standaloneramenjiro.hatenablog.com/entry/2015/12/16/223506

Page 11: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

5 . 4

5 . 5

ラーメン二郎識別のモチベーション

社内勉強会にて、同僚がTensorflowを使って ラーメン二郎4店舗の画像を識別した話を

聞いたことがきっかけ

(2017年4月頃)

Page 12: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

5 . 6

ラーメン二郎について

同僚曰く

カルト的人気なラーメン屋

主に関東圏に暖簾わけをしている

店舗は現在41店舗店舗毎に「味・見た目が多少異なる」

常連は見た目で店舗を見分けることができる

画像を見ても違いがわからなかったが、 とりあえず全41店舗の分類器を作ろうと思い立つ

Page 13: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

6 . 1

クローラーを開発してラーメン二郎画像を収集

主にtwitterやinstragram等から収集全41店舗計33130枚

Page 14: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

6 . 2

画像収集の際は、robots.txtを考慮したり、 収集先へ意図せず負荷をかけないよう注意

Page 15: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

6 . 2

6 . 3

どの店舗の画像なのか推定できる形で収集するのが重要

例えば、画像についたメッセージ

二郎�������二郎品川店��二郎品川店

から

品川店 だけを抽出したい

Page 16: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

6 . 3

6 . 4

正規表現で取得

/(二郎(?:(?!二郎|店).)*店)/

ラーメン二郎素人の自分には、 画像が混ざったらもう分離できない…

Page 17: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

6 . 4

6 . 5

目視でノイズ除去

店舗ごとに集めた画像には、 自撮りや店舗外観や券売機、等々 ラーメン以外の画像が結構ある

ざっくり15%程度を除去して計33130枚の データセットを準備した

Page 18: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

6 . 6

収集したラーメン二郎画像の内訳

Page 19: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

6 . 6

7 . 1

ディープラーニングによる画像分類

Page 20: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

7 . 2

画像分類の実例

出展: http://acsi.hpcc.jp/2016/download/ACSI2016-tutorial2.pdf

Page 21: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

7 . 3

CNN (畳み込みニューラルネット)

画像認識分野においてはCNNがデファクト 層の深いCNNの学習を深層学習(Deep Learning)と呼ぶ

出展: http://acsi.hpcc.jp/2016/download/ACSI2016-tutorial2.pdf

Page 22: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

7 . 4

大規模な学習と精度向上

ILSVRC (ImageNet Large Scale Visual Recognition Challenge)

出展http://acsi.hpcc.jp/2016/download/ACSI2016-tutorial2.pdf

Page 23: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

8 . 1

ラーメン二郎分類機の作成

DeepLearningフレームワークにMXNetを利用(速い)各店舗50枚をテスト用に分離ResNet-50モデルで学習

Page 24: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

8 . 2

学習結果

validationデータで約83%の精度 そこそこイケてる?

Page 25: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

8 . 3

テストデータによるモデルの評価

Page 26: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

8 . 4

分類精度評価

Precision Recall F1-score

avg / total 0.326 0.166 0.148

実態としては約3割程度の正解率

Precision(適合率): 検出件数にどの程度正解が含まれるかRecall(再現率): 正解をどの程度検出できるかF1-score: PrecisionとRecallの調和平均

Page 27: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

8 . 5

混同行列

ほぼほぼ荻窪店

Page 28: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

9 . 1

ファインチューニング

ディープラーニングによる画像分類で定番の ファインチューニングを試してみる

Page 29: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

9 . 2

ファインチューニングとは

別の問題、別のデータセットで学習済みのモデルの パラメータをコピーし、新しいニューラルネットの

パラメータの初期値として使うこと

下位層は固定して限られた上位層のみ再学習する

ImageNetで学習済みのモデルを用いることが多い

Page 30: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

9 . 3

出展: http://acsi.hpcc.jp/2016/download/ACSI2016-tutorial2.pdf

Page 31: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

9 . 3

9 . 4

出展: CS231n: Convolutional Neural Networks for VisualRecognition

Page 32: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

9 . 4

9 . 5

ファインチューニングの使いどころ

ディープラーニングを利用したいが、 学習データを大量に用意できない場合

通常の学習における問題

大量の学習用データが無ければ精度がでない

最近の性能の良いモデルは学習に1~2週間かかることもある

ファインチューニングのメリット

比較的少ないデータでも精度が得られることが多い

学習済みモデルの汎化性能を引き継いだモデルを作成できる

最近は性能の良い各種モデルの学習済みモデルが公開されている

Page 33: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

9 . 6

ラーメン二郎データをファインチューニング

フレームワークは同じくMXNet各店舗50枚をテスト用に分離ImageNetで学習済みのResNet50モデルを利用

学習済みモデルを使う以外は、 スクラッチでの学習と同様に学習してみる

Page 34: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

9 . 7

学習結果

スクラッチでの学習より約10%ほど高い約94%の精度

Page 35: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

9 . 8

テストデータによるモデルの評価

Page 36: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

9 . 9

分類精度評価

Precision Recall F1-score

avg / total (scratch) 0.326 0.166 0.148

avg / total (finetune) 0.816 0.725 0.723

ファインチューニングの方がかなり精度が良い

Precision(適合率): 検出件数にどの程度正解が含まれるかRecall(再現率): 正解をどの程度検出できるかF1-score: PrecisionとRecallの調和平均

Page 37: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

9 . 10

混同行列

かなり改善した(やや亀戸店)

Page 38: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

10 . 1

認識精度向上のための手法

(主にファインチューニングにおける)

Page 39: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

10 . 2

モデルの選択

どのモデルを選ぶ?

→ より表現力があり問題の処理に適したモデルを利用

ImageNetで学習済みのモデルが共有されている

Alexnet, VGG, ResNet, etc

どれを選ぶのがよいか、性能は? 学習コストは?

Page 40: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

ImageNet学習済みモデル性能比較

Page 41: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

10 . 310 . 4

データの追加、精度向上

まずは学習用データの量と質が大事

例えば、路面不具合であれば、 路面が正常なのか異常なのかの判断基準が重要

必要に応じて専門家の意見を仰ぐ等 データ品質を向上させる

※データが極端に少ない場合に高性能な モデルで学習すると性能がでないことが多い

Page 42: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

10 . 5

Optimizerの選択様々なアルゴリズムが研究されている

SGDAdaGradRMSPropSGDNesterovAdaDeltaAdam

一般に扱う問題が異なれば適するOptimizerも異なる

Page 43: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

10 . 6

Optimizerの違い(イメージ)

Page 44: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

10 . 7

データ拡張

学習用データが少ない場合に、元データを回転・輝度変

更・上下左右反転等してデータを水増しするのも有効

(参考画像: )

https://m2dsupsdlclass.github.io/lectures-labs/slides/03_conv_nets/

Page 45: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

10 . 8

モデルやOptimizerを変えて試すモデル: ImageNetで学習済みのinception-v3learning rate: 0.0001optimizer: NAdam各種データ拡張実施

Page 46: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

10 . 9

学習結果

validationデータでの識別精度は約94%

Page 47: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

10 . 10

テストデータによるモデルの評価

Page 48: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

10 . 11

分類精度評価

Precision Recall F1-score

avg / total (ResNet-50) 0.816 0.725 0.723

avg / total (inception-v3) 0.874 0.839 0.845

先程のファインチューニングの例に出した ResNet-50の場合と比べ識別精度が向上

Page 49: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

10 . 12

混同行列

さらに改善した

Page 50: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

11 . 1

サービス化

Slackに組み込んだtwitterのボットにした

Page 51: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

11 . 2

Slackのbotに二郎識別機能搭載

Page 52: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

11 . 3

twitterのbotに二郎識別機能搭載

@jirou_deepに画像をリプライすると店舗名を答えます

Page 53: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

12 . 1

mxnet-finetunerhttps://github.com/knjcode/mxnet-finetuner

Page 54: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

12 . 2

自動でファインチューニングして 結果をレポートしてくれるツールを作った

ファインチューニングるまでの定形の作業を スクリプト化してDockerコンテナに詰め込んだ

学習用の画像を準備して、 各種学習用パラメータを書くだけで すぐにディープラーニングを試せます

Page 55: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

12 . 2

12 . 3

セットアップ

$ git clone https://github.com/knjcode/mxnet-finetuner $ cd mxnet-finetuner $ bash setup.sh

ホスト環境(GPU有無等)に応じて

������������������ と ����������

が自動生成されます

Page 56: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

12 . 3

12 . 4

画像をクラス毎に分類して配置

images/ train/ airplanes/ airplane001.jpg cairplane002.jpg ... watch/ watch001.jpg watch002.jpg ...

������������ と ����������� も同じ構造で配置

Page 57: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

12 . 4

12 . 5

���������� を書くfinetune: pretrained_models: - imagenet1k-resnet-50 optimizers: - sgd num_epochs: 30 lr: 0.0001 lr_factor: 0.1 lr_step_epochs: 10,20 mom: 0.9 wd: 0.0001 batch_size: 20

Page 58: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

12 . 5

12 . 6

ファインチューニング

$ docker-compose run finetuner

Page 59: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

12 . 7

学習結果のグラフ

先程お見せしたグラフが ����� に出力されます

Page 60: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

12 . 8

テスト

test: model_prefix: 201705292200-imagenet1k-nin-sgd model_epoch: 10

���������� にテストしたい学習済みモデルを指定

Page 61: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

12 . 9

テスト実行

$ docker-compose run finetuner test

Page 62: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

12 . 10

テスト結果

先程お見せしたグラフが ����� に出力されます

Page 63: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

12 . 11

学習後にSlackへ結果を自動アップロード

Page 64: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

12 . 12

ファインチューニング時の各種作業を自動実行

学習データの加工・整形

学習済みモデルの自動ダウンロード

用意したデータのクラス数に応じた学習済みモデルの整形

データ拡張

学習結果のグラフ化、混同行列や分類精度のレポート機能

Slackへの学習結果のアップロードjupyer notebook, etc

https://github.com/knjcode/mxnet-finetuner

Page 65: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

13

まとめ

ラーメン二郎の全41店舗の画像を収集ファインチューニングにより識別精度 約87%のモデルを作成識別モデルをAPI化し、Slackやtwitterのbotに組み込んだノウハウをまとめツール化した (mxnet-finetuner)実はまだラーメン二郎を食べたことがない

Page 66: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

14

参考深層学習とその画像認識への応用に関する最近の研究動向

CS231n: Convolutional Neural Networks for Visual RecognitionOptimizer : 深層学習における勾配法について神田神保町店のラーメン二郎画像

(http://f.hatena.ne.jp/multiplexer/20090919110638)品川店のラーメン二郎画像

(http://standaloneramenjiro.hatenablog.com/entry/2015/12/16/223506)道路不具合検出システムをAI技術で実現

Page 67: Large Scale Jirou Classification - ディープラーニングによるラーメン二郎全店舗識別

15

ありがとうございました