63
はははははははははは DeepLearning はははははは () GMO ははははははは はははははははははは ははは

はじめての人のためのDeep Learning

Embed Size (px)

Citation preview

Page 1: はじめての人のためのDeep Learning

はじめての人のための DeepLearning(画像認識編)

GMO インターネット次世代システム研究室

中野唯一郎

Page 2: はじめての人のためのDeep Learning

2

目次 :

1. 既存のモデルで画像識別器作成

2. クラウドでモデルを学習

3. DL を利用したプログラム作成

4. まとめ

Page 3: はじめての人のためのDeep Learning

3

そもそも

なぜ DeepLearning で

画像認識を研究?

Page 4: はじめての人のためのDeep Learning

4

以前 OpenCV での画像認識をやってみた

X 顔、車など物体毎に設定ファイルの変更が必要

X 車の種類など細かい認識が難しい

X 独自の物体認識器を作るのにも手間がかかる

こういうった辛さも、流行の DeepLearning なら解決してくれるのでは?という思いから

Page 5: はじめての人のためのDeep Learning

5

研究内容 :X 顔、車など物体毎に設定ファイルの変更が必要X 車の種類など細かい認識が難しい→ 「1.既存のモデルで画像識別器作成」で解決策を研究

X 独自の物体認識器を作るのにも手間がかかる→ 「2.クラウドでモデルを学習」で解決策を研究

最後に上記研究で蓄えた知識の応用として「 3. DL を利用したプログラム作成」で研究

Page 6: はじめての人のためのDeep Learning

6

自己紹介:中野唯一郎・ 2015/5 ~ GMO インターネット株式会社入社

      次世代システム研究室所属

・それまでは SIer/ コンサルでアパレル・官公庁の

基幹系システムを中心に 12 年間

・センター試験 - 数学で 200 点満点中 78 点(しか

も BASIC 言語が 50 点)をとったほどの数学音痴

 →今回の発表はそんなド素人が DeepLearningに触れてみた内容の共有です。間違った内容は

こっそり教えて下さい

Page 7: はじめての人のためのDeep Learning

7

目次 :

1. 既存のモデルで画像識別器作成

2. クラウドでモデルを学習

3. DL を利用したプログラム作成

4. まとめ

Page 8: はじめての人のためのDeep Learning

8

いきなり Demo

Page 9: はじめての人のためのDeep Learning

9

簡単な手順で設定ファイル変更もなく、詳細な識別ができる!

https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%BC%E3%83%99%E3%83%AB%E3%83%9E%E3%83%B3

Page 10: はじめての人のためのDeep Learning

10

Demo 作成までに以下の工程を実施以降でそれぞれを解説する

1. 理論実装

2. 環境構築

3. ニューラルネットワーク、学習モデル用意

4. 画像識別プログラム作成

Page 11: はじめての人のためのDeep Learning

11

Demo 作成までに必要な工程

1. 理論実装

2. 環境構築

3. ニューラルネットワーク、学習済モデル

4. 画像識別プログラム作成

Page 12: はじめての人のためのDeep Learning

12

1.理論実装

DeepLearning 関連理論の実装は避けられな

い・・・

→ フレームワークを使えば解決!

Page 13: はじめての人のためのDeep Learning

13

1.理論実装

代表的な DeepLearning フレームワーク

• Caffe (←今回使用)- 現在のデファクトスタンダード- コミュニティが盛んで学習済モデル(後述)も豊富- 情報が豊富であり馴染みやすいため今回使用

• Chainer- Jubatus でお馴染みの PFI 社が作成- 時系列等を扱える RNN/LSTM 対応- ネットワーク設計のための DSL が簡潔でわかりやす

• Deeplearning4j- 分散処理可能で Hadoop 上でも動作

Page 14: はじめての人のためのDeep Learning

14

Demo 作成までに必要な工程

1. 理論実装

2. 環境構築

3. ニューラルネットワーク、学習済モデル

4. 画像識別プログラム作成

Page 15: はじめての人のためのDeep Learning

15

2.環境構築

Caffe は依存ライブラリが非常に多いため手動インストールは辛い。。。

依存ライブラリCUDA :   GPU を使用するためのライブラリ。 NVIDEIA 提供。BLAS:  ベクトル / 行列演算のための線形代数操作ライブラリBoost:   C++ユーティリティライブラリProtobuf:  データシリアライズライブラリ。 Google Protocol BufferLevelDB:  学習・評価データ格納用 DBSnappy: データ圧縮・解凍ライブラリHDF5:  大量数値データ保存用ライブラリOpenCV:   Computer Vision 用ライブラリ

