FC2カウンター FPGAの部屋 Vivado HLSのビデオ プロセッシング関数を使用したOpenCVのFPGAアクセラレーション

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Vivado HLSのビデオ プロセッシング関数を使用したOpenCVのFPGAアクセラレーション

この記事は”OpenCV Advent Calendar 2016”の23日目の記事として書きます。

1.FPGAのツールについて
FPGAを知らないという方も多いと思うので、ツールについて説明したいと思います。
Xilinx 社のFPGA 用のツールとしてVivado Design Suite - HLx Edition (通称 Vivado) というツールがあります。これでFPGA を開発するわけです。通常はハードウェア記述言語(HDL)という専用の言語を使います。HDL言語の 2 大勢力としてVerilog HDLとVHDL があります。ですが、最近は高位合成ということで、C, C++, Python, Jave などからHDLを合成できるツールが出てきました。そのうちのC, C++ を使ってHDL を合成するツールがVivado にもあります。Vivado HLS です。
なお、Vivado と Vivado HLS は、デバイス限定ではありますが、無料です。だれでも気軽に始められますよ。

2.Vivado HLS(高位合成ツール)
正確に書くとVivado HLS はC, C++ 言語の記述をHDLに変換して、Vivado のIP を作ります。そのIP をVivado にインポートし、Vivado のIP インテグレータのブロックデザイン上にインスタンスして使用します。(CやC++でどこが高位なのかという疑問があると思いますが、ハードウェアはHDLレベルなので、動作を書けるCやC++ でも高位な言語となります)
また、Xilinx 社のFPGAチップとして、Zynq というチップが出ていますが、これはARMプロセッサのCortex-A9 x2 +FPGAが搭載されているチップです。Zynq を使用するとC やC++ でOpenCV でソフトウェアとして書いて実行もできますし、ハードウェアに落としてアクセラレーションすることもできます。ただし、OpenCV のコードはハードウェアに独自のライブラリを使っているため一部書き換えが必要です。

Vivado HLS についての資料は”Vivado Design Suite ユーザー ガイド 高位合成 UG902 (v2016.3) 2016 年 10 月 5 日”をご覧ください。215ページの「ビデオ プロセ ッ シング関数」にOpenCV ライブラリのことが記述されています。
Accelerating OpenCV Applications with Zynq-7000 All Programmable SoC using Vivado HLS Video Libraries XAPP1167 (v3.0) June 24, 2015”に使用例が書いてあります。
もう1つの情報源はXilinx のWiki の”HLS Video Library”です。
Xilinx のCommunity Forum も参考になります。
とにかく情報が少なく、どのような構造になっているのかが、よくわからないのが欠点です。

3.Xilinx社のHLS ビデオライブラリのWikiの内容
Xilinx のWiki の”HLS Video Library”からの引用です。日本語はGoogle翻訳を使用します。
Vivado HLS のHLS ビデオライブラリには、以下に示すライブラリ関数があります。

Video Library Data Structures
HLS Video Libraryには、イメージ、ピクセルなどの基本的なデータ構造を表現するためのテンプレートクラスがいくつか用意されています。これらの名前と使用方法のほとんどは、OpenCVに似ており、FPGAの特殊化と最適化があります。
 hls :: Mat <ROWS、COLS、T>
 hls :: Scalar <N、T>
 hls :: Window <ROWS、COLS、T>
 hls :: LineBuffer <ROWS、COLS、T>

OpenCV interface functions
 IplImage2AXIvideo
 AXIvideo2IplImage
 cvMat2AXIvideo
 AXIvideo2cvMat
 CvMat2AXIvideo
 AXIvideo2CvMat
 IplImage2hlsMat
 hlsMat2IplImage
 cvMat2hlsMat
 hlsMat2cvMat
 CvMat2hlsMat
 hlsMat2CvMat
 CvMat2hlsWindow
 hlsWindow2CvMat

AXI4-Stream I/O Functions
 hls :: AXIvideo2Mat
 hls :: Mat2AXIvideo

Video Processing Functions
 hls::AbsDiff
 hls::AddS
 hls::AddWeighted
 hls::And
 hls::Avg
 hls::AvgSdv
 hls::Cmp
 hls::CmpS
 hls::CornerHarris
 hls::CvtColor
 hls::Dilate
 hls::Duplicate
 hls::EqualizeHist
 hls::Erode
 hls::FASTX
 hls::Filter2D
 hls::GaussianBlur
 hls::Harris
 hls::HoughLines2
 hls::Integral
 hls::InitUndistortRectifyMap
 hls::Max
 hls::MaxS
 hls::Mean
 hls::Merge
 hls::Min
 hls::MinMaxLoc
 hls::MinS
 hls::Mul
 hls::Not
 hls::PaintMask
 hls::Range
 hls::Remap
 hls::Reduce
 hls::Resize
 hls::Set
 hls::Scale
 hls::Sobel
 hls::Split
 hls::SubRS
 hls::SubS
 hls::Sum
 hls::Threshold
 hls::Zero


4.Vivado HLS の操作手順について
これからのXilinx社の高位合成ツールのVivado HLS について簡単に説明します。
Vivado HLSのファイルはテストベンチとソースに分けられます。Vivado HLSのファイル構成や手順を図 1 に示します。
Vivado_HLS_OpenCV_1_161219.png
図 1 Vivado HLSのファイル構成や手順

テストベンチが main() 関数があるところで、main() からハードウェア化する関数を呼び出して使用します。テストベンチとハードウェア関数は別のファイルで、それぞれ、Vivado HLS のTest Benchフォルダ、Sourcesフォルダにから関連付けされています。その様子を図 2 に示します。
Vivado_HLS_OpenCV_2_161219.png
図 2 Vivado HLS 画面

図 2 で、Sourcesフォルダの opencv_ex_ug.cpp がハードウェア化する関数のファイルで、opencv_ex_ug_tb.cpp がテストベンチです。

図 1 に話を戻すと、ハードウェア関数はCコードの合成を行って、HDLに落とされます。次にIP 化を行って、Vivado で使えるようになります。
この辺りは、話せば相当長くなるので、省略します。

つまり何が言いたかったかというと、ソフトウェアでも実装できて、最初にソフトウェアで動作を確認して、そのままハードウェアに落とすことができます。Vivado_HLS のOpenCVライブラリは通常のOpenCVと違うところもあるので、そのままというわけにはいきませんが、ほとんど同じにできます。
ハードウェアにすると、性能が向上するか?という疑問があると思いますが、ハードウェアに適した課題で、しかもハードウェアに合わせてコードを最適化したり、指示子(ディテクティブ、プラグマで書きます)を適切に追加する必要があります。今のところは、FPGAの構造を熟知していないとチューニングは難しいかもしれません?

5.例1 Sobelフィルタ
それでは実際のC コードを見ていきましょう。最初にSobel フィルタのコード例です。

Vivado HLS 2015.4 で OpenCV を使ってみた3(Sobelフィルタを試した1)

ここでは、シミュレーションだけを行っていて、実機では動作させていません。

6.Vivado HLS のC シミュレーションとC/RTL協調シミュレーション
Vivado HLS にはC シミュレーションとC/RTL協調シミュレーションの2つのシミュレーションがあります。C シミュレーションは普通にC ソースコードをコンパイルして実行します。これは普通のVisual Studio とかでやっているのと同じ普通のC の実行です。
もう1つのC/RTL協調シミュレーションは、ハードウェア化する関数をハードウェアとしてHDL に合成した後に動作を確かめるためにRTL シミュレーター(HDLをテストするシミュレーターです)とC のテストベンチを連動させてシミュレーションするものです。この場合に、HDL にしたときのデータの同一性をチェックするためにテストベンチでOpenCVを使用して処理したデータとRTL シミュレーターの出力データを比較しています。今のところテストベンチはそのように記述されています。図 3 にC/RTL協調シミュレーションのブロック図を示します。
Vivado_HLS_OpneCV_3_161220.png
図 3 C/RTL協調シミュレーションのブロック図1

OpenCV では、値が一致しないこともあるので、(近い値になっています)その場合は異常終了しないようにしています。
また、FPGAに落とす場合は、浮動小数点演算のコストが大きく、膨大なリソースを使用するため浮動小数演算を固定小数点演算にする場合が多いです。その場合の誤差を計測するためにもシミュレーションを使用します。その場合のブロック図を図 4 に示します。
Vivado_HLS_OpneCV_4_161220.png
図 4 C/RTL協調シミュレーションのブロック図2

7.例2 FASTXコーナー検出
OpenCV のFAST コーナー検出器のHLS ビデオライブラリ版のFASTX コーナー検出器を確かめてみたのがこの記事です。

FASTX コーナー検出の改良3(threshold をソフトウェアで変更可能にする)

ここでは、800 x 600 ピクセルの画像で、リアルタイムにFASTX コーナー検出を行っています。レポートを見ると、

FASTX コーナー検出IP は 280 MHz まで動作するというレポートが出ているので、HD 解像度の 148.5 MHz も問題なくできると思う。そのようにすればHD解像度で、60 fps のFASTX コーナー検出ができると思う。

という結論になりました。かなりの性能が出ていると思われます。

その他、Vivado HLS の記事は、Vivado HLS をご覧ください。

8.実例 ミニロボットカーによる自動走行例
Vivado HLS のHLS ビデオライブラリを使用したハードウェア+ソフトウェアによる白線追従走行の様子です。カメラを使用した画像解析で白線の間を走っています。


次に同様に、Vivado HLS のHLS ビデオライブラリを使用したハードウェア+ソフトウェアによるマーカーを使用した隊列走行の様子です。



  1. 2016年12月23日 03:30 |
  2. OpenCV
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3667-86434859
この記事にトラックバックする(FC2ブログユーザー)