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

Preview:

Citation preview

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

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

中野唯一郎

2

目次 :

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

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

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

4. まとめ

3

そもそも

なぜ DeepLearning で

画像認識を研究?

4

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

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

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

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

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

5

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

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

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

6

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

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

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

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

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

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

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

こっそり教えて下さい

7

目次 :

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

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

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

4. まとめ

8

いきなり Demo

9

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

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

10

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

1. 理論実装

2. 環境構築

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

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

11

Demo 作成までに必要な工程

1. 理論実装

2. 環境構築

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

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

12

1.理論実装

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

い・・・

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

13

1.理論実装

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

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

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

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

14

Demo 作成までに必要な工程

1. 理論実装

2. 環境構築

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

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

15

2.環境構築

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

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

and more...

16

2.環境構築

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

https://github.com/aydindemircioglu/vagrantcaffe

17

2.環境構築

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

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

19

2.環境構築

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

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

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

20

Demo 作成までに必要な工程

1. 理論実装

2. 環境構築

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

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

21

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

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

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

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

が動作に必要

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

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

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

23

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

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

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

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

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

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

に紐付けるために必要

24

Demo 作成までに必要な工程

1. 理論実装

2. 環境構築

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

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

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)

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/

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"

28

以上の手順のみで

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

29

目次 :

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

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

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

4. まとめ

30

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

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

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

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

各種パラメータの調整

etc....

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

31

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

32

Labellio とは?

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

Web プラットフォーム

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

済みのものを使用

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

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

ロード可能

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

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

33

Labellio を使ったら

識別器作成も簡単そう!

34

じゃあやってみよう!

35

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

よう

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

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

36

Labellio 使用手順

1. モデル名入力

37

Labellio 使用手順

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

38

これだけ(数分で完了)

39

Demo

40

Labellio結果サンプル

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

削除

41

目次 :

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

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

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

4. まとめ

42

あらたな悩み

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

44

複数オブジェクトでも

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

45

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

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

削除

46

実現はできそう!

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

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.

48

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

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

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

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

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

使用

49

ただの R-CNN やるのも

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

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

50

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

画像中央を抽出

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

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

犬の一部が欠けてる…

52

サムネイル抽出ロジック

1.SelectiveSearch で領域検出する

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

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

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

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

する

53

1. SelectiveSearch で領域検出する

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

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

54

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

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

Score:0.462

Score:0.456

Score:0.460

・・・

55

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

0.4600.462

0.456

56

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

画像中央を抽出

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

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

全体像が写っている!

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)

58

当方式における課題

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

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

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

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

59

目次 :

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

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

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

4. まとめ

60

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

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

天気の判別

不審者の侵入検知

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

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

61

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

ば競争優位にたてるかも

62

まずは気軽に試して、

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

63

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

Recommended