第20回目となる今回からは、機械学習という技術についてご紹介します。
スマートフォンを含むデジタルカメラや、FacebookなどのWebサービスやアプリでは、写真から自動で顔を検出する機能が採用されています。このような顔検出には、機械学習(Machine Learning)という分野が深く関わっています。パターン認識(Pattern Recognition)と呼ばれることもあります。

機械学習は、教師あり学習(Supervised Learning)、教師無し学習(Unsupervised Learning)に大別できます。その中間の、半教師あり学習(Semi-Supervised Learning)というものもあります。
教師あり学習は、人間が正解値を与えた学習データを用いて学習し、その学習結果を用いて未知のデータを推定する手法です。
一方教師なし学習は、人間が正解値を与えていない学習データを用いる手法です。「教師なし」よりも「教師あり」の方が、容易に優れた結果を出すことができます。ここでは、教師あり学習について解説していきます。

機械学習でできること

機械学習でできることは、大別すると2つあります。
1つ目は、識別(Classification)です。識別は、例えば、映っている画像が顔か、顔以外かを推定する手法です。
2つ目は、回帰(regression)です。回帰は、例えば、映っている人の年齢を推定することができます。顔識別、年齢推定を例に具体的に説明すると、下記の手順となります。

顔識別

1. 学習データ:顔が写っている画像群と顔以外が写っている画像群を用意します。

2. 学習:その学習用データから特徴量を抽出し、特徴量と出力値との関係を表すパラメータを求めます。

3. テスト:学習で求めたパラメータと、未知のデータに写っている画像から抽出した特徴量を用いて、画像に映っているものが顔か顔以外かを推定します。

年齢推定

1. 学習データ:20歳代の顔が写っている画像、30歳代の顔が写っている画像、……といった具合に年齢ごとの画像群を用意します。

2. 学習:その学習用データから特徴量を抽出し、特徴量と出力値との関係を表すパラメータを求めます。

3. テスト:学習で求めたパラメータと、未知のデータに写っている画像から抽出した特徴量を用いて、未知の顔画像の年齢を予測します。

知っておきたい手法

機械学習の有名な手法には、ニューラルネットワーク(Neural Network)、ランダムフォレスト(Random Forest, Randomized Trees)、サポートベクターマシーン(SVM: Support Vector Machine)、AdaBoostなどがあります。
最近流行っているディープラーニング(Deep Learning:深層学習)は、ニューラルネットワークの層を深くしたモデルです。コンピュータビジョンでは、CNN(Convolutional Neural Network)がよく用いられます。

性能の評価指標

機械学習を用いた技術を開発すると、その性能を評価したくなるはずです。評価指標としては、顔として予測した結果のうち何割が正解だったかを表す適合率(Precision)、実際に顔であるものを何割顔として予測できたかを表す再現率(Recall)、そして適合率と再現率から求まるF値(F-measure)がよく用いられます。

正解が1(顔) 正解が-1(顔でない)
予測が1(顔) True Positive (Tp) False Positive (Fp)
予測が-1(顔でない) False Negative(Fn) True Negative (Tn)

数式は下記のとおりです。

Precision = Tp/(Tp+Fp)
Recall = Tp/(Tp+Fn)
F-measure = 2Recall*Precision/(Recall + Precision)

また、学習機のパラメータを変えながら、縦軸と横軸にそれぞれTp/(Tp+Fp)、Fp/(Fp+Tn)をプロットしたROC曲線、そのROC曲線の性能を要約したAUC(Area Under the Curve)もよく用いられます。

OpenCVなど、様々なライブラリに機械学習が実装されています。機械学習の理論を完全に理解していなくても、顔識別や年齢推定を実装することは難しくありません。興味のある方は、是非トライしてみてください。

次回は、顔検出・人検出についてもう少し詳しく解説します!