31
機械学習で学ぶSwift 入門 株式会社BizReach プロダクトマーケティング本部 山下大輔

Introduction of Swift from Machine Learning

Embed Size (px)

Citation preview

機械学習で学ぶSwift入門

株式会社BizReach プロダクトマーケティング本部 山下大輔

自己紹介・山下大輔(やました だいすけ) ・2015年1月よりビズリーチのiOSエンジニア ・@daisuke0131 ・http://www.facebook.com/daisuke0131 ・https://github.com/daisuke0131

https://itunes.apple.com/jp/app/haikurasu-ren-cainokyaria/id972002786?mt=8

今日のゴール

・機械学習について少し理解する ・画像認識の仕組みを数学的な説明なしに理解する ・OpenCVの組み込み方をざっくり理解 ・Swiftにちょっと馴染む

おしながき

・機械学習について ・顔認識、顔検出について ・今回のハンズオンで作るもの ・OpenCVについて ・CIDetectorについて

wikipediaより https://ja.wikipedia.org/wiki/機械学習

機械学習って何?

機械学習(きかいがくしゅう、英: machine learning)とは、人工知能における研究課題の一つで、人間が自然に行っている学習能力と同様の機能をコンピュータで実現しようとする技術・手法のことである。

wikipediaより https://ja.wikipedia.org/wiki/機械学習

機械学習って何?例えば人の写真データを入力すると名前を出力してくれるような仕組み を作ることを考えると

たかしさん

機械学習って何?人物の写真データをその人の特徴をうまく表現できるような数値に 変換できればなんとかできそう。

機械学習って何?人物の写真データをその人の特徴をうまく表現できるような数値に 変換できればなんとかできそう。

数値に変換する 識別する

機械学習って何?人物の写真データをその人の特徴をうまく表現できるような数値に 変換できればなんとかできそう。

数値に変換する 識別する

たかし:10 さとし:500 ゆうじ:700 さとみ:8000

723ゆうじ?

機械学習って何?人物の写真データをその人の特徴をうまく表現できるような数値に 変換できればなんとかできそう。

数値に変換する 識別する

たかし:10 さとし:500 ゆうじ:700 さとみ:8000

723ゆうじ?

特徴量抽出

学習

識別器

機械学習って何?人物の写真データをその人の特徴をうまく表現できるような数値に 変換できればなんとかできそう。

数値に変換する 識別する

たかし:10 さとし:500 ゆうじ:700 さとみ:8000

723ゆうじ?

特徴量抽出

学習

識別器

学習

たかし

さとし

ゆうじ

さとみ

・・・

・・・

・・・

・・・

名前と画像の組をたくさん集める

学習

たかし ・・・

名前と画像の組をたくさん集める

特徴量抽出

12 11 9 8

10に近い値がでてくるのは「たかし」さん?たかし:10 さとし:??? ゆうじ:??? さとみ:???

教師あり学習

たかし ・・・

名前と画像の組をたくさん集める

特徴量抽出

12 11 9 8

10に近い値がでてくるのは「たかし」さん?たかし:10 さとし:??? ゆうじ:??? さとみ:???

機械学習って何?

数値に変換する 識別する

たかし:10 さとし:500 ゆうじ:700 さとみ:8000

13たかし?

判別する仕組みが作れそう!!

顔認識、顔検出について

顔認識

顔検出

たかし

顔認識システム

顔検出システム

写真に写っているのは誰かを識別する

写真の中から人の顔を抽出する顔はここ!

ハンズオンについて

顔検出

顔検出システム

写真の中から人の顔を抽出する顔はここ!

今回つくるもの

顔検出について顔検出システム 顔はここ!

特徴量計算 識別処理

Haar-like特徴量 AdaBoost

Haar-like特徴量

AdaBoost

->領域を定義して明暗から数値を算出

->識別能力の弱い識別器を連携させて識別を行う方法

Haar-like特徴量

Haar-like特徴量 H(r1,r2) = S(r1) - S(r2)