and more...

Page 16: はじめての人のためのDeep Learning

16

2.環境構築

with CUDA: GPU 環境向けwithout CUDA: CPU 環境向け

https://github.com/aydindemircioglu/vagrantcaffe

Page 17: はじめての人のためのDeep Learning

17

2.環境構築

> git clone https://github.com/aydindemircioglu/vagrantcaffe.git> cd ./vagrantcaffe/without.CUDA> vagrant up> vagrant ssh> cd /usr/local/caffe

Page 18: はじめての人のためのDeep Learning

18

2.環境構築

後々エラーが起きるので、 Caffe コードを一部修正

/usr/local/caffe/python/caffe/io.py:253 行目

if ms != self.inputs[in_][1:]: - raise ValueError('Mean shape incompatible with input shape.')+ # raise ValueError('Mean shape incompatible with input shape.')+ in_shape = self.inputs[in_][1:]+ m_min, m_max = mean.min(), mean.max()+ normal_mean = (mean - m_min) / (m_max - m_min)+ mean = resize_image(normal_mean.transpose((1,2,0)),in_shape[1:]).transpose((2,0,1)) * (m_max - m_min) + m_min

Page 19: はじめての人のためのDeep Learning

19

2.環境構築

書籍「 Caffe をはじめよう」 (石橋崇司著 Oreilly刊行 )より抜粋

というのもあり、 Caffe の Python モジュール修正は度々発生します

“ 開発の中心組織である BVLC のメンバーによると、 caffe.Net のみが公式サポートされており、それ以外のモジュールは例として挙げているだけに過ぎないとしています”

Page 20: はじめての人のためのDeep Learning

20

Demo 作成までに必要な工程

1. 理論実装

2. 環境構築

3. ニューラルネットワーク / 学習済モデル

4. 画像識別プログラム作成

Page 21: はじめての人のためのDeep Learning

21

3.ニューラルネットワーク、学習済モデル用意

Deep Learning を用いた画像認識では

1. ニューラルネットワークと呼ばれるモデルの定義

2. それを元に学習させた学習済モデル

が動作に必要

→Caffe では「 Model Zoo 」としてネット上に公開!

(※非商用ですけど、、、)

Page 22: はじめての人のためのDeep Learning

22

3.ニューラルネットワーク、学習モデル用意

> cd /usr/local/caffe/examples/imagenet> wget https://raw.githubusercontent.com/sguada/caffe-public/master/models/get_caffe_reference_imagenet_model.sh> chmod u+x get_caffe_reference_imagenet_model.sh> ./get_caffe_reference_imagenet_model.sh> cd /usr/local/caffe/data/ilsvrc12> ./get_ilsvrc_aux.sh

Page 23: はじめての人のためのDeep Learning

23

3.ニューラルネットワーク、学習済モデル用意

ダウンロードファイルで重要なもの

bvlc_reference_caffenet.caffemodel・学習済モデル。1ファイルのみで対象カテゴリ全てに対応

deploy.prototxt・ネットワーク定義ファイル

ilsvrc_2012_mean.npy・ ImageNet データセット画像の平均値・入力画像からこの値を減算し、正規化を行うため必要

synset.txt・カテゴリと物体名の紐付け表 (ex. nXXXX warplane)・ NN からの出力は無意味な No. のため、これを人間のわかる名前

に紐付けるために必要

Page 24: はじめての人のためのDeep Learning

24

Demo 作成までに必要な工程

1. 理論実装

2. 環境構築

3. ニューラルネットワーク、学習済モデル

4. 画像識別プログラム作成

Page 25: はじめての人のためのDeep Learning

25

4.識別プログラム作成

サンプルに格納されたプログラムをそのまま利用

/usr/local/caffe/python/caffe/classify.py( 以下抜粋 )

# cpu/gpu切り替え if args.gpu: caffe.set_mode_gpu() print("GPU mode") else: caffe.set_mode_cpu() print("CPU mode")

# モデルから対応カテゴリを予測し、 npy形式で保存するpredictions = classifier.predict(inputs, not args.center_only)np.save(args.output_file, predictions)

Page 26: はじめての人のためのDeep Learning

26

4.識別プログラム作成

npy形式を synset.txt と照合して該当カテゴリを表示する

