この記事は”
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 に示します。

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

図 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協調シミュレーションのブロック図を示します。

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

図 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 ビデオライブラリを使用したハードウェア+ソフトウェアによるマーカーを使用した隊列走行の様子です。
- 2016年12月23日 03:30 |
- OpenCV
-
| トラックバック:0
-
| コメント:0