2015 年度 卒業論文 表情認識システム 指導教員白井英俊教授 中京大学情報理工学部機械情報工学科 学籍番号 氏名 H412074 中川将成 (2016 年 1 月 )
卒業論文要旨 題目 表情認識システム 学籍番号 H412074 氏名中川将成指導教員白井英俊 近年 笑顔を認識して自動的にシャッターをきる機能を搭載したデジタルカメラが発売されており 機械が笑顔を認識する機能が実用化されるようになった それもかなりの精度で認識してくれたり 笑顔の認識の強さを変更できる機能までついている しかし 笑顔以外の表情を認識して何かしてくれる商品はまだ世の中には出回っていないように見受けられる そのような笑顔を認識する機能の仕組みに興味が沸いたと同時に 自分で表情を認識する機能を持ったアプリケーションを作成してみたいと思ったことが本研究を進めるきっかけである 本研究を進めるにあたって OpenCV という画像処理ライブラリと Labellio という深層学習を用いた Web プラットフォームの 2 つを用いて表情の認識を行った OpenCV を用いようと思った理由は フリーソフトでありながら 物体認識の実績をいくつもあげており ゼミでも導入の部分をふれたことがあったためである 二つ目に Labellio を用いて研究を進めたが これは画像分類器を手軽に作成できるというのがこれを採用した大きな理由である OpenCV の研究は次のように行った まず分類器で分類するための元となる笑顔の画像と笑顔ではない人の表情の画像を集め 一枚ずつ分類していく 分類した画像を分類器に学習させ 出来た分類器に笑顔の画像とそうでない画像を分類器に通してシステム評価をするという流れになる しかし 分類器がうまく動作せず 笑顔の画像を認識できなかった そこで 白井教授や同期のゼミ生からの紹介で 比較的容易に画像分類器を作成できる Labellio を用いて分類器を作成するに至った この Labellio を用いた研究は まず笑った顔 悲しそうな顔 驚いている表情 怒っている表情の 4 種類の画像を各 50 枚ほど用意し Labellio 上にアップロードする そしてアップロードした画像をそれぞれ表情別に分類し しばらくすると分類器が出来る 出来た分類器の精度は 59% だったが 表情によって正しく認識される表情と誤って認識される表情に差が出る結果となった 具体的には笑顔と悲しそうな顔の認識率は 80% だったのに対し 怒っている顔の認識率は 60% 驚いている顔の認識率は 30% になった これは怒っている顔と驚いている顔の部分に似ているところがあり お互いの認識率を低下させたためだと思われる 笑顔とそれ以外の表情を認識するという観点では満足いく結果になったが 表情を認識するという観点ではまだまだ問題が残る結果になった
目次 1. はじめに... 1 2. 研究の構成... 3 2.1 OpenCV... 3 2.2 OpenCV を用いた表情認識システムの構成... 3 3. 画像収集... 4 3.1 画像収集... 4 3.2 画像の分類... 4 4. 分類器の作成... 6 4.1 分類器の作成... 6 4.2 HAAR-LIKE 特徴量... 6 5. システム評価... 7 5.1 システム評価... 7 6. 考察... 8 6.1 考察... 8 6.2 改善案... 8 7. 修正研究計画... 9 7.1 修正研究計画... 9 7.2 深層学習... 9 7.3 Labellio... 9 7.4 Labellio を用いた分類器の作成の手順... 10 8. Labellio を用いた研究結果... 11 8.1 分類器の精度... 11 9. 考察 展望... 14 i
9.1 考察... 14 9.2 展望... 14 謝辞... 15 参考文献... 16 付録... 17 ii
1. はじめに 近年 笑顔を認識して自動的にシャッターをきる機能を搭載したデジタルカメラが発売されており 機械が笑顔を認識する機能が実用化されるようになった それもかなりの精度で認識してくれたり 笑顔の認識の強さを変更できる機能までついている しかし 笑顔以外の表情を認識して何かしてくれる商品はまだ世の中には出回っていないように見受けられる そのような笑顔を認識する機能の仕組みに興味が沸いたと同時に 自分で表情を認識する機能を持ったアプリケーションを作成してみたいと思ったことが本研究を進めるきっかけである 本研究を進めるにあたって OpenCV という画像処理ライブラリと Labellio という深層学習を用いた Web プラットフォームの 2 つを用いて表情の認識を行った OpenCV を用いようと思った理由は フリーソフトでありながら 物体認識の実績をいくつもあげており ゼミでも導入の部分をふれたことがあったためである 二つ目に Labellio を用いて研究を進めたが これは画像分類器を手軽に作成できるというのがこれを採用した大きな理由である OpenCV の研究は次のように行った まず分類器で分類するための元となる笑顔の画像と笑顔ではない人の表情の画像を集め 一枚ずつ分類していく 分類した画像を分類器に学習させ 出来た分類器に笑顔の画像とそうでない画像を分類器に通してシステム評価をするという流れになる しかし 分類器がうまく動作せず 笑顔の画像を認識できなかった そこで 白井教授や同期のゼミ生からの紹介で 比較的容易に画像分類器を作成できる Labellio を用いて分類器を作成するに至った この Labellio を用いた研究は まず笑った顔 悲しそうな顔 驚いている表情 怒っている表情の 4 種類の画像を各 50 枚ほど用意し Labellio 上にアップロードする そしてアップロードした画像をそれぞれ表情別に分類し しばらくすると分類器が出来る 出来た分類器の精度は 59% だったが 表情によって正しく認識される表情と誤って認識される表情に差が出る結果となった 具体的には笑顔と悲しそうな顔の認識率は 80% だったのに対し 怒っている顔の認識率は 60% 驚いている顔の認識率は 30% になった これは怒っている顔と驚いている顔の部分に似ているところがあり お互いの認識率を低下させたためだと思われる 笑顔とそれ以外の表情を認識するという観点では満足いく結果になったが 表情を認識するという観点ではまだまだ問題が残る結果になった 1
第 2 章は OpenCV や OpenCV を用いた表情認識システムの構成について説明する 第 3 章では 画像の収集方法や画像の枚数 画像の分類の仕方について述べる 第 4 章では 分類した画像を用いて分類器を作成する手順や HAAL-LIKE 特徴量 LBP 特徴量 HOG 特徴量について述べる 第 5 章では 第 4 章で作成した分類器に画像を通したときの反応について述べる 第 6 章では分類器の問題点や改善案の提起を行う 第 7 章では Labellio や深層学習 Labellio を用いた分類器を作成する手順を説明する 第 8 章では Labellio を用いて作成した分類器の精度や各表情の認識率を示す 第 9 章では Labellio を用いて作成した分類器についての考察 展望について述べる なお 本研究で OpenCV の分類器を動かすためのプログラムや分類器をテストするための画像を付録に載せた 2
2. 研究の構成 本研究は OpenCV や Labellio を用いて表情認識を行うシステムについて述べたものである 本章では まず OpenCV やそれを用いた表情認識システムの構成について説明する 2.1 OpenCV OpenCV とは Intel によって開発された 画像認識に関連する機能のライブラリのことである OpenCV は コンピュータビジョンと呼ばれる画像認識 解析に関するコンピューティング技術が主な用途として想定され 画像処理 モーション解析と物体追跡 パターン認識 機械学習などが実装されている 2.2 OpenCV を用いた表情認識システムの構成本研究で設計した表情認識システムの構成を図 1.1 に示す まずいろいろな表情の画像を集め 次に集めた画像を検出したい表情 ( たとえば 笑っている 顔や 怒っている 顔 ) の画像とそれ以外の表情の画像に分類する この 2 種類の画像を OpenCV の機械学習により分類器を作成する そして この分類器に画像を与え 検出したい表情の画像かそうでない画像かを判定させる ここでは 検出対象の表情を笑顔とした そのため 笑顔の画像をポジティブ それ以外の画像をネガティブと呼ぶことにする 画像収集 画像の分類 分類器の作成 システム評価 図 2.1 表情認識システムの構成 3
3. 画像収集と分類 本章では 画像の収集方法とその分類の仕方について述べた章である 3.1 画像の収集画像の収集は Google 画像検索を用いて一枚一枚保存していたが 時間と手間がかかるため ImageSpider という画像収集アプリケーションを用いた この ImageSpider は収集したい画像のキーワードや画像のサイズ 種類 ( 顔 イラスト 写真など ) 色 取得枚数などを指定すると Google から自動的に画像を集めてくれるアプリケーションである これを用いて ポジティブの画像とネガティブの画像をあわせて約 5000 枚ほど集めた 3.2 画像の分類集めた画像を SHKH(2012) が提供しているツールを用いてラベル付けしていく ポジティブの画像であれば 図 3.1 のように顔の部分を囲み NEXT ボタンをクリックする ネガティブの画像であれば何もせず 単に NEXT ボタンをクリックする これにより 画像ファイルをポジティブとネガティブに分類すると同時に 識別する顔の範囲が記録されるというツールである 顔に回転がかかっていたり 顔のイラストになっているものはどちらにも分類せずに除いて ポジティブの画像を 702 枚 ネガティブの画像 1255 枚集めた 4
図.3.1 笑顔と判断した画像 ( 赤枠が顔の範囲 ) 5
4. 分類器の作成 この章では 分類した画像を用いて分類器を作成する手順や HAAL-LIKE 特徴量 LBP 特徴量 HOG 特徴量について述べる 4.1 分類器の作成 3 章で述べたツールによりラベル付けした画像は ポジティブの場合は info.dat ネガティブの場合は bg.txt というフォルダに出力される そして ポジティブサンプルだけを opencv_createsamples プログラムに渡す このプログラムによって生成されるファイルに kawaii.vec という名前をつけた 次に この kawaii.vec とネガティブ画像ファイルのリスト bg.txt とをプログラム opencv_traincascade に渡してしばらく待つと分類器ができる ただし 出力ファイルが kawaii ディレクトリに保存されるので プログラムの使用前に kawaii ディレクトリを作っておく必要がある また opencv_traincascade はサンプルデータを学習させるためのコマンドであり 分類器に用いる特徴量を HAAL-LIKE LBP HOG の中から選択することができる 本研究ではデフォルトで設定されている HAAL-LIKE 特徴量を用いた 4.2 HAAR-LIKE 特徴量 HAAR-LIKE 特徴量とは 物体にある複数の明暗差を検出して 対象を検出するものである 画像の一部分を切り出し 局所的な明暗差を算出し この局所的な特徴をいくつも組み合わせることで 物体を判別できるようになる OpenCV で用いられる特徴量は他にも LBP(Local Binary Pattern) 特徴量 HOG(Histogram of Oriented Gradients) 特徴量がある LBP 特徴量は輝度の分布により特徴を捉え HOG 輝度の勾配方向の分布により特徴を捉える 6
5. OpenCV による分類器の評価 この章では 4 章で作成した分類器の評価を行う 5.1 システム評価 4 章で述べた分類器に 学習させていないポジティブの画像を通して ポジティブかネガティブかを判別できているかをプログラミング言語の Python を用いて付録.1 のプログラミングで検証する 分類器にポジティブの画像 ( 付録.2) を10 枚通した結果 10 枚全てがFalse( 認識できていない ) という結果になった 7
6. 考察と改善案 この章では なぜ分類器が画像を認識できなかった理由を考察し 表情認 識システムの改良案を提示する 6.1 考察分類器が画像を認識できなかった理由としては 学習データが少なかったことがまず考えられる また ポジティブデータの生成 (3 章参照 ) の際に 顔の領域として耳や髪を含めるか含めないかという基準がぶれてしまったため 質が統一できないデータとなったのではないか このため 表情という小さな変化に対応できるような HAAR-LIKE 特徴量を抽出できなかったのではないか と考えた 6.2 表情システムの改良案表情システムの改良案としては サンプル数の増加 顔を囲うときの基準を統一する HAAL-LIKE 特徴量の代わりに第 4 章で説明した LBP 特徴量や HOG 特徴量を用いるということが上げられる 本研究の計画段階ではどの特徴量が表情認識に向いているかは不明だったので HAAL-LIKE を用いたが HoG vs Haar-like feature ベンチマーク (http://d.hatena.ne.jp/htee2006/20080228/1204190976) によると 検出率は HOG 特徴量のほうが良いという結果になったという研究報告もある 8
7. 修正研究計画 この章では OpenCV を用いて出来なかった分類器の作成を Labellio を用いて作成する手順や Labellio の説明 深層学習について述べる 7.1 修正研究計画 OpenCV を用いて表情認識ができなかったので 今度は比較的容易に分類器を作成できるという観点から Labellio という深層学習を用いた Web プラットフォームを使って表情の判別を行うことを考えた 7.2 深層学習深層学習とは 多層構造のニューラルネットワークの機械学習のことである ( 人工知能学会 2015) 人工知能は人間と同じような計算や認識を機械にさせる機械学習のことである 人間や動物の脳はニューロンと呼ばれる神経細胞がシナプスと呼ばれる結合部位を介して多層結合してできている ということが示されていて それをニューラルネットワークといい ニューラルネットワークをモデルにして学習させるものが深層学習である 深層学習で用いられるニューラルネットワークはいくつかあり 以降の章で使用する Labellio では畳み込みニューラルネットワークが使われている 畳み込みニューラルネットワークは層の多いニューラルネットワークをうまく学習させるためのもので タスクに応じた結合構造をあらかじめ作り込むことで 結合重みの自由度を減らし 学習を容易にさせるというもののことをいう 畳み込みニューラルネットワークは ネオコグニトロン ( 吉塚 庄野 宮本 岡田 福島,2004) という生物の脳の視覚神経系の構造からヒントを得て S 層 ( 単純細胞層 ) と C 層 ( 複雑細胞層 ) を組み合わせた 2 層の神経回路を基本モジュールとしたものが元となっている S 層のノードは直前の層の出力の中に存在する特徴なパターンを検出し C 層のノードはS 層の出力を集めてC 層の出力とすることからプーリングと呼ばれる 7.3 Labellio Labellio(https://www.labell.io/ja) とは Alpaca 社がリリースした 深層学習を用いた画像分類器を作成できる Web プラットフォームである Labellio は AWS(Amazon Web Services) の GPU を搭載したマシンの上で動いていて モデル学習自体は Caffe のライブラリで使っている この Labellio を用いて笑顔や悲しそうな顔などの表情の画像をもとに分類器を作成する 9
7.4 Labellio を用いた分類器の作成の手順本研究で設計した Labellio を用いた表情認識システムの構成を図 7.1 に示す まず 第 3 章で使用した Google 画像検索と ImageSpider で顔の画像を集める 本研究では 笑顔 悲しそうな顔 怒っている顔 驚いている顔の 4 つの表情を約 50 枚ずつ集めた これらの画像を付録 3 に載せる 次に Labellio に画像をアップロードし 分類するラベルに名前を付ける 最後に 集めた画像を各表情に手動で分類する 分類が完了し しばらく待つと分類器が完成する 画像の収集 4 種類の表情の画像を約 50 枚ずつアップロード 分類させたいラベルの名前を付ける 画像をそれぞれのラベルに分別 システム評価図.7.1 Labellio を用いた研究計画の流れ 10
8. Labellio を用いた研究結果 べる この章では Labellio を用いた分類器の精度や各表情の認識率について述 8.1 分類器の精度 分類器が出来ると分類器の精度が出るようになっていて 本研究で作成し た分類器の精度は 59.06% であった 図 8.1 accuracy が分類器の精度 loss_0 が訓練データ loss_test がテストデ ータの学習曲線 次に 作成した分類器に各表情の画像を 10 枚ずつ分類器に通して評価した結果 を表に示す ここで使用した画像は学習用には使用していない画像で これら の画像を付録 4 に載せる 表 8.1 Lebellio を用いて作成した表所システムの性能評価結果 出力入力笑顔悲しそうな顔怒った顔驚いている顔 笑顔 悲しそうな顔 怒った顔 驚いている顔 8 2 0 0 2 8 0 0 1 1 6 2 3 1 3 3 11
以下に分類器に画像を通したときの代表例を示す 図 8.2 笑顔の画像の認識結果 認識率は egao の 1.00 12
図.8.3 驚いている顔の認識率 認識率は Odoroku の 0.50 図.8.4 悲しそうな顔の認識結果 Kanashii の 0.32 図.8.5 怒っている顔の認識結果 認識率は Okoru の 0.36 13
9. 考察 展望 この章では 分類器の考察や展望について述べる 9.1 考察 笑顔や悲しそうな顔の認識率は 80% と高く 怒っている顔は 60% 驚いている顔の認識率は 30% という低い結果となった 笑顔や悲しそうな顔は顔のパーツの変化が大きいため認識率が上がったと思われる また 怒っている顔と驚いている顔は似ている部分があり 実際に怒っている顔が驚いている顔に誤認識されていることが多く 逆に 驚いている顔が怒っている顔に誤認識されていることが多かった 9.2 展望 分類器の精度を向上させるためには 学習させる画像の枚数を増やしたり 顔の画像に回転がかかっていないものや画質のいいものを使うなどして画像の質を上げるなどが考えられる また Labellio は Caffe という C++ で実装され GPU に対応した高速なディープラーニングのライブラリを用いており作成されたネットワーク構造は Caffe を用いてファインチューニングできる そこで Labellio で作成されたネットワークをベースとして その構造の中間層を増やすなど改造することで精度を向上させることができるかもしれない 14
謝辞 本研究を行うにあたり ご指導いただいた白井英俊教授に感謝いたします ま た ゼミや卒業論文制作で助けていただいたゼミ生の皆様にも感謝いたします 15
参考文献 資料 htee HoG vs Haar-like feature ベンチマーク http://d.hatena.ne.jp/htee2006/20080228/1204190976 (2016 年 1 月参照 )Kurima s Page (2015) ImageSpider http://kurima.sakura.ne.jp/ (2015 年 10 月参照 ) Labellio (2015) https://www.labell.io/ja (2015 年 10 月参照 ) MkDocs (2015) Labellio とは? 参照 ) https://www.labell.io/static/manual/ja/ (2015 年 10 月 SHKH (2012). OpenCV 2.4.2 で分類器を作る http://shkh.hatenablog.com/entry/2012/11/03/052251 (2015 年 9 月参照 ) 桑井博之 豊沢聡 永田雅人 (2014) 実践 OpenCV for Python. 東京 : カットシステム. 人工知能学会監修. (2015) 深層学習: Deep Learning. 東京 : 近代科学社. 吉塚武治 庄野逸 宮本弘之 岡田真人 福島邦彦 (2007) ネオコグニトロ ンによる視覚腹側経路のモデル化. 日本神経回路学会誌 16
付録 1. プログラミング #!/usr/bin/env python import cv, cv2 tar = 'sample.jpg' im = cv2.imread(tar) cascade = cv2.cascadeclassifier('cascade.xml') # 分類器の指定 faces = cascade.detectmultiscale(im, 1.1, 3) # 物体の検出 for (x, y, w, h) in faces: print x, y, w, h center = (int(x+w/2), int(y+h/2)) radius = int(w/2+5) 画 cv2.circle(im, center, radius, cv.rgb(255, 20, 147), thickness=3) # 円の描 cv2.imwrite('result.jpg', im) 17
2. 第 6 章で分類器に通したときのポジティブの画像 18
3.1 Labellio の学習用に用いた笑顔の画像 19
20
3.2 Labellio で学習用に用いた悲しそうな顔の画像 21
22
3.3 Labellio で学習用に用いた驚いた顔の画像 23
3.4 Labellio で学習用に用いた怒っている顔の画像 24
25
4.1 Labellio を評価する際に用いた笑顔の画像 4.2 Labellio を評価する際に用いた驚いた顔の画像 26
4.3 Labellio を評価する際に用いた怒った顔の画像 27
4.4 Labellio を評価する際に用いた悲しそうな顔の画像 28