画像認識モデルを作るための
鉄板レシピ
Agenda
 自己紹介
 はじめに
 鉄板レシピの全体構成
 Recipe1: Survey
 Task Planning: モデルの要件を設計する
 Gather Images: 画像の収集を行う
 Implements Pipeline: 画像の処理プロセスを実装する
 Annotation: 画像へのアノテーション
 Recipe2: PreProcessing
 Calculate Parameters: 前処理用パラメーターの計算を行う
 Data Augmentation: 学習画像の拡張を行う
 Recipe3: Training
 Use Pretrained Model: 事前学習済みモデルを利用する
 Training: 学習を実行する
 Conclusion
自己紹介(1/2)
久保隆宏
TIS株式会社 戦略技術センター
 化学系メーカーの業務コンサルタント出身
 既存の技術では業務改善を行える範囲に限界があるとの実感から、戦略技術セ
ンターへと異動
 現在は機械学習や自然言語処理の研究・それらを用いたシステムのプロトタイピ
ングを行う
人とロボットを連携させた接客シ
ステムmaicoの発表
(@対話システムシンポジウム)
OpenAI Gymを利用した、
強化学習に関する講演
(@PyConJP 2016)
kintoneアプリ内にたまった
データを簡単に学習・活用
(@Cybozu Days 2016)
icoxfog417
自己紹介(2/2)
所属するチーム chakki のミッション
すべての人が、ティータイムに帰れるようにする
すべての人が、ティータイム(15:00)に帰れる(茶帰)社会を
実現します。
この実現には、既存の仕事を効率化するのでなく、根本的
に「仕事の仕方」を変える必要があります。
しかし、慣れた仕事の仕方というのは簡単には変わりませ
ん。だからこそ、実際に「体験」をし、効果を「実感」し
てもらうことが重要になります。
そのため、私たちは先進的技術を用い、仕事の仕方が変わる体
験を提供していきます。
はじめに(1/2)
きゅうり、洋服、そしてアイドル・・・画像認識は仕事、そして趣味に欠かせない物に
なってきています。
そして、その手段として機械学習を用いるのはもはや常識的になっていると言っても
過言ではありません。そのためのチュートリアルも、数多くあります。
しかし、その機械学習の素になる「学習データの作り方」については、あまり情報がな
いように思います。
キュウリ農家とディープラーニ
ングをつなぐ TensorFlow
ディープラーニングによるファッ
ションアイテム検出と検索
TensorFlowによるDCGANでアイ
ドルの顔画像生成
はじめに(2/2)
機械学習がいかに優れた調理法であっても、素材となるデータが悪ければ美味しい
結果にはなりません。
本編では、この「データの取り方、処理方法(下ごしらえ)」にフォーカスして、解説を進
めていきます。
なお、全編にわたって「にがくてあまい」テイストですのでご了承下さい。
鉄板レシピの全体構成
画像認識モデルを構築するプロセス(レシピ)の全体構
成は、以下のようになっています。
1.Survey
2.Preprocessing
3.Training
認識モデルのスペック(何を、どのくらいの精度で行うのか)
を定義します。その後に学習用データの調達先、ラベル付
けのプロセスをデザインし、実装します。
収集した画像に対して、学習のための前処理を行います。
前処理に必要なパラメーターなどがあれば、事前に計算を
行っておきます。
前処理した画像を用いて、実際に学習を行います。
 Task Planning: モデルの要件を設計する
 Gather Images: 画像の収集を行う
 Implements Pipeline: 画像の処理プロセスを実装する
 Annotation: 画像へのアノテーション
Recipe1:Survey
入力される画像の性質、
統計情報を把握
画像サイズの分布
画像内の識別対象の個数
識別対象の回転の度合い
etc…
Task Planning: モデルの要件を設計する(1/2)
認識したい画像について調査を行い、その情報を基にモデルに対するインプット、
アウトプットを定義します。
Image Input Output
Tux
識別領域のサイズ
(=モデルに入るサイズ)
※人間が識別可能なサ
イズでなければ、機械学
習で識別するのも難しい
ので注意
識別クラス数
識別対象数
確信度(識別確率)の要否
識別位置の要否
目標精度
全体のプロセス以外に、こうした画像をこう認識する、といった具体例を集めたシート
を作っておくとよいです(次スライド参照)。この設計を怠ると精度へのダメージや学習
データの作り直しといった事態を招くので注意。
Task Planning: モデルの要件を設計する(2/2)
Image Output
・識別領域の上限/下限?
・領域の特定方法?
Input
切り出し後の画像は縮小を
行い、サイズを合わせる
どれくらいのサイズが適当?
Target: Tux (91.%)
Position: (left top/bottom…)
顔領域/識別クラス/識別
確率
を出力する
個別のケースを考えることで、
問題点を洗い出せる
ケース:認識対象が複数ある場合
ラベルから画像を探す場合(画像検索のようなイメージ)
 SNS系のAPIを利用する: Twitter/Facebook
 検索エンジン系のAPIを利用する: Google Custom Search API/Bing Search API
 画像共有系サービスのAPIを利用する: Instagram/Flickr
