ver. 1.2
2018-03-21 19:00-21:00 未来会議室
森下功啓
1
オトナの画像認識入門
改訂履歴
• 2018-03-21 ver. 1.0 release
• 2018-03-22 ver. 1.1 再開時の処理について追記
• 2018-04-14 ver. 1.2 リンクの修正
2
自己紹介
リリースしてきたもの
• 鳴き声から鳥の種類を当てるソフトウェア
• https://github.com/KatsuhiroMorishita/birdsong_project
• 阿蘇の雲海予報を行う「うんかいったー」
• https://twitter.com/unkaitter
3
名前
専門
趣味の一つ
SNS Facebook https://www.facebook.com/katsuhiro.morishita
Github https://github.com/KatsuhiroMorishita
SlideShare https://www.slideshare.net/katsuhiromorishita/
衛星測位やセンサー使う方
森下功啓 @KatsuhiroKU
機械学習
今日のゴール
機械学習
AI
IoT
データ分析
4
「画像認識やれそうだわい」
ってとこまで行けたら良いな
本日の目次
• 画像認識の概要
• 画像データと特徴量
• 畳み込みニューラルネットワーク
• ImageDataGeneratorによる教師データの水増し
• 学習
• callback
5
画像認識の分類
6
画像認識
物体認識
シーン認識
クラス認識
インスタンス認識
認識結果: 「桜島」
類似画像検索・顔認証など
認識結果:「山」
認識結果: 「海辺を観光」
http://www.kagoshima-kankou.com/guide/11813/
*それぞれアプローチが異なる
画像認識の分類
7
画像認識
物体認識
シーン認識
クラス認識
インスタンス認識
今日取り組む内容
http://www.kagoshima-kankou.com/guide/11813/
認識結果: 「桜島」
類似画像検索・顔認証など
*それぞれアプローチが異なる
認識結果:「山」
認識結果: 「海辺を観光」
画像認識の概要
画像データと特徴量
畳み込みニューラルネットワーク
ImageDataGeneratorによる教師データの水増し
学習
callback
8
画像データの構造
• 画素(ピクセル)毎に色がある
• 色は3原色(RGB)で合成される
• RGBはそれぞれの明るさを0-255で表現
• RGBの3色で1枚のカラー画像
• プログラムで読み込むと3次元配列になる
9
データの並び方には色々ある
[[r1, g1, b1], [r2, g2, b2], …
[[g1, b1, r1], [g2, b2, r2], …
[[r1, r2, r3, …] , [g1, g2, g3, …], [b1, b2, b3, …]]
http://neareal.net/index.php?ComputerGraphics%2FImageProcessing%2FTheStructureOfImageData
画像とプログラムによっては透
過率を表すαチャンネルがつい
てくるので注意
画像データの座標系とサイズ
• 左上が原点
• 画像には、横W pixel 縦H pixelの様に、サイズがある
10
http://neareal.net/index.php?ComputerGraphics%2FImageProcessing%2FTheStructureOfImageData
画像の特徴量
• 輝度勾配を基に、SIFTなどの特徴量が提案されている
• 画像マッチングにはSIFTなどを使う
• 分類に有効な特徴量は自明ではない
• 畳み込みニューラルネットワークは、畳込み層で特徴量を獲得する
11
輝度勾配の例
http://gori-naru.blogspot.jp/2012/11/hog.html
抽出されたSIFT特徴点の例
http://lang.sist.chukyo-u.ac.jp/classes/OpenCV/py_tutorials/py_feature2d/py_sift_intro/py_sift_intro.html
画像認識の概要
画像データと特徴量
畳み込みニューラルネットワーク
ImageDataGeneratorによる教師データの水増し
学習
callback
12
ニューラルネットワーク
• 神経細胞を模したユニットを層状に結合したもの
• 前段ユニットの出力に結合係数を掛けたものが次の入力となる
• 入力データに合わせた非線形写像を実現する
• 画像認識や画像生成などに使われる
13
https://qph.fs.quoracdn.net/main-qimg-330e8b2941bc0164211bbdc7d5c693f3
ニューラルネットワークの例
入力
ベクトル𝒙
出力
ベクトル𝒚
代表的な層の種類
• 前後のユニットの結合の仕方にバリエーションがある
14
全結合層 畳み込み層 プーリング層 ドロップアウト層
畳み込みフィルタ(カーネル)
• Photoshopなどで使うフィルタが畳み込みである
• 平滑化フィルタやエッジ強調フィルタなどがある
• フィルタをずらしながら、積和演算により新たな画像を作る
• フィルタは特徴的な輝度勾配を強調できる
• CNNでは、このフィルタを学習により獲得する
15
http://agnesmustar.com/tag/vgg16/
3×3のフィルタで、左上の画素を生成 3×3のフィルタで、中心の画素を生成
畳み込みの例
16
元画像
http://agnesmustar.com/tag/vgg16/
フィルタと畳み込みで生成された画像
• 畳み込みを実施した例を示す
フィルタ
畳み込みニューラルネットワーク(CNN)
17
畳み込み層
CNN
(この図ではフィルタは1つ)
全結合層のみで構成
普通のニューラルネットワーク
プーリング層
• プーリングでは、複数画素内から求めた最大値や平均を使って
新たな画像を生成する
• 縮小画像を作ることで、データ量を減らす
• 画像に写る物体の平行な位置ズレを吸収する効果がある
18
http://agnesmustar.com/tag/vgg16/
*stride(窓をずらす量)は指定できる
ドロップアウト層
• ドロップアウト層は、学習時に、ある確率で抽出したユニットを一時的
にネットワーク上に存在しないものとして扱う
• 無いものとされたユニットに繋がる結合係数は学習で更新されない
• 抽出のやり直しは学習の度に行われる
• ユニット数が減ることで学習が進みやすくり、且つ過学習を防止できる
• ノイジーなユニットが確率的に不活性化され、学習が進む
• また、一時的にユニット数が減ったことで写像能力が落ちる
19
学習段階では、一部のユニットを
無いものとして扱う
予測時には全ユニットが使われる
VGG16
• VGGは画像認識で実績のあるモデル
• VGG16がよく使われる
• 1000クラス分類問題を学習したモデルが公開されている
20http://agnesmustar.com/tag/vgg16/
(全結合層)
(畳み込み層)
画像認識の概要
画像データと特徴量
畳み込みニューラルネットワーク
ImageDataGeneratorによる教師データの水増し
学習
callback
21
ImageDataGeneratorとは
• 画像を水増しすることで教師データを増やす
• 画像データの収縮拡大、回転、平行移動、正規化などを施す
• これで汎化能力を増す
• 注意:入力する画像データの画素の値は0-1の範囲に変換しておく
22
Kerasによるデータ拡張
http://aidiary.hatenablog.com/entry/20161212/1481549365
使い方
• サンプルコードで使い方を確認しましょう
• jupyter notebookを起動し、「ImageDataGeneratorを試
す.ipynb」を開いて下さい
• セルを上から順次実行(再生ボタンを押す)し、結果を確認し
てください
23
https://github.com/KatsuhiroMorishita/machine_leaning_samples/tree/master/keras_Image_classification/test_of_ImageDataGenerator
画像認識の概要
画像データと特徴量
畳み込みニューラルネットワーク
ImageDataGeneratorによる教師データの水増し
学習
callback
時間がないので、非常に単純な例を示します
24
サンプルプログラムで学習
• 下記URLの学習用サンプルプログラムを動かします
25
https://github.com/KatsuhiroMorishita/machine_leaning_samples/tree/master/keras_Image_classification/flower
これは、写真から花の種類を当てる例題です
ファイルの説明
• learning.py:学習用のプログラム
• prediction.py:学習済みの結合係数を読み込んで、未知画像を予測する
• label_dict.pickle:クラスの番号をクラス名に変換する辞書をシリアラ
イズ化して保存したもの
• model:保存されたモデルデータ
• param.hdf5:保存された結合係数
• 1_train, 2_train:学習用の画像が入っているフォルダ
• 1_test, 2_test:学習結果を評価するための画像が入っているフォルダ
• 学習には利用しない
• prediction_result.csv:prediction.pyが保存した予測結果
• validation_table*.csv: learning.pyが保存した、検証データに対する真
値と予測値とで作った分割表
26
learning.pyの動作
• ソースコードで指定されたフォルダ内の画像を読み込み、学習する
• フォルダ名から正解ラベルを取得する
• 教師データの一部を、学習に用いずに、過学習の判定に利用
• 学習後に結合係数やモデルの情報を保存する
27
Tips
• Optimizerは結合係数を修正するアルゴリズム
• Optimizerは学習の途中でadamからSGDに変えると良いらしい
• loss(損失)は小さい方が良い
• acc(精度)は1.0に近い方が良い
• lossとval_loss(またはaccとval_acc)が乖離していたら過学習
• batch_sizeは大きい方が母集団の勾配を表現できるが、大きいと勾配
が消失したり(学習が進まない)、GPUのメモリが不足したりする
• 学習の結果が満足できるものかは、分割表で判断
28
←恐らく学習に成功した例
縦軸がlossで、横はepoch
青色はloss、橙色はval_loss
分割表の見方
• サンプルプログラムが作る分割表の例を以下に示す
• この例では、1つのクラス1がクラス2に誤って識別されている
29
入力
出力
画像認識の概要
画像データと特徴量
畳み込みニューラルネットワーク
ImageDataGeneratorによる教師データの水増し
学習
callback
30
学習時間を有効に使うためのcallback
• 学習には時間がかかるため、定期的に学習係数を保存した方が良い
• 保存していれば、一旦中断して再開することができる
• 学習が進まなくなったら途中で処理を止めたい場合もある
• kerasのcallbackの使い方
• https://keras.io/ja/callbacks/
• 下記URLのサンプルコードを例に説明します
31
https://github.com/KatsuhiroMorishita/machine_leaning_samples/tree/master/keras_Image_classification/flower_with_callback
callbackの基本的な使い方
• kerasのドキュメントのコードをコピる
• model.fit()の引数にオブジェクトをリストで渡す
32サンプルコードの実装例(抜粋)
上:学習が進まなくなったら止める
下:良い成績が出たらモデルを保存
リストで渡す
サンプルコードにおける、
途中で処理を再開するための仕掛け
• 学習に使うデータと検証に使うデータをそれぞれ保存
• フォルダ名とクラス番号などのヒモ付辞書も保存
• モデルはOptimizerの状態や結合係数ごと保存
• callbackでsave_weights_only=Falseと設定
• 実行時に引数をチェックし、指示があれば途中から再開
33
読み込んだ画像データ等の保存
実行時の引数で"再開" or "最初から"の選択
付録
34
メモ
• 画像内での物体の回転が考えられる場合は、それだけ畳み込みのフィ
ルタが必要になる。ゆえに、野菜の等級判断などにおいて、画像の向
きを調整できるのであれば、調整した上で入力した方が学習コストを
下げることができる。
• 野菜などの形状判定にはCNNは向いていない。形状を表す特徴量設計
を行った方が断然性能が出ると思う。
35
参考リンク集
ネット上に情報はあふれるようになったが、ゴミも多い。おス
スメの書籍を以下に紹介する。
36
ゼロから作るDeep Learning
画像認識
https://goo.gl/d1vNZb
https://goo.gl/fxMc5D
参考リンク集
ネット上に情報はあふれるようになったが、ゴミも多い。書籍
を数冊用意した上で、下記もおススメする。
• KerasでVGG16を使う
• http://aidiary.hatenablog.com/entry/20170104/1483535144
• VGG16のFine-tuningによる犬猫認識 (2)
• http://aidiary.hatenablog.com/entry/20170110/1484057655
• 勾配ブースティングについてざっくりと説明する
• http://smrmkt.hatenablog.jp/entry/2015/04/28/210039
37
告知:PyCon Kyushu 2018
• connpassで告知が有ると思います
• https://pycon-kyushu.connpass.com/
• もうすぐ講演募集開始です!
• 日時:2018年6月30日(前夜祭と懇親会を企画中)
• 場所:LINE福岡
• Web:http://kyushu.pycon.jp/
38
39
面白ツイート
個人的には、古き良き手法で精度が出るならそれでいいと思う・・・

オトナの画像認識 2018年3月21日実施