ディープラーニングで笑顔を自動検知したい

ディープラーニングで笑顔を自動検知するまでの学習過程を綴っていきます。

ディープラーニングの仕組み

ディープラーニングの仕組み

これからディープラーニングの仕組みについて分かったことを書いていこうと思います。

ニューラルネットワーク

ディープラーニングは人の脳をモデルとしたニューラルネットワークが原型であり、脳の神経ネットワークには神経細胞であるニューロンと、隣接するニューロンを結合する部分のシナプスがあります。

ニューロンからの電気信号が一定以上の信号になると、シナプスを経由して次のニューロンに信号が伝達されます。 ニューラルネットワークでは、ニューロンノードシナプスエッジと呼び、ノード間が接続されてネットワークを形成しています。

ニューラルネットワークの構造

ニューラルネットワークの構造

図の〇がノード、〇と〇を繋ぐ線がエッジとなります。
そして、ディープラーニングでは隠れ層が多段になっています。

活性化関数

エッジで繋がれた前のノードからの出力値にエッジの重みをかけて合算し、その合算値を活性化関数に通すと、そのノードの出力値になる。
活性化関数にはシグモイド関数ReLU(ランプ)関数などがある。

活性化関数とは入力値がある閾値を超えると大きな値を返すもので、電気信号が一定以上になると次のニューロンに信号が伝播されるという事を模したものだと思われます。

ディープラーニングの計算

ディープラーニングの計算

上図のn1の出力を計算する方法は、
・活性化関数(x1 * w1 + x2 * w2 + x3 * w3)
という事になる。

誤差逆伝播

ニューラルネットワークでは、出力値と正解値の誤差を出力から入力に向かって逆に伝播して誤差を減らすようにでき、この方法を誤差逆伝播法(バックプロパゲーションというようです。

バックプロパゲーション

バックプロパゲーション

誤差の算出と重みの更新を繰り返して、理想的な重みに近づけるようにしていきます。このような計算方法を勾配降下法と言うようです。

機械学習とディープラーニングの違い

機械学習ディープラーニングの違い

そもそも機械学習とは何なのかをwikipediaで調べてみました。

人間が自然に行っている学習能力と同様の機能をコンピュータで実現しようとする技術・手法のことである。

なるほど、そのまんまですね^^;

 

機械学習には教師データの有無で分類できるようで、以下のサイトが図入りで非常に分かりやすいと思います。
教師あり学習と教師なし学習 (Vol.9)

 

そして、同じくディープラーニングwikipediaで調べてみました。

ディープラーニングまたは深層学習とは、多層のニューラルネットワークによる機械学習手法である。

※読みやすくするため注釈は省いています。

 

つまり、
機械学習の手法の中の1つにディープラーニングがある。
という事のようですね。
また、ディープラーニングには「画像や音声データの解析制度が高い」特徴があるらしく、今回のゴールには適している機械学習であると思います。

最初の一歩

一番参考になった記事

そもそもディープラーニングの仕組みについて全く分からない状態なので、
初心者向けと思われるネットの記事や書籍は結構な数読み漁りました。

個人の好みもあると思いますが、私の中で一番理解しやすかったのがこのサイトです。
ニューラルネットワークと深層学習

もちろん記事の内容のほんの僅かしか理解できていないのですが
以下に後述の通り、現実的な例を挙げて説明されているため、その部分が個人的には理解の助けになりました。

まずはパーセプトロンから

ディープラーニングの前に、恐らく基本中の基本であると思われるパーセプトロンの項は是非読んでみてください。第1章の冒頭で説明されています。
私は3回はこの個所を読み返したと思います。

具体例で考えると意外と簡単?

第1章に「チーズ祭り」を題材に簡単な現実的な例を挙げて説明されているのですが、これを読んだときにピンときました。
また、この「チーズ祭り」を自身の身近な例に置き換えると更にピンときました。

私の場合だと「仕事終わりに飲みの誘い」があった場合でしょうか。
この場合、結果に与える影響としては、

  1. 早く帰って娘と遊びたいか?
  2. 財布の具合はどうか?
  3. 仕事の進み具合はどうか?

が考えられ、これを「チーズ祭り」同様に考えてみると理解が進んだように思います。

結局のところ

言葉だけを聞くと相当難しいことをやっていそうな感じがするのですが、
結果に影響を与える複数の入力があり、それぞれの入力には重みがあって、重みを加味した入力値の合算が次のパーセプトロンに伝播していき、それを繰り返していって、最終的に出力が求まる

そして、
入力から出力までの間に伝播していくパーセプトロン層が沢山あるから"ディープラーニング"
なのだと、自己理解しました。
※あくまで私の解釈なので本来のディープラーニングの意味合いと異なるかも知れません。

きっとライブラリが裏では複雑な計算をやっていると思うのですが、
ざっくりとした概念だけに焦点を当てるとそんなに複雑な訳ではなさそうだと思えてきました。

ゴールを決める

勉強を始めるにあたって最初に「ゴール」を決めたいと思います。
あれもこれもと欲張ると結局終わらなくなるパターンなので、
必要最低限をゴールに定めたいと思います。

ゴール

"ラズベリーパイにWebカメラを接続し、笑顔を自動検知してカメラ画像を保存する"

既に既存のデジカメとかに入っていそうな機能ではありますが、これを自作してみたいと思います。

達成に必要な項目

ゴールから逆算して考えてみました。
ディープラーニングの仕組みを理解
・いわゆる"Hello,World!"とも言える数字識別(MNIST)を実践
ラズベリーパイで顔認識
・笑顔を認識(検知)する

かなりざっくり分けるとこんな感じでしょうか。
いきなり笑顔の認識を行うには壁が高いので、まずはMNISTで基礎を学ぼうとしています。
前途多難な感じがしますが、1歩ずつ地道に取り組んでいこうと思います

はじめに

このブログは、 ディープラーニングについて全くの初心者にも関わらず

"愛する娘の笑顔を自動検知して写真に残したい"

という願いを叶えるために無謀にも果敢に挑戦してい1人のエンジニアの爪痕を記したブログです。

 

同じようにディープラーニングについて興味はあるけども分からないような方たちに

少しでも役立てたらと考え、勉強したことをブログに残していきたいと思います。

 

独学でやっているため誤りも含まれているかもしれませんが、

有識者の方がいらしたら、ぜひご指摘いただければ幸いです。

 

無事に笑顔を自動検知することができるのか!?