# synset_words.txt ロードcategories = numpy.loadtxt(sys.argv[1], str, delimiter="\t")# npy形式データロードscores = numpy.load(sys.argv[2])

# score 順に Sort し、 top_k 数分だけカテゴリ表示するtop_k = 3prediction = zip(scores[0].tolist(), categories)prediction.sort(cmp=lambda x, y: cmp(x[0], y[0]), reverse=True)for rank, (score, name) in enumerate(prediction[:top_k], start=1): print('#%d | %s | %4.1f%%' % (rank, name, score * 100))

http://techblog.yahoo.co.jp/programming/caffe-intro/

Page 27: はじめての人のためのDeep Learning

27

4.識別プログラム作成

コマンド実行

> python /usr/local/caffe/python/classify.py --raw_scale 255 /hoge.jpg /usr/local/caffe/result.npy 1>/dev/null 2>/dev/null ; python /usr/local/caffe/show_result.py /usr/local/caffe/data/ilsvrc12/synset_words.txt /usr/local/caffe/result.npy"

Page 28: はじめての人のためのDeep Learning

28

以上の手順のみで

詳細な物体認識まで可能なことを検証

Page 29: はじめての人のためのDeep Learning

29

目次 :

1. 既存のモデルで画像識別器作成

2. クラウドでモデルを学習

3. DL を利用したプログラム作成

4. まとめ

Page 30: はじめての人のためのDeep Learning

30

新しいオブジェクトを学習させるためには・・・

大量の画像準備(1カテゴリに最低 100枚以上)

画像リサイズ、 LevelDB/LMDBへの登録

GPU搭載マシンの準備( CPU でもいいけど遅い)

各種パラメータの調整

etc....

OpenCV と同じくらいの手間。。。もっと手軽にできないのか?

Page 31: はじめての人のためのDeep Learning

31

https://www.labell.io/ja/

Page 32: はじめての人のためのDeep Learning

32

Labellio とは?

alpaca 社が開発した画像認識を簡単に可能にする

Web プラットフォーム

サーバ、ネットワークアキテクチャ等はチューニング

済みのものを使用

画像収集も Bing/Flicker から取得可能

学習したモデルを Caffe の学習モデルとしてダウン

ロード可能

だれもが簡単に利用できて、それによって「新しい用

途」を生み出してほしいというコンセプト

Page 33: はじめての人のためのDeep Learning

33

Labellio を使ったら

識別器作成も簡単そう!

Page 34: はじめての人のためのDeep Learning

34

じゃあやってみよう!

Page 35: はじめての人のためのDeep Learning

35

似ている芸能人を判別してみ

よう

1. でんぱ組 .inc 最上もが

2. きゃりーぱみゅぱみゅ削除

Page 36: はじめての人のためのDeep Learning

36

Labellio 使用手順

1. モデル名入力

Page 37: はじめての人のためのDeep Learning

37

Labellio 使用手順

2. Bing で検索するワードを登録する

Page 38: はじめての人のためのDeep Learning

38

これだけ(数分で完了)

Page 39: はじめての人のためのDeep Learning

39

Demo

Page 40: はじめての人のためのDeep Learning

40

Labellio結果サンプル

お手軽画像認識させるには充分な機能あり簡単に試したいときにはかなり心強いサービス

削除

Page 41: はじめての人のためのDeep Learning

41

目次 :

1. 既存のモデルで画像識別器作成

2. クラウドでモデルを学習

3. DL を利用したプログラム作成

4. まとめ

Page 42: はじめての人のためのDeep Learning

42

あらたな悩み

Page 43: はじめての人のためのDeep Learning

43

今までの画像認識は一枚一オブジェクトしか対応していない

#1| goose #2| hen #3| Kakatoe galerita

#1| unicycle ( 一輪車 )#2| taxi#3| go-kart(ゴーカート )

https://www.pakutaso.com/20110944268post-668.htmlhttp://www.ashinari.com/2015/09/18-393195.php?category=11

Page 44: はじめての人のためのDeep Learning

44

複数オブジェクトでも

なにがあるか認識できないか?

Page 45: はじめての人のためのDeep Learning

45

(参考) http://demo.illustration2vec.net/

こういうのが理想!(これも DeepLearning)

削除

Page 46: はじめての人のためのDeep Learning

46

実現はできそう!

とりあえずやってみよう!

Page 47: はじめての人のためのDeep Learning

47