黒領域の平均輝度 白領域の平均輝度

->ぼんやり明暗で人の顔っぽいものは認識できるのでは?

位置、大きさ形を変えて 18万個ほど抽出

AdaBoostの学習->サンプルから弱識別器、重みを決定していく

z1:評価値 = 0.4

z2:評価値 = 0.8

z:評価値 = 0.2

・ ・ ・

Adaboost

h(2の場所)  × α2

AdaBoostの学習->サンプルから弱識別器、重みを決定していく

z1:評価値 = 0.9

z2:評価値 = 0.5

z:評価値 = 0.2

・ ・ ・

Adaboost

h(2の場所)  × α1

h(1の場所)  × α2

AdaBoost->サンプルから弱識別器、重みを決定していく

z1:評価値 = 0.9

z2:評価値 = 0.5

zx:評価値 = 0.2

・ ・ ・

Adaboost

h(2の場所)  × α2

h(1の場所)  × α1

・ ・ ・

h(xの場所)  × αx

識別->検索窓を定義し、作成したAdaBoost識別器から評価値を算出

Adaboost

h(2の場所)  × α2

h(1の場所)  × α1

・ ・ ・

h(xの場所)  × αx

0.1:顔じゃない

+

+

+

識別->検索窓を定義し、作成したAdaBoost識別器から評価値を算出

Adaboost

h(2の場所)  × α2

h(1の場所)  × α1

・ ・ ・

h(xの場所)  × αx

3.5:顔発見

+

+

+

OpenCVについて

OpenCV(オープンシーヴィ、英語: Open Source Computer Vision Library)とはインテルが開発・公開したオープンソースのコンピュータビジョン向けライブラリ。 2009年にWillow Garage(ウィロー・ガレージ)に開発が移管された後、2015年現在はItseezがメンテナンスを行なっている。

wikipediaより https://ja.wikipedia.org/wiki/OpenCV

OpenCVについて

・機能が豊富!   -車、動物、人の検出

https://www.youtube.com/watch?v=5uCbEvXL94Q https://www.youtube.com/watch?v=3BJFxnap0AI

  -顔認識、顔検出 -文字認識、文字検出 -さまざまな特徴量計算(SHIFT,SURF)

OpenCVについて

・もちろんiOSで使えます! -公式でビルドライブラリが配布されている

       http://opencv.org/downloads.html

-CocoaPods上では公式には配布されていないので野良ビルドを使う必要がある。

       https://github.com/Zi0P4tch0/Specs

       ただし、現状は最新版の3.0には未対応

OpenCVについて

・c++で呼び出す必要があります。 swiftから使うにはbridge-headerを設置してobjective-c++を呼び出して、そこからOpenCVのライブラリを呼び出します。

OpenCV library

Objective c++

Swift

顔検出 from OpenCV

・cascade file(学習後のモデルファイル)を読み込んで ・認識メソッドを呼び出す

cascade.load(fileName) cascade.detectMultiScale(image,positions,・・・);

画像データ 顔の位置情報

cascade fileの場所

・cascade fileは色々な人が配布しているのでそれを使えば 人の顔以外も検出は可能

顔検出 from 標準framework

・iOS 5.0あたりからCore Imageに機能的に追加された

顔の検出(笑顔検出、瞬き検出) QRコードの検出

・iOS 9.0では文字検出、文字認識系もできるように!

https://developer.apple.com/library/prerelease/ios/documentation/CoreImage/Reference/CIDetector_Ref/

・CIDetectorを使う

CIDetector 使い方

https://developer.apple.com/library/prerelease/ios/documentation/CoreImage/Reference/CIDetector_Ref/

let image = UIImage(named:”photo”) let ciImage = CIImage(image: image) let detector = CIDetector(ofType:CIDetectorTypeFace ,context:nil ,options:[ CIDetectorAccuracy:CIDetectorAccuracyHigh

]) let features = detector.featuresInImage(ciImage)