画像処理
GPU
機械学習
FPGA
画像認識

以下の記事は,OpenVinoの登場などによって状況が変わりつつあるようです。最新の技術動向を自力で調査して、判断を行なってください。

さらに、Ultra96ボードの登場によっても、FPGAボードでの開発がさらに加速されるでしょう。


画像処理・画像認識を高速化しようとすると、どのようなアプローチをすべきなのか迷うことがあります。

そこで役に立つ資料を見つけたので、参考までにメモを残します。

並列化処理については、それを専門とする方々が多数いらっしゃるので

このメモを読むよりは、それらの方の作成された資料を直接読むことをお勧めします。

デスクトップで電源とファンの心配をしなくていい分野と

組み込みでバッテリーの心配がいる分野では、最適な選択が異なります。

また、そのシステムを何台作るのかによっても最適な選択は異なります。

FPGAとASICでは生産台数が相当な規模にならない限り、ASICを新たに起こす利点はありません。しかも、FPGAの側が有利な台数は、FPGA技術の進展により増加しています。

しかし、システムに必要なものを既存のASICを流用するときには、少ない台数でも追加コストは発生しません。

ですから、画像処理を含むCPUは、どんどん少数のASICに集中している傾向があります。かつては、デジタルカメラメーカ自体が画像処理のASICを開発していることが多かったようですが、今では、専業の画像処理のASICメーカーのチップや、携帯電話用のチップを利用していることが増えているようです。

CPU, GPU, FPGA, ASICをめぐる争いは、使用するアルゴリズムの組み合わせとともに、状況が著しく変わります。

最新の状況を、検索して見てください。

slideshare 「マルチコアを用いた画像処理」

slideshare 2値化CNN on FPGAでGPUとガチンコバトル(公開版)

私見:

・mapに分類されるパターンでは、SIMD命令が効果的らしい。演算とデータ転送では、データ転送のコストが大きいために、GPUで処理したときにCPUのSIMDやOpenMPなどに打ち勝つことができない。

 LSI設計でCPUに独自の演算を追加できるような場合は、SIMD演算を追加するようなものと見ることができるのだろう。

 

・画像認識でもフレーム間で独立な処理ならば、マルチコアで別スレッドで動作させることで並列性を向上させる方法がある。

(ただし、1つのフレームに対して既にマルチコアによる並列性を利用している場合には、効果は望めない)

・インテルのCPUの場合、「インテル Parallel Studio」を使ってみることを考慮すべきらしい。

・FPGAが利用できるZynqデバイスでも、ARMコアのNEON命令による高速化は考えるべきらしい。

・専用回路をFPGAで自作するのは、それによる高速化が10倍程度の場合にはFPGA化しないことも考えたほうがよいらしい。アルゴリズム自体の改善で、同程度の改善が数年で達成する場合があるからだそうだ。(どこかの記事でそういっていた。)

・汎用的な線形代数の高速化の場合だと、そのアーキテクチャ用の適切なライブラリを選ぶことだけを考えるべきであって、自分で改良をできる場合はそう多くないはずだ。

追記:

 ソフトウェアによる画像処理の記述には、改良の余地がかなりあることを次の記事から知りました。


例えば入力画像を二乗して20を足すコードを書くとします.

計算の結果,

OpenCVは73 ms

Halideは9.8ms

と圧倒的な違いがありました.


ここに記載していたメモは、次の記事にいたしました。

高速な画像処理用言語 Halideについて調査中

OpenCV のcv::Mat型に関して言えば、各画素に対するアクセスを含むコードを書いている場合、

次の記事を参考にしてはいかがでしょうか?

qiita cv::Mat::forEachを使った高速なピクセル操作

また、画像処理で2重ループをなるべく書くな も考量に入れておいてください。 2重ループを何も考えずに、書いているとOpenCVのライブラリ関数の方が格段に速い結果になっていることがあるのも視野においてください。

参考資料

qiita 「雨の中、Cを書かずにPythonで並列計算をする人間がいてもいい。自由とはそういうものだ。」

コンパイラによる最適化

書籍 「構造化並列プログラミング―効率良い計算を行うためのパターン 」

FPGAによる最適化

インテル® FPGA マシーンラーニング (機械学習)

Intel® Distribution of Caffe

Alteraのロゴはもう使われていなく、Intelのロゴが使われています。


インテルは、FPGA の専門家になる必要なく、推論 (スコアリング) 用 CNN トポロジーを超低消費電力で実装する FPGA アーキテクチャーの柔軟性を利用するために、Deep Learning Accelerator FPGA IP (Intellectual Property) を提供しています。FPGA にロードされたこの IP により、DAAL (Data Analytics Acceleration Library) に入っている Intel® Caffe、および Intel® MKL-DNN を利用して、FPGA を再コンパイルせずに ALexNet や GoogleNet のようなトポロジーを構築できます。


FPGA上のDeep Learning の一例

AIやビッグデータの進化を加速させる半導体はGPUか? FPGAか? CPUか?

slideShare Polyphony: Python ではじめる FPGA

slideShare PythonとPyCoRAMでお手軽にFPGAシステムを開発してみよう

slideShare 研究者のための Python による FPGA 入門


追記 以下の記事が参考になりそうだ。

「FPGAマガジン No15

手のひらFPGAボードですぐに試せる!

車に農業!?AI時代のチャレンジ!リアルタイム動画認識」

FPGA_magazine

FPGAは、10年前に比べると格段に使いやすくなっている。


  • 評価ボードの値段が画期的に安くなった

  • ARMコアが標準的に入っていて、ARMコアとFPGA間のバスも標準化されている。

  • OpenCVの代表的な関数について、既にFPGA用のデザインが用意されている。

  • RTLを書かずに、C/C++のインタフェースからOpenCV互換のIPを利用できるようになっている。


FPGA関連の記事があるサイト

http://monoist.atmarkit.co.jp/mn/subtop/features/fpga/

http://fpga.cqpub.co.jp/

PYNQについて調査中


OpenCL関連

OpenCLをGPUで顔検出に使った動画

OpenCL face detection


参考イベント