想い出ざわざわ

画像処理・機械学習を学びます。

"cudaErrorLaunchOutOfResources"について

表題のエラーで苦しめられてる。関連サイトを集めた。

 

・公式の説明

CUDA Runtime API :: CUDA Toolkit Documentation

レジスタ数の確認

カーネルが使うレジスタ数 - PukiWiki for PBCG Lab

・実行ユニットあたりの共有メモリ・レジスタ数の説明

高速演算記 第3回 「チューニング技法その1 CUDAプログラミングガイドからピックアップ」 | G-DEP

・掲示板での解決事例

https://devtalk.nvidia.com/default/topic/569648/cudaerrorlaunchoutofresources-aka-quot-too-many-resources-requested-for-launch-quot-/?offset=1

・デバイスが対応するレジスタ数の取得

デバイス情報の取得 - PukiWiki for PBCG Lab

・デバイス情報の取得での設定

https://devtalk.nvidia.com/default/topic/413403/cudadeviceprop-undeclared-first-use-in-this-function-/

カーネルで気をつけるのはスレッド数・レジスタ量・共有メモリの量

www.softek.co.jp

2chで関連ありそうだった書き込み

f:id:nozawanarain:20170801230713p:plain

・デバイス情報の表示方法

qiita.com

 

誤って編集した記事を一度削除して、絶望した。

手元のコードは、レジスタ数が上限を超えてるように思うのだが・・・

 

追記

やはりレジスタが不足していた。コンパイル時に、maxreggcountを設定して解決

d.hatena.ne.jp

smのレジスタ数をブロックあたりのスレッド数で分割し、カーネル関数の使用レジスタ数を下回っていると上記エラーが発生するよう。

 

Visual Studio Code使ってみた(デバッグ実行)

Visual Studio CodeでDebug実行してみた。

"Hello World"できてしまえば、Debug実行は簡単だった。

 

手順

まずコードの左側に適当にブレイクポイントを設置する。

f:id:nozawanarain:20170725215551p:plain

 

そして画面上部から”デバッグの開始”を選択する。

f:id:nozawanarain:20170725215555p:plain

 

コードの左側に、変数やウォッチ式が表示される。

f:id:nozawanarain:20170725215558p:plain

 

特に設定しなくても補完機能も使える。

f:id:nozawanarain:20170725215943p:plain

感想

実行できてしまえば、後は簡単ですね。

IDEより軽量で、補完機能やデバッグ実行も可能。

しばらく使ってみようかな。

 

Visual Studio Code使ってみた(インストールからHello worldまで)

Visual Studio Coe使ってみた。

何度も詰まった結果、今日はビルドして、「Hello world」まで。

環境はMacOS Sierra10.12.5。

 

インストー

下記のリンクからどうぞ。

code.visualstudio.com

参考サイトさん同様、C/C++やRunnerもインストール。

f:id:nozawanarain:20170724212234p:plain

適当なコードを書いて、ビルド(command+shift+b)を試みる。

 

詰まったところ1

f:id:nozawanarain:20170724211944p:plain

command+shift+b でエラー。ググると、

xcode-select --install

で解決できるとのこと。

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun | Tips &Tricks

詰まったところ2

iostreamが見つからなくて、詰まった。/usr/include/c++に発見。

c_cpp_properties.jsonに反映。

f:id:nozawanarain:20170724213434p:plain

 

詰まったところ3

tasks.jsonが設定できない・・・結局、参考サイトさんの方法を丸コピ。。

 

結果

Hello, wolrdまではできました。次はデバッグ実行したい。

 

参考サイト

[Visual Studio Code][Mac] C言語をビルド(コンパイル)&ステップ実行する

http://gabekore.org/vscode-c-mac

qiita.com

 

 

 

「距離データハンドリングのための3次元特徴量」のメモ

初めに


 橋本先生の「距離データハンドリングのための 3 次元特徴量」を読んだ。その内容をメモする。また下記スライドは類似した内容を述べており、理解もしやすい。

・物体認識のための3次元特徴量の基礎と動向

http://isl.sist.chukyo-u.ac.jp/Archives/ViEW2014SpecialTalk-Hashimoto.pdf

 

3次元物体認識の分類と主な研究例

 近年、工場の自動化に多くの企業が取り組み、それに伴う成果も耳にするようになった。工場の自動化でキーとなる技術の一つが、マシンビジョンである。マシンビジョンは部品や製品を認識する技術で、グレイスケールの濃淡画像や距離画像が入力として考えられる。マシンビジョンにおける3次元物体認識は、物体の大まかな位置・姿勢の検出と、精密な位置・姿勢検出という2段階の処理によって構成される。大まかな位置・姿勢検出を、「物体検出」、精密な位置・姿勢検出を「精密位置合わせ」と呼ぶ。「精密位置合わせ」には、ICP(Iterative Closest Point)手法やその発展がよく用いられる。「精密位置合わせ」では距離画像がよく用いられるが、濃淡画像を統合的に用いる手法もある。

 物体検出技術は、アピアランスベースとモデルベースに分類される。アピアランスベースは、物体の見えの情報を用いる手法である。アピアランスベースの利点は、距離画像や3次元モデルが不要なことである。欠点は大量の画像が必要なことや、処理コストの大きさである。モデルベースは、距離画像や3次元モデルを前提とした手法である。利点は、大量の画像が不要なことや距離情報導入よる精度の高さである。欠点は距離画像が必要なことである。
 モデルベースは、代表的な2次元画像処理であるSIFTやテンプレートマッチングの3次元版と捉えられる。著者はモデルベースを、キーポイントベース手法と非キーポイントベース手法に分類している。キーポイントベース手法は、マッチングに使用すべき特徴点を選択し、その点の特徴量の類似性によってモデルと入力データを照合する手法である。非キーポイントベース手法は、単一視点からの物体の距離データ全体を特徴量とする手法である。

 

