空飛ぶロボットのつくりかた

ロボットをつくるために必要な技術をまとめます。ロボットの未来についても考えたりします。

数学のお勉強(1)~クオータニオン~

f:id:robonchu:20180715143240p:plain

参考:クォータニオンの回転補間:掲示板:シムダンス「四次元能」|Beach - ビーチ

やりたいこと

クオータニオンを理解する

教科書

↓ 素晴らしくわかりやすい。

回転行列の問題

  1. ジンバルロック特異点がある)

  2. 行列計算での処理負荷が重い

  3. 回転の補間が難しい

クオータニオンの利点

  1. ジンバルロックがない

  2. 計算負荷が低い

  3. 2つの回転同士のスムーズな補間が表現できる

  4. x,y,z軸に限らない任意の回転軸での回転が簡単にできる

複素数について

虚数単位

i ** 2 = -1

複素数

a + b * i

複素平面

f:id:robonchu:20180715143555p:plain

参考: 複素平面 - Wikipedia

複素数の行列表現

I = numpy.array([[0, -1], [1, 0]])

E = numpy.array([[1, 0], [0, 1]])

I ** 2 = - E

Z = a*E + b*I = numpy.array([[a, -b], [b, a]])

Z = numpy.array([[numpy.cos(theta), -numpy.sin(theta)], [numpy.siN(theta), numpy.cos(theta)]]) * numpy.array([[r, 0], [0, r]])

複素数の場合、乗法の交換法則・結合法則・分配法則を満たす

共役

z' = a - b * i

z * z' = || z || ** 2

複素数のすごさ

複素数平面における点の回転」は「複素数のかけ算」に対応している。

「回転を足す」と「複素数を掛ける」は同じ意味!

たとえば、単位円でiを掛けていくと90度ずつ回転する。めちゃ便利。

参考:

二重数について

冪零元

epsilon**n = 0

二重数

z = a + b*epsilon

epsilon = numpy.array([[0, 1], [0, 0]])

Z = a + b*epsilon = numpy.array([[a, b], [0, a]])

bを二重部という

複素数の場合、乗法の交換法則・結合法則・分配法則を満たす

クオータニオン

複素数の拡張として考えることができる

q = w + x*i + y*j + z*k  # i,j,kは虚軸 
  • 複素数は1とiという2つの線形独立な基底ベクトルで平面を表現

  • クオータニオンは1,i,j,kという4つの線形独立な基底ベクトルによる4次元空間を表す

基底i,j,kの関係

i**2 = j**2 = k**2 = -i*j*k = -1

i*j = k

j*i = -k

j * k = i

k * j = -i

k * i = j

i * k = -j

交換法則はなりたたない

クオータニオンはw,x,y,zの組として、

q = [w, x, y, z]

と表記されることがおおい

クオータニオンの演算

共役

q' = [w, -x, -y, -z]

大きさ

v = (x, y, z)

|q| = sqrt(w**2 + |v|**2)

乗算

ベクトル部の内積外積をもちいて以下のように表される

q0q1 = [w0 * w1 - v0 * v1 ,  w0 * v1 + w1 * v0 + v0 ✕ v1]

内積

q0 * q1 = w0 * w1 + v0 * v1

逆数

q**-1 = q' / |q|**2

単位クオータニオンでは、共役を求めれば逆数が求まることがわかる

行列表現

i = numpy.array([[0, 0, 0, 1], [0, 0, -1, 0],[0, 1, 0, 0],[-1, 0, 0, 0]])

j = numpy.array([[0, 0, 1, 0], [0, 0, 0, 1],[-1, 0, 0, 0],[0, -1, 0, 0]])

k = numpy.array([[0, -1, 0, 0], [1, 0, 0, 0],[0, 0, 0, 1],[0, 0, -1, 0]])

3D回転

回転

あるベクトルpを単位クオータニオンを用いて3次元空間で回転を表現する方法

p' = q * p * q**-1

p' = [0, v]

q = [qw, qv]  # qv:回転軸

p = [0, pv]

qw = +- numpy.cos(theta/2.0)

qv = +- numpy.sin(theta/2)*u  # u:qvと同じ方向の単位ベクトル

上記をまとめると、3次元の回転はクオータニオンを使って以下の式で表される

p' = q * p * q**-1

q = [numpy.cos(theta/2.0)  numpy.sin(theta/2.0)*u]

pを単位クオータニオンqで回転したあと、rをつかって回転させる場合、