公開データセットを利用する場合
オープンデータ、また研究用として公開されているデータセットを利用する(詳細)
 Kaggle Datasets
 Open Images dataset
人力(意外とばかにならない)
 自分で/お願いして/写真を撮りまくるetc
目安として1クラス10~100画像といったところですが、
ImageNetのように数百なくてもOKです(あるにこしたことはない)。
Gather Images: 画像の収集を行う
計画が決まったら、それに基づき学習用の画像を収集します。
Implements Pipeline: 画像の処理プロセスを実装する
収集した画像に対してラベルを付与していくことになりますが(アノテーション)、この
段階で実装可能なプロセスは実装に入ります。
というのも、アノテーションの段階か否かで変わるのは識別するのが人か機械学習
モデルかだけのためです。
Image Input Output
Tux
Human
Model
Annotation
Prediction
Cut
To Input
実装上で難点があれば、認識をあきらめるクラスや、対象画像サイズの変更など
を検討する必要が出てきます。これが後から判明すると、アノテーション損などが
発生するので注意が必要です。
実装可能
Annotation: 画像へのアノテーション(1/2)
 自力
 他力
 クラウドソーシング
 半自動(半教師/アクティブラーニング)
 アノテーション済みのデータを使って学習したモデルを使って予測させ、予
測から選択する
どの手法を使うにせよ、アノテーション用のツールがあるとよいです。
ツールは幾つかありますが、「これぞ」というものはまだない
印象です。クラウドソーシングへの対応を考えると、Web
ベースのツールが良いと思います(汎用プラットフォーム
を作ればワンチャンある)。
収集した画像に対して、実際にアノテーションを行っていきます。
アノテーションの実施に際しては、以下3つの選択肢があります。
Annotation: 画像へのアノテーション(2/2)
Image Input Output
Tux
Human
Cut
To Input
API
Dataset
Annotation Tool
(Model)
Assist
半自動にするしないにかかわらず、ある程度データがたまっ
た段階で機械学習モデルを学習させ(学習の方法について
は後述)、精度の確認を行っておいた方が良いです。
ともすると、現状の画像では精度が出ないにもかかわらず、
延々と作業していたという事態が発生します。
精度
データ量
順調に上がっ
ているか?
画像を格納
画像へのパス
とラベルをま
とめたファイ
ルを更新
Incremental Brush-up
手戻りを防止する。インクリメンタルに進めることで。
Task
Planning
Gather
Images
Implements
Pipeline
Annotation
タスクを設計し、画像を集める。
実装、アノテーションにより問題
点が明らかになれば、タスクの
再設計を行う。必要があれば画
像を集め直し・・・というように、サ
イクリックに進める。
また、最初から大量のデータを
扱わず、数百~程度からインクリ
メンタルに、扱うデータを増やし
ていく。
これにより手戻りを防いでいく。
 Calculate Parameters: 前処理用パラメーターの計算を行う
 Data Augmentation: 学習画像の拡張を行う
Recipe2:PreProcessing
About Preprocessing
学習するに当たって、画像を学習しやすいように加工したりする処理を前処理と呼び
ます。
Image Input
Cut
To Input
Pre
Preprocessing Input’
これを行うことにより、学習速度を向上させたり、モデルの精度を高めたりすることが
できます。
Calculate Parameters: 前処理用パラメーターの計算
前処理の代表的なものの一つが、画像の正規化/白色化です。
 Channel Mean
 RGB画像の場合、R/G/Bの各Channelについて全画像の平均を計算する
 学習時には、各ピクセルのRGB要素からこの平均を引く
 Per-pixel Mean
 各ピクセルについて、全画像の平均を計算する(10x10x3の画像なら300個
の各pixel)
これらの処理を行うには事前に平均などのパラメーターを計算
しておく必要があるため、このパラメーターを計算しておきます。
(標準偏差で割るところまでやった方が理想的ではありますが、
そこまでしている例はあまりないようです)。
Data Augmentation: 学習画像の拡張を行う
学習用に集めた画像を単にそのまま使うのではなく、水増しや補正をするというテク
ニックがあります。
 水増し
 画像データを増やすテクニック(左右反転させて2倍にするなど)
 補正
 画像の特徴(輪郭など)を強調したり、対象の位置を補正したりすることで学習