複数オブジェクトへの対応への道 : R-CNN

1. 画像をインプット2. 画像から物体があると思われる領域を抽出する3.4. DeepLearning を使い、領域毎に画像認識させる

Girshick, R., Donahue, J., Darrell, T., & Malik, J. “Rich feature hierarchies for accurate object detection and semantic segmentation”. CVPR2014.

Page 48: はじめての人のためのDeep Learning

48

物体があると思わえる領域を抽出する方法

CPMC(Constrained Parametric Min-Cuts)・点を配置し、その周囲をグラフカット・処理速度が遅いが、領域を高精度に判定

Selective Search・色、輝度、テクスチャが似ている領域を探索し、物体検出する

・高速だが精度は CPMC ほどではない・最近流行りの判定方法

→ 今回は処理速度が早く、モダンな Selective Search を

使用

Page 49: はじめての人のためのDeep Learning

49

ただの R-CNN やるのも

面白く無いので、これを利用した

プログラムを作ってみよう!

Page 50: はじめての人のためのDeep Learning

50

R-CNN を利用したサムネイル抽出をしてみよう

画像中央を抽出

?R-CNN を使って重要な部分を抽出

https://www.pakutaso.com/20120109005post-1066.html

犬の一部が欠けてる…

Page 52: はじめての人のためのDeep Learning

52

サムネイル抽出ロジック

1.SelectiveSearch で領域検出する

2.検出した領域を DeepLearning にかけ Scoreを測る

3.Score の高い Top-N を取得

4.Top-N の Score を加算していき、最も高い点数

を得た領域のまん中を中心にしてサムネイル抽出

する

Page 53: はじめての人のためのDeep Learning

53

1. SelectiveSearch で領域検出する

赤い枠線で囲まれた領域を検出

それぞれを DL にかけ判別させ

Page 54: はじめての人のためのDeep Learning

54

2. 検出した領域を DeepLearning にかけ Score を測る

3. Score の高い Top-N を取得

Score:0.462

Score:0.456

Score:0.460

・・・

Page 55: はじめての人のためのDeep Learning

55

4. ( Y軸)得点総計の高い領域のまん中を中心にしてサムネイル抽出す

0.4600.462

0.456

Page 56: はじめての人のためのDeep Learning

56

R-CNN を利用したサムネイル抽出をしてみよう(結果)

画像中央を抽出

R-CNN を使って重要な部分を抽出

https://www.pakutaso.com/20120109005post-1066.html

全体像が写っている!

Page 57: はじめての人のためのDeep Learning

57

Selective Search コーディング例

※Labellio の SelectiveSearch ライブラリ使用

import selectivesearch

# selective search 実行 regions に x,y の座標とそこからの距離が格納 img_lbl, regions = selectivesearch.selective_search(inputs[0], scale=100, sigma=0.9, min_size=10)

for r in regions: # 同じ領域が検出されたら対象外 if r['rect'] in candidates: continue # 500ピクセル以下は対象が if r['size'] < 500: continue candidates.add(r['rect']) for x,y,w,h in candidates: imgar = inputs[0][y: y+h, x: x+w] predictions = classifier.predict([imgar], not args.center_only)

Page 58: はじめての人のためのDeep Learning

58

当方式における課題

処理速度の遅さ・領域毎に認識が走るため、時間がかかる

→Fast R-CNN という新しい手法の導入(数百倍)→GPU サーバ導入

物体検出の精度・人間が重要だと思う領域を抜き出さないことがある

→FaceDetection などの複数手法、複数パラメータでの抜き出しなど

Page 59: はじめての人のためのDeep Learning

59

目次 :

1. 既存のモデルで画像識別器をつくろ

2. クラウドでモデルを学習させよう

3. DL を利用したプログラムをつくろう

4. まとめ

Page 60: はじめての人のためのDeep Learning

60

DeepLearning 使えばいろんなことができそう

画像を分類分け、タグ付けをする

天気の判別

不審者の侵入検知

自分の好きな俳優だけが写っているシーンを抽出

好きな音楽ジャンルの動画を検索

Page 61: はじめての人のためのDeep Learning

61

新しい分野だけにアイデアさえ思いつけ

ば競争優位にたてるかも

Page 62: はじめての人のためのDeep Learning

62

まずは気軽に試して、

次世代ビジネスのアイデアを育てよう!

Page 63: はじめての人のためのDeep Learning

63

ご清聴ありがとうございました