r*(q*p*q**-1)*r**-1=(rq)*p*(q`r`)=(rq)*p*(rq)`

となり、あらかじめクオータニオンrqを計算してクオータニオンsとして合成しておけば、回転の合成を行うことができる

クオータニオンを使えばどんな回転も一発で表現可能

デュアルクオータニオン

定義

回転のみならず、剛体変換(回転と平行移動)を表現できる。

クオータニオンの二重数である

q^ = r + d * epsilon  # r,d: クオータニオン、epsilon:零冪元

所感

わかったようなわからないような。。。とりあえずハミルトン大先生すごい笑

まだ正直、理解しきれてない気がする。追記していこう : )

ホームオートメーション(1)~カーテン自動化~

やりたいこと

朝、めざまし無しで起きたい !

これまでは、目覚ましとiftttでの電気オン。。。

電動カーテン自動化による太陽光で起きる作戦

www.youtube.com

ハマりポイント

まさかの購入した電動カーテンのリモコンが赤外でなく、Nature Remo使えず...

スイッチボットで物理的にリモコンボタンを押すことに(泣)

構成

  1. ニトリの電動カーテン

  2. switch bot & switch link

  3. IFTTT or Alexa

IFTTTのタイマー機能で、毎朝7:00にswitch link に信号を送り、switch botニトリの電動カーテンの無線リモコンの開きボタンを物理的に押すという無理やり構成( ̄ー ̄)

そして、コンセント周りの配線…

今後

毎朝、目覚ましをかけずに太陽光で起きれるか実験⚗

いちお寝坊防止のために、

  1. 7:00にカーテンオープン by IFTTT & switch link !

  2. 7:15に電気オン by IFTTT & Nature Remo !!

  3. 7:30に目覚まし by iphone !!!

それではおやすみなさい💤

画像処理についてまとめメモ

やりたいこと

画像処理の大事な内容について箇条書きでまとめ

教科書

CG-ARTS | 書籍・教材

まとめメモ

  • カメラ応答関数:カメラへの入射光強度を入力として、画素値を出力とする関数

  • 光ショットノイズ:受光素子に到達した光子数に比例して出力電圧に含まれるゆらぎの標準偏差

  • 暗時ノイズ:受光素子に到達した光子数に依存せずに生じるノイズの総称で暗電流ノイズや読み出しノイズなどを含む

  • モスキートノイズ:元画像の高周波の成分が失われるようなノイズ

  • 量子化雑音:量子化誤差に起因する画素値の歪み

  • フリッカ:動画において各フレームで明るさが一定でない現象

  • ガウシアンフィルタ:正規分布型の重み係数をもつ。

  • バイラテラルフィルタ: ガウシアンフィルタを改良して、「中心画素からの距離のみで決めていた重み」を「中心画素の画素値と他の画素値の離れ方も含めた重み」に変更したもの

  • ノンローカルミーンフィルタ:テンプレートマッチングのように周辺画素を含めた領域が、注目画素の周辺領域とどれくらい似通っているかによって重みを決定するもの

  • ラプラシアンフィルタ:画像の二次微分に相当。

    • ガウシアンフィルタからのラプラシアンフィルタでノイズを減らしつつもエッジを強調できる
  • 鮮鋭化フィルタ:元画像をそのまま出力するフィルタからラプラシアンフィルタを引いたもの

  • ガボールフィルタ:ある特定の方向の周波数成分を検出するフィルタ

  • LoGフィルタ: ガウシアン分布のラプラシアン

  • ゼロ交差:値が生から負へ、負から正へ変化する間の0になる位置。ゼロ交差の点をつなげると閉曲線になる

  • 点拡がり関数:劣化過程を表す空間フィルタ

  • 歪曲収差:ピントがしっかり合致していて色のにじみもないのに、映像が歪んで見えてしまうこと

  • 被写界深度:レンズのピント調整をした時に十分にピントがあっていると判断できる距離

  • F値 = レンズ焦点距離 / レンズの有効開口径。F値が大きいと、被写界深度は深くなる。

  • 平面パノラマ: 複数の画像を平面に投影しながらつなぎあわせたもの。直線性は維持。

  • 円筒面パノラマ:円筒面に投影したもの。直線性は維持されない。

  • 球面パノラマ:球面に投影したもの。直線性は維持されない。

  • フレーム間差分:二枚の差分画像を用いて、論理積を求めることで移動領域だけを抽出する

  • Horn-Shunkckの方法:オプティカルフローのx,y方向の微分値の二乗値が小さくなるような平滑化項。オプティカルフローの拘束条件だけでは一意に決定することはできない。

  • 光学:

放射量 測光量 備考
放射束[W] 光束[lm] 単位時間に人感の明るさ単位
放射照度[W/m**2] 照度[lx] 単位面積あたりの光束
放射強度[W/sr] 光度[cd] 単位立体角あたりの放射束

あるアナログ的な信号をデジタルデータにサンプリングする場合、原信号に含まれる周波数成分をすべて正確にサンプリングするためには、原周波数の2倍以上のサンプリング周波数が必要となる。

これを標本化定理という。たとえば、100Hzのアナログ信号を正確にサンプリングするためには、最低でも200Hz以上の周期でサンプリングしなければならない。

もしサンプリング周波数の1/2よりも高い周波数成分が含まれていると、その成分がサンプリング結果にはエイリアス(alias、虚像)信号として現われる。

参考:標本化定理とは - コトバンク

  • dpi: dots per inch

  • 青色波長のピーク:450nm

  • 緑色波長のピーク:550nm

  • 赤色波長のピーク: 600nm

  • 色の順番:青、シアン、赤、黄色、緑、青緑、青

f:id:robonchu:20180707160328p:plain

  • ラプラシアンフィルタは以下のように表すことができ、負の値にもなるし、同じ色が多い場合、0付近に値が集中する

0 | 1 | 0

1 | -4| 1

0 | 1 | 0

  • バイリニア補間:隣接4画素を頂点とする正方形の下底と上底それぞれについてx方向で補間を行い、得られた2つの値を用いて、y方向に線形補間を行う

  • pタイル法:濃度ヒストグラムの濃度の低い方からの画素数と,画像全体の画素数の割合がpとなる濃度値を閾値とする

  • オイラー数 = 連結結合の個数 - 穴の個数は

  • 市街地距離:f:id:robonchu:20180707163500p:plain

  • ユークリッド距離:f:id:robonchu:20180707145411p:plain

  • チェス盤距離:横方向と縦方向の移動距離の大きい方の長さ

以下、赤:市街地距離、緑:ユークリッド距離、青:チェス盤距離

f:id:robonchu:20180707194907p:plain

  • マハラノビス距離:データの各方向への散らばり具合まで考慮した「データ群からの距離」 -> sqrt( (a-b)2 / delta2 )

f:id:robonchu:20180707184857p:plain

参考:マハラノビス距離の意味を2次元の場合で理解する - 具体例で学ぶ数学

  • バンドル調整:たくさんの画像の対応点を利用して、各画像のカメラモーションと各対応点の3次元位置を更新する

  • テンレートマッチングの演算回数: 減算、絶対値、加算の三回

  • SIFT: http://www.vision.cs.chubu.ac.jp/cvtutorial/PDF/02SIFTandMore.pdf

  • FAST: 注目画素の周囲16画素の画素値が注目画像より明るい、もしくは暗い画素が一定の画素以上連続する場合はコーナーとする。

  • Cannyエッジ検出:

    1. ノイズ低減と微分

    2. 勾配の最大位置の検出

    3. しきい値処理(2つのしきい値を用いる)

  • 2次元DCT: 離散コサイン変換

  • 虹彩デジタルカメラの絞りにあたるもの

  • mod M ; Mで割った余り

  • チェイン符号化: 線画像を、画素の連なりに注目して記述する可逆符号方式

  • ハフマン符号化: 画像の種類によらない符号化方式。符号割り当ては、濃度やランレングスといった情報源シンボルに符号を割り当てる作業であるが、生起確率の高い情報源シンボルほど短い符号を与えると、符号化に必要な平均の符号長を最小とすることができる。

  • JPEG2000方式:二次元離散ウェーブレット変換と算術符号化が用いられる

  • 立体角:f:id:robonchu:20180707190932p:plain

参考:立体角とは - スーパーサイエンスガール

  • ステラジアン:立体角の大きさを表わすSI補助単位。記号 sr 。1 sr は球の半径の2乗に等しい面積をもつ球面上の面分が球の中心に対してつくる立体角。

  • 双方向反射率分布関数(BRDF):入射光の方向と出射光の方向に依存する四次元の関数。反射率を一般化したもので、出射光の放射輝度と入射光の放射照度の比として定義される。

  • ヘルムホルツの相反性:ヘルムホルツの定理 [物理のかぎしっぽ]

  • ディザ法:黒と白つまり輝度が0と255の色だけを用いてハーフトーン(中間色)を表現しようという技術で,2値しか出力できない表示装置でなんとかグレースケールを表現しようとしたもの。グレースケールの画像を小さいブロックに分割し,それにマスクを掛けて閾値を越えたピクセルを白,下回ったものを黒というように処理。

  • デジタルカメラのゲイン:ゲインを下げるとノイズが減り、全体的に暗く撮影される

  • デジタルカメラの明るさ:F値の2乗に反比例する

  • 1画素のモーションブラーの計算: 対象物との距離 / 焦点距離 * 1画素あたりの大きさ 1

  • ライトフィールドカメラ: 被写体からの光線を、三次元的な情報も含めて記録するカメラ。イメージセンサーの前面にマイクロレンズアレイを配し、光線の明暗だけでなく、光線の入射方向に関する情報を記録する。

  • ダイナミックレンジ: 観測可能な最大、最小明るさの比によって定義

  • ノイズのない画像の推定:事後確率の最大化がある。事後確率は尤度と事前確率の積に比例する。

  • 残差逐次検定(SSDA)法: 相違度の加算の途中で残差がしきい値を超えたら加算を打ち切ることで、全体の計算量を減らしている。

  • ワールド座標系X = Z / f(焦点距離) * u

  • 基本行列E = D(歪対称行列)* R(回転行列)。Dからはカメラの相対的な平行移動ベクトルがわかる。

  • ネガポジ変換でエントロピーは変化しない

  • 著作隣接権: 著作物の創作者ではないが、著作物の伝達に重要な役割を果たしている実演家、レコード製作者、放送事業者、有線放送事業者に認められた権利

  • ガンマ補正:ガンマ分の1乗のガンマが1より小さい時は暗くなり、大きい時は明るくなる

  • リギング:周波数領域において、不連続にフィルタリングを行うとエッジに対して波打つような濃淡の繰り返しが発生する

  • ウィーナフィルタ:復元画像と原画像の誤差が最小になるように定義されたフィルタ

  • オープニング:背景のノイズを除去

  • クロージング:画像内のノイズを除去

  • 細線化では以下の条件を満たしているときに白画素にする

    1. 注目画素が境界上にある黒画素

    2. 白画素に変更しても連結性が保持

    3. 線分の端点でない

  • ミーンシフト:近傍の点群の平均位置に移動を繰り返して、極大点を求める方法

  • スネーク:閉曲線が縮んでエッジの境界に張り付くことにより対象物の領域を抽出する方法

  • JPEGの圧縮率を高くした時:隣り合うブロックの境界が目立つブロック歪みが生じる。また、はっきりとした輪郭の周りにモスキートノイズも現れる。

  • モスキートノイズ:デジタル画像圧縮画像(特にJPEG静止画およびMPEG動画)において輪郭部分や色の変化の激しい部分で起こる画像の乱れ

  • オーレンネイヤーモデル:拡散反射モデル。

  • フォンモデル:鏡面反射モデル。物理的に正確なモデルでない。

  • トランススパロウモデル:鏡面反射モデル。物理的に正確性を求めたモデル。

所感

画像処理、幅が広いので大変だぁ。。。光や色の特性や座標変換、フィルターや著作権などなど、、、

一歩ずつ!!!

Linuxのお勉強(2)

f:id:robonchu:20180702214333p:plain

やりたいこと

linuxの構造やコマンドの知識を増やしたい

教科書

www.lpi.or.jp

システムファイルを見つける、適切な位置にファイルを配置する

f:id:robonchu:20180702212601p:plain

特定のディレクトリをupdatedbの情報更新対象外に設定する際はupdatedb.confに設定を記述する。そのまんま。

updatedbコマンドは、locateコマンドやslocateコマンドを使ってファイルの検索をするための情報データベースを最新の状態に保つためのコマンド。

/etc/updatedb.confの内容例

PRUNEFS="sysfs selinuxfs usbdevfs devpts NFS nfs nfs4 afs sfs proc smbfs cifs autofs auto iso9660 udf"
PRUNEPATHS="/tmp /usr/tmp /var/tmp /afs /net /sfs /selinux /udev /mnt/floppy /media"
export PRUNEFS
export PRUNEPATHS
  • PRUNEFS: mountコマンドでマウントする際に指定するファイルシステムの種類

  • PRUNEPATHS: 具体的なパスの指定

pruneは余分なものを取り除くという意味がある

参考: 104.7 システムファイルを見つける、適切な位置にファイルを配置する|サンプル問題/例題解説|受験対策|IT資格といえばLPI-Japan | LinuC/OSS-DB/HTML5/OPCEL/LPIC

ハードリンクとシンボリックリンクを作成・変更する

  • ハードリンクは、実体を共有している

  • 異なるファイル名(リンク名)に同一のiノード番号を割り当てることで実現している

  • 異なるパーティションにまたがってのリンクは、シンボリックリンクを使う

参考: 6.ユーザー管理

ファイルのパーミッションと所有者を管理する

  • 新たに作成されたファイルやディレクトリの所有ユーザーは、作成したユーザーと、そのユーザーのプライマリグループに設定される

  • プライマリグループとは、ユーザが何らかのコマンドを実行する際にグループ権限として参照される一番優先順位の高いグループのこと

  • "ファイルの所有ユーザーを変更できる"のは、rootユーザーのみ

  • "ディレクトリの所有者"が関係するのは、パーミッションと合わせて書き込み可能かどうかについてのみ

  • "ファイルの所有グループを変更できる"のは、rootユーザー or そのファイルを所有しているユーザー

Q: 作成したファイルを他のユーザーにもアクセスさせたいときはどうするの?

A: 所有グループを変更し、適切なパーミッションを与える

例:fileファイルをotherグループに対して読み書き可能にする

$ touch file          fileファイルを作成
$ chgrp other file    fileの所有グループをotherに設定
$ chmod g+rw file     fileのグループパーミッションをrwに設定

参考: 104.5 ファイルのパーミッションと所有者を管理する|サンプル問題/例題解説|受験対策|IT資格といえばLPI-Japan | LinuC/OSS-DB/HTML5/OPCEL/LPIC

ファイルのパーミッションと所有者を管理する

  • umaskの考え方は、すべてのパーミッションが読み書き可能な状態から、umaskの値を引いた値が設定される

  • 設定値は所有者、グループ、その他の順にそれぞれ0から7の整数で表わされる

  • ファイル:666がデフォルト

  • ディレクトリ:777がデフォルト

例:

○ファイルの場合

 666 (rw-rw-rw-)
-002 (-------w-)
-----------------
 664 (rw-rw-r--)

ディレクトリの場合

777 (rwxrwxrwx)
-002 (-------w-)
-----------------
 775 (rwxrwxr-x)

参考: 104.5 ファイルのパーミッションと所有者を管理する|サンプル問題/例題解説|受験対策|IT資格といえばLPI-Japan | LinuC/OSS-DB/HTML5/OPCEL/LPIC

ファイルシステムの整合性を保持する

  • Linuxで標準的に使用されているファイルシステム ext2/ext3 は、ファイルの管理にiノードを使用している

  • iノードの仕組みは、実際にファイルのデータを保管しているデータ領域とは別に、iノード情報を保管するiノード領域が確保されている

  • iノード領域の使用状況は、dfコマンドに-iオプションをつけることで確認できる

例)データ領域の使用状況

$ df
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/hda2             19656572  14523320   4134752  78% /
none                    262240         0    262240   0% /dev/shm

例)iノード領域の使用状況

$ df -i
Filesystem            Iノード  I使用   I残り I使用% マウント位置
/dev/hda2            2496960  333530 2163430   14% /
none                   65560       1   65559    1% /dev/shm

例)2KB毎にiノードを割り当てる

mke2fs -i 2048 /dev/hda2

割り当てられるブロックサイズよりも小さいファイルが大量に作成されるような場合には、iノード割当量を変更を検討すべき

参考: 104.2 ファイルシステムの整合性を保持する|サンプル問題/例題解説|受験対策|IT資格といえばLPI-Japan | LinuC/OSS-DB/HTML5/OPCEL/LPIC

パーティションファイルシステムの作成

ファイルシステムジャーナリング機能とは: 突然の電源断など正常なシャットダウン処理が行えなかった際の、再起動時のファイルシステムチェックを効率よく行う仕組み

具体的には、実際の書き込みを行う前にジャーナルに記録を行い、もし異常終了が起きた場合は、ジャーナルの情報に基づいて壊れている可能性がある部分だけをチェックして修復する

ジャーナリング機能を備えたファイルシステムの例↓

参考:

viを使って基本的なファイル編集を行う

Q: テキストファイルの最終行にカーソル移動させるコマンドは?

A: G

  • Go ToのG

  • 10Gと指定すれば10行目へ移動する

参考: viエディタの使い方

プロセスの実行優先度を変更する

  • Linuxは、複数のプロセスを同時に並行して動作させるマルチプロセスのOS

  • ある時点で動作しているプロセスは1つだけで時間を区切って順番にプロセスを切り替えて実行することで、見かけ上複数が同時並行で動作しているように見せている

  • nice値は、重要度はそれほど高くないプロセスには低い優先順位をつけて、他のプロセスの実行を邪魔をしないようにしたりすることで、円滑なプロセス実行を可能にする仕組み

  • nice値は、-20(最高優先)から19(最低優先)までの40段階に分かれており、基本的にデフォルトは中間の0に設定

  • reniceコマンドは、実行中のプロセスのnice値を変更できる

例: PID 2742のnice値を10に変更

renice 10 2742

参考: 103.6 プロセスの実行優先度を変更する|サンプル問題/例題解説|受験対策|IT資格といえばLPI-Japan | LinuC/OSS-DB/HTML5/OPCEL/LPIC

プロセスを生成、監視、終了する

プロセスには、以下の2種類に大きく分けられる↓

  • システム起動時に実行されたり、システム管理者が起動したプロセス

  • システムを利用しているユーザーが実行しているプロセス

ジョブ: 中断されているプロセスや、バックグラウンドで実行されているプロセスのこと.

jobsコマンドを実行することでどのようなジョブが実行されているかを確認することができる

ストリーム、パイプ、リダイレクトを使う

標準入出力には番号がついており、番号指定でストリームを制御することができる↓

0 標準入力

1 標準出力

2 標準エラー出力

例1: 標準エラー出力をファイルに保存したい場合

command 2> error.txt

例2: 標準出力と標準エラー出力を、別々のファイルに出力する場合

command > file.txt 2> error.txt

例3: 標準出力と標準エラー出力を同じファイルに出力する場合

command 1> file.txt 2>&1

&を使って標準出力に標準エラー出力を混ぜる

参考: 103.4 ストリーム、パイプ、リダイレクトを使う|サンプル問題/例題解説|受験対策|IT資格といえばLPI-Japan | LinuC/OSS-DB/HTML5/OPCEL/LPIC

所感

まだまだLinuxシステムについての理解が足りない。。。

一歩ずつ !

動画像処理のお勉強(12)

やりたいこと

動画像処理について学ぶ

教科書

CG-ARTS | 書籍・教材

目次

差分画像

二枚の画像において、同じ位置に画素値の差の絶対値を画像とする

参考:2枚の画像のdiff(差分)を超簡単に調べる方法 - 昼メシ物語

背景差分法

f:id:robonchu:20180519092628j:plain

参考: 研究開発:前景と背景の分離技術 - livedoor Blog(ブログ)

フレーム間差分法

移動物体を撮影した異なる時間の3枚の画像を用いて、移動物体領域を取り出す

f:id:robonchu:20180519093239j:plain

参考: 高度情報演習1A “テーマC” 実践 画像処理プログラミング 〜画像認識とCGによる画像生成〜 第四回 演習課題 画像中からの物体抽出処理(背景情報を手がかりとして) 芝浦工業大学 工学部 情報工学科 青木 義満 2006/05/ ppt download

統計的背景差分法

画素値の定常的な変動を考慮して移動物体を検出する方法

f:id:robonchu:20180519093711j:plain

参考: 高度情報演習1A “テーマC” 実践 画像処理プログラミング 〜画像認識とCGによる画像生成〜 第四回 演習課題 画像中からの物体抽出処理(背景情報を手がかりとして) 芝浦工業大学 工学部 情報工学科 青木 義満 2006/05/ ppt download

オプティカルフロー

異なる時間に取られた二枚の画像を用いて、静止カメラで撮影した移動物体の解析ができる。

異なる時間に撮影された二枚の画像間での対象の移動量をベクトルデータとして表現したものをオプティカルフローと呼ぶ

ブロックマッチング法

テンプレートマッチングを用いてオプティカルフローを求める方法

f:id:robonchu:20180519095425j:plain

参考: 高度情報演習1A “テーマC” 実践 画像処理プログラミング 〜画像認識とCGによる画像生成〜 第四回 演習課題 画像中からの物体抽出処理(背景情報を手がかりとして) 芝浦工業大学 工学部 情報工学科 青木 義満 2006/05/ ppt download

勾配法

連蔵する二枚の画像での対象物体の移動量が微小であることを前提にオプティカルフローを求める方法

この前提により、オプティカルフローの拘束条件式が求められ、この未知数である2つのベクトルを求める方法を以下に示す

Lucas-Kanade法(LK法)

f:id:robonchu:20180519100301j:plain

f:id:robonchu:20180519100310j:plain

参考: Lucas kanade法について

Horn-Shunck法

オプティカルフローの空間的滑らかさを拘束条件として、エネルギー関数を導出し、それを最小にするベクトルを計算する

f:id:robonchu:20180519100731p:plain

参考: OpenCVでとらえる画像の躍動、Optical Flow

移動体追跡

参考: [http://www.vision.cs.chubu.ac.jp/features/pdf/seminar/100326%E3%82%BB%E3%83%9F%E3%83%8A%E3%83%BC%E8%B3%87%E6%96%99%E7%89%A9%E4%BD%93%E8%BF%BD%E8%B7%A1.pdf]

テンプレートマッチングによる追跡

テンプレートマッチングを、前の時刻における移動体の位置周辺だけを行えば良い

探索範囲の広さや位置を設定する良い方法論がないのが課題。

KLTトラッカー

LK法を用いた特徴点ベースの追跡法

f:id:robonchu:20180519111521j:plain

参考:

ミーンシフトトラッキング

ミーンシフトによる追跡は類似度極大点に向かって、局所的に探索する方法

重なり領域が存在しない場合、追跡できなくなる

f:id:robonchu:20180519112824j:plain

参考:

ベイジアンフィルタ

時刻tまでに観測された時系列画像から移動体の状態を推定する方法

前述の2つと異なり、ある位置にある確率と別の位置に物体がある確率と言った具合に、物体の状態に関する仮設を複数保持しながら追跡が可能。

f:id:robonchu:20180519113816j:plain

参考:

カルマンフィルタ

ベイジアンフィルタにおいて、線形・ガウス型の状態空間モデルにのみ適応可能な最適フィルタ

f:id:robonchu:20180519115009j:plain

参考:

パーティクルフィルタ

パーティクルと呼ばれる離散的なサンプルを状態空間にばらまき、モンテカルロ法により、ベイジアンフィルタを近似計算する方法

f:id:robonchu:20180519120455j:plain

参考: コンピュータビジョン特論 第8回対象追跡 2006年11月22日 加藤丈和. - ppt download

↓めちゃくちゃわかりやすい!!!

www.slideshare.net

その他同画像処理

カット検出

撮影場面が大きく変化する部分をカットという

画像を長方形領域に区分し、長方形領域ごとの画素値の平均値を求めその差の絶対値を用いてカットの判定を行う。

カメラモーション推定

背景の動きをオプティカルフローで求め、その動きからカメラの動きを求めることができる。

時空間画像処理

時空間画像とは画像を時間方向に重ねた三次元データ

f:id:robonchu:20180519143134j:plain

参考: 電子情報通信学会知識ベース |2群 画像・音・言語

Bazel事始め

f:id:robonchu:20180527200814p:plain

やりたいこと

c++のビルドを簡単に行いたい

Bazelとは

Bazel install

教科書(cpp-tutorial)

Code

構成

.
├── README.md
├── WORKSPACE
├── lib
│   ├── BUILD
│   ├── hello-name.cc
│   └── hello-name.h
└── main
    ├── BUILD
    ├── hello-get-name.cc
    ├── hello-get-name.h
    └── hello-robots.cc
  1. 直下に空のWORKSPACEを作る

  2. ディレクトリがわかれる場合はそれぞれにBUILDを設置

BUILDの書き方

libの方

cc_library(
    name = "hello-name",
    srcs = ["hello-name.cc"],
    hdrs = ["hello-name.h"],
    visibility = ["//main:__pkg__"],
)

visibilityを書くことでmainの方から見えるように。

mainの方

cc_library(
    name = "hello-get-name",
    srcs = ["hello-get-name.cc"],
    hdrs = ["hello-get-name.h"],
)

cc_binary(
    name = "hello-robots",
    srcs = ["hello-robots.cc"],
    deps = [
        ":hello-get-name",
        "//lib:hello-name",
    ],
)

depsにcc_binaryで使いたいlibraryのnameを記入する。

How to build and use

  1. bazel build //main:hello-world

  2. bazel-bin/main/hello-robots

詳しくはgit参照。

コメント

ちゃっかりGitHubでびゅー笑

パターン認識のお勉強(11)

f:id:robonchu:20180512193754j:plain

参考: 2014/5/29 東大相澤山崎研勉強会:パターン認識とニューラルネットワーク,Deep Learningまで

やりたいこと

パターン認識について学ぶ

教科書

CG-ARTS | 書籍・教材

目次

プロトタイプ法による識別

特徴空間においてテスト画像から各クラスのプロトタイプまでのユークリッド距離を測り、最も近いクラスにテスト画像を識別する。

f:id:robonchu:20180512200009p:plain

参考: 「わかりやすいパターン認識」 第1章:パターン認識とは - ppt download

クラスの分布を考慮した識別

f:id:robonchu:20180512200852j:plain

参考:

NN法とkNN法

f:id:robonchu:20180512201200p:plain

参考:

kd-tree法

バックトラック: survey/kdtree.md at master · komi2/survey · GitHub

f:id:robonchu:20180512202559j:plain

参考: Scalable nearest neighbor algorithms for high dimensional data

ハッシングによる近似最近傍探索

f:id:robonchu:20180512201849j:plain

参考: 情報システム基盤学 基礎1 アルゴリズムとデータ構造 - ppt download

アダブースト

複数の識別器を組み合わせて一つの強力な識別器を学習するアンサンブル学習の一つ

f:id:robonchu:20180512203130p:plain

参考:

リアルアダブースト

ハードマージンSVMサポートベクターマシン

f:id:robonchu:20180512220724p:plain

参考:

ソフトマージンSVM

f:id:robonchu:20180512221529j:plain

参考:

カーネルトリック

高次に写像しながらも、写像の計算を避けるテクニックをカーネルトリックと呼ぶ。

f:id:robonchu:20180512222145p:plain

よく使用されるカーネル関数

  1. ユークリッド内積

  2. 多項式カーネル

  3. RBFカーネル

参考:

1対他分類器による多クラス識別

ニューラルネットワーク

robonchu.hatenablog.com

robonchu.hatenablog.com

深層学習

robonchu.hatenablog.com

ランダムフォレスト

学習サンプルをランダムサンプリングにより作成したサブセットごとに決定木を構築し、複数の決定木の結果を統合して識別する。

f:id:robonchu:20180513090836p:plain

参考:

階層的クラスタリング

f:id:robonchu:20180513091232j:plain

参考: クラスター分析の手法②(階層クラスター分析) | データ分析基礎知識

k-means法

f:id:robonchu:20180513092010j:plain

参考:

主成分分析

robonchu.hatenablog.com

robonchu.hatenablog.com

f:id:robonchu:20180513093251p:plain

参考:

線形判別分析

f:id:robonchu:20180513094016j:plain

参考:

部分空間法

SELFIC法

主成分分析で低次元化した特徴空間でクラスの近さに基づく識別を行う方法

CLAFIC法

主成分分析を用いて、クラスごとに入力画像群をよく表現する低次元な特徴空間を求め、その特徴空間をパターン学習の結果とみなす方法

参考:

KL展開:

f:id:robonchu:20180513100337p:plain

参考:

顔検出と顔識別

顔画像の特徴量:Haar-like特徴量

参考:

顔識別の方法

  1. 顔の局所領域においてローカルバイナリパターンのヒストグラムを作成する

  2. このLBPヒストグラムを用いて、NN法により最も類似している登録画像を求める

f:id:robonchu:20180513101456p:plain

参考: OpenCVで物体検出器を作成③ LBP特徴【開発会社プロフェッサ】

人検出

人の輪郭形状を捉える勾配方向ヒストグラムをもとにしたHOG特徴量が利用される

f:id:robonchu:20180513102055j:plain

参考: 局所特徴量と統計学習手法による物体検出

画像検索

f:id:robonchu:20180513102600p:plain

参考: Visual Wordsを用いた類似画像検索 - 人工知能に関する断創録

人体姿勢推定

f:id:robonchu:20180513103309j:plain

f:id:robonchu:20180513103336j:plain

f:id:robonchu:20180513103400j:plain

f:id:robonchu:20180513103412j:plain

参考:

所感

このあたりはSOTAな深層学習手法のほうがはるかに精度は高そう。

実際に構築するときは、計算コストとのトレードオフで適切な手法を選択していきたい。