f:id:nozawanarain:20170711215554p:plain

 

3次元特徴量の研究動向

 3次元特徴量は、キーポイントをできる限り強くアイデンティファイでき、かつモデルと入力データにおいて安定的に記述される必要がある。優れた3次元特徴量を用いることによって、高性能な3次元物体認識を実現できる。3次元特徴量には
キーポイント周りの情報を記述したものと、複数点の位置や法線の関係を記述したものといった2タイプがある。
 キーポイント周りの情報を記述した特徴量として、SHOT(Signature of Histograms of Orientations)がある。SHOTでは注目点周辺の領域を32分割し、それぞれにおける法線ベクトル群と注目点の法線との関係を352次元の特徴量として定義している。
 複数点の位置や法線の関係を記述した特徴量として、PPF(Point Pair Feature)がある。この特徴量は、物体モデル上の全ての3次元点から2 点(点対)を選択して組み合わせ、4次元特徴量Fを保持する。このとき、FをインデクスとしてFをとる2点の点番号をテーブル化し、入力データの対応点を効率的に検索する。対応づけ後には点対間の剛体変換パラメータを投票空間に投票する。高得票のパラメータを採用することで、モデルが存在する位置と姿勢を特定する。

 法線推定について分からない方は、下記を参照。

qiita.com


局所参照座標系の研究動向

 局所参照座標系とは、キーポイントごとに設定される座標系である。ここでは局所参照座標系をLRF(Local Reference Frame)と呼ぶ。LRFは3軸から成り、1軸はキーポイント周囲の法線ベクトル、2軸はこれと直 交するベクトル、3軸は、1軸、2軸をもとに外積ベクトルとして定義される。LRFの役割は、大きく分けて2つある。1つ目は、対応づけられたキーポイント間の幾何学的な関係を計算する情報を提供すること、2つ目は特徴量の記述再現性(Repeatability)を高めることである。

 

f:id:nozawanarain:20170711220242p:plain

 LRFの算出方法は2通りある。1つ目は固有ベクトルを用いる手法、2つ目は3軸をそれぞれ独立に求める手法である。平面的点群では、固有ベクトルの第3主成分が法線ベクトルに当たることから、前者は自然な手法と言える。ただし後者では安定的に求められる1軸に基づき、点群の情報欠損を想定した上で、他の軸を推定する。よって点群欠損時には、後者の手法がより高精度である。

3次元特徴量に関する筆者(橋本先生)の研究事例

 特に印象に残った研究は、以下の通りである。
 まずマシンビジョンではバラ積み部品の認識を求められるが、この際オクルージョンによる精度低下が生じる。そこで著者らは、物体の可観測性に基づく特徴点選択によって精度向上する手法を提案している。
 また平面のような単純な形状の部品では、LRFにおいて1軸(法線ベクトル)は正確に求められるが、1軸以外の軸で誤ることが多い。そこで著者らは、物体の外形(稜線による輪郭)といった大局的なデータ分布によってRFを求める手法を提案している。
 さらに物体をセンサから徐々に遠ざけた場合、点群の密度低下に応じて精度が低下する。そこで著者らは、同一物体上の局所領域のデータ点数比は一定であるという特性に基づく新たな特徴量を提案している。

感想

 2次元画像処理の特徴量と共通する考え方が多くあると感じた。例えば、キーポイントベースと非キーポイントベースの照合が存在する点や、キーポイント周辺の情報を記述する特徴量と、キーポイント間の位置関係の情報を記述する特徴量が存在する点など。マシンビジョンの概観を学ぶことができたので、次は個々の処理について深堀したい。

 

グレイコードパターン投影法

概要

 距離画像を得る際の代表的な手法が、ステレオ法。ステレオ法では、二視点から同じ対象を撮影し、画像内の対応関係を用いて、三角測量によって対象までの距離を求める。しかし画像の見えのみによる対応付けでは、撮影対象の特徴が乏しい場合、対応誤りが生じ、精度良く距離を求めることはできない。そこで精度良く距離を求める方法として、カメラをプロジェクタに置き換え、プロジェクタから発した光を一方のカメラで受光し、対応付けを求めるグレイコードパターン投影法がある。

投影回数削減の工夫
 

 単純な方法として、画像の左端列から1列ずつ発光・撮影する方法が考えられる。この場合、画像の幅だけ処理を繰り返す必要があり、多くの計算コストを要してしまう。グレイコードパターン投影法では、1列毎を二進数で表現する。二進数では10bitで1024までの値を表せることから、例えば幅が1024画素の画像であっても、10回の発光・撮影によって発光パターンから列を特定することができる。

 

誤り削減の工夫

 

 2進数では、上位ビットが誤って反転してしまった場合、値そのものが大きく変化してしまう。この現象を防ぐためグレイコードパターン投影法では、グレイコードを用いる。グレイコードでは、ある値から隣接した値に変化する際に、常に1ビットしか変化しない。すなわち上位ビットに誤りが生じても、値そのものが大きく変化してしまうことはない。グレイコードは、”通常の二進数表現”と”それを1ビット右シフトし、先頭に0をつけたもの”の排他的論理和で得られる。

 

参考にした資料

 

・三次元計測のまとめ
https://www.jstage.jst.go.jp/article/ieejeiss/124/8/124_8_1556/_pdf
グレイコードパターン投影の説明

blog.k-tanaka.me

 

感想

 

 1000本から毒入りワインを見つける問題を思い出しました。

stabucky.com