しやすくする
これらの手法を使用することで、モデルの汎用性を高めたり、学習をしやすくすること
ができます。
Data Augmentation: 学習画像の拡張を行う(水増し)
Flip
Crop
Brightness
左右の反転を行い、学習画像
をかさましする。
→人間なら左右が反転しても
識別可能なはずなので。
画像から一部分を切り出して、
複数の画像を生成する。
→人間なら、画像の一部分か
らでも識別可能なはずなので。
画像の明るさやコントラスト
を調整して画像を生成する。
→人間なら(以下略
モデルの汎用性に貢献する
Data Augmentation: 学習画像の拡張を行う(補正)
Adjust
Emphasis
認識対象が中央に来るように
揃える(顔認識の場合、目の位
置を揃えるなど)
閾値処理や輪郭検出により、
認識したい箇所を強調する。
学習のしやすさ、精度に貢献する
※ただし、補正がかかった画像で学習したモデルは補正がかかっていることが前提
のモデルになります。そのため、予測を行う際も補正が必要です。
汎用性を持たせるには、補正前後/補正強度を変化させた画像を混ぜるなどの工夫
が必要になります。
Test Recipe2
画像から平均を引く、水増しや補正といった処理は、通常学習時に動的に行います
(補正は事前にかけておくケースもあるかもしれませんが)。
そのため、これらは学習前に十分なテストをしておくことが肝要です。
前処理がバグっていたせいで学習が上手くいかなかったとは、目も当てられません。
また、前処理のプロセスは予測の際も必要になります。
そのため、前処理のプロセスは独立にしておき、学習・予測処理双方から呼び出して
使えるようにしておく必要があります。
⇒機械学習モデルの設計については、こちらをご参考ください。
 Use Pretrained Model: 事前学習済みモデルの利用
 Training: 学習を実行する
Recipe3: Training
Use Pretrained Model: 事前学習済みモデルの利用
機械学習で画像認識を行う際は、事前学習済みモデルの使用を推奨します。
「画像認識のためには数万枚の画像を集めて、何日間もGPU搭載サーバーを動か
さないといけない・・・」というのはもはや当てはまりません。
事前学習済みのモデルを利用して、自分たちの画像データセットを用いてFine
Tuning(Transfer Learning)するというのが近年のセオリーです。
CS231n Lecture11 Training ConvNets in practice, p26
Use Pretrained Model: 事前学習済みモデルの利用
各深層学習ライブラリでは、通常事前学習済みのモデルが配布されています(中で
も、CaffeのModel Zooは著名です)。
 TensorFlow: 事前学習済みモデルをダウンロード可能(slimで書かれているが)
 Caffe: Model Zooで配布されている
 Chainer: Caffeモデルのインポート機能有
 MXNet: 事前学習済みモデルをダウンロード可能
 Keras: keras.applicationsから呼び出し可能
特にお勧めしたいのは、Kerasです。
Kerasでは右図のようにコード中の記述だけで
簡単に事前学習済みモデルをロードすること
ができるためです。
使いたいモデルを
呼び出すだけ!
Training: 学習を実行する
学習は、通常通り行います。
これまでのプロセスで良いデータが整っていれば、自ずと精度は出てくると思います。
じっくり待ちましょう。
素材(データ)に真摯に向き合えば、モデル
は必ず答えてくれる。
ハイパーパラメーター調整地獄に陥る前に、
データをしっかり整えよう。
Conclusion
 Convolutional Neural Networkを実装する
 機械学習のためのOpenCV入門
 画像の水増し方法をTensorFlowのコードから学ぶ
 CNN による画像分類で使われる前処理・テスト時処理まとめ
 CS231n: Convolutional Neural Networks for Visual Recognition
 Active Learning 入門
 にがくてあまい
References

画像認識モデルを作るための鉄板レシピ