動画像処理のお勉強(12)
やりたいこと
動画像処理について学ぶ
教科書
目次
差分画像
二枚の画像において、同じ位置に画素値の差の絶対値を画像とする
参考:2枚の画像のdiff(差分)を超簡単に調べる方法 - 昼メシ物語
背景差分法
参考: 研究開発:前景と背景の分離技術 - livedoor Blog(ブログ)
フレーム間差分法
移動物体を撮影した異なる時間の3枚の画像を用いて、移動物体領域を取り出す
統計的背景差分法
画素値の定常的な変動を考慮して移動物体を検出する方法
オプティカルフロー
異なる時間に取られた二枚の画像を用いて、静止カメラで撮影した移動物体の解析ができる。
異なる時間に撮影された二枚の画像間での対象の移動量をベクトルデータとして表現したものをオプティカルフローと呼ぶ
ブロックマッチング法
テンプレートマッチングを用いてオプティカルフローを求める方法
勾配法
連蔵する二枚の画像での対象物体の移動量が微小であることを前提にオプティカルフローを求める方法
この前提により、オプティカルフローの拘束条件式が求められ、この未知数である2つのベクトルを求める方法を以下に示す
Lucas-Kanade法(LK法)
Horn-Shunck法
オプティカルフローの空間的滑らかさを拘束条件として、エネルギー関数を導出し、それを最小にするベクトルを計算する
参考: 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法を用いた特徴点ベースの追跡法
参考:
ミーンシフトトラッキング
ミーンシフトによる追跡は類似度極大点に向かって、局所的に探索する方法
重なり領域が存在しない場合、追跡できなくなる
参考:
ベイジアンフィルタ
時刻tまでに観測された時系列画像から移動体の状態を推定する方法
前述の2つと異なり、ある位置にある確率と別の位置に物体がある確率と言った具合に、物体の状態に関する仮設を複数保持しながら追跡が可能。
参考:
カルマンフィルタ
ベイジアンフィルタにおいて、線形・ガウス型の状態空間モデルにのみ適応可能な最適フィルタ
参考:
パーティクルフィルタ
パーティクルと呼ばれる離散的なサンプルを状態空間にばらまき、モンテカルロ法により、ベイジアンフィルタを近似計算する方法
参考: コンピュータビジョン特論 第8回対象追跡 2006年11月22日 加藤丈和. - ppt download
↓めちゃくちゃわかりやすい!!!
www.slideshare.net
その他同画像処理
カット検出
撮影場面が大きく変化する部分をカットという
画像を長方形領域に区分し、長方形領域ごとの画素値の平均値を求めその差の絶対値を用いてカットの判定を行う。
カメラモーション推定
背景の動きをオプティカルフローで求め、その動きからカメラの動きを求めることができる。
時空間画像処理
時空間画像とは画像を時間方向に重ねた三次元データ
Bazel事始め
やりたいこと
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
直下に空のWORKSPACEを作る
ディレクトリがわかれる場合はそれぞれに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
bazel build //main:hello-robots
bazel-bin/main/hello-robots
詳しくはgit参照。
コメント
ちゃっかりGitHubでびゅー笑
パターン認識のお勉強(11)
参考: 2014/5/29 東大相澤山崎研勉強会:パターン認識とニューラルネットワーク,Deep Learningまで
やりたいこと
パターン認識について学ぶ
教科書
目次
- やりたいこと
- 教科書
- 目次
- プロトタイプ法による識別
- クラスの分布を考慮した識別
- NN法とkNN法
- kd-tree法
- ハッシングによる近似最近傍探索
- アダブースト
- ハードマージンSVM(サポートベクターマシン)
- ソフトマージンSVM
- カーネルトリック
- 1対他分類器による多クラス識別
- ニューラルネットワーク
- 深層学習
- ランダムフォレスト
- 階層的クラスタリング
- k-means法
- 主成分分析
- 線形判別分析
- 部分空間法
- 顔検出と顔識別
- 人検出
- 画像検索
- 人体姿勢推定
- 所感
プロトタイプ法による識別
特徴空間においてテスト画像から各クラスのプロトタイプまでのユークリッド距離を測り、最も近いクラスにテスト画像を識別する。
参考: 「わかりやすいパターン認識」 第1章:パターン認識とは - ppt download
クラスの分布を考慮した識別
参考:
NN法とkNN法
参考:
kd-tree法
バックトラック: survey/kdtree.md at master · komi2/survey · GitHub
参考: Scalable nearest neighbor algorithms for high dimensional data
ハッシングによる近似最近傍探索
参考: 情報システム基盤学 基礎1 アルゴリズムとデータ構造 - ppt download
アダブースト
複数の識別器を組み合わせて一つの強力な識別器を学習するアンサンブル学習の一つ
参考:
リアルアダブースト
ハードマージンSVM(サポートベクターマシン)
参考:
ソフトマージンSVM
参考:
カーネルトリック
高次に写像しながらも、写像の計算を避けるテクニックをカーネルトリックと呼ぶ。
よく使用されるカーネル関数
参考:
1対他分類器による多クラス識別
ニューラルネットワーク
深層学習
ランダムフォレスト
学習サンプルをランダムサンプリングにより作成したサブセットごとに決定木を構築し、複数の決定木の結果を統合して識別する。
参考:
階層的クラスタリング
参考: クラスター分析の手法②(階層クラスター分析) | データ分析基礎知識
k-means法
参考:
主成分分析
参考:
線形判別分析
参考:
部分空間法
SELFIC法
主成分分析で低次元化した特徴空間でクラスの近さに基づく識別を行う方法
CLAFIC法
主成分分析を用いて、クラスごとに入力画像群をよく表現する低次元な特徴空間を求め、その特徴空間をパターン学習の結果とみなす方法
参考:
KL展開:
参考:
顔検出と顔識別
顔画像の特徴量:Haar-like特徴量
参考:
顔識別の方法
参考: OpenCVで物体検出器を作成③ LBP特徴【開発会社プロフェッサ】
人検出
人の輪郭形状を捉える勾配方向ヒストグラムをもとにしたHOG特徴量が利用される
画像検索
参考: Visual Wordsを用いた類似画像検索 - 人工知能に関する断創録
人体姿勢推定
参考:
所感
このあたりはSOTAな深層学習手法のほうがはるかに精度は高そう。
実際に構築するときは、計算コストとのトレードオフで適切な手法を選択していきたい。
パターン検出とマッチングのお勉強(10)
参考:Archives
やりたいこと
パターン検出とマッチングについて学ぶ
教科書
テンプレートマッチング
テンプレートマッチング:予め標準パターンをテンプレートとして用意しておき、このテンプレートを用いて入力画像とのマッチングを行う
位置を検出することもでき、探索範囲に対して類似度を調べ、その中から最も類似する位置を検出する
類似度
類似度を調べるには以下の2つがよく利用される
また、以下が使われることもある。
サブピクセル位置推定
サブピクセル位置推定:対応点の座標の小数値を推定する技術(サブピクセル推定)
参考: 機械の目が見たセカイ -コンピュータビジョンがつくるミライ(9) カメラを用いた3次元計測(3) - サブピクセル推定 | マイナビニュース
高速探索法
探索範囲すべての位置での類似度の計算(全探索)は計算時間が多くかかることがある。
以下に効率化手法を示す。
残差逐次検定法
残差があるしきい値を超えたら、検出位置ではないとし、次の位置での計算にうつる方法
しきい値は自動的に決める方法があり、最初はしきい値を決めず計算し、それを最初のしきい値とし、次々計算していく中でそのしきい値を超えない場合、その値をしきい値に変更する。
こうすることで、常に真の最小値に到達することが保証されている。
疎密探索法
画像情報を何段階化の解像度で表現し、解像度の疎密性を利用することで、類似度や相違度の最大値位置や最小値位置を効率的に探索することができる。
イメージピラミッドを作り、低解像度から探索を行い、探索された位置に対して高解像度画像に上げていき探索を行う。こうすることで高速に探索できる。
参考:画像認識 第4章-物体追跡:Object Tracking- - とある学生のお勉強日記
参照画素の選択による高速化
同時生起行列の確率を計算し、確率が低い(独自性が高い)画素を類似度計算に用いる参照画素とする。
こうすることで、もし選択された画素が1%であれば、100倍高速化される。
エッジ情報を用いたチャンファーマッチング
テンプレートマッチングの一種であり、入力画像とテンプレート画像間のエッジ相違度に基づいて探索を行う手法
参考: Archives
ヒスログラム情報を用いたアクティブ探索
カラーヒストグラム
カラー空間を量子化した際の各色番号に対する類度を表したもの
類似度の算出は以下の2つがある。
ヒストグラムインタセクション
バタチャリヤ係数
参考:
www.slideshare.net
アクティブ探索
テンプレートと入力画像上のある領域のカラーヒストグラムの類似度が低ければ、周辺の重なりを持つ領域の類似度も低いという考え方を利用して、周辺領域の類似度計算を省く
コーナー検出全体まとめ
参考: qiita.com
ハリスのコーナー検出
参考:
FASTによるコーナー検出
決定木をトラバーサル(横切る)するだけでコーナーを検出できる
参考:
DoG画像を用いた特徴点とスケールの検出
画像間の拡大縮小に関係なく、対応点を決めることができる
参考:
Cannyのエッジ検出アルゴリズム
アルゴリズム:Canny法によるエッジ検出 — OpenCV-Python Tutorials 1 documentation
参考:
SIFT
スケールと回転に不変な特徴記述
参考:
SIFT (Scale-Invariant Feature Transform, スケール不変の特徴変換)の紹介 — OpenCV-Python Tutorials
https://www.codeproject.com/Articles/619039/Bag-of-Features-Descriptor-on-SIFT-Features-with-O
2値特徴量
BRIEF: BRIEF (Binary Robust Independent Elementary Features, 二値頑健独立基本特徴) — OpenCV-Python Tutorials
ORB: ORB (Oriented FAST and Rotated BRIEF, 方向付きFASTと回転BRIEF) — OpenCV-Python Tutorials 1 documentation
対応点マッチング
参考: MIRU2013チュートリアル:SIFTとそれ以降のアプローチ
図形要素検出
ハフ変換
参考:
一般化ハフ変換
ランダム化ハフ変換
特徴統合性理論
顕著性マップ
参考: コンピュータビジョンのセカイ - 今そこにあるミライ(44) 自動作成を行うために用いられることの多い3つの重要度マップ手法 | マイナビニュース
所感
ロボットの認識器を作る上でとても大事な章だと思う。なかなか難しいところもある。。。
顕著性マップなど人間の視覚システムに基づいて考えられている理論は面白い。
領域処理のお勉強(9)
参考: Willow Garage ブログの非公式翻訳: OpenCV 2.1をリリース
やりたいこと
領域処理について学ぶ
教科書
目次
- やりたいこと
- 教科書
- 目次
- 領域のテクスチャ
- 隣接画素の統合による領域分割処理
- 画素特徴量のクラスわけによる領域分割処理
- ミーンシフトを用いた画像分割処理
- 対象物と背景の間のエッジを利用した領域分割処理
- グラフカットを用いた領域分割
- 領域分割の利用例
- 所感
領域のテクスチャ
テクスチャ:繰り返しの輝度パターンを指す
テクスチャの繰り返しパターンを数値化する方法を以下に示す
周波数特徴量
2次フーリエ変換を用いるとテクスチャの特徴を波という観点から見ることができる。
領域分割し、その領域のパワースペクトルを測ることでテクスチャを数値化できる。
ガボールフィルタ
参考:
www.slideshare.netガボールフィルタ:正弦波・余弦波にガウス関数で窓をかけた関数になっており、パラメータを操作して、様々な方向と強度をもつフィルタを多数準備して、特徴抽出を行う。
このフィルタ群をフィルタバンクとよび、抽出された特徴量の群はtextonとする。
同時生起行列を用いた統計的特徴量
参考: グレー レベルの同時生起行列の作成 - MATLAB & Simulink - MathWorks 日本
同時生起行列:離れた2つの場所にある画素対の値から画素値の一様性、方向性、コントラストなどの性質を表す特徴量を求めるもの
同時生起行列を用いて計算するおもな特徴量は次の7種類がある
隣接画素の統合による領域分割処理
参考: 領域拡張法のテスト: メモブログ
領域統合法:類似した特徴量を持ち空間的に隣接した画素の集合に画像を分割する手法
画素特徴量のクラスわけによる領域分割処理
参考: 画像処理論
画素をその特徴量に基づいて特徴空間に基づいて特徴空間に写像し、その特徴空間でクラス分けし、各クラスに属する画像群を領域として画像を分割する方法
ミーンシフトを用いた画像分割処理
ミーンシフト法 → 画像領域の分割や対象画像の追跡に用いられる
基本原理
ある任意の点から半径hの超球を考え、その範囲にある点群の平均を計算し、その位置に観測点を移動する。同様の操作を繰り返すと、観測点は最大勾配の方向に移動し、やがて極大点に収束する
確率密度関数の推定
参考:
www.slideshare.net確率密度関数の勾配
勾配法:確率密度関数のある点から勾配の大きい方に移動して極大点を探索する方法
参考:
www.slideshare.net勾配法を用いた極大探索
このミーンシフト法では確率密度関数が大小が自動的に計算されオーバーシュートや振動がないことで知られている
参考:
クラスタリングへの応用
各点にミーンシフト法を実行し、収束位置がしきい値以下なら同じクラスタに入れる。
特徴としては全ての点でこの処理が必要だが並列化でき、クラス数をあらかじめ設定する必要がない。
参考:
www.slideshare.net対象物と背景の間のエッジを利用した領域分割処理
スネーク:エッジを閉曲線として抽出する
スネークでは複数の対象物や鋭い屈曲がある閉領域を正しく抽出できないという欠点がある。
参考: 動的輪郭モデル
輪郭抽出
グラフカットを用いた領域分割
グラフカット:全画面を対象と背景の2種類にラベル付するときに最小となるコスト関数を与え、コスト最小となるラベルの組み合わせを効率良く求める方法
参考:
コスト関数の意味:グラフィカルモデル入門
GrabCut
領域分割の利用例
合成画像を作るときによく用いられる。つなぎ目の不自然さをなくすために以下のような方法がある。
マッティング:部分画像の境界の画素値を同じ位置に重なる背景画像の画素値の平均値で置き換える処理
アルファブレンディング: 画像のアルファブレンドを行うときに陥りがちな罠 - どらの日記
参考: 合成のなじみを良くする「エッジブレンディング」のテクニック - コンポジゴク
所感
背景除去や特徴量を用いたセグメンテーションの方法などどれも興味深い。
これらと深層学習の両知識を増やしてコスパの良いロボットの認識器をどんどん考えていきたい。
Xamarinで遊んでみる
やりたいこと
レシピ
教科書
インストール
Mac OS Update
Xcode Update
Visual Studio for mac Install
実機の準備(例:iOS11.03のiPhone6s)
Xcodeの設定
Visual Studioでiphoneでの実機ビルドを行う為に、Xcodeでダミープロジェクトをつくってバンドル識別子を取得する必要がある
アカウントの登録
プロジェクトの作成(ここでバンドル識別子が取得できる)
Single View Application
参考:
Visual Studioのプロジェクトの作成(設定)・ビルド
新しいプロジェクトを作る
Single View Application
作成したプロジェクトのInfo.plistのバンドル識別子を上記の物に変更する
上方タブのDebug -> iPhoneに設定し、横の▷(実行ボタン)をクリック
iPhone上で設定→一般→プロファイル→信頼をクリック
上記手順で実行できる
Xamarinの初期コード構成
Main.cs
- アプリケーションのエントリーポイント
Info.plist
- アプリケーション名やバージョンなどを設定できるファイル
Main.storyboard
- 画面を定義する為のストーリーボードファイル
ViewController.cs
- ストーリーボードの画面に対してロジックを奇術するためのクラス
いくつかコードをトライ
ボタンなど基本の操作のサンプル
磁気センサ
GPS
加速度センサ
加速度センサを使う
ViewControllerを以下を参考に書きかえ
上記コードの解説
画面サイズ基準でラベルサイズを指定
// Viewのサイズを取得 layoutW = View.Bounds.Width; layoutH = View.Bounds.Height; // Viewサイズを元にLabelサイズを指定 textW = layoutW / 2; textH = layoutH / 6;
デバッグ出力
System.Diagnostics.Debug.WriteLine("Width: {0}, Height: {1}", layoutW, layoutH);
ラベルの作成
// Label作成&配置 var sensorText = new UILabel(new CGRect(layoutW / 2 - textW / 2, layoutH / 2 - textH / 2, textW, textH)); sensorText.BackgroundColor = UIColor.FromRGB(192, 192, 192); sensorText.Lines = 0; sensorText.TextAlignment = UITextAlignment.Center; sensorText.LineBreakMode = UILineBreakMode.TailTruncation; View.AddSubview(sensorText);
加速度の表示&反映
Frameとは:[iPhone] UIView の frame と bounds の違い | Sun Limited Mt.
var textLoc = sensorText.Frame; motionManager = new CMMotionManager(); if (motionManager.AccelerometerAvailable) { // Accelerometer Update間隔 motionManager.AccelerometerUpdateInterval = 0.015; // UpdateがQueueに入る度に処理を行う(多分) motionManager.StartAccelerometerUpdates(NSOperationQueue.CurrentQueue, (data, error) => { sensorText.Text = string.Format("X = {0:N4}\nY = {1:N4}", data.Acceleration.X, data.Acceleration.Y); // 現在の位置を取得 nowX = sensorText.Frame.X; nowY = sensorText.Frame.Y; System.Diagnostics.Debug.WriteLine("nowX: {0}, nowY: {1}", nowX, nowY); // Viewをはみ出さないようにAccelerometerの値によってLabelを移動 if (nowX + (nfloat)data.Acceleration.X * 10 > 0 && nowX + (nfloat)data.Acceleration.X * 10 < layoutW - textW) textLoc.X = nowX + (nfloat)data.Acceleration.X * 10; if (nowY - (nfloat)data.Acceleration.Y * 10 > 0 && nowY - (nfloat)data.Acceleration.Y * 10 < layoutH - textH) textLoc.Y = nowY - (nfloat)data.Acceleration.Y * 10; sensorText.Frame = textLoc; }); }
動作画面
この画面の中央に加速度が表示される
Bluetoothを使う
ハマり個所
所感
これからロボットの操作用IFにスマホを使っていきたい♪
3Dセグメンテーションのお勉強
やりたいこと
3Dセグメンテーションについて学ぶ
教科書
GitHub - timzhang642/3D-Machine-Learning: A resource repository for 3D machine learning
RANSAC
自然界のデータにはたくさんノイズがある ノイズがあると、法則性をうまく見つけられないことがある そんなノイズをうまく無視するのがRANSAC
参考:
Robust linear model estimation using RANSAC — scikit-learn 0.19.1 documentation
study-ransac/ransac.ipynb at master · smurakami/study-ransac · GitHub
Point Net
www.slideshare.net
SEGCloud
論文:https://arxiv.org/pdf/1710.07563.pdf
6-DoF Object Pose from Semantic Keypoints
6-DoF Object Pose from Semantic Keypoints
Git:object3d/code at master · geopavlakos/object3d · GitHub
Good!!!
3D Bounding Box Estimation Using Deep Learning and Geometry
論文: https://arxiv.org/pdf/1612.00496.pdf
Sliding Shapes for 3D Object Detection in Depth Images
Sliding Shapes for 3D Object Detection in Depth Images
Object Detection in 3D Scenes Using CNNs in Multi-view Images
論文:https://stanford.edu/class/ee367/Winter2016/Qi_Report.pdf
Deep Sliding Shapes for Amodal 3D Object Detection in RGB-D Images
Good!!!
DeepContext: Context-Encoding Neural Pathways for 3D Holistic Scene Understanding
Voxel Net
論文: https://arxiv.org/pdf/1711.06396.pdf
Git: GitHub - jeasinema/VoxelNet-tensorflow: A 3D object detection system for autonomous driving.
PointNets
論文: https://arxiv.org/pdf/1711.08488.pdf
Git: GitHub - charlesq34/frustum-pointnets: Frustum PointNets for 3D Object Detection from RGB-D Data
Good!!!