あどりぶろぐ=adli"B"log

表情認識を研究する海なし県民のブログ

CNNを用いた表情認識技術とそれを用いた映像コンテンツ推薦アルゴリズムの開発

f:id:shubarie:20171015175014p:plain 

 

研究内容紹介

僕は高専に6年間通っています。

 

…6年間とか小学生かよ!とツッコまれるかもしれませんが、中学を卒業した瞬間から工学のことが学べて、大学生が卒業するころには3年間の一貫した研究を修了しているというアドバンテージが高専生(専攻科生)にはある!…と思っています。

 

僕はその一貫した研究の2年目です。

 

研究テーマは「CNNを用いた表情認識技術とそれを用いた映像コンテンツ推薦アルゴリズムの開発」です。

 

このテーマは与えられたものではなく自ら考えだしたテーマなので、研究の意義があるのかという部分がいささか不安ではありますが、簡単に説明すると、動画を見ている被験者の表情をディープラーニングを使って認識して、その表情データを利用して被験者が好みそうな動画を推薦するアルゴリズムを開発する研究です。

 

簡単に説明するって言ったけどちょっと日本語的にややこしくなってしまった(;'∀')

 

先述したように高専(専攻科)では3年間の一貫した研究が行えますが、僕の場合は、

 

1年目は表情認識モデルの開発と検証

2年目は表情認識率の向上(教師データの拡張、転移学習等)・被験者の表情認識

3年目は推薦アルゴリズムの開発と検証

 

というスケジュールで研究を行っており、週に1回指導教員への報告会とミーティングがあるという状況です。

 

成果物とその解説

 

まずは今までの成果物(スクリプト群)を公開します。

(今日段階での成果を残しておきたいからbranchで分けてみたんだけどこういう使い方で良いだろうか…笑)

 

github.com


 

training_model.py⇒realtime_recognition.pyの順に実行すればとりあえずは動くと思います。

 

ただ、Githubの仕様上(?)dataの一部は省かれてしまったので、後述する方法でdataを別途用意してください。

 

ここで、それぞれのモジュールについても簡単に説明しておきます。

 

training_model.py

実行すると学習モデルを構築して、データセットから学習を行うスクリプト。学習したなかで最もAccuracyが高かった時の重みデータと、学習のログを吐き出す。モデルは下図のような構成になっている。

DatasetクラスとModelクラスが格納されており、モデル構築や学習にはKerasを使っている。

f:id:shubarie:20180209143344p:plain

学習モデル

realtime_recognition.py

OpenCV3でハードウェアカメラにアクセスして、ループで画像をプレビューしながらそこにフレームごとの表情認識結果をオーバーレイするスクリプト。直感的に認識精度を感じられるように作った。主にModelクラスのpredictメソッドを動かしている。

f:id:shubarie:20180209151936g:plain

リアルタイム表情認識の様子

このデモではPC画面で流している動画の登場人物をWebカメラで撮影して表情認識しています。

evaluation.py

新しい入力をラベルとセットで与えてテストする(=認識率を計算する)。複数の入力を与えて全体の認識率を計算することができるため、モデルの有用性がわかる。

主にModelクラスのevaluateメソッドを動かしている。

 

f:id:shubarie:20180208151434p:plain

リアルタイム表情認識とテスト それぞれのフロー

 

ちなみに、先日実験的にお笑い芸人のコントを視聴する自分の顔をrealtime_recognition.pyで保存し、evaluation.pyで表情認識率を計算したら、84.55%だった。

 

なお、学習に用いているデータは、以下のような特徴のもので、convert_fer2013.pyで画像として書き出した後に、基準(複数の顔が写っている、横を向いている等)に則っていくつかの画像を省いた上でその9割を学習モデルにぶち込んでいます。残りの1割はテスト用です。

 

fer-2013データセット

Challenges in Representation Learning: Facial Expression Recognition Challenge | Kaggle

表情の発現した画像データのピクセル値をcsv形式でまとめたデータセット。元画像はGoogle画像検索からスクレイピングしたもので、それぞれの画像に(0=Angry, 1=Disgust, 2=Fear, 3=Happy, 4=Sad, 5=Surprise, 6=Neutral)でラベル付けされている(っぽい)。枚数は36000枚弱で、すべてグレースケールかつ48x48の大きさにリサイズされている。

 

convertor_fer2013.py

 データセットをpandasで読み込んでnumpyでreshape、その後PIL(Python Image Library)で画像として書き出すスクリプト。書き出す際にラベルごとにディレクトリを分ける
 

課題点と今後の展望  

・顔領域認識の精度の低さ

映像コンテンツを視聴する人の顔が認識できれば良いので正面顔を認識できれば良いのですが、OpenCV3標準の顔領域認識では顔周りの装備品(メガネやマスク)、光の当たり方によって認識できない場合が多く難航しています。

 

・コンフュージョンマトリクスの表示

何をどれだけ誤認識したか知るために、evaluation.pyでコンフュージョンマトリクスが生成されるようにしたい。

 

・多様な動画を視聴して表情認識を行う

推薦アルゴリズムを開発するための知見の入手が目的です。

 

・撮影した顔画像群を効率的に分類するGUIアプリを作成する

現在は大量の顔画像を撮影⇒手作業でラベル付け(フォルダ分け)⇒テストという手順でテストを行っているのでこれを効率化するためのGUIアプリを作ろうかと考えています。

 

来夏の学会発表があるからちょっと焦ってる←

 

 

 

つづきます⇒

 

 

Pyhtonのスクリプトをコマンド1つで実行ファイル(.exe)化する

f:id:shubarie:20171116023627p:plain

 

はじめに

Pythonスクリプトを別のPCでも気軽に動かしたい

Pythonスクリプトを実行ファイル化して配布したい

こういうこと、ありませんか?

 

僕は、他言語を勉強するのが億劫でついついなんでもPythonで作ってしまいます。

 

わりとなんでも作れてしまうのがPythonのいいところではあるのですが、さすがにスクリプト言語だし実行ファイル化するのは無理だよな~。

 

そう思っていた時期もありました。

 

「起動が遅い」「ファイルサイズが大きくなる」といったデメリットはあるものの、Pythonスクリプトを実行ファイル化することはできます

 

しかもコマンド1つで!

 

今回使うのはPyinstallerです。

PyInstallerはPythonプログラムをWindowsLinuxMac OS XFreeBSDSolarisAIXスタンドアロンの実行可能ファイルにフリーズ(パッケージ化)するプログラムです。

公式サイトより引用

ステップ1 Pyinstallerをインストール

今回はAnaconda3の仮想環境上でPyinstallerを使います。

Anacondaを導入していない方は、以下の記事で最も簡単な環境構築方法を解説しているので、参考にしてください。

adliblog.hatenablog.com

仮想環境をactivateにした後、以下のコマンドでAnaconda上のPyinstallerパッケージを探してください。自分のOSに適合したパッケージが見つかるはずです。

anaconda search -t conda pyinstaller

 

良さげなパッケージを見つけたら、以下のコマンドでパッケージのインストール方法を閲覧してください。僕は「conda-forge/pyinstaller」という名前のパッケージを選択しました。

anaconda show conda-forge/pyinstaller

 

一番下のほうにインストールのコマンドが表示されているので、それを実行することでPyinstallerと共に、依存関係のあるライブラリも同時にインストールされます。

conda install --channel https://conda.anaconda.org/conda-forge pyinstaller

ステップ2 Pyinstallerを使ってスクリプトを実行ファイル化

スクリプトを実行ファイル化するのはコマンド1つで出来てしまいます。

pyinstaller yourprogram.py

 

コンソールを起動してほしくない場合や、ファイルを一つにまとめたい場合、古い実行ファイルを削除したい場合は以下のようにオプションを付けましょう。

pyinstaller yourprogram.py --noconsole --onefile --clean

 

肝心の実行ファイルは、カレントディレクトリ配下のdistディレクトリの中に生成されていますので、煮るなり焼くなり好きにすると良いでしょう。

おまけ トラブルシューティング

導入時に実際に起こった問題と、その対策をメモします。

トラブル1 実行ファイル起動時にエラーが出る

 実行ファイルを起動するとこんなエラーが…

f:id:shubarie:20171116021121p:plain

実行時のエラー

なんかQtのプラグインが見つからなかったとかなんとか言ってます…

 

ggったら解決方法が見つかりました。

https://plus.google.com/+rikitoy/posts/1bVKdQy33dz

 

どうやら、以下のディレクトリの配下のplatformsディレクトリを、実行ファイルのあるディレクトリにコピーすればエラーが解消されるようです。

[Anaconda3インストールディレクトリ]\envs\[仮想環境名]\Library\plugins\

Raspberry pi 3 + 3.5インチタッチディスプレイの最も簡単なセットアップ方法

f:id:shubarie:20171103154640p:plain

はじめに

 

ラズパイでIoTゲームを作りたい

 

そんな思いを胸に、今回はRaspberry pi 3 Model Bと3.5インチHDMI-LCDタッチディスプレイを購入しました!(他人の金で)

 

しかし、セットアップ完了までに紆余曲折あったので、最も簡単だった方法をまとめておきます。

 

購入した3.5インチタッチディスプレイ↓

www.amazon.co.jp

 

レビューを見て分かったんですが、どうやらこの商品はWaveshareというメーカーの3.5インチタッチディスプレイをパクリスペクトしたもののようです^^;

 

しかし、そのおかげで、同メーカーのディスプレイのセットアップ方法をそのまま使用することができました。

 

参考にしたページはこちら↓

3.5inch HDMI LCD - Waveshare Wiki

 

ところで、Raspberry pi のOSをセットアップする際はNOOBSを使用するのが一般的だと思いますが、このタッチディスプレイはなぜかNOOBSを使って導入したOSには対応していない模様…

 

そのため、タッチディスプレイのドライバがインストールされた状態のOSイメージを直接、microSDカードに書き込んでいきます。

 

なお、ここからはWindows10での作業になります。他OSの方は以下リンクが参考になるかと思います。

Mac

ラズパイに LCD をつける苦闘 - Qiita

Linux(ステップ2以降)

Raspberry Pi Image Installation Guides - Waveshare Wiki

 

ステップ1 microSDをフォーマットする

何らかの方法でmicroSDFAT32形式でフォーマットしてください。

 

ここでは、SDメモリカードフォーマッター - SD Associationというソフトを使います。

 

インストール後は、指示に従ってmicroSDをフォーマットします。

f:id:shubarie:20171103141104p:plain

microSDのフォーマット

ステップ2 OSイメージを用意する

以下のリンクから、タッチディスプレイのドライバがインストールされた状態のOSイメージをダウンロードして解凍します。

https://drive.google.com/uc?id=0BwbgcecjOmBqdk5qOVJCMlJKcVk&export=download

 

ステップ3 OSイメージをmicroSDに書き込む

以下のリンクから、イメージ(.imgファイル)をメディアに書き込むことができるソフトのインストーラーをダウンロードし、指示に従ってインストールします。

Win32 Disk Imager download | SourceForge.net

 

ステップ2でダウンロードしたOSイメージと、microSDが入っているディスクを選択し、microSDに書き込みます。

 

f:id:shubarie:20171103143457p:plain

OSイメージの書き込み

少し時間がかかるので、この間に一服しましょう。

 

・・・

 

数分後、書き込みが完了したので、 早速、microSDとディスプレイを装着して電源投入!

f:id:shubarie:20171103154640p:plain

3.5インチ タッチディスプレイが完成

おお!タッチができる!!

 

おまけ トラブルシューティング

導入時に実際に起こった問題と、その対策をメモします。

トラブル1 OSが起動しない

問題:

OSイメージをmicroSDに書き込み、電源投入したが、起動途中でOSがフリーズする

 

対策:

ディスプレイに適合したOSイメージをダウンロードする

 

ダウンロードしたOSイメージが、間違ったものだったためにこの問題が起きたようです。

 

以下のページのDisplaysの項で、自分のディスプレイに適合したページに飛び、そこからOSイメージをダウンロードしましょう。

Waveshare Wiki

f:id:shubarie:20171103160220p:plain

Waveshare Wiki

トラブル2 タッチの反応が異常

問題:

タッチができるようになったが、タッチとその反応に位置的なズレが生じる

 

対策:

TouchscreenのCalibrationを行う

 

以下を参考に、「Calibrate Touchscreen」をRaspberry PI 3にインストールし、それを使ってキャリブレーションしましょう。

3.5inch HDMI LCD #Touch_screen_calibration - Waveshare Wiki

 

「Calibrate Touchscreen」でキャリブレーションを行う際は、シャーペンなどの先がとがったもので行うと、正確にキャリブレーションできると思います。

【Python】たったの3ステップで今話題の機械学習に入門【Keras】

f:id:shubarie:20171015175014p:plain

はじめに

Pyhtonで書ける機械学習ライブラリKerasの開発環境作りの解説です。

Kerasは、Pythonで書かれたTensorFlowまたはTheano上で実行可能な高水準のニューラルネットワークライブラリです
KerasはPython 2.7-3.5に対応しています

筆者のPC環境

adliblog.hatenablog.com

ステップ1 Anacondaをインストールする

Anacondaは、いくつかあるPythonのインストール方法のうちの1つです。

僕が知る中で最も簡単で、最も使いやすい方法なのでお勧めします。

導入方法を説明します。

公式からインストーラーをDLしてきて実行する

そう、これだけです。
面倒な設定は一切なく、Pythonとメジャーなライブラリが使えるようになります。

ステップ2 仮想環境を作成する

仮想環境を作ることで、ライブラリのバージョンや互換性で発生する問題への対処が楽になります。

Python本体のバージョン切り替えもできます。

ターミナルを開いて以下のコマンドを実行してください。

conda create --name test python=3.5

「test」という名前のPython3.5の仮想環境を作ることができました。

以下のコマンドで仮想環境に入ることができます。

activate test

以下のコマンドで仮想環境から抜けることができます。

deactivate

ステップ3 Kerasをインストールする  

仮想環境上にはライブラリをインストールすることができます。
Kerasとその使用に必要なtensorflowを以下のコマンドでインストールしましょう。

TensorFlow CPU版
pip install tensorflow
TensorFlowGPU版
pip install tensorflow-gpu

Keras
pip install keras

うまく動かない場合はバージョンの互換性を確認してみましょう。

使い方

Pythonでのプログラミングは、

ソースコード(スクリプト)を記述して
②ターミナル等で実行する

というサイクルで行われます。

Kerasを使ったスクリプトの記述方法はここが参考になるでしょう。
なんと公式ドキュメントに日本語版があるのです。

そこがKerasのいいところですよね。

公式ドキュメントで、ある程度書き方に慣れたら、公式のサンプル集で何かを実装してみましょう。

今回はこれでおしまいです。
もっと簡単な方法があったらぜひ、コメント欄で教えてください。

【レビュー】ドスパラのBTOパソコンはコスパが良い⁉【1年間使用】

f:id:shubarie:20171004030042p:plain

はじめに

1年前にドスパラBTOしたデスクトップパソコンの紹介です。

BTOとはBuild To Orderの略で、「受注生産」を意味します。 既製パソコンより詳細にパーツ構成(メモリ・ハードディスクなど)をカスタマイズすることが可能です。予算や用途などのご希望に応じて自由に選べるのが魅力です。

構成

値段

120,000円ちょい

レビュー

1年間使ってみて、なかなかコスパが良いなと感じました。

CPUを高性能にして、RAMも大きく確保したので…

Chromeで動画流しつつ
Atomでコードを書き
コマンドプロンプトでプログラムを実行

みたいな使い方をしていても、一度もフリーズはしませんでした。

あと、SSDにしたおかげで起動がめちゃくちゃ速いです!
しかもキャンペーンでSSD240GB→480GBが無料だった。ドスパラすごい。

ゲームや機械学習GPUを酷使することもありますが、GTX960でそれほどストレスを感じず使えています。

例えば…

①SteamのDead by Daylight(ホラーアクションゲーム)が最高画質でカクツキなく動作する
②17層のCNNで48×48の画像約30000枚の学習が30分で終わる

f:id:shubarie:20171004022816p:plain

でも、黒い砂漠(MMORPG)で多人数が画面上にいるとさすがにカクカクします。
妥協したくない人はGTX1080等もっと良いものを買ったほうがいいかも。

でも、お金、大事ですからね。笑

とりあえずそこそこのPCが欲しい!

って考えの人は、PCケースだけは大きめにしておいて、中身は必要になったら拡張!

って買い方がいいんじゃないかなあ。