Vitis HLSにVitisビジョンライブラリとOpenCVをインクルードして、高位合成の環境を構築する方法【Windows】(2)

ビジョンライブラリ
スポンサーリンク

本記事の概要

概要

Windows環境において、Vitis HLSにVitisビジョンライブラリと、テストベンチ検証用のOpenCVをインクルードする方法について解説。画像処理関数を高位合成する環境を構築する。
本記事では、Vitis HLSのセットアップ方法を解説する。

Vitisビジョンライブラリは、Xilinx社が提供しているVitisライブラリのうち、画像処理に特化したライブラリを指します。
Vitisライブラリは、Open Sourceのライブラリで、線形代数やソルバー、画像処理など、各機能に特化したAPI関数が含まれる開発ツールです。このツールを使って、ソフトウェアで記述したプログラムをFPGAのロジックに合成して、処理を高速化(アクセラレーション)することが可能です。

Vitis ライブラリ
Vitis 統合ソフトウェア プラットフォームには、既存のアプリケーションにわずかなコード変更を加えるだけですぐに高速化を実現できる、最適化されたオープンソース ライブラリが多数含まれています。アルゴリズムをゼロから再実装する必要がなく、ザイリンクスの適応性に優れた演算機能を活用できます。

実際に、ビジョンライブラリから高位合成する方法は以下の記事をご覧ください。

Vitis HLSにOpenCVライブラリをインクルードして環境を構築するのはひと手間かかります。
私も何度かエラーが発生するなか、やっとテストベンチシミュレーションと高位合成を行うことができました。

前回の記事では、Vitis HLSのテストベンチ関数で使用するためのOpenCVの環境を、Windows上で構築する方法を紹介しました。

本記事では、Vitisビジョンライブラリをダウンロードし、実際にVitis HLS上でビジョンライブラリとOpenCVをそれぞれインクルードする方法を解説します。

本記事の対象読者:以下の状況に直面している方
  • すでにVitis HLSの開発環境は構築済みで、Vitisビジョンライブラリを新たに追加したい
  • OpenCVのインクルードでエラーが発生している
おすすめ書籍

「プログラムはなぜ動くのか」は、ソースコードをコンパイルしてから、OpenCVのようなライブラリファイル(lib, dll)をリンクし、実行ファイルを作成する一連の流れを理解するのに有用な書籍です。プログラムのビルドに詰まったときに、状況を整理するのに役立ちました。

Vitisライブラリのダウンロード

前回の記事で実施したOpenCVのビルドを待っている間に、Vitisライブラリをダウンロードしましょう。
次のXilinxのページからVitisライブラリをダウンロードします。
[Vitisビジョンライブラリのみ]と[Vitisライブラリすべて]のどちらかを選択します。
私は他の線形代数などのライブラリも試してみようと思い、 [Vitisライブラリすべて] を選択しました。

Vitis ビジョン ライブラリ

GitHubのページに移行するので、[Code]>[Download Zip]と選択します。

Vitis Libraries MasterというZipファイルがダウンロードされるので、それを解凍します。
解凍したフォルダは好きなディレクトリ(LIBRARY_ROOT)に移しておきます。私は以下のディレクトリに移動しました: LIBRARY_ROOT = C:\Xilinx\Vitis_Libraries-master

以上で、Vitisライブラリのダウンロードは完了です。

Vitis HLSの設定

次に、Vitis HLSを設定しましょう。
Vitis HLSのプロジェクトを作成します。
以前投稿した以下の記事で解説した方法と同様に、まずはソースコードは指定せずにプロジェクトを立ち上げました。

プロジェクトが作成出来たら、Vitisビジョンライブラリのexampleディレクトリから、テストベンチ関数と高位合成の対象となる関数をそれぞれインポートします。

今回はガウシアンフィルタを例に説明します。

ビジョンライブラリ内のexampleディレクトリ[ LIBRARY_ROOT \vision\L1\examples\gaussianfilter]から

  • xf_gaussian_filter_accel.cpp : 高位合成の対象となる関数
  • xf_gaussian_filter_config.h : xf_gaussian_filter_accel.cppのヘッダファイル
  • xf_gaussian_filter_tb.cpp : テストベンチ関数

の3つのファイル、
そして、さらに下位のディレクトリ[ LIBRARY_ROOT \vision\L1\examples\gaussianfilter\build]から

  • xf_config_params.h : 各種パラメータを指定したヘッダファイル

のファイル、
そして、入力関数としてディレクトリ[ LIBRARY_ROOT \vision\data]から

  • 128×128.png

を作成したプロジェクトのディレクトリにコピーしました( LIBRARY_ROOT = C:\Xilinx\Vitis_Libraries-master)

コピーが完了したら、高位合成の対象となる関数とテストベンチ関数をVitis HLSに加えます。
高位合成の対象となる関数xf_gaussian_filter_accel.cppは、ExplorerのSourceを右クリックし、[Add Source File…]から選択します。

テストベンチ関数 xf_gaussian_filter_tb.cpp は、TestBenchを右クリックし[Add Test Bench File…]から選択します。

次に、先ほどインストールしたOpenCVライブラリとビジョンライブラリへのリンクを設定します。
Projectから[Project Settings…]を選択します。

新しく立ち上がったウィンドウでは以下の通り設定します。

Vitis HLSのFlagの設定方法

(A) Simulationの設定(Cシミュレーションのための設定)

①まず、[Edit CFLAGS…]をクリックし、立ち上がったダイアログに
[-I LIBRARY_ROOT \vision\L1\include -I OPENCV_BUILD_PATH \install\include -std=c++14 -Wno-unknown-pragmas]
を入力します。
例えば、私の場合は、 LIBRARY_ROOT = C:\Xilinx\Vitis_Libraries-master、 OPENCV_BUILD_PATH = C:\opencv_hls\buid_mingw としたので、

-IC:\Xilinx\Vitis_Libraries-master\vision\L1\include -IC:\opencv_hls\opencv\build_mingw\install\include -std=c++14 -Wno-unknown-pragmas

と入力しました。

-std=の後は、Xilinxのドキュメンテーションではc++14ではなくc++0xが指定されています。

stdオプションはC++のコンパイラを利用するときに、明示的にどのバージョンのC++の機能を使うのかを示すものです。c++0xは09年以前のリリースをめざしていた名残で0xとつけられています。実際は、計画が変更され2011年にリリースされたのでC++11のことを指します(参照)

私のビルド環境では、c++0x でCシミュレーションを進めると大量にWarningが出てしまったので、c++14に変更しました。

②次に、[Linker Flags]に、
[-L OPENCV_BUILD_PATH \install\x64\mingw\lib -lopencv_core440 -lopencv_imgcodecs440 -lopencv_imgproc440]
を入力します。例えば、私の場合は、

-LC:\opencv\build_ming\install\x64\mingw\lib -lopencv_core440 -lopencv_imgcodecs440 -lopencv_imgproc440

と入力します。

③最後に、[Input Argument]に入力画像のパスを入力します。先ほどプロジェクトのディレクトリに移動した画像128×128.pngへのパスを指定します。

(B) Synthesisの設定(高位合成のための設定)

①Top Functionsに、右の[Browse…]をクリックし、高位合成の対象となる関数名を選択します。例えば今回は、”gaussian_filter_accel”となります。

②[Edit CFLAGS…]をクリックし、立ち上がったダイアログに
[-I LIBRARY_ROOT \vision\L1\include -std=c++14]
を入力します。例えば、私の場合は、

-IC:\Xilinx\Vitis_Libraries-master\vision\L1\include -std=c++14

と入力しました。 Synthesisの方にはOpenCVのパスを含めないように注意しましょう。

以上で、Vitis HLSの設定は完了です。

Cシミュレーションでの実行処理の確認

では、無事にビルドが通るかを確認しましょう。
[C Simulation]を実行します。

エラーが発生したときのために、デバッグモードで立ち上げます。[Launch Debugger]にチェックを入れ、[OK]をクリックします。

注意!

画像では、Input Argumentsの指定が、“¥”で区切られていますが、”/”に直さないとCシミュレーションでエラーが発生します。

誤: "..¥12xfopencv_start¥vision_start¥128x128.png"
正: "../12xfopencv_start/vision_start/128x128.png"

なぜか”¥” のままでも[Launch Debugger]で立ち上がるデバッグモードはうまく実行できますが、通常のCシミュレーションでは区切りを直さないと次のエラーが発生します。原因が非常にわかりにくいエラーですので、細かいところですが、慎重にパスを指定しましょう。

INFO: [SIM 211-2] *************** CSIM start ***************
INFO: [SIM 211-4] CSIM will launch GCC as the compiler.
make: 'csim.exe' is up to date.
ERROR: [SIM 211-100] CSim failed with errors.
INFO: [SIM 211-3] *************** CSIM finish ***************
INFO: [HLS 200-111] Finished Command csim_design CPU user time: 1 seconds. CPU system time: 0 seconds. Elapsed time: 1.509 seconds; current allocated memory: 256.656 MB.
4
    while executing
"source C:/xilinxPrj/blog/12xfopencv_start/opencv_try/solution1/csim.tcl"
    invoked from within
"hls::main C:/xilinxPrj/blog/12xfopencv_start/opencv_try/solution1/csim.tcl"
    ("uplevel" body line 1)
    invoked from within
"uplevel 1 hls::main {*}$newargs"
    (procedure "hls_proc" line 16)
    invoked from within
"hls_proc [info nameofexecutable] $argv"

デバッグモードが次の画面のように立ち上がれば成功です。左上の実行マークをクリックしましょう。

そうすると、コンソールに処理結果が出力されます。OpenCVとビジョンライブラリの出力結果の間に誤差がないことを示しています。

また、画像処理後の画像と差分処理後の画像はプロジェクトフォルダ内に格納されています。
[/solution1/csim/build]というフォルダの中にそれぞれの画像があります。

処理後の画像

error.png(差分画像)が真っ黒(すべてゼロ)に表示されていれば、シミュレーションに成功しています。

ひがし
ひがし

Vitis HLSでビジョンライブラリを使えるようになったと思います。かなり試行錯誤しながら進めたので、参考にしていただければと思います。
実際にビジョンライブラリでアプリケーションを構築するのは、また別の機会に。引き続き、高位合成や協調Sim、IP生成がうまくできるかを試してみます。

最後までご覧いただきありがとうございました!

スポンサーリンク


参考:開発環境

環境
  • 開発用PC: Windows 10, 64bit
    • Vitis コア開発キット – 2021.2

参考にさせていただいたサイト

コメント