arutema47's blog

書いたり書かなかったり。

CPUとGPUのマルチスレッディングの違いについて

"Locality is efficiency, Efficiency is power, Power is performance, Performance is King", Bill Dally

マルチスレッディングとは?

つぶやいたら読みたい方が多そうだったので完成させました。

マルチスレッディングとはメモリ遅延を隠蔽しスループットを上げるハードウェアのテクニックです。

ただCPUとGPUで使われ方がかなり異なるため、その違いについて考えてみる記事です。

(SIMDについて並列プログラミングの観点から触れるべきでしたが、時間無いマルチスレッディングに注目するため初版では省きました。)

本記事について

本記事はCPUとGPUにおけるマルチスレッディングの違いを出来るだけ平易に説明する。

そもそもメモリ遅延とはなにかから始めそれを減らすテクニックについて触れたあとにCPUのマルチスレッディングについて説明。

最後にGPUのマルチスレッディングについて説明し、実際のCUDAコードでどう活用されるか見る。

本記事の想定読者はハードウェアやCSに専門性がない方である。並列プログラミングやHWの専門性を持つ方にとっては教科書レベルの内容で退屈だと思う。

(追記:本記事はコンピュータアーキテクチャ的目線で書かれており、隣接分野から見ると言葉の定義が怪しいかもしれません。随時改定し語弊を減らしていきたいと思います)

tl;dr

(追記)

メモリ遅延を隠すためにCPUではマルチスレッディングが活用されてきた。一方でCPUの主目的はレイテンシを削減することであり、それら機能とのバランス上、スレッド数を大きく増やすことはできなかった。

対照的にGPUはCPU機能を削減し、スループットを最大化するアーキテクチャ。

GPUは大量のマルチスレッディングを行うことで非常に高いスループットが得られ、それは画像処理、科学計算、深層学習に好適。

メモリ遅延とは?

まずメモリ遅延(memory latency)とはなんだろう?

文字通りデータをメモリに読みに行く待機時間でコンピューティングには重要なもの。

Googleの神ことJeff Deanがよく言っている"Latency Numbers Every Programmer Should Know"にメモリ遅延の概算値が載っているのでみてみよう。

L1 cache reference                           0.5 ns
Branch mispredict                            5   ns
L2 cache reference                           7   ns                      14x L1 cache
Mutex lock/unlock                           25   ns
Main memory reference                      100   ns                      20x L2 cache, 200x L1 cache
Compress 1K bytes with Zippy             3,000   ns        3 us
Send 1K bytes over 1 Gbps network       10,000   ns       10 us
Read 4K randomly from SSD*             150,000   ns      150 us          ~1GB/sec SSD
Read 1 MB sequentially from memory     250,000   ns      250 us

https://gist.github.com/jboner/2841832

要するにCPU外からデータを読み込むとすごく(100-1000倍)くらい遅いよ、といっている。

このCPU内メモリ(キャッシュ)からデータを読める(読む)ことをキャッシュヒット、メインメモリ(DRAM)からデータを読まないといけないことをキャッシュミスと言う。

f:id:aru47:20210825211639p:plain

L1キャッシュに対しキャッシュミス(DRAM読み出し)は200倍遅いのでCPUの仕事イメージ的には図のようにほぼメモリ読み出しを待っている状態になる。 これはストール(stall)と呼ばれ、CPUは何もしていない待機状態になってしまう。

メモリ遅延を減らすテクニック

このようなメモリ遅延(メモリ読み出しの待機時間)を減らし、CPUにより多くの仕事をしてもらうために色々な技術が考え出された。

  • キャッシュの階層化、大容量化

  • プリフェッチ、分岐予測、投機的実行

  • マルチスレッディング

キャッシュ

キャッシュの大容量化はメモリ遅延を減らす一番ストレートかつ効果的なアプローチ。 大きいは正義。

なのでCPUは世代が進むごとにキャッシュをどんどん大きくする。

半導体屋さん的にもキャッシュの性能向上・拡大は至上命題であり、最新CMOSプロセスがランチされる際には一番最初にキャッシュ性能(SRAMセル性能)が学会で報告される。今だと3nmプロセスですね。

プリフェッチ、分岐予測、投機的実行

f:id:aru47:20210825212711p:plain

またプリフェッチといって将来読まれるであろうデータを予め読み込む強力なテクニックがある。

図のように計算Aの次に必要となるデータBをデータAと同時に読み込むことで、計算Bを遅延なく開始することができる。(正確に予測できれば)メモリ遅延を大幅に減らしCPUの仕事効率を大きく改善する。

実際にデータBのメモリ遅延はなくしたわけではありませんが、プロセッサから見るとあたかもメモリ遅延がなくなったように見えるためメモリ遅延を隠蔽する(hiding memory latency)といったりする。

f:id:aru47:20210826215131p:plain

イメージとしてプリフェッチは必要となるデータを先読みする命令を追加し、予めキャッシュに格納する。

プリフェッチには次に必要となるデータと命令を正確に予測する必要がある。このような命令予測技術を分岐予測や投機的実行といってCPU分野で大きく発展してきた。

余談だが投機的実行はGoogleが発見したx86 CPUの脆弱性であるSpectreやMeltdownで話題になった機能。ものすごく平易に言うと投機的実行のプリフェッチ時に本来権限がないメモリ領域にアクセスできてしまい、悪用すると機密データへアプリケーションがアクセスできてしまう。結局Spectreを完全に抑えるには投機的実行を一部無効化するしかなく、OSアップデートで一部アプリケーションが大きく低速化したのが話題になった。ハードウェア脆弱性はコンピューティングの本質と向き合うものが多く、調べると面白いです(DRAMの脆弱性をつくrowhammerとか)

CPUのマルチスレッディング

(追記:はてブにて演算器を共用する同時マルチスレッディングとメモリ隠蔽するマルチスレッディングの話が混ざっているという指摘がありました。仰る通りなので補足・改定します。)

それではようやく本題のマルチスレッディングについて説明する。

CPUコア(物理的に存在するコア)を2倍に見せる技術がマルチスレッディング。

f:id:aru47:20210825215230p:plain

図の通り自分のCPU(Ryzen4800)は物理的に8コアですが、マルチスレッディングにより16コア(論理プレセッサ数)とコンピュータは認識する。

f:id:aru47:20210825220500p:plain

図のようにマルチスレッディングを使うCPUコアは2つに見える(コアAとコアB)。

コアAが計算、データ読み込みと動作するときにキャッシュミスが発生したとします。そうすると前述したように大きなメモリ遅延が発生し、CPUはストールし待機状態に入ってしまう。

そこでマルチスレッドCPUはプロセススイッチと呼ばれる動作が入り、コアBの命令動作に移行します。コアBが計算している間、コアAはデータを待っているため結果的に1つの物理CPUコアを有効活用できる。

また同様にコアBでもキャッシュミスが生じると今度はコアAにプロセススイッチし、データが届き次第計算を開始する。

このようにCPUのマルチスレッディングは生じてしまったメモリ遅延の裏側で別の命令・計算を行うことで、あたかも2つのコアがあるかのように見せかける技術だ。

上記がマルチスレッディングの重要な意義であり、それはCPUもGPUも変わらない。

またマルチスレッディングによりレイテンシは変わらないが、スループットを大幅に向上することが可能だ。

(補足:上記例では並列プログラミングの観点からマルチスレッディングの単純な例を書きました。実際のCPUでは同時マルチスレッディング(SMT)というもっと複雑な技術が使用されています。上記ではメモリ遅延を隠蔽する効果でしたが、SMTではCPU内のある処理で使用していない演算器を別スレッドでも利用することで更にハードウェア利用効率を高めています。こちらはメモリ遅延を緩和する効果はありませんが、タスクが演算律速である場合は高速化に寄与します。)

ja.wikipedia.org

レイテンシとスループット

f:id:aru47:20210826215835p:plain

レイテンシとスループットという概念は重要でそれぞれどう改善されるか理解しておこう。

レイテンシとはある命令が実行されてから完了するまでにかかった時間。例えば命令Aが終了するまでにかかる時間をレイテンシとして評価する。これはマルチスレッディングによっては改善しないが、分岐予測で上手くメモリ遅延を隠蔽できたら改善できる。

一方でスループットとは1秒間に実行した命令の量(データ量)を表す。例えば図のように計算が1bitで全部で1秒かかったとすると4bit/sのように表す。

スループットはマルチスレッディングを活用することで大きく改善でき、更にスレッド数を増やしても改善できることがわかる。 だが後述するようにCPUは分岐予測、SMTに加え多種多様の命令を実現するためパイプラインが複雑でスレッド数をこれ以上増やしてもあまりリターンが得られない事が知られている。

では分岐予測や煩雑なx86命令などスループット改善に邪魔な機能()を全て取っ払ってマルチスレッド数を増やしまくったら最速プロセッサが作れる!という発想で発展してきたのがGPUだ。

GPUのマルチスレッディング

GPUマルチスレッディングの基本思想

CPUのジョブ(OS等)は基本的に逐次的であり、ジョブのレイテンシを最適化することを目標に設計されている。そのため非常に複雑な分岐予測機を持っており、マルチスレッド数も2と小さく抑えられている。

一方でGPUはそもそもレイテンシは全く気にせず、スループットを最大化するシステム思想。根本からCPUの設計思想と異なることを意識する必要がある。

前のCPUでは各コアにジョブを分割していたが、GPU(CUDA)ではスレッドで命令を分割するマルチスレッドプログラミングを行う。

f:id:aru47:20210826222617p:plain

(参考:CS15-418)

ここではスレッドが4つあるGPUコアを考える。まずスレッド0が計算を始めるがストールが発生するとする。するとメモリ遅延が生じ、プロセススイッチによりスレッド1に切り替える。スレッド1も同様にストールが発生すると次はスレッド2に。。とプロセススイッチを繰り返す。

最後にスレッド3もストールすると今度はスレッド0のデータ読み出しが完了したためスレッド0にスイッチし計算を完了させる。そしてデータが到着したスレッドに順々に切り替え、計算を行っていく。

マルチスレッディング動作自体はCPUとほぼ変わらない(ストールしたらプロセススイッチを行う)。しかしCPUと違いGPUの計算機構成が単純であるため多くのスレッドを展開可能なことが特徴である(GPUはキャッシュはあるが分岐予測は持たない)。CUDAでは256スレッドまでプログラマは定義することができ、2スレッドしかないCPUと大きく異る。

ここで注目するべきことは

  • プロセッサの(計算器)使用率は非常に高い(ほぼ100%)である

  • メモリ遅延が発生しているにも関わらず、その影響をほぼ受けていない。

の2点である。

この例ではストールが発生してもすぐにデータがキャッシュに格納されているスレッドがあると仮定したため、ほぼプロセッサは100%計算を実施することができた。 これは非常に計算機の利用効率が高く、プロセッサの理論スループット近く出せていることを示している。繰り返しになるが、マルチスレッド数が多ければ多いほどシステムスループットは改善でき、GPUはスループットを最大化するように設計されている。

また1点目が達成できている理由は、マルチスレッディングによって上手くメモリ遅延を隠蔽できているからだ。スレッド0がストールしている間に他スレッドが計算を行うことでプロセッサの計算機は動き続けることができる。

このスループット最大化処理方法はOSなどのシステムを走らせるには向かないが、科学計算、画像、ディープラーニングといった大量の計算が要求されるアプリケーションと相性が良い。

上記の考察によりGPUのハードウェア構造も見えてきたのではないだろうか? GPUのようなスループット最大化システム(throughput oriented systems)は複数スレッドを一度に展開し多数のデータフェッチを実施し、データの準備ができたスレッドから片っ端に計算する。そのためデータフェッチ機能は大量に必要で、プロセススイッチ機構などもCPUより複雑になる。

GPUのコア構造

f:id:aru47:20210827211617p:plain

それでは単純化したGPUのコア(SM core)をみてみよう。

マルチスレッド管理をプログラマにやらせると煩雑すぎて死んでしまう。

そのためスレッド管理はGPUではコア内にスケジューラをもたせており、ハードウェアがスレッドのスケジュールを管理してくれる。このマルチスレッドスケジューラを備えている点がGPUの固有な点であるため取り上げた。

命令セットプールにはそのコアに割り当てられた命令がプールされている。そしてWarpスケジューラが上記の例で示したように、スレッドがストールしたらデータがフェッチできているスレッドに切り替えるというスケジューリングを行う(実際のスレッド管理はブロック毎になっているが基本概念は同じ)。

CUDAコードを読んでみよう

それでは最後にCUDAコードを読んでみてGPUのマルチスレッディングについて理解を深めよう。

developer.nvidia.com

CUDAのHello World的なコードを読んで見る。

#include <stdio.h>

__global__
void saxpy(int n, float a, float *x, float *y)
{
  int i = blockIdx.x*blockDim.x + threadIdx.x;
  if (i < n) y[i] = a*x[i] + y[i];
}

int main(void)
{
  //ベクトル定義
  int N = 1<<20;  // 100万
  float *x, *y, *d_x, *d_y;
  x = (float*)malloc(N*sizeof(float));
  y = (float*)malloc(N*sizeof(float));

  cudaMalloc(&d_x, N*sizeof(float)); 
  cudaMalloc(&d_y, N*sizeof(float));

  for (int i = 0; i < N; i++) {
    x[i] = 1.0f;
    y[i] = 2.0f;
  }

  //GPUへ配列をコピー
  cudaMemcpy(d_x, x, N*sizeof(float), cudaMemcpyHostToDevice);
  cudaMemcpy(d_y, y, N*sizeof(float), cudaMemcpyHostToDevice);

  // 計算の実行
  saxpy<<<(N+255)/256, 256>>>(N, 2.0f, d_x, d_y);
  
  // 出力をコピー、メモリ開放
  cudaMemcpy(y, d_y, N*sizeof(float), cudaMemcpyDeviceToHost);

  float maxError = 0.0f;
  for (int i = 0; i < N; i++)
    maxError = max(maxError, abs(y[i]-4.0f));
  printf("Max error: %f\n", maxError);

  cudaFree(d_x);
  cudaFree(d_y);
  free(x);
  free(y);
}

SAXPYとは“Single-precision A*X Plus Y”の略でベクトル掛け算、足し算の並列化しやすい計算である。

saxpy<<<(N+255)/256, 256>>>(N, 2.0, d_x, d_y);

が本コードにおける肝であり、<<< >>>に囲まれた変数がマルチスレッド並列化を指定している。

<<<** 合計スレッドブロック数, 並列化するスレッド数>>>

と定義している。256スレッドが一塊となり、N=100万のため、それが約4000ブロック生成されるというイメージである。

GPUのコア1つで256スレッド扱えるため、スレッド数は256から増やすとどんどん高速化できそうだ。

CUDAプログラミングでは通常のC-likeプログラミングに加え並列化するスレッド数とスレッドブロック数を定義する必要があることを覚えておければ良い

またこれさえ定義すればGPU内部でコアでのスケジューリングを行ってくれるため、プログラマの労力は(比較的)小さい。(最適化するのは大変だけど。。

備考:いろいろな並列性

TBD(気になったらデータレベル並列性、SIMD、スレッドレベル並列性でググってみてください)

参考: speakerdeck.com

https://kaityo256.github.io/sevendayshpc/day7/index.html

参考文献

CMU Parallel Computer Architecture and Programming(修士1年生向けに並列プログラミングを教える入門講義です。神講義。)

15418.courses.cs.cmu.edu

Computer Architecture: A Quantitative Approach(3章にスレッドレベル並列性について、4章にGPU並列性について詳しく書いてあります。是非一読を)

amzn.to

How many threads can run on a GPU?

このようにスループットを最大化した際には今度はメモリ帯域が性能律速に関わってきます。"メモリ律速"については以下記事で詳しく記述しています。

aru47.hatenablog.com

入門書籍

KagglePC、サーバー構成メモ

Kaggleマシンの参考になればと思い執筆しました。

最近はColab Proが月1000円と破格でディープラーニング環境を提供しており、Kaggle Notebookも相当良いです。

感覚的にですが、30万くらいのマシンを組むよりはColab Pro、Kaggle Notebookの方が早く、それ以上払うならばリターンが得られるというイメージがあります。

さらに月5000円のColabPro+だとV100マシンが優先的に使用できるため50万くらいのマシン相当になります。高いかなーと当初思いましたが電気代を考えるとオンプレV100マシンを回すより安いです。

自分は開発はオンプレ鯖で行ってアンサンブル学習はColabを使用して並列で学習したりします。

colab.research.google.com

オンプレマシンのメリットとしては

  • 容量をかなり大きくできる。2TBなど扱えるのは大きく、コンペによっては大規模データが必須となるためオンプレが有利になる。

  • 学習が打ち切られないため一週間など長期間回せる

  • 環境をカスタマイズできる。

オンプレマシンのデメリットとしては

  • 排熱、音が凄い。夏場など厳しい。家族の理解が必要。

  • 電気代が高い。5000円は軽く超える。うちはGPU一枚で一万円くらいかな。。

  • 場所を食う。

省スペース構成

自宅のkaggleサーバーは5年前に組んだゲーミングPCにubuntuを入れて継ぎ足し継ぎ足し改造してます。

f:id:aru47:20210810204315p:plain

個人的には自宅用鯖は上記のような小さいケース(mini-ATX, ITX)で組みたいという謎のこだわりがあり、拡張性がほぼないです。ケースファンがしっかりしていればGPUで300W一週間ぶん回してもミニケースで放熱いけちゃいます。

省スペースに組みたいならばこのような1GPU構成がおすすめですが、タワーケースをおいてもいいよ、という方ならばこの構成はおすすめしません。

niku.webcrow.jp

【CPU】AMD Ryzen 5 3600X BOX ¥29,976 @最安

【メモリ】CFD CFD Selection W4U2666CM-16GR [DDR4 PC4-21300 16GB 2枚組] ¥14,976 @最安

【マザーボード】ASRock B550M-ITX/ac ¥15,970 @最安

【GPU】お好きなものをどうぞ

【SSD】サムスン 870 EVO MZ-77E2T0B/IT ¥26,980 @最安

【電源】ANTEC NeoECO Gold NE750G ¥9,990 @最安

【合計】 97,892円

メモ

  • GPUがどう考えても一番高いので予算にあったお好みのものでどうぞ。

  • GPUは3080ti,3090,2080ti,RTXtitan あたりで十分戦えるかと思います。

  • メモリは16GBあれば(画像+Swapを使えば)十分足りる感じです。またCPUはRyzen5以上ならば問題なし。

  • SSD容量は大事です。ケチらずに2TBを買いましょう。

  • HDDは遅いので絶対ダメ。

  • 今パーツ高いですね。。

タワーPC構成

f:id:aru47:20210810205326p:plain

Kaggleするわけではないですが、お仕事用にはタワーPCで組んでました。デカいです。

【CPU】AMD Ryzen 7 3700X BOX ¥35,287 @最安

【メモリ】CFD CFD Selection W4U2666CM-16GR [DDR4 PC4-21300 16GB 2枚組] ¥14,976 @最安

【マザーボード】ASRock B550 Taichi ¥32,890 @最安

【SSD】サムスン 870 EVO MZ-77E2T0B/IT ¥26,980 @最安

【GPU】お好きなものをどうぞ

【電源】Corsair HX1000 CP-9020139-JP ¥26,378 @最安

【合計】¥ 136,511

メモ

  • これにtitan*2をぶっ刺していました。あちちです。

  • GPU*2まで対応してます。PCIe16xが3個ついてるRyzen用マザーはこれとかあります

論文執筆・研究活動に参考になるページ

論文の書き方

ymatsuo.com

あのAIで有名な松尾先生の論文の書き方に関するページ。

論文のストーリー構築の重要さからproof-readingに関する心構えまで全て参考になる。

hontolab.org

Stanford大のJennifer WidomのTips for Writing Technical Papersを和訳したものです。

特にイントロダクションを書く際に考える5つのポイント:

  1. 問題は何か?

  2. なぜその問題が興味深くかつ重要なのか?

  3. なぜその問題を解くのが困難なのか? (例:なぜ単純なアプローチではうまく解けないのか?)

  4. なぜ今までその問題は解決されてこなかったのか? (もしくは,既存手法の何が悪いのか?提案手法と既存手法との差異は何か?)

  5. 提案アプローチの重要な要素は何か?それを用いた結果はどうだったのか? 特定の制約条件についても全て述べるようにすること.

をまず考える、という思考フレームワークは勉強になります。

研究の取り組み方

How to Have a Bad Career in Research/Academia

f:id:aru47:20210616114814p:plain

How to Have a Bad Career in Research/Academia

チューリング賞を受賞したPatterson先生の反例を元に良い研究の取り組み方について話した有名な講演。

How to Have a Bad Career | David Patterson | Talks at Google - YouTubewww.youtube.com

アップデートされた内容がこちら。

Do grades matter?

Do Grades Matter?

スタンフォードのFatahalian先生の大学院生の過ごし方について。

ハードウェア論文の書き方

How to write ISSCC papers

How to write a good Journal of Solid State Circuits paper, Bram Nauta

慶應黒田研究室ISSCC論文ができるまで

研究ポジション応募

How to get a faculty job

matt-welsh.blogspot.com

ハーバード教授のMatt Welshのブログ。非常にわかりやすい。 ザッカーバーグの指導員だったからかザッカーバーグがよく例文で登場する笑

https://www.nyu.edu/projects/rzhang/Matt-Welsh-Advice.pdf

HAQ: Hardware-Aware Automated Quantization with Mixed Precision

HAQ: Hardware-Aware Automated Quantization with Mixed Precision (CVPR 2019 oral), Kuan Wang∗, Zhijian Liu∗,Yujun Lin∗, Ji Lin, and Song Han

Paper

Codes

課題

量子化はDNNをモバイルデバイスの高速化において重要な技術だが、各レイヤのビット幅などの設計は今まで手設計でルールベースなどで行われてきた。この論文ではレイヤ毎の量子化ビット数を自動的にハードウェアの性能を反映しつつ決定可能なHAQ技術を提案する。具体的には強化学習エージェントを使うことでレイテンシを最小化するパラメータを求める。

提案技術

mixed precision

DNNの量子化は幅広く使用されている技術であり、一般的には量子化はDNNの全レイヤを単一のビット幅になるよう圧縮を掛けてしまう。

f:id:aru47:20210531165639p:plain
Fig.1

一方でDNNはレイヤごとに冗長性や演算密度が異なり、レイヤ毎に量子化ビット数を最適化した方が性能向上が狙えるというのが発想(Fig.1)。 このようなflexible-bit qunatizationによって性能・レイテンシトレードオフを改善するというのが研究の狙い。

ハードウェア-awareな性能見積もり

f:id:aru47:20210531170449p:plain FLOPS等の指標はモデルの計算量を簡単に机上で見積もることができるため、幅広く使われている。一方でFLOPSはモバイルデバイスのレイテンシに直結しておらず、有用な指標でないことを指摘。実際はハードウェアのキャッシュサイズやメモリバンド幅などが支配的になるのでFLOPSは当てにならないことが多い。(ビットシフトは0FLOPSなので演算量はなしとした狂った論文もありましたね。。)

そこでHAQではRLエージェントのアクション中にハードウェアを直接盛り込むことでハードウェアレイテンシを直接観測する(Fig.2)。力技だが、HW性能見積もりをちゃんとやっているのでHardware-awareな見積もりが可能。HWは実際にはFPGAにて実装している模様。

RL agent

RLエージェント報酬はレイテンシではなく、量子化後の精度としている

f:id:aru47:20210531170846p:plain

リソース最小化はRLエージェントではなく、アクションスペースの制限で達成している。 簡単にいってしまうとRLエージェントが提案する量子化ビット数候補に対しリソース(レイテンシ、モデルサイズ)を計算し、もしそれが要求を満たしていなかったら各レイヤのビット幅をリソース制限を満たすまで少しずつ減らしていく。そのためRLで直接量子化ビット幅自体を最適化しているわけではない。 直感的にはターゲット精度を達成するための最適な量子化ビット数を探索するようなアルゴリズムに見える。そのためリソース制限を厳しくすることで、そのリソースで得られるベストな量子化組み合わせを探索するイメージ。

手法はかなりローテクな気がするが、リソースをRLエージェントの報酬にするよりは探索空間が狭くて上手くいくということか。

離散化アクションスペースでは量子化ビット数の大小の関係を組み込むことができないため、α=[0,1]の連続値を入力し離散ビットを出力する関数を用いて擬似的に連続的なアクションスペースを作成する。 f:id:aru47:20210531171330p:plain

結果

f:id:aru47:20210531171912p:plain 決め打ち量子化(PACT)に対しHAQは同等のレイテンシで高精度達成。

f:id:aru47:20210531172334p:plain 面白いことにモバイルデバイス向けではdepthwise convolutionのビット幅を縮小するようにしている。おそらくモバイルデバイスではdepthwise convでメモリ律速になりやすく、その点を解消しようとRLエージェントが最適化をかけていると考察。

Introduction to Distance Sensors (Stereo Camera, Projection, LiDAR)

This is an English translation of

aru47.hatenablog.com

It's mostly powered by DeepL, so don't count too much on the English.

Goals

While a normal camera extracts the brightness and color of an object, a distance sensor senses the distance to an object. This is why they are sometimes called 3D cameras or depth sensors.

Knowing the distance is important in a variety of applications, for example, in automated driving, it is essential to know the exact distance to the vehicle in front. In games and other applications, Kinect, which uses distance sensors to extract human movements, has expanded the range of games. Distance sensors are also important for surgical robots such as DaVinci to know the exact distance to the affected area.

It is difficult to visualize the dimensions and distance of a room in a photograph or floor plan, but 3D mapping allows you to map the room itself. ! image.png

This kind of mapping can be easily done with the new iPhone Pro using apps like Polycam, so if you have the device, give it a try!

This article lists the major types of distance cameras in the world, their overview, features, and products used.

The goal is to help you choose the right distance sensor for your R&D project, for example. I'm a LiDAR expert, so I'm not very familiar with camera-based methods, but I've also described the most frequently used distance sensors: stereo cameras and projection cameras.

You can also read more about point cloud deep learning here: aru47.hatenablog.com

Stereo Cameras

Overview

This is a distance sensor that is widely available on the market that is used in e.g. Subaru EyeSight and other industrial products.

アイサイトのしくみ

This WhitePaper from ensenso is also a good reference.

Obtaining Depth Information from Stereo Images Vision.pdf)

f:id:aru47:20210515103910p:plain

www.youtube.com

The principle is the same as how we see things in three dimensions.

If you close your eyes alternately to the left and right and look at the monitor, do you see the shift from left to right?

The brain perceives the object with the larger shift as being closer and the object with the smaller shift as being farther away. This is the principle behind stereo cameras, and it can be said that the distance sensors that we use are also based on stereo cameras**.

A stereo camera can measure the distance to an object based on how far the pixels have shifted. The farther apart the cameras are, the greater the pixel shift relative to the object, and the more accurate the distance. On the other hand, the closer the cameras are to each other, the more difficult it is to measure the distance because there is almost no pixel shift. Increasing the number of pixels will, in principle, increase the range, but the downside is that the amount of signal processing increases exponentially.

The biggest challenge for stereo cameras is to determine if the two cameras are looking at the same object. This requires advanced image processing techniques and makes it very difficult to guess whether distant objects are really identical or not.

image.png

Reference: Obtaining Depth Information from Stereo Images

In addition, there must be no difference in height between the left and right images in order to adapt stereo vision. In order to adapt stereo vision, there must be no height difference between the left and right images, so pre-processing is required to remove camera distortion and calibrate (rectify) the height difference.

Features

While other distance sensors require special components (such as lasers), stereo cameras can be realized by using only two ordinary commercial cameras.

However, in order to measure the distance, the left and right cameras need to see (recognize) the same location of the same object, and it is difficult to measure the distance of distant objects. The disadvantage is that the housing becomes larger if you want to see farther**, because parallax is not created for distant objects unless the camera is set farther away like EyeSight, although the mathematical formula is omitted.

Products used.

For commercial products, Intel's RealSense** comes with software (SDK) and is easy to try.

The RealsenseD435 can be purchased on Amazon for 24,000 yen.

amzn.to

Here is an example of the RealsenseD435 output.

  • High accuracy can be obtained at short distances (1-3m).
  • High resolution because it is camera based.
  • Real-time (30FPS) operation even on a CPU

These are the features of the D435. I think it is the best choice for distance sensors for hobby use.

The RealsenseD400 series also has pattern projection, but it is mostly a stereo camera that is used for distance estimation (even if the projection is turned off, the picture remains almost the same, so it is just a supplementary function).

Pattern Projection Cameras

Overview

Pattern projection cameras are used in high-performance 3D cameras for industrial applications and iPhone FaceID.

It projects a known pattern onto an object (pattern projection) and uses signal processing to derive the distance between the camera and the object from the way it is distorted.

If you project a pattern of stripes onto an object like a helmet, you will see that the stripes are distorted depending on the height of the object. By reading and analyzing such distortions, the three-dimensional shape of the helmet can be determined.

pattern.png

The video below also explains how the iPhone FaceID works. It uses infrared light to emit a pattern all over the face, and is able to read the exact shape of the face. Since it sees the unevenness, it is difficult to fool FaceID, which makes the security stronger.

www.youtube.com

  • Compared to LiDAR, the components are simpler, so the price can be reduced.

  • Very high accuracy can be obtained for indoor use (mm~um accuracy).

  • On the other hand, outdoor use with a lot of external disturbance is difficult.

There are also many approaches that use both pattern projection and stereo vision.

Ensenso, a high-precision 3D camera often used in picking robots, provides both pattern projection and stereo vision. The advantage of this camera is that it can obtain a clean point cloud even for objects that are difficult to match, which stereo vision is not good at (for example, flat walls).

Products

iPhone

! Image result for iphone face id

FaceID is an active projection camera that is used for facial recognition on the iPhone.

Every time FaceID is used, the iPhone emits an infrared pattern.

In fact, the original technology evolved from Apple's acquisition of the company (PrimeSense) that developed the Microsoft KinectV1. It's called MiniKinect by those who know it. LOL.

Industrial Products (Ensenso, Keyence)

There aren't many examples of industrial sensor outputs on the net, but they are mm-accurate and incomparable to Realsense (which is over-spec for hobby use).

They cost several million yen each.

They are often used for inspection in factories and for robotic products. If you go to an industrial exhibition, you'll often see one of these attached to a product, so look for it.

On the other hand, the projection can only be accurately read within a few meters, making it difficult to use outdoors. Basically, it is for indoor use.

  • Keyence 3D Camera, Ensenso 3D cameras

Time of Flight LiDAR

How Time of Flight works

Camera-based distance sensors (stereo cameras, projections) and LiDAR are fundamentally different in principle.

On the one hand, LiDAR measures distance based on Time of Flight.

The principle is simple: a laser beam is emitted from the enclosure as shown in the figure below, and the time it takes for the laser to be reflected back to the object is measured. If the laser beam returns after 10 seconds and the speed of light is 1m/s for simplicity, the distance to the object is

(10s * 1m/s)/2 = 5m

and we know that the object is 5 meters away. This method of deriving the distance based on the time of flight is called Time of Flight.

Since the actual speed of light is very fast, 108m/s, the time it takes for the light to return is on the order of a few picoseconds or nanoseconds, so the circuit used to measure the time needs to be highly accurate.

The type of LiDAR which directly measures the return time of the laser pulse is also called a direct time of flight sensor. FIY, The Lidar in iPad Pro and iPhone is direct time of flight.

https://tech.nikkeibp.co.jp/atcl/nxt/column/18/00001/02023/?ST=nnm image2.png

Features

The most important features of LiDAR are

  • High accuracy
  • Long range
  • Resistant to external disturbance (can be used outdoors)
  • High price

High cost Since the distance is derived directly from the return time of a strong pulsed laser beam, it is difficult to introduce errors and is highly reliable. Since these features are difficult to achieve with a camera-based system, LiDAR is expected to be used mainly for detecting distant objects in automated driving, which is required to operate even in harsh conditions.

On the other hand, the cost of LiDAR is several to dozens of times higher than that of the camera type because it requires a scanning mechanism, laser emitter, laser receiver, and many other specialized elements.

Recently, Livox and other LiDARs costing less than $1k have begun to be mass-produced and used in many robots, so the days of being shunned because of their high price may be coming to an end.

The greatest advantage of LiDAR is its ability to scan a fine point cloud over a long distance (100-200m) as shown in this figure.

LiDAR is the only distance sensor that can obtain a perfect point cloud over a long distance in the open air. This is why LiDAR is expected to be very popular in automated driving. (Although some people, such as Tesla, say they do not need LiDAR...)

Scanning LiDARs

www.gizmocrazed.com

image.png

It is possible to obtain the distance per pixel using the above-mentioned time of flight principle of LiDAR. But how can we get the distance information as a picture? To do this, LiDAR has a concept of scanning.

One approach is to use a mirror to scan (scan) the emitted laser beam.

image.png

The animation above is a clear representation of LiDAR scanning using a mirror. By rotating the mirror, the laser beam is scanned 360 degrees to obtain information on the entire surrounding environment.

A 2D raster scan is a method of scanning two-dimensionally while acquiring information one pixel at a time, while a 1D scan is a method of scanning horizontally while acquiring vertical pixels all at once. Both methods produce distance, but the 1D scan method is more likely to achieve a higher FPS because of the shorter time required to obtain a distance image.

On the other hand, using a mirror (like a single-lens reflex camera) will increase the size of the LiDAR housing. For this reason, MEMS mirrors are being used instead of mirrors, and Optical Phased Array LiDAR, which scans optically, is being actively developed, and it is expected that LiDAR will become smaller and less expensive in the future.

Flash LiDARs

LiDAR has also been developed to acquire two-dimensional pixel information at once, just like an image sensor of a camera, without scanning. This type of LiDAR is structurally very simple, as it only emits a laser beam that covers the entire image sensor and receives the light. Therefore, it can be realized at a lower cost than the scanning type.

On the other hand, there are several issues - Short distance due to low laser power per pixel - Susceptible to external disturbance - Susceptible to interference and noise Therefore, it is not suitable for automatic driving, but it may be useful for indoor robots.

Products

Velodyne Series

The most famous ToF LiDAR products are probably those of Velodyne, the first LiDAR manufacturer to introduce LiDAR products to the world and still the reigning "king".

Their products are notorious for being very expensive, ranging from hundreds of thousands to millions, but the quality is top-notch, and the only self-driving cars that don't use Velodyne are Tesla and Waymo (Waymo uses its own LiDAR). I also imagine that Velo is often used in robotics R&D because of its high pixel count and accuracy.

www.argocorp.com

VLP-16_2.jpg

Livox Horizon

Livox, a subsidiary of DJI, has released a LiDAR that achieves high accuracy while costing less than $1k, and this is becoming the mainstream for robotics projects.

You can buy them in amazon as well..

amzn.to

www.livoxtech.com

The quality is great, and the SDK is available on github, so it's easy to develop.

iPhone

image.png The front of the iPhone has actually been equipped with ToF LiDAR (one pixel) for quite some time. It does not do any scanning, so it is probably low cost.

The Proximity Sensor in the image is the same. When you make a call, if you bring the iPhone screen close to your face, the screen will automatically turn off. I think this is because it senses the distance between your face and the iPhone.

Note: iPhone and iPad Pro are now equipped with dToF LiDAR.

aru47.hatenablog.com

iToF LiDAR

This technology is used in Azure Kinect and other applications.

amzn.to

点群DNN、3D DNN入門 -3DYOLO, VoxelNet, PointNet, FrustrumPointNet, Pointpillars

またまたQiitaからのお引越し記事です。

センサについてはこちらをどうぞ。

aru47.hatenablog.com

目的

image.png

点群データに対してディープニューラルネットワーク(DNN)を適応する研究は活発で、いくつものアプローチがあります。 大人気のPointNetだけではなく、他の手法も照らし合わせて各手法のメリット・デメリットを理解する自助をすることが記事の目的です。

浅く広く手法について学び、ああこういうアプローチがあるのかと気づくことができると幸いです。 各技術の詳細を知りたい場合は元論文や解説サイトを読むといいと思います。

またPointCloud DNNの論文についてはここにわかりやすくまとまっています。是非一読を!

点群DNNでできること

  • 点群認識

image.png

与えられた点群が何の物体か認識するタスクです。 例えばShapenetにおいては点群がどの家具か当てるタスクがあります。 画像認識と同様のタスクです。

  • 点群セグメンテーション
  • image.png

SUN-RGBDにあるタスクです。 点群がどの物体に属しているかセグメンテーションするタスクです。 画像セグメンテーションと同様のタスクです。

  • 点群物体検出

image.png 自動運転などに重要な点群中に存在する物体の座標を認識するタスクです。 アプリ的に需要が高く、一番研究としては人気のあるタスクな印象です。

3Dセンサ

RealsenseD435はアマゾンで24000円と手頃でAPIも使いやすいです。

点群を取得してみたいのならば試しに買ってみてはいかがでしょうか。

amzn.to

3D DNNの家計図

image.png

独断と偏見で3D DNN系の家系図を作ってみました。

大きくは * 2Dベースのアプローチを結集する2D based * あくまで点群にニューラルネットワークを適応するPoint cloud based approach * 画像から得た結果と点群ニューラルネットワークをフュージョンするアプローチ * また点群ニューラルネットワークで点群を前処理(エンコード)した後に2Dベースの物体検出を適応するPointCloud+2D アプローチ の四種類があると考えています。

それぞれを詳しく見てみましょう。

変更履歴

使うデータドメイン毎にカテゴライズを変更(2019/10/2) データセットなど加筆(2019/10/2) Pointpillars追加(2020/03)

2Dベースアプローチ

Complex YOLO (ECCV workshop 2018), YOLO 3D (ECCV workshop 2018)

Complex-YOLO: An Euler-Region-Proposal for Real-Time 3D Object Detection on Point Clouds

https://link.springer.com/chapter/10.1007/978-3-030-11009-3_11

YOLO 3D: End-to-end real-time 3D Oriented Object Bounding Box Detection from LiDAR Point Cloud

http://openaccess.thecvf.com/content_eccv_2018_workshops/w18/html/Ali_YOLO3D_End-to-end_real-time_3D_Oriented_Object_Bounding_Box_Detection_from_ECCVW_2018_paper.html

手法について

タスク:自動運転用の三次元物体検出 LiDARの点群はデータ量が少なく(疎)であるため、点群から物体の情報を直接抽出するのは難しい。

そこで点群を俯瞰的視点(上からみた)の画像を生成し、それに対し物体検出の手法(YOLOやFaster-RCNN)を適応するという手法です。 点群データも俯瞰視点に変換してしまえば車や人なども画像のように扱うことができます。 そのため成功をすでに収め、人間レベルの検出が可能なCNNを積極的に3Dの分野でも適応しようというのがベースの考え方です。

俯瞰(bird's eye viewまたはBEV)とは?

bird 上の図が正面からみたカメラで下の図が俯瞰視点でみた点群です。 これを画像として扱い、物体検出DNNを適応します。

1564476894677.png

メリット

2D画像で成功したディープなR-CNNベースの手法をそのまま点群データに対し適応することができる。

R-CNNはImageNetやMS-COCOなどから転移学習できるので、必要な学習データ量が少なく済む可能性がある。

YOLOベースのため高速。リアルタイム動作も可能。

デメリット

点群を二次元化してしまうので物体の三次元的特徴(凸凹など)は読み取れない。

多角的に検出を行うことは可能だが、角度間(例えば俯瞰と正面)の検出結果の整合性を取るのが難しく検出を間違えたりしてしまう。

(あと3D研究者からすると手法がストレート過ぎておもしろくない笑)

点群ベースアプローチ (PointNet系)

PointNet(NIPS 2016)

PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation

https://arxiv.org/abs/1612.00593

みんな大好きPointNet。

https://www.slideshare.net/FujimotoKeisuke/point-net

https://qiita.com/KYoshiyama/items/802506ec397559725a1c

に詳しい解説があるのでそちらも読むことをおすすめします。

PointNetの手法について

1564478255143.png

点に対し全結合ネットワークを複数回かけ合わせ、特徴量を抽出していく(Classification Network)。

そして最終的に得られた点に対する特徴量(n*1024部)をmaxpoolingすることで点群全体の特徴量(global feature)を得る。

点に対する特徴量抽出後、maxpoolingで全体特徴量を得ることが出来ることを示したのがPointNet最大の功績じゃないかと考えている。これでいいんだ!!という感じ。。笑

1564478526102.png

点群に対するクラス分類、セグメンテーション両方に対して(ModelNet,SUNRGB-D)非常に高いスコアを叩き出した。

PointNetのタスク

PointNetが効果を発揮するのはデータセットは主に室内で取られた点群データに対してです。 image.png

報告されているのは室内のセグメンテーションを行うSUNRGB-Dデータセット(上図)

image.png

そして家具単体のクラスを当てるModelNet40です。

自動運転のようなKittiデータセットに対しては点群が疎すぎるため、適応できないとのこと。 これは後に2Dと3DをフュージョンするFrustrum PointNetで解決されました。

PointNetの実装

PointNet-Tensorflow(本家) https://github.com/charlesq34/pointnet

PointNet.Pytorch(自分もこれを使っており、本家同等の精度が出るのを確認してます) https://github.com/fxia22/pointnet.pytorch

PointNet-Keras https://github.com/garyli1019/pointnet-keras

PointNet-Chainer https://github.com/corochann/chainer-pointnet

PointNet++(NIPS 2017)

PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space https://arxiv.org/abs/1706.02413

PointNetの局所的特徴を見ていない(近傍点群の情報を取り込めない)、という課題を改良したPointNet++も人気と実力が高いです。

PointNetに入力する点群を事前にクラスタリングした近傍点を入力することで、擬似的に局所的特徴量も抽出できるようになっています(後日加筆します。。)

まずはとっつき始めるならばPointNet,研究を行うならばPointNet++を元に実装を行うべきと思います。

実装

PointNet++.pytorch https://github.com/erikwijmans/Pointnet2_PyTorch

VoteNet(ICCV 2019)

Deep Hough Voting for 3D Object Detection in Point Clouds http://arxiv.org/abs/1904.09664

PointNet生みの親からの室内のオブジェクトの3D物体検出に向けた最新論文。 現在ScanNetv2ベンチマークにおいてSoTA。

点群の物体検出タスクは複雑な実装が多く、精度もあまり出ていなかった。 一方VoteNetはシンプルなアイデアながら、高い精度を実現。 基本的なアイデアは物体の中央をhough-votingで予測し、予測した中心点を元に物体検出するというもの(後日加筆します)。

今後人気が出てくるようと思うので要ウォッチ。

センサフュージョンベースアプローチ

Frustrum PointNets

Frustum PointNets for 3D Object Detection from RGB-D Data

https://arxiv.org/abs/1711.08488

手法について

PointNetでは物体検出のタスクにはあまり向かない。

そこでカメラとLiDARデータのセンサフュージョンを行い、精度向上を達成。

そこで成功を収めている2DベースR-CNNで物体のある方向を円錐で絞り込んでから、その部分の点群のみPointNetにかけることで高精度な3D物体検出を実現。

これもアイデアは非常に単純だが、効果絶大なアプローチである。自動運転用など高い精度が求められる三次元物体検出を行うならばこのアプローチが一番スタンダードなのではないだろうか。

1564478892398.png

3D bindingbox predictionを行うPointNetも新規に提案している。

1564478950881.png

メリット

カメラ+LiDARを用いた3次元物体検出のタスクにおいてstate-of-the-art。(Kittiデータセット)

有力な2つの手法を組み合わせているので実装がしやすい。

デメリット

モデルを縦続的に使うので演算量は多い。

そもそもカメラで取り逃した物体は検出できない。

実装

https://github.com/charlesq34/frustum-pointnets

点群+2D CNNのアプローチ

VoxelNet(CVPR 2018)

VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection

http://openaccess.thecvf.com/content_cvpr_2018/html/Zhou_VoxelNet_End-to-End_Learning_CVPR_2018_paper.html

手法について

1564477068068.png この論文のポイントは点群にPointNet-likeなネットワークで特徴抽出を行った後に、2Dベースのアプローチ(Region CNN)を適応することで物体検出を行います。2D CNNに直接点群を入力すると点群の精微な情報を読み取れないという弱点を最初にPointNetで特徴抽出を行うことで解決したのが進歩性です。

また物体検出自体はCNN系手法の方が精度が高いため、PointNetとR-CNN両方の長所を使っているという意味で興味深い手法です。

Voxelとは?

voxel 左の絵が生の点群データです。 点群データはポイント数が多く扱いにくいので、複数を一纏まりにしたVoxelに変換します。Voxelは粒度によっては点群のように振る舞いますが、荒くすると昔のゲームのポリゴンくらいになってしまいます。 ざっくばらんに言うとはダウンサンプルした点群と捉えることができます。

空間的情報を保ったままデータ量、演算量を削減できるため、3D DNNが流行る前から点群の位置合わせ(レジストレーション)を行う際にはボクセル化は定番のアプローチです。

メリット

Voxel間で畳み込みを行うため、後述するPointNetではできない近隣点群間の特徴量も抽出することが可能です。

Voxelの特徴量の他にPoint自体の特徴量抽出も行っているため(直感的には)情報のロスはなく、高精度な認識が期待できます。

PointNetとCNNの良いところどりをしたようなアーキテクチャ。

デメリット

メモリ使用量が多い。

ランダムサンプルやVoxel間隔をチューニングすれば軽くすることは可能だが、チューニングが大変。

公式実装がリリースされていない。 ここに公式では有りませんが実装がありました。

PointPillars: Fast Encoders for Object Detection from Point Clouds

CVPR 2019. https://arxiv.org/abs/1812.05784

  • 課題 image.png

従来点群のみ使用したネットワークは精度は高いが低速で、点群を画像に投影するネットワークは高速だが 精度が低いという欠点があった。

  • 提案 image.png 狙いとしては点群の細かい情報量を失わないように情報量をエンコードし、疑似画像に変換する。その疑似画像を2D CNNで使用するような物体検出ネットワークに入力し、物体検出を行う。 この手法の進歩性は従来単純に点群を俯瞰画像といった疑似画像に投影し物体検出CNNに入力するだけでは点群の細かい情報量が失われてしまっていた。そこで点群を画像に投影するためのエンコードネットワークを用いることで点群情報を失わずに物体検出CNN(SSD)に入力データを与え高精度化を達成した。

image.png 具体的に点群を画像にエンコードするために、Pillar(柱)と呼ぶ点群を細かく格子状に分割しPointNetのような点群DNNを使いPillar内の特徴量を抽出。そして得た2Dの特徴量マップをSSDに与えることで物体検出を行う。 アイデア自体は非常にシンプルながら、PointNetと物体検出CNNを結合する手法を初めて提案し点群物体検出の精度でブレイクスルーを果たした。

  • 実験 image.png 発表当時、KITTIベンチマークでstate of the artを達成。

ネットワーク自身も改造しやすく、Kaggleなどのコンペでも頻繁に使われている。

https://www.kaggle.com/c/3d-object-detection-for-autonomous-vehicles

Class-balanced Grouping and Sampling for Point Cloud 3D Object Detection

https://arxiv.org/pdf/1908.09492.pdf 現在のNuscenes一位のソリューション。 image.png

  • 課題 LiDARデータのaugumentationの提案が主に精度向上の要因。 Nuscenesはクラス間精度の平均が評価指標になっているが、学習データ数がクラスによっては異常に少なく学習が進まない。例えば最も頻出する車クラスに対して人やanimalクラスは1/10から1/100しかない。 image.png

  • 提案 このようなデータセットインバランスに対応するため、点群データ中に少数クラスを恣意的に生成することで学習を進みやすくした。ネットワーク自体はほぼPointpillarsの応用で、データセット拡張により大幅な精度向上を実現した。また精度に貢献している提案として大きさなどが似ているクラス(人と自転車など)を"superclass"としてまず分類してから詳細クラスを分類する2-stepの分類を実行している。

image.png 特に自転車クラスは14倍も精度向上した。

点群系(3D)のベンチマーク

ModelNet40

image.png 一番基本的な3D系のベンチマーク。 90%精度が出てしまっているので、モデルがオーバーフィット気味でベンチマークの価値は現在あまりなくなった。MNIST的に学習時間も短いので最初に試すのはこれ。 https://paperswithcode.com/task/3d-object-classification

現在は3D capsulenetがリーダー。 image.png

ScanNetv2

現在の室内用3Dデータでは一番難しいタスク。 VoteNetが一位ですね。 https://paperswithcode.com/sota/3d-object-detection-on-scannetv2

image.png

自動運転系

nuScenes

image.png 現在では最も難しく、巨大なデータセット。

  • 大規模点群+カメラ画像のアノテーション結果
  • 20秒で区切られた1000シーンのデータ
  • ボストンとシンガポールの街中
  • 23クラスの結果

https://www.nuscenes.org/object-detection?externalData=all&mapData=all&modalities=Any

image.png ベンチマーク首位はMEGVIIでPointpillarsは結構精度は低い。 一方でPointpillarsは使いやすく、KaggleのLyftコンペではほとんどの上位陣が使った。 https://www.kaggle.com/c/3d-object-detection-for-autonomous-vehicles

KITTI

image.png

従来まで使われていたデータセット。 データ数はあまり多くないが、データセット形式が使いやすくスタートするには最適。 http://www.cvlibs.net/datasets/kitti/

PS

逐次最新論文等は自分のブログにまとめてます。

距離センサ入門(ステレオカメラ、プロジェクション、LiDAR)

Qiitaからのお引越し記事です。

目標

通常のカメラは物体の明るさ、色を抽出するのに対し、距離センサは物体までの距離をセンシングします。そのため3DカメラやDepth Sensorなどと呼ばれたりします。

距離を知ることは多様なアプリケーションにおいて重要であり、例えば自動運転では前方車両までの正確な距離を知ることは必須です。またゲームなどのアプリケーションでは人の動作などを距離センサで抽出するKinectが遊びの幅を広げました。またDaVinciといった手術ロボットでも患部の正確な距離を知るためにも距離センサは重要です。

身近なアプリケーションですと例えば部屋の3Dマッピングなどに使用できます。

部屋の寸法、距離感覚は写真や間取り図にするとイメージが湧きづらいのですが、3Dマッピングしてしまえば部屋そのものを感じることができます。 image.png

このようなマッピングは新型iPhone Proで簡単にPolycamなどのアプリを使ってできるのでもしデバイスを持っていたら試してみて下さい!

この記事では世の中に大きくどのような距離カメラがあるのか、それらの概要や特徴、使用されている製品をリストします。

例えば研究開発プロジェクトに使用する距離センサが選べるようにするのが目標です。

私はLiDARの専門家なのでカメラベースの手法にはあまり詳しくないのですが、使用頻度の高い距離センサであるステレオカメラやプロジェクションカメラについても記述しました。

また点群ディープラーニングについてはこちらをどうぞ。

aru47.hatenablog.com

ステレオカメラ

概要

スバルアイサイトなどに搭載されている市場に多く出回る距離センサです。

https://www.subaru.jp/eyesightowner/about/

アイサイトのしくみ

またこちらのWhitePaperも参考になります。

Obtaining Depth Information from Stereo Images

https://www.zmp.co.jp/knowledge/adas_dev/adas_sensor/adas_camera/adas_stereo

png.png

原理は人間がものを立体的にみるのと同じ原理です。

目を左右交互につむり、モニタを見ると左右にずれるのがわかりますか?

脳はこのずれが大きい物体ほど近くにあり、ずれが小さいほど遠くにあると認識してくれます。これがステレオカメラの原理であり、人間が使っている距離センサもステレオカメラがベースになっているといえます

ステレオカメラではピクセルがどれくらいずれた事から、物体までの距離を測ることができます。この際カメラ同士が離れれば離れているほど物体に対してピクセルずれは大きくなるため、正確な距離が図りやすいです。一方でカメラ同士が近いとほとんどピクセルズレが起こらないため、距離を測るのは難しくなります。画素数を向上させれば原理的には測距距離は長くなりますが、信号処理量が指数関数的に増加してしまうのが欠点です。

またステレオカメラ最大のチャレンジは、2つのカメラが同一の物体を見ているかどうかを判定することです。これには高度な画像処理テクニックが必要で、遠くの物体が本当に同一かどうかを当てるのはとても難しくなります。

image.png

Reference: Obtaining Depth Information from Stereo Images

またステレオビジョンを適応するには左右の画像間で高低差があってはいけません。 そのため前処理でカメラ歪除去と高低差除去のキャリブレーション(rectify)が必要です。

特徴

他の距離センサは専用部品(レーザなど)が必要な一方で、ステレオカメラは普通の市販カメラを2つ使うだけで実現できるため、コストが安いのが最大のメリットです。

ただ距離を測るために左右のカメラで同一の物体の同じ場所を見る(認識する)必要があり、遠くのものの距離を測るのは難しい。数式などは省略するが、アイサイトのようにカメラを離れて設置しないと遠くのものでは視差が生まれないため、遠くまで見たい場合は筐体が大型化してしまうのが欠点です。

使用製品

市販製品ではIntelのRealSenseがソフトウェア(SDK)もついてきて試しやすいです。

RealsenseD435ならアマゾンで24000円なのでお手軽に購入できます。

https://amzn.to/3tgO9zGamzn.to

RealsenseD435の出力例です。

  • 近距離(1-3m)ならば高い精度が取れる
  • カメラベースのため、解像度が高い
  • CPUでもリアルタイム(30FPS)で動作

のが特徴です。ホビー用途の距離センサならば一番の選択肢だと思います。

RealsenseD400系にはパターンプロジェクションも付いていますが、距離推定に用いているのはほぼステレオカメラです(プロジェクションを切ってもほぼ絵が変わらないためあくまで補助機能ぽいですね。)

パターンプロジェクションカメラ

概要

工業用の高性能3DカメラやiPhoneのFaceIDで使われているのがパターンプロジェクションカメラです。

物体に既知のパターンを投影し(パターンプロジェクション)、その歪み方からカメラと物体までの距離を信号処理によって導出します。

説明を聞いてもよくわからないが、下記の図を見るとわかりやすいかと思います。ヘルメットのような物体があるところにしましまのパターンを投影すると、物体の高さによってしましまが歪むことがわかります。このような歪みを読み取り解析することで、ヘルメットの三次元形状を知ることができます。

pattern.png

また下記の動画はiPhoneのFaceIDの仕組みについて解説してます。赤外線で顔中にパターンを放射し、顔の正確な形状を読み取ることができる。凹凸をみているのでFaceIDを騙すのは難しく、セキュリティを強固なものにしていますね。

Using An Infrared Camera To Show How Face ID Works

https://www.youtube.com/watch?v=g4m6StzUcOw maxresdefault.jpg

  • LiDARに比べると部品がシンプルなため、価格が抑えられるのが特徴。

  • 室内使用であれば非常に高い精度が得られる(mm~um精度)。

  • 一方で外乱の多い屋外使用は厳しい。

またパターンプロジェクションとステレオビジョンを両方使うアプローチは多いです。

ピッキングロボットで頻繁に使用される高精度3DカメラEnsensoではパターンプロジェクションとステレオビジョン両方を備えます。 ステレオビジョンが苦手なマッチングが取りにくい物体(例えば平坦な壁など)でも綺麗に点群を得られるのがメリットです。

使用製品

iPhone

Image result for iphone face id

iPhoneの顔認証(FaceID)はアクティブプロジェクションカメラで実現されています。

FaceIDが使われるたびに、iPhoneは赤外線のパターンを放射してます。

実は元の技術はMicrosoft KinectV1を開発していた企業(PrimeSense)をAppleが買収し、発展したものです。 関係者の間ではMiniKinectなどと言われています。。笑

ゾゾスーツ

https://zozo.jp/zozosuit/ 1570948182773.png

ゾゾスーツもスーツのドットをカメラで撮影し、距離を測っているという意味で技術的には似ている。ただゾゾスーツはドットを投光していないのでパッシブプロジェクションと言えるかもしれない。人の大体のサイズ感が測れれば良いためか、FaceIDのカメラに比べると点数は少なめ。

工業製品(Ensenso, キーエンス)

工業用途のセンサ出力例はあまりネットに出回ってないのですが、mm精度が得られRealsenseなどとは精度自体は比べ物になりません(そんなのホビー用途ではオーバースペックなんですが)

一つ数百万円します笑

工場内の検品やロボット製品に使われることが多いです。産業系の展示会に行くとこいつが付けられていることが多いので探してみて下さい笑

一方でプロジェクションを正確に読み取れるのは数メートル範囲内のみであり野外の使用などは厳しいです。基本的には室内用ですね。

キーエンス 3Dカメラ

Ensenso X36

Time of Flight LiDAR

Time of Flightの原理

カメラベースの距離センサ(ステレオカメラ、プロジェクション)とLiDARは原理が根本的に異なる。

一方でLiDARはTime of Flight(光の飛行時間)をベースにして距離を測ります。

原理としては単純で、下記の図のようにレーザ光を筐体から放ち、そのレーザが物体に反射して返ってくるまでの時間を計測する。もしレーザ光が10秒後に返ってきて光速を単純のため1m/sとすると、物体までの距離は

(10秒 * 1m/秒)/2 = 5m

と5m先に物体があることがわかります。このように飛行時間をベースにして距離を導出する手法をTime of Flightと呼びます。

実際の光速は108m/sと非常に早いため、光が返ってくるまでの時間は数ピコ秒、ナノ秒のオーダーなので時間を計測する回路には高い精度が求められます。

このようなレーザパルスの帰還時間を直接測定するタイプのLiDARはdirect Time of Flight sensorとも呼ばれます。

https://tech.nikkeibp.co.jp/atcl/nxt/column/18/00001/02023/?ST=nnm image2.png

特徴

LiDARの最大の特徴は

  • 高精度
  • 遠距離
  • 外乱に強い(野外で使用可)
  • 値段が高い

と挙げられます。強いパルスレーザ光を照射し、その帰還時間から直接距離を導出するため誤差が混入しづらく信頼性が高いのが特徴です。これらの特徴はカメラベースで実現するのは難しいため、過酷な条件でも動作が義務付けられる自動運転ではLiDARが主に遠方の物体検出で使われることが期待されています。

一方でスキャン機構、レーザ出射機、レーザ受光部と多くの専門素子が必要になるためカメラ型に対してコストは数倍~数十倍高くなってしまうのはデメリットです。

最近はLivoxなど10万以下のLiDARが多くのプロトタイプで使用され始めているので値段が高いから敬遠される時代は終わりつつあるかも知れません。

この図のような長距離(100-200m)の精微な点群(Point Cloud)でスキャンできるのはLiDARの最大のメリットです。

野外で遠距離までバッチリ点群を取れる距離センサはLiDARだけです。なので自動運転などで熱い期待を持たれています。(TeslaなどLiDARいらないよ派もいますが。。)

スキャン型LiDAR

https://www.gizmocrazed.com/2019/03/gates-backed-lumotive-upends-lidar-conventions-using-metamaterials/ image.png

LiDARのの上記のTime of flightの原理で1画素あたりの距離を取得することはできます。それでは絵として距離情報を得るためにはどうしたら良いのでしょう?そのための工夫としてLiDARにはスキャンという概念があります。

一つのアプローチはミラーを使い、出射するレーザ光を走査(スキャン)する方法です。

https://commons.wikimedia.org/wiki/File:LIDAR-scanned-SICK-LMS-animation.gif image.png

上記のアニメーションはミラーを使ったLiDARのスキャンをわかりやすく表しています。ミラーを回転させることでレーザ光を360度走査し、周辺環境の全ての情報を得ることができます。

このとき1画素ずつ情報を得ながら二次元的にスキャンするのが2Dラスタースキャンという方式で、縦画素を一気に取得しながら横方向にスキャンする方式を1Dスキャンと呼びます。両者とも距離は出ますが、1Dスキャン法が距離画像を得るために必要な時間が短いため、高いFPSを達成しやすいです。

一方でミラーを使うと(一眼レフカメラのように)LiDARの筐体は大きくなってしまいます。そのためミラーを使わずにMEMSミラーを使ったり、光学的にスキャンするOptical Phased Array LiDARなども開発が活発に進められており、将来的にLiDARの小型化や低コスト化は進むと見られています。

フラッシュ型LiDAR

またスキャンをせずにカメラのイメージセンサのように二次元画素情報を一度に取得するようなLiDARも開発されています。イメージセンサ全体を覆うようなレーザ光を出射し、それを受光するだけなので構造的には非常に単純です。そのためスキャン型に比べ低コストで実現可能です。

一方で課題はいくつかあり、 - 1画素あたりのレーザパワーが少ないため距離が短い - 外乱に弱い - 干渉などに弱く、ノイズが発生しやすい というのが欠点のため自動運転には適さないが、室内のロボットなどには活かせるかもという感じです。

製品

Velodyne Series

最も有名なToF LiDARはVelodyneの製品でないでしょうか。LiDAR製品を初めて世に出したメーカーで現在も帝王として君臨しています。

彼らの製品は数十万~数百万と非常に高額ですがそのクオリティは一級品。Velodyneを使っていない自動運転車はTeslaとWaymoくらいだと思います(Waymoは独自LiDARを使用)。ロボットの研究開発の現場でも画素数や精度が高いため、Veloが使われることが多いイメージです。

www.argocorp.com

VLP-16_2.jpg

追記 Livox Horizon

DJIの子会社であるLivox社が10万円を切りつつも高精度を達成するLiDARを発売しており、こちらがロボ系プロジェクトでは主流になりつつあります。

アマゾンで買えます笑

amzn.to

www.livoxtech.com

クオリティは凄まじく、SDKなどgithubで公開してくれてるので開発もしやすいです。Velodyneから乗り換えている人多数ですね。

iPhone

image.png iPhoneのフロントには実は結構昔からToF LiDAR(1画素)が搭載されています。 スキャンなどはしないので低コストなのでしょう。

画像で言うProximity Sensorがそうです。 通話する時、iPhoneの画面を顔に近づけると画面は自動的に切れます。これは顔とiphoneとの距離をセンシングしているからだと思います。

追記:iPhone, iPad ProはdToF LiDARを搭載しました。 詳しくは:こちら記事参照

iToF LiDAR

Azure Kinectなどに搭載されている技術です。

amzn.to

技術や原理はこちらの記事参照。

aru47.hatenablog.com