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

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

ハリネズミ管理のためのArduinoを使った温度管理システムVer1.0

前回、ハリネズミを見守るためのRaspberry pi 3を用いたネットワークカメラの構築を行いました。こんな感じでiPhoneからも見れます。

f:id:hiro2o2:20160323213535p:plain


今回は、家で眠っていたArduinoを掘り出してきて、ちょっと賢い温度計を作ります。

  • 必要な物

Arduino uno
温度センサ(LM35)
LED(赤と青二つ)
抵抗
ワイヤ
フレットボード
USBケーブルなど

以下のセットで全て手に入ります。

 

家で眠っていて何か使えないかという事が一点と、LM35という温度センサーをraspberry piで使用するためにはAD変換しないと使用できないのがもう一点。
Arduinoはディジタルもアナログもいける子なのでこいつを使います。

 

f:id:hiro2o2:20160323213704j:plain

 配線はこんな感じで行いました。
LM35の温度センサの配線はこんな感じです。

f:id:hiro2o2:20160323213807j:plain

LEDは青と赤を使用し、一定間隔毎に計測した温度を元に、温度が20度より高く30度より低い時はちょうど良い温度なので青色のLEDを点灯させ、それ以外の時は寒すぎるか暑すぎるときなので、赤色のLEDを点灯させます。

ArduinoC言語で書いたソースで制御できるので、手軽に使用できます。
今回のソースコードは以下のようになります。

float a_in;          // アナログ入力値(0〜203)
float temp_c = 0;  // 摂氏値( ℃ )
int red_led = 2;
int blue_led = 3;
void setup(){
  Serial.begin(9600);  // シリアル通信速度
  pinMode ( red_led, OUTPUT);
  pinMode ( blue_led, OUTPUT);
}

void loop(){
  // アナログピンから計測値を取得(0〜203)
  a_in = analogRead(0);
  // 入力値を摂氏に換算
  temp_c = ((5 * a_in) / 1024) * 100;
  // 出力
  Serial.print( temp_c );
  Serial.println('C');

  if(temp_c > 20 && temp_c < 30){
     // 青色LEDを点灯 ( HIGHは電圧レベル )
    digitalWrite( blue_led, HIGH );
    digitalWrite( red_led, LOW );
  }else{
    // 赤色LEDを点灯 ( HIGHは電圧レベル )
    digitalWrite( red_led, HIGH );
    digitalWrite( blue_led, LOW );
  }
 
  // 10s待機
  delay(10000);
}

 

  • 全体図

ArduinoはRaspberry piから給電を行い、動作させます。
後々、部品や環境が整ったらシリアル通信をさせて何かリッチな表示をさせたいと思います。

f:id:hiro2o2:20160323214559j:plain

 

赤外線カメラと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}となる。
なぜわざわざ同次座標系を用いるかというと、平行移動も含めて座標変換を行列の形で表現できるようになるためである。つまり、同次座標系は数式を見やすくするために導入している。