画像処理とか機械学習とか

画像処理や機械学習関連の事について気まぐれで書いていきます。歩行者検出関係が多いと思います。ハリネズミもたまに出現します。

赤外線カメラとRaspberry pi 3を用いたハリネズミ見守りシステムの構築

以前から紹介しているハリネズミですが、夜行性ということもあり夜どの様な行動をしているのか気になっていました。また、昼間居ない時の様子も外からチェックできれば良いなと思い、本システムを構築しようと思いました。

f:id:hiro2o2:20160322114154j:plain

この子の管理システムを構築していきます。

  • 必要な物

無線LAN環境
Raspberry pi 3

Raspberry pi 3を使う理由は最新版で無線LANBluetooth標準装備になったため、非常に使いやすくなったのが一つと、CPUが64bitに対応し動作クロックも1.2GHzになり、高性能になったのが主な理由です。


赤外線カメラ

 Raspberry pi用の赤外線カメラモジュールは安くて4000円代後半くらいでしたので、上記の1200円程の赤外線カメラを試しに購入してみたところ、USBで繋ぐだけで認識しましたので、上記のカメラをおすすめします。

マイクロSDカード

 SDカードは何でも良いですが、今回は32GBのものを使用します。

主にこの3つが必要となります。その他SSHで接続できるまでにUSBキーボードとUSBマウスが必要となります。

 

  •  SDカードへOSの書き込み

www.raspberrypi.org

 

 今回はRaspbianという、Raspberry pi 公式サポートのOSを使用しました。
上記サイトから、Raspbianをダウンロードし、Windowsの場合、下記URLで入手できる
Win32DiskImagerというソフトウェアを使用し、SDカードへダウンロードしてきたOSを書き込みます。
 私の場合、言語の設定を弄ってたりすると途中で何度か起動できなくなったので何度か書き込みを繰り返してます。

https://www.raspberrypi.org/documentation/installation/installing-images/windows.md


 

  •  Raspberry pi の起動

 マイクロSDカードスロットへOSを書き込んだマイクロSDカードを差し込みます。
そして、USBキーボード、USBマウスを接続し、電源に接続します。
電源は、5Vで2.5Aの出力のものが推奨されているみたいです。私はiPhoneの電源アダプターとUSBケーブルで接続して動作しています。出力アンペアが低すぎると動作が不安定になります。


 起動を行うと、特に何もせずにGUIの画面が表示されます。

まず、パーテーションの設定を変更します。標準ではOSがインストールされている部分が60MBしか無いため、このままsudo apt-get updateすると容量不足でエラーとなり、私の場合は起動出来なくなりました。

Raspberry Piでパーティションを拡張する – UbuntuによるEco Linuxサーバ構築記
上記リンクのサイトの通りにコマンドを入力するだけで、パーテーションの設定変更が行えました。

その後

$ sudo apt-get update
$ sudo apt-get upgrade

を行いましょう。

 

次に言語を日本語にしたい場合は、まずネットに接続の設定をした後、ターミナルを使って

$ apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname

を入力して日本語フォントを導入して下さい。

その後、左上のタブから設定を開き、GUIで言語の設定を変更した方が良いでしょう。
(一度ターミナルから変更しようとした際に起動不可となりました。)

 

  • Motionのインストール

$ sudo apt-get install motion

のコマンドを入力すると監視カメラのアプリケーションがインストールできます。
このアプリはかなり高性能で、動体検知、画像の撮影、動画の作成、ネットワークからのリアルタイム閲覧など様々な機能があるため、使いやすいです。

設定ファイルをいじる為にVimなどのテキストエディタをインストールします。

$ sudo apt-get install vim

$ sudo vim /etc/motion/motion.conf

上記コマンドでVimをインストールし、Motionの設定ファイルを開きます。
Vimは何かキーを入力すると入力モードになり、編集が可能となり、保存したい場合はEscキーを押して:wqを入力してエンターを押して下さい

そのままの設定だと解像度が低いのと、画像がキャプチャされてしまうので、容量不足にならないようにキャプチャのoff、ネットワークからのアクセスの許可を行います。

width 640
height 480framerate 30
output_normal off
webcam_localhost off
control_localhost off

この辺の設定を上記の様に変更して下さい。バージョンによって名前が違うかもしれませんが、似たやつを変更すればokです。変更後、Escキーを押して:wq入力後エンターで保存して終了出来ます。

$ sudo service motion start

を入力するとmotionを起動出来ます。

$ ifconfig

でRaspberry pi に割り振られたipアドレスを確認して下さい。
恐らく、192.168.1.* で*に何か他の数字が入っていると思います。ブラウザを開き、http://192.168.1.*:8081/
を開くと、カメラの映像を確認できます。

f:id:hiro2o2:20160322113739p:plain

こちらが、実際に動作させた画面になります。
iPhoneでも見れますので、便利です。また、外からアクセスする場合は、Raspberry pi のipアドレスの固定とポートの開放が必要ですので、そちらはまた紹介したいと思います。

今後は温度センサやArduinoとの連携をしていけたらなぁと思います。

Matlabでステレオカメラキャリブレーション

今回は、Matlabを用いた簡単なステレオカメラキャリブレーションの方法を説明します。

 コンピュータビジョンにおいて画像から手軽に三次元情報を取得する方法の一つとしてステレオ視があります。二つのカメラを用いて物体を撮影することで、人間の目のように立体的にとらえることが可能となり,二枚の画像の差から三次元情報を取得できます。一般的に使用するカメラは,カメラ毎に異なる焦点距離などのカメラの内部パラメータなどを持っており,このパラメータを求めることをカメラキャリブレーションと言います。
 ステレオカメラキャリブレーションを行うと,この内部パラメータだけでなく,二つのカメラ間の平行移動や回転などの外部パラメータを求めることが出来ます。
 

今回は、このVuzix社製のWrap1200DXARのステレオカメラを用いてステレオカメラキャリブレーションを行います。

f:id:hiro2o2:20160226223936j:plain

カメラキャリブレーションには、MatlabのStereo Camera Calibrationを利用し、チェッカーパターンを5つのシーンで左右のカメラから計10枚の画像を撮影して行います。以下に撮影した5つのシーンのうち2つのシーンの画像を載せます。

f:id:hiro2o2:20160226224134p:plain

f:id:hiro2o2:20160226224208p:plain

このように,MatlabのStereo Camera Calibrationを起動し,撮影した画像を選択するだけで自動的に対応点を探してくれます.こちらで行うのは画像を撮影し、選択するだけです。その結果が以下のようになりました。

推定されたカメラの内部パラメータ

f:id:hiro2o2:20160226224528p:plain

f:id:hiro2o2:20160226224534p:plain

f:id:hiro2o2:20160226224553p:plain

この図のように,大まかな撮影場所と二つのカメラの位置関係が取れていることが分かります。

 

 

ハリネズミを飼い始めました!!

最近Youtubeで一目惚れしてから飼うことに決めたハリネズミ
めちゃめちゃ可愛いです、本気でかわいいです。

f:id:hiro2o2:20160221220135j:plain

うちに来たばかりの様子
タオルにくるまって寝てます。これからハリネズミの家を作ります。

ZOZOTOWNの段ボールがあったのでこれで作ります。
まずハサミで一刀両断にします。

f:id:hiro2o2:20160221220329j:plain

次に100均で買ってきた断熱材を貼っていきます。
寒さに弱いのでなるべく寒さを防げるようにしていきます。

f:id:hiro2o2:20160221220450j:plain

全部貼り終わりました。
さらにこの上から段ボールを貼っていきます。

f:id:hiro2o2:20160221220538j:plain

作業してたらごそごそ聞こえてきました。
ご飯を食べてるようです。

f:id:hiro2o2:20160221220628j:plain

しばらく作業してると寝てました。
もうちょいで終わるから待っててね!

f:id:hiro2o2:20160221220730j:plain

ついに完成しました。
なかなかいい出来に仕上がりました。
ハリネズミちゃんは喜んでくれるでしょうか!?

f:id:hiro2o2:20160221220848j:plain

速攻で入っていきました。
喜んでくれたみたいです、寒さ大丈夫かな
パネルヒーター引いてるけど、暖突買った方がいいかなぁ。

f:id:hiro2o2:20160221221044j:plain

 

可愛いです。明日から論文の続き読みます。

【随時更新】歩行者検出の為のカスケード型検出器の学習(ICCV2015の論文読み)

今回はICCV2015の論文でまだ歩行者検出関係が有りますので読んでいきます。
カスケード型の識別器の学習の論文のようです.Deep Learningとも関係があるみたいで、Deep Modelの特徴をカスケード構造に組み込むようです。読みながらまとめていき、随時更新します。

 

参考論文:Learning Complexity-Aware Cascades for Deep Pedestrian Detection

http://www.cv-foundation.org/openaccess/content_iccv_2015/papers/Cai_Learning_Complexity-Aware_Cascades_ICCV_2015_paper.pdf

 

  • 概要

Complexity-aware cascaded detectorsという、複雑さが違った特徴量を組み合わせる構造が考えられた。

精度と複雑さの両方を考慮したリスクのラグランジュ最適化で学習を行う、新しいカスケードの設計手順が紹介された。
Complexity aware cascade training(CompACT)として示されたブースティングアルゴリズムは、この最適化を解くことで導き出される。

CompACTアルゴリズムは、カスケード構造の後半で特徴量を高次元へ射影することで精度と複雑さの間の最適なトレードオフを探す。

これは、検出器の中で非常に複雑な特徴量で利用が可能であるということを示している。結果として、特徴プールにCNNの出力のようなカスケード構造に利用するには実用的でないとされてきた特徴を使うことが出来るようになった。

CompACTカスケードは、CNNとシームレスに統合し、結果としてCaltechとKTTIデータセットで過去に提案されたものと比較しても、最も良い性能が出せ、かなり早い処理速度も実現している。

 

  • 関連研究と高速な人物検出

 人物検出は重要なタスクであり、多くの手法が存在し、リアルタイムでの動作が求められる。Sliding Windowの枠組みでは、640×480ピクセルの画像1枚から検出を行うのに、100万回計算を行うこともあり、かなり扱いづらい問題である事が分かる。
 人物検出の分野で、最新の手法としてDeep Learningを用いるDeep Modelsがある。また、高速な検出の手法としてカスケード構造が挙げられる。カスケード構造とはいくつかの識別の層を作り、初めの方の識別器は簡単な軽い計算の識別器を置き、徐々に後半の識別器になるにつれて厳しい判定の識別器を用いる手法である。このカスケード構造を取ることで、精度を落とすこと無く識別の計算コストを減らすことが出来る。

 

特徴量ベースの歩行者認識に関して

今回は、Deep Learningでは無く特徴量ベースの人物検出について簡単にまとめていきます。

  • 歩行者認識(Pedestrian Detection)とは?

 歩行者認識は、画像処理・パターン認識の分野で重要な課題で、毎年CVPRやICCVなどのトップカンファレンスでも幾つかの論文が見つかると思います。近年はDeep Learningを用いた手法が多い傾向があります。
 しかし、現状で、実用段階にあるのは昔からの特徴量ベースの手法が多く、Deep Learningは学習にかかるコストや、GPUなどの高価なハードが必要だったりとまだまだ課題が残されています。今回は、昔ながらの特徴量ベースの歩行者認識について説明していきたいと思います。

  • 歩行者見つけてどうするの?

 スバルのアイサイトをはじめ、「ぶつからない車」などの走行安全運転システムが普及してきており、人物検出・車両検出に期待が高まっています。このような人物検出や車両検出の研究は、日本だけでも東芝・日立・デンソーなどなど数多くの企業が研究を行っており、実際に車載のための画像処理LSIなどが実用化されています。歩行者を見つけるだけでなく、状態(異常行動等)を検出したり、歩いている方向やカメラからの距離などを推定したりと様々な事が出来るようになってきています。
 この分野の日本の学会はSSIIやMIRUなどが有名です。ぜひ足を運んでみてはいかがでしょうか?去年は私も発表してきました!

confit.atlas.jp

sites.google.com

  • 歩行者検出の為の特徴量

歩行者検出では、形状情報がよく使われており、輝度勾配という特徴がよく使用されます。輝度勾配とは、画像の暗いところから明るいところへの向きで、輝度値の差分で表します。

輝度勾配を用いる手法として人検出ではHOG特徴量が有名です。
HOG特徴量は、画像をセルという細かい格子状の領域に分割し、セルごとに輝度勾配のヒストグラムを作成していきます。ヒストグラムは4つのセルを一つのブロックとして、ブロックごとに正規化を行います。HOGをベースとした特徴量は数多く出されていて、Joint HOGやFIND、CoHOGなどがあります。
HOGはMatlabを用いて簡単に用いることができ、HOGを計算し、その可視化(画像のエッジの可視化)が以下のように簡単に表示できます。

f:id:hiro2o2:20160215224632j:plain

Matlabを用いると以下のように簡単に使えますが、アルゴリズムは簡単なので出来ればソースコードの中身を読むのをお勧めします。

%HOG特徴量の抽出
[hogfeatures,hog]=extractHOGFeatures(img);

%HOG特徴量の可視化
figure;
imshow(img); hold on;
plot(hog);

HOGをベースにした、東芝さんのCoHOGでは輝度勾配の共起に注目しています。
共起とは、二画素ペアの勾配共起を用いる手法で、HOGは二次元のヒストグラムですが、CoHOGでは二次元の勾配共起ヒストグラムを作成します。
この共起性を用いて他にもいろいろな特徴量が提案され、HOGの問題を解決しています。

  • 歩行者認識関連のさらなる情報

東芝レビュー・CoHOGについて
https://www.toshiba.co.jp/tech/review/2010/06/65_06pdf/rd01.pdf
https://www.toshiba.co.jp/tech/review/2011/02/66_02pdf/a04.pdf

デンソー・DeepLearningを用いた歩行者検出
【GTC2014】デンソーがディープニューラルネットワークとTegra K1を使った歩行者認識をデモ - Car Watch

中部大学・藤吉先生
FLAB : Computer Vision for Visual Surveillance and Mobile Robotics
http://www.vision.cs.chubu.ac.jp/CVTutorial/PDF/03ObjectDetection.pdf

ZMPGPUを用いた歩行者検出
www.youtube.com

画像と空間の座標での表現

カメラで撮られた画像中の位置から、実際の物体の位置をコンピュータービジョンにおいて、どのように表現しているかをまとめます。

  • 透視投影モデル

f:id:hiro2o2:20160214212935p:plain
空間を表す3次元座標には、カメラを中心としてみたカメラ座標系と、空間中のある位置を中心として考えたワールド座標系の二つがある。カメラ座標系は、上の図のようにカメラの光軸方向がZ軸となる。
ワールド座標系と、カメラ座標系の関係は以下のようになる。

{ \displaystyle
\begin{pmatrix}
X\\ Y\\ Z
\end{pmatrix}
=R\begin{pmatrix}
X_w\\ Y_w\\ Z_w\end{pmatrix}+t
}

{R}は3×3の回転行列を表し、{t}は3次元の平行移動ベクトルを表す。
つまりこの式は、ワールド座標系の原点からどれだけ回転して平行移動した所がカメラ座標系の原点かという事を表している。

  • 正規化画像座標と画像座標との違い

一般に、画像は長さの単位として画素を用いる。画素としての座標が{(u,v)}であり、一般的な座標として表しているのが正規化画像座標の{(x,y)}である。
正規化画像座標{(x,y)}と画像座標{(u,v)}との間には以下のような関係がある。

{\displaystyle x=\frac{d_u(u-c_u)}{f}}
{\displaystyle y=\frac{d_v(v-c_v)}{f}}

ここで、{f}はカメラの焦点距離{d_u, d_y}は縦方向と横方向の画素の間隔、そして{(c_u,c_v)}が画像座標系の光軸と画像との交点(画像中心)を表す。

 これは、カメラの内部パラメータとも呼ばれ、使用するカメラによって決まる定数である。したがって、実際に実験でカメラを使用する際は、カメラキャリブレーションによってカメラの内部パラメータを求める必要がある。また、{Rとt}はワールド座標系に対してのカメラの位置によって決まる定数なので、外部パラメータと呼ばれる。

  • 同次座標系を用いた表現

この分野において、画像の座標などのベクトルを同次座標系で表すことが多い。同次座標系とは以下のようなものである。
画像の座標等の二次元平面上の点を{(x,y,m)^t}という形で表現し、実際の座標値は{(x/m,y/m)^t}となる。
なぜわざわざ同次座標系を用いるかというと、平行移動も含めて座標変換を行列の形で表現できるようになるためである。つまり、同次座標系は数式を見やすくするために導入している。

EMアルゴリズム

今回は、前回の混合ガウスモデルに引き続き、混合ガウスモデルのパラメータ推定の手法に使えるEMアルゴリズムについて紹介したいと思います。

混合ガウスモデルを例に挙げますので、混合ガウスモデルが分からない方は前回の記事を参照してください。
hiro2o2.hatenablog.jp

混合ガウスモデルは以下の式で表せました。
{ \displaystyle p(x|\theta)=\sum_{j=1}^K \pi_jN(x|\mu_j,\Sigma_j) }
何か近似したい確率密度分布(真の分布)がある際に、混合ガウスモデルを使って近似する場合、最も真の分布に近づくような、パラメータ{ \displaystyle \theta }が分かれば良いです。

このパラメータ{ \displaystyle \theta }の学習に、通常のガウスモデルと同じように最尤推定を用い、対数尤度の最大化のアプローチで解けるでしょうか?

{ \displaystyle \hat{\theta}={\rm argmax}\sum_{i=1}^I\log(p(x_i|\theta))\\ ={\rm argmax}\sum_{i=1}^I\log(\sum_{j=1}^K\pi_jN(x_i|\mu_j,\Sigma_j)) }

このように、正規分布の和のlogの部分で、微分して0とおく計算が難しくなります。
また、重み{ \displaystyle \pi }を足し合わせて1であるという条件と、共分散行列{ \displaystyle \Sigma_j }が正定値であるという条件のもと、{ \displaystyle \theta }を最大にするのは困難です。つまり、この問題は解析的に解けません。

  • 隠れ変数の定義

ここで、{ \displaystyle z\in{1,...K} }のような変数{ \displaystyle z }を定義します。この変数{ \displaystyle z }を以下のように導入します。

{ \displaystyle p(x|z,\theta)=N(x|\mu_z,\Sigma_z) }・・・(1)
{ \displaystyle p(z|\theta)=\pi_z,  \sum_{l=1}^K \pi_l=1 }・・・(2)

ここで、混合ガウスモデル{ \displaystyle p(x|\theta) }は以下のようになります。

{ \displaystyle p(x|\theta)=\sum_{j=1}^K p(x,z=j|\theta)\\ = \sum_{j=1}^K p(x|z=j,\theta)p(z=j|\theta)\\ = \sum_{j=1}^K \pi_jN(x|\mu_j,\Sigma_j) }

まず一行目ではxの分布がxとzの同時分布を周辺化した物で表せることを示しており、二行目では、ベイズの定理よりxの分布とzの事前分布に分けられます。そして、(1)(2)式より、zを導入した式が、混合ガウスモデルになる事が分かりました。
f:id:hiro2o2:20160212200737p:plain
上の図を見ると分かるように、隠れ変数zはどの正規分布かを表し、xとzの同時確率というのは、一つの正規分布を表します。また、それらをzについて周辺化することで混合ガウスモデルが得られるという事を表しています。

やっと本題に入ります。隠れ変数zを含めた対数尤度の式は以下のようになります。

{ \displaystyle \hat{\theta}={\rm argmax}\sum_{i=1}^I\log(\int p(x_i,z_i|\theta)dz_i)}

{ \displaystyle B[\{q_i(z_i)\},\theta] = \sum_{i=1}^I\int q_i(z_i)\log(\frac{p(x_i,z_i|\theta)}{q_i(z_i)})dz_i \le \sum_{i=1}^I\log(\int p(x_i,z_i|\theta)dz_i)}
Jensenの不等式より、最大化したい尤度よりも常に小さい尤度の下界を{ \displaystyle B[\{q_i(z_i)\},\theta]}として定義し、この下界を大きくすることで尤度の最大化を行おうというのが、EMアルゴリズムです。

{ \displaystyle B[\{q_i(z_i)\},\theta]}を最大化するために、{ \displaystyle \theta}{ \displaystyle q_i(z_i)}を交互に求めて少しずついいものにしていきます。

・Eステップ
{ \displaystyle \theta}を固定して{ \displaystyle q_i(z_i)}を変更し、下界を最大化する

・Mステップ
{ \displaystyle q_i(z_i)}を固定して、下界を最大にする{ \displaystyle \theta}を求める

このようにEステップとMステップを繰り返すことにより、尤度を最大化し、最適なパラメータ{ \displaystyle \theta}を求めます。
f:id:hiro2o2:20160212202753p:plain
EMアルゴリズムの図的なイメージ

ただし、注意して頂きたいのが、最尤推定と同じく局所最適化などの問題を孕んでいる点など、様々な面において最尤推定の悪い部分も引き継いでいます。
しかし、実装の容易さと理解のしやすさから混合ガウスモデルのパラメータ推定によく用いられます。