概要Vitisビジョンライブラリでテストベンチ関数を使ったCシミュレーションの方法を解説。用例のcustomconvに含まれるFilter2D_accelを例にラプラシアンフィルタの高位合成と実装をめざす(本記事はCシミュレーションのみ)Xilinxの統合ソフトウェア開発環境では、Vitisビジョンライブラリ(以下、ビジョンライブラリ)をインクルードすることによって、画像処理機能を高速化(アクセラレーション)することが可能です。OpenCVのフィルタ処理などを、FPGAに実装可能なロジックへと高位合成することができます。ビジョンライブラリのインクルードの方法は以下の記事にまとめています。HLSにビジョンライブラリとOpenCVをインクルードして、画像処理関数を高位合成する環境を構築しました。本記事では前準備として環境構築に必要なセットアップのうちOpenCVのインストール方法を解説しています。HLSにビジョンライブラリとOpenCVをインクルードして、画像処理関数を高位合成する環境を構築しました。HLSのセットアップの方法を解説しています。phys-higashi.com2022.01.09本サイトでは実際にVitisビジョンライブラリのFilter2D_accel関数を例に、ラプラシアンフィルタを行う画像処理IPのCシミュレーション、高位合成、C/RTL協調シミュレーション、そして実装を進めていこうと思います。最終的にラプラシアンフィルタをZynqに実装し、空間フィルタ処理した画像をディスプレイに表示させてみようと思います。-本記事では、VitisとVivadoを用いてZybo経由で外部ディスプレイに画像を出力するアプリケーションを作成します。DiligentからダウンロードしたHDMI出力デモサンプルをもとに、Zynq内部のハードウェア構成を設計しています。phys-higashi.com2021.02.21まず、本記事では、Filter2D関数の動作をテストベンチでシミュレーションしす。シミュレーションは、C/C++で記述されたソースコードが所望の機能(ラプラシアンフィルタ)を満足するかどうかを確認するCシミュレーションです。テストベンチ関数の処理の内容を理解し、そのうえで動作を確認できればと思います。この記事の対象読者Vitisビジョンライブラリを初めて扱うビジョンライブラリのテストベンチの方法を知りたいビジョンライブラリの各パラメータの設定方法を知りたいFilter2D_accelについてまず、今回用例に採用するFilter2D_accel関数について簡単に述べておきます。Filter2Dは、入力画像に対し線形フィルタによる空間フィルタリング処理を行う関数で、OpenCVにも実装されています。空間フィルタリングとは、入力画像の対応する画素値だけでなく周囲の画素も含めた特定の領域内の画素値を用いて計算する画像処理のことを言います。空間フィルタは線形フィルタと非線形フィルタに分類され、周囲の画素を用いた演算が次の式のように線形変換で与えられる空間フィルタのことを、線形フィルタといいます。\):カーネルと呼ばれる線形フィルタの係数を表す行列。要するに、Filter2Dは、入力画像に対してカーネル行列を使った畳み込み(convolution)処理を行う関数です。convolutionの略か?)という名前でディレクトリが用意されています。線形フィルタを用いた空間フィルタリング処理では、以下のような画像処理を施すことができます。平滑化(smoothing):周囲の画素との平均をとる。extraction):周囲との画素との差分をとる。画素値の急峻な変化を抽出することが可能。鮮鋭化(sharpening):入力画像と平滑化画像との差分をとる。元の画像を維持しつつ、エッジを強調する今回は、エッジ抽出の一つである4近傍ラプラシアンフィルタを例にしてみましょう。0\end{pmatrix}$$で与えられる横方向と縦方向の2次微分の和を出力する線形フィルタです。$$※実際の画像は離散的なので微分ではなく差分です。画像処理は、まず次の教科書がおすすめです。CG-ARTS協会が監修で、基本事項が網羅的にまとめられていますし、何より図解が多くわかりやすいです。画像処理だけでなく、必要となる光学の基礎や、カメラやディスプレイの動作原理、規格など、ハードウェアに関する最低限の知識が記載されているのもよかったです。RinkerKindleAmazon楽天市場Yahooショッピングある程度読んでから、力試しに画像処理エンジニア検定の問題集を解いてみると理解が深まります。受験してみて資格を取ってしまうのもよいかもしれませんね。RinkerKindleAmazon楽天市場Yahooショッピングテストベンチを読み込むまずは、ビジョンライブラリからFilter2D関数を読み込みましょう。読み込む方法は以下の記事を参考にしてください。HLSにビジョンライブラリとOpenCVをインクルードして、画像処理関数を高位合成する環境を構築しました。HLSのセットアップの方法を解説しています。HLSを立ち上げ、空のプロジェクトを作成します。ビジョンライブラリにおけるL1ディレクトリの用例customconvからテストベンチと高位合成対象のソースコードをそれぞれプロジェクト内にコピーします。Vitisライブラリのパスを指します。C:\Xilinx\Vitis_Libraries-master]です。処理する入力画像もプロジェクトにコピーしておきましょう。今回は、解像度640×480のディスプレイに投影するため、解像度160×120の次のビットマップ画像を用意しました。640×480の画像でもよいのですが、高位合成後のロジック規模が大きくなりすぎたので、解像度を下げています。Benchに、高位合成の対象となるxf_custom_convolution_accel.cppをSourceに登録します。Settingと順に選択し、SimulationとSynthesisの設定タブでそれぞれFlagを設定し、ビジョンライブラリとOpenCVライブラリをインクルード、そしてリンクするためのフラグを設定します。-Wno-unknown-pragmas]を入力します。-Wno-unknown-pragmasと入力しました。-std=の後は、Xilinxのドキュメンテーションではc++14ではなくc++0xが指定されています。stdオプションはC++のコンパイラを利用するときに、明示的にどのバージョンのC++の機能を使うのかを示すものです。c++0xは09年以前のリリースをめざしていた名残で0xとつけられています。Cシミュレーションを進めると大量にWarningが出てしまったので、c++14に変更しました。-lopencv_imgproc440]を入力します。-lopencv_imgproc440と入力します。Argumentsには入力画像のパスを設定しました。Functionsに、右の[Browse...]をクリックし、高位合成の対象となる関数名を選択します。今回は、”Filter2D_accel”となります。-std=c++14]を入力します。-std=c++14と入力しました。Synthesisの方にはOpenCVのパスを含めないように注意しましょう。HLSへの関数の読み込みは終了です。今回の解像度の画像に対しラプラシアンフィルタの処理を行うため、ヘッダーファイルとテストベンチ関数のパラメータを変更しました。xf_config_params.hまず、xf_config_params.hから。次のようにパラメータを設定します。1それぞれのパラメータの意味は以下の通り。入力画像は符号なし8it分解能のビットマップ。ビジョンライブラリにおけるxf::cv::Mat型の使い方については、次の記事をご覧ください。Vitisビジョンライブラリのxf::cv::MatクラスについてVitisビジョンライブラリで画像を取り扱うためのクラスxf::cv::Matの宣言の仕方とテンプレート引数、メンバについてまとめました。OpenCVのcv::Matクラスとの相違点を中心に解説しています。ユーザーが変更しなくてはならないのは、HEIGHTとWIDTHとSHIFTの3つです。このうちHEIGHTとWIDTHは、入力画像と出力画像を格納するMatオブジェクトのテンプレート引数そのものなので、特に上記の記事をご覧いただければ説明は不要でしょう。SHIFTは、空間フィルタリングのカーネルを定義するときのビット右シフトの回数を表します。カーネルに次の平滑化フィルタを設定する場合を考えましょう(customconvはデフォルトでこのフィルタが設定されています)。int、すなわち符号付き2byte整数型です。平滑化フィルタでは小数を入力しなければ正しく計算できません。そこで、用いるのが右シフトです。カーネルを0.1111ではなく、3640に設定し、SHIFTを15とします。$$なので、小数を表現することができます。ラプラシアンフィルタの場合、整数なのでビットシフトを設ける必要はありませんが、次のように8ビット分シフトさせて小数も代入できるようにしました。//0;一連の処理の流れ次に、具体的にテストベンチの処理を確認しましょう。テストベンチxf_custom_convolution_tb.cppのメイン関数は以下の順に処理がなされています。cv::Matクラスのオブジェクトin_imgに入力画像を代入。OpenCVのfilter2D関数で用いるカーネルを、cv::Matクラスのオブジェクトfilterに代入。OpenCVのfilter2D関数を呼び出し、参照画像を算出。cv::Matクラスのオブジェクトocv_refに参照画像を代入。ref_img.jpgというファイルに参照画像を出力。ビジョンライブラリのFilter2D_accel関数で用いるカーネルを配列filter_ptrに代入。cv::Matクラスのオブジェクトout_imgに出力画像を代入。out_img.jpgというファイルに出力画像を出力。out_imgとref_imgの差分を計算し、差分画像diffをdiff_img.jpgというファイルに出力。シミュレーションできているか判定OpenCVのcv::Matクラスとのデータの受け渡し「5出力画像の算出」でOpenCVのcv::Matクラスのオブジェクトimg_inから、ビジョンライブラリのxf::cv::MatクラスのオブジェクトimgInputにデータを移すための受け渡し方法をまとめておきます。Filter2D_accel関数を呼び出すとき、OpenCVのcv::Matクラスのオブジェクトを引数にとれず、配列しか渡すことができません。そこで、テストベンチ関数と高位合成対象の関数では、次のようにして画像を渡しています。高位合成を行う対象のソースファイル内では、OpenCVのライブラリを参照することはできません。ビジョンライブラリの関数でないと高位合成できないためです。そのため、テストベンチでは、cv::Matのオブジェクトにおけるdata配列(のポインタ)を高位合成する対象の関数に渡して、関数xf::cv::Array2xfMatを用いて配列をxf::cv::Matのオブジェクトへと変換します。xf::cv::Matクラスのオブジェクトへと変換したら、空間フィルタリングを行う関数xf::cv::filter2Dに代入します。xf::cv::xfMat2ArrayでMatオブジェクトを配列に変換してから、テストベンチ関数に戻ります。Cシミュレーションの結果では、実際にCシミュレーションを実行してみましょう。実行の結果は、無事誤差なく出力できていました。Filter2D_accel関数の出力であるout_img.jpgも差分処理した画像が出力されていました。ラプラシアンフィルタを用いることによって、画素値が大きく変わるエッジ部分のみが強調されています。誤差がないので当然ですが、参照画像との差分も問題なく真っ黒の画像が得られていました。まとめFilter2D_accel関数のCシミュレーションを行い、無事に所望の機能が得られることが確認できました。引き続き、次の記事では高位合成を行った結果や協調シミュレーションの結果を示していきたいと思います。Synthesis】Vitisビジョンライブラリでテストベンチ関数を使った高位合成の方法を紹介。Synthesis】Vitisビジョンライブラリでテストベンチ関数を使った高位合成の方法を紹介。用例のcustomconvに含まれるFilter2D_accelを例にラプラシアンフィルタの高位合成と実装をめざす(本記事は高位合成まで)ビジョンライブラリビジョンライブラリの画像処理結果をディスプレイ表示【(1)構成】Vitisビジョンライブラリのcustomconvに含まれるFilter2D_accelを例にラプラシアンフィルタを行うIPを高位合成。本記事ではラプラシアンフィルタリング処理した画像をディスプレイ表示するブロックデザインの構築方法を紹介。HLSにビジョンライブラリとOpenCVをインクルードして、画像処理関数を高位合成する環境を構築しました。HLSのセットアップの方法を解説しています。ビジョンライブラリVitisビジョンライブラリのxf::cv::MatクラスについてVitisビジョンライブラリで画像を取り扱うためのクラスxf::cv::Matの宣言の仕方とテンプレート引数、メンバについてまとめました。OpenCVのcv::Matクラスとの相違点を中心に解説しています。ビジョンライブラリビジョンライブラリの画像処理結果をディスプレイ表示【(2)実装】Vitisビジョンライブラリのcustomconvに含まれるFilter2D_accelを例にラプラシアンフィルタを行うIPを高位合成。本記事ではラプラシアンフィルタリング処理した画像をディスプレイ表示するアプリケーションプロジェクトを紹介。ビジョンライブラリビジョンライブラリを使った高位合成の方法【(3)C/RTL協調シミュレーション】Vitisビジョンライブラリを使った高位合成で、C/RTL協調シミュレーションを行う方法、確認するポイントを解説。Filter2D_accelを例に、本記事ではビジョンライブラリから高位合成した画像処理IPのタイミングチャートをまとめました。コメントをキャンセルメールアドレスが公開されることはありません。※サイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。上に表示された文字を入力してください。@phys_higashiFPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。初学者の目線から、詰まりやすいポイントとそれを解決した方法について、記事にまとめています。初学者ゆえの間違い等あるとは思いますが、お気づきの際はお問い合わせをいただけますと幸いです。@phys_higashiFPGAを使ったデジタル回路の設計に興味を持ち、休日に勉強をしています。初学者の目線から、詰まりやすいポイントとそれを解決した方法について、記事にまとめています。初学者ゆえの間違い等あるとは思いますが、お気づきの際はお問い合わせをいただけますと幸いです。-掛け算IPをZyboに実装-2021.04.182022.02.13Rustupをインストールするときに発生したエラーの回避方法2021.08.102021.11.07。