Comments
Description
Transcript
Vivado HLS ビデオ ライブラリを使用して Zynq-7000 All
ア プ リ ケーシ ョ ン ノ ー ト : Vivado HLS XAPP1167 (v3.0) 2015 年 6 月 24 日 Vivado HLS ビデオ ラ イ ブ ラ リ を使用 し て Zynq‐7000 All Programmable SoC で OpenCV ア プ リ ケーシ ョ ン を高速化 著者 : Stephen Neuendorffer、 Thomas Li、 Devin Wang 概要 こ のアプ リ ケーシ ョ ン ノ ー ト では、OpenCV ラ イ ブ ラ リ を使用 し て Zynq®-7000 All Programmable SoC で コ ン ピ ュ ー タ ー ビ ジ ョ ン アプ リ ケーシ ョ ン を開発す る 方法について説明 し ます。 OpenCV は、 アルゴ リ ズ ムのプ ロ ト タ イ ピ ン グか ら イ ン シ ス テ ム での実行ま で、 設計プ ロ セ ス の さ ま ざ ま な段階で使用で き ます。 OpenCV コ ー ド は、 Vivado® 高位合成 (HLS) に付 属のビデオ ラ イ ブ ラ リ を使用 し て、 合成可能な C++ コ ー ド に移行す る こ と も 可能です。 合成 さ れたブ ロ ッ ク を Zynq SoC デザ イ ンに統合す る こ と で、 高い解像度 と フ レーム レー ト の コ ン ピ ュ ー タ ー ビ ジ ョ ン アルゴ リ ズ ムが イ ン プ リ メ ン ト で き ます。 は じ めに コ ン ピ ュ ー タ ー ビ ジ ョ ンの分野には、 製造不良品を検出する 産業用監視シ ス テ ムか ら 自動車の運転支援シ ス テ ム ま で、 数 多 く の興味深いアプ リ ケーシ ョ ンが広 く 存在 し ます。コ ン ピ ュ ー タ ー ビ ジ ョ ン シ ス テ ムの多 く は、デス ク ト ッ プ プ ロ セ ッ サお よ び GPU を タ ーゲ ッ ト と す る 多数の一般的な コ ン ピ ュ ー タ ー ビ ジ ョ ン機能の最適化 さ れた イ ンプ リ メ ン テーシ ョ ン を含む ラ イ ブ ラ リ であ る OpenCV を使用 し て イ ンプ リ メ ン ト ま たはプ ロ ト タ イ ピ ン グ さ れてい ます。 OpenCV ラ イ ブ ラ リ 内の多数の関数は、さ ま ざ ま な コ ン ピ ュ ー タ ー ビ ジ ョ ン アプ リ ケーシ ョ ン をほぼ リ アル タ イ ム で実行で き る よ う に高度に 最適化 さ れてい ますが、最適化 さ れた イ ンプ リ メ ン テーシ ョ ンが組み込まれてい る 方が望ま し い場合が少な く あ り ません。 こ のアプ リ ケーシ ョ ン ノ ー ト では、OpenCV プ ロ グ ラ ム を Zynq デバ イ スへ リ タ ーゲ ッ ト する デザ イ ン フ ロ ーを示 し ます。 こ のデザ イ ン フ ロ ーでは、 Vivado Design Suite の HLS テ ク ノ ロ ジ と 、 最適化済みの合成可能ビデオ ラ イ ブ ラ リ を使用 し ま す。 ラ イ ブ ラ リ は直接使用す る こ と も 、 それを アプ リ ケーシ ョ ン独自の コ ー ド と 組み合わせて、 特定のアプ リ ケーシ ョ ン 向けにカ ス タ マ イ ズ さ れた ア ク セ ラ レー タ を作成す る こ と も で き ます。 こ のデザ イ ン フ ロ ーでは高性能で低消費電力の多 数の コ ン ピ ュ ー タ ー ビ ジ ョ ン アルゴ リ ズ ム を迅速に イ ンプ リ メ ン ト で き ます。 ま た、 高デー タ レー ト の ピ ク セル処理 タ ス ク はプ ロ グ ラ マブル ロ ジ ッ ク で実行 し 、 低デー タ レー ト の フ レームベース処理 タ ス ク は従来どお り ARM® コ アで実行 す る よ う に設計す る こ と も 可能です。 次の図に示す よ う に、 OpenCV はビデオ処理シ ス テ ムの さ ま ざ ま な設計段階で使用で き ます。 左側では、 フ ァ イ ル ア ク セ ス関数を用い る イ メ ージの入力/出力お よ び処理の両方に OpenCV 関数呼び出 し を使用 し 、アルゴ リ ズ ム を設計お よ び イ ン プ リ メ ン ト で き ます。 次に、 こ のアルゴ リ ズ ム を (Zynq ベース TRD な ど の) エンベデ ッ ド シ ス テ ムに イ ンプ リ メ ン ト し 、 プ ラ ッ ト フ ォーム独自の関数呼び出 し を使用す る 入力/出力 イ メ ージにア ク セ ス し ます。 こ の場合、 ビデオ処理は、 こ れま で どお り (Zynq プ ロ セ ッ シ ン グ シ ス テ ム内の Cortex™-A9 プ ロ セ ッ サ コ ア な ど の) プ ロ セ ッ サで実行 さ れ る OpenCV 関数 呼び出 し を使用 し て イ ン プ リ メ ン ト さ れ ます。 あ る いは、 OpenCV 関数呼び出 し を、 対応す る Vivado HLS ビデオ ラ イ ブ ラ リ 内の合成可能な関数で置 き 換え る こ と も で き ます。 こ の場合 も 、 OpenCV 関数呼び出 し は、 入力/出力 イ メ ージへのア ク セ ス と 、 ビデオ処理アルゴ リ ズ ムの完全な リ フ ァ レ ン ス イ ンプ リ メ ン テーシ ョ ンの提供に使用可能です。 合成後、 処理 ブ ロ ッ ク は Zynq プ ロ グ ラ マブル ロ ジ ッ ク に統合で き ます。 統合 さ れたブ ロ ッ ク は、 プ ロ グ ラ マブル ロ ジ ッ ク に イ ンプ リ メ ン ト さ れ る デザ イ ンに応 じ て、 プ ロ セ ッ サに よ っ て作成 さ れ る ビデオ ス ト リ ーム (フ ァ イ ルか ら 読み出 さ れ る デー タ な ど) や外部入力か ら の生の リ アル タ イ ム ビデオ ス ト リ ーム を処理 し ます。 本資料は表記のバージ ョ ンの英語版を翻訳 し た も ので、内容に相違が生 じ る場合には原文を優先 し ます。 資料に よ っ ては英語版の更新に対応 し ていない も のがあ り ます。 日本 語版は参考用 と し て ご使用の上、 最新情報につ き ま し ては、 必ず最新英語版を ご参照 く だ さ い。 XAPP1167 (v3.0) 2015 年 6 月 24 日 japan.xilinx.com 1 リ フ ァ レ ン ス デザイ ン X-Ref Target - Figure 1 ,PDJH5HDG2SHQ&9 ,PDJH5HDG 2SHQ&9 9LGHR)UDPH5HDG 9LGHR)UDPH5HDG 2SHQ&9$;,YLGHR $;,YLGHR0DW +/6YLGHROLEUDU\ IXQFWLRQFKDLQ 2SHQ&9IXQFWLRQ FKDLQ 0DW$;,YLGHR 6\QWKHVL]HG)3*$ 3URFHVVLQJ%ORFN 6\QWKHVL]DEOH %ORFN 2SHQ&9IXQFWLRQ FKDLQ $;,YLGHR2SHQ&9 ,PDJH:ULWH 2SHQ&9 9LGHR)UDPH:ULWH 9LGHR)UDPH:ULWH ,PDJH:ULWH2SHQ&9 図 1 : デザイ ン フ ロー こ のアプ リ ケーシ ョ ン ノ ー ト の一般的なデザ イ ン フ ロ ーは、 次の と お り です。 1. デス ク ト ッ プで OpenCV アプ リ ケーシ ョ ン を開発 し 、 実行す る 。 2. OpenCV アプ リ ケーシ ョ ン を変更せずに Zynq SoC 内で再コ ンパ イ ル し 、 実行する 。 3. I/O 関数を使用 し て OpenCV アプ リ ケーシ ョ ン を リ フ ァ ク タ リ ン グ し 、 ア ク セ ラ レー タ 関数を カプセル化する 。 4. OpenCV 関数呼び出 し を、 ア ク セ ラ レー タ 関数内の合成可能ビデオ ラ イ ブ ラ リ 関数呼び出 し で置き 換え る 。 5. Vivado HLS を使用 し て、 ア ク セ ラ レー タ 関数か ら ア ク セ ラ レー タ お よ びそれに対応す る API を生成す る 。 6. ア ク セ ラ レー タ 関数の呼び出 し を、 ア ク セ ラ レー タ API の呼び出 し で置 き 換え る 。 7. 高速化 さ れた アプ リ ケーシ ョ ン を再 コ ンパ イ ル し 、 実行す る 。 リ フ ァ レ ン ス デザイ ン リ フ ァ レ ン ス デザ イ ンは、 次の リ ン ク か ら ダ ウ ン ロ ー ド で き ます。 https://secure.xilinx.com/webreg/clickthrough.do?cid=323570 表 1 に、 リ フ ァ レ ン ス デザ イ ンの詳細を示 し ます。 表 1 : リ フ ァ レ ン ス デザイ ンの詳細 パラ メ ー タ ー 説明 全般 開発者 Thomas Li タ ーゲ ッ ト デバ イ ス (ス テ ッ ピ ン グ レベル、 ES、 プ ロ ダ ク シ ョ ン、 ス ピー ド グ レー ド ) XC7020-1 ソ ース コ ー ド の提供 あり ソ ース コ ー ド の形式 C XAPP1167 (v3.0) 2015 年 6 月 24 日 japan.xilinx.com 2 Vivado HLS のビデオ処理ラ イ ブ ラ リ 表 1 : リ フ ァ レ ン ス デザイ ンの詳細 パラ メ ー タ ー 説明 既存の ザ イ リ ン ク ス ア プ リ ケ ーシ ョ ン ノ ー ト / リ フ ァ レ ン ス デザ イ ン、 CORE Generator ツール、 サー ド パーテ ィ か ら デザ イ ンへの コ ー ド /IP の使用 あ り (Zynq ベース TRD アプ リ ケーシ ョ ン ノ ー ト / リ フ ァ レ ン ス デザ イ ン、 CORE Generator ツール、 ま た はサー ド パーテ ィ のシ ミ ュ レーシ ョ ンに基づ く ) シ ミ ュ レーシ ョ ン 論理シ ミ ュ レーシ ョ ンの実施 あ り 、 C を使用 タ イ ミ ン グ シ ミ ュ レーシ ョ ンの実施 なし 論理 シ ミ ュ レ ー シ ョ ン お よ び タ イ ミ ン グ シ ミ ュ レーシ ョ ンでのテ ス ト ベンチの利用 あり テ ス ト ベンチの形式 C 使用 し たシ ミ ュ レー タ /バージ ョ ン g++ SPICE/IBIS シ ミ ュ レーシ ョ ンの実施 なし イ ン プ リ メ ン テーシ ョ ン 使用 し た合成ツール/バージ ョ ン Vivado 2014.4 使用 し た イ ン プ リ メ ン テーシ ョ ン ツール/バージ ョ ン Vivado 2014.4 ス タ テ ィ ッ ク タ イ ミ ン グ解析の実施 あり ハー ド ウ ェ ア検証 ハー ド ウ ェ ア検証の実施 あり 使用 し たハー ド ウ ェ ア プ ラ ッ ト フ ォーム ZC702 Vivado HLS のビデオ処理ラ イ ブ ラ リ Vivado HLS には、 各種の ビデオ処理機能の作成を容易にす る ビデオ ラ イ ブ ラ リ が多数含ま れてい ます。 こ れ ら の ラ イ ブ ラ リ は合成可能な C++ コ ー ド と し て イ ン プ リ メ ン ト さ れ、 OpenCV に イ ン プ リ メ ン ト さ れてい る ビデオ処理関数お よ び デー タ 構造にほぼ対応 し てい ます。 Vivado HLS におけ る ビデオの概念お よ び抽象化の多 く は、 OpenCV のそれ ら と 非常に 類似 し てい ます。 特に、 OpenCV imgproc モジ ュ ールの関数の多 く に、 対応する Vivado HLS ラ イ ブ ラ リ 関数があ り ます。 た と えば、 OpenCV の中心的な要素であ る cv::Mat ク ラ ス は、 通常はビデオ処理シ ス テ ム で イ メ ージ を表す際に使用 さ れま す。 cv::Mat オブジ ェ ク ト は、 通常は次の例に示す よ う に宣言 さ れます。 cv::Mat image(1080, 1920, CV_8UC3); こ れは変数 image を宣言 し 、 こ の変数を初期化 し て 1080 行、 1920 列の イ メ ージ を表 し ます。 こ こ で、 各ピ ク セルは 3 個 の符号な し 8 ビ ッ ト 数で表現 さ れます。 合成可能 ラ イ ブ ラ リ には、 こ れに対応す る hls::Mat<> テ ンプ レー ト ク ラ ス が含ま れ、 同様の概念を合成可能な方法で次の よ う に表現 し ます。 hls::Mat<2047, 2047, HLS_8UC3> image(1080, 1920); 得 ら れ る オブジ ェ ク ト はほぼ同 じ ですが、 コ ン ス ト ラ ク タ ー引数に加え てテ ンプ レー ト パ ラ メ ー タ ーを使用 し て イ メ ージ の最大サ イ ズ と フ ォーマ ッ ト が記述 さ れ る 点が異な り ます。 こ れに よ り 、 Vivado HLS は、 こ の イ メ ージの処理に使用す る メ モ リ のサ イ ズ を決定 し 、 得 ら れた回路を特定のピ ク セル表現方法に合せて最適化で き ます。 ま た、 hls::Mat<> テ ンプ レー ト ク ラ ス では、 処理 さ れ る イ メ ージの実際のサ イ ズが最大サ イ ズ と 同 じ であ る 場合、 コ ン ス ト ラ ク タ ー引数を完全に省略 で き ます。 hls::Mat<1080, 1920, HLS_8UC3> image(); 同様に、 OpenCV ラ イ ブ ラ リ では、 cvScale 関数で イ メ ージの各ピ ク セル値に リ ニ ア ス ケー リ ン グ を適用可能です。 こ の 関数は次の よ う に呼び出 さ れます。 XAPP1167 (v3.0) 2015 年 6 月 24 日 japan.xilinx.com 3 ビデオ処理アーキテ ク チ ャ cv::Mat src(1080, 1920, CV_8UC3); cv::Mat dst(1080, 1920, CV_8UC3); cvScale(src, dst, 2.0, 0.0); こ の関数呼び出 し は、 入力 イ メ ージ src の ピ ク セルを オ フ セ ッ ト な し で 2 倍に ス ケー リ ン グ し 、 出力 イ メ ージ dst を生 成 し ます。 合成可能 ラ イ ブ ラ リ で こ れに対応する 動作は、 hls::Scale テ ンプ レー ト 関数の呼び出 し に よ っ て次の よ う に イ ンプ リ メ ン ト さ れます。 hls::Mat<1080, 1920, HLS_8UC3> src; hls::Mat<1080, 1920, HLS_8UC3> dst; hls::Scale(src, dst, 2.0, 0.0); 注記 : hls::Scale はテ ンプ レー ト 関数ですが、 テ ン プ レー ト 引数は src お よ び dst の宣言内のテ ン プ レー ト 引数か ら 推測 さ れ る ため、 指定す る 必要はあ り ません。 ただ し 、 hls::Scale テ ンプ レー ト 関数では、 入力 イ メ ージ と 出力 イ メ ー ジのテ ンプ レー ト 引数が同一でなければな り ません。 サポー ト さ れてい る 関数の一覧は、 『Vivado Design Suite ユーザー ガ イ ド : 高位合成』 (UG902) [参照 4] に記載 さ れてい ます。 ビデオ処理アーキテ ク チ ャ Zynq SoC のビデオ処理デザ イ ンは、 通常は次に説明す る 2 つの一般的な アーキ テ ク チ ャ のいずれかに従い ます。 「ダ イ レ ク ト ス ト リ ー ミ ン グ」 と 呼ばれ る 第 1 のアーキ テ ク チ ャ の場合、 ピ ク セル デー タ は、 プ ロ グ ラ マブル ロ ジ ッ ク の入力ピ ンに到着 し た後、ビデオ処理 コ ン ポーネ ン ト に直接送 ら れ、そ こ か ら ビデオ出力へ直接伝送 さ れます。 こ のアーキ テ ク チ ャ は、 一般的に最 も 簡単かつ効率的な ビデオ処理方法ですが、 ビデオ処理 コ ン ポーネ ン ト が厳密に リ アル タ イ ム で フ レーム を処理で き る こ と が要件です。 X-Ref Target - Figure 2 ''5 3URFHVVLQJ 6\VWHP ''50HPRU\&RQWUROOHU 86%&DPHUD +DUGHQHG 3HULSKHUDOV86% *LJ(&$163, 8$57&*3,2 $0%$6ZLWFKHV $0%$6ZLWFKHV $38 'XDO&RUH &RUWH[$2&0 6B$;,B+3ELW 6B$;,B*3EELW $;,6WUHDP ,3&RUH $;,,QWHUFRQQHFW ,D/ 9LGHR ,QSXW 9LGHR 3URFHVVLQJ &RPSRQHQW 9LGHR 'LVSOD\ &RQWUROOHU ,D/ ; 図 2 : ビデオ処理のダ イ レ ク ト ス ト リ ー ミ ング アーキテ ク チ ャ 「フ レーム バ ッ フ ァ ー ス ト リ ー ミ ン グ」 と 呼ばれ る 第 2 のアーキ テ ク チ ャ の場合、 ピ ク セル デー タ はまず外部 メ モ リ に格 納 さ れ、処理後に再び外部 メ モ リ に格納 さ れます。処理 さ れた ビデオの出力にはビデオ デ ィ ス プ レ イ コ ン ト ロ ー ラ ーが必 要です。 こ のアーキ テ ク チ ャ では、 ビデオ レー ト が ビデオ コ ン ポーネ ン ト の処理速度の影響を受けに く く な り ますが、 外 部 メ モ リ に対す る ビデオ フ レームの読み出 し と 書 き 込みに十分な メ モ リ 帯域幅が求め ら れます。 XAPP1167 (v3.0) 2015 年 6 月 24 日 japan.xilinx.com 4 AXI 4 ス ト リ ー ミ ング ビデオ X-Ref Target - Figure 3 ''5 3URFHVVLQJ 6\VWHP ''50HPRU\&RQWUROOHU 86%&DPHUD +DUGHQHG 3HULSKHUDOV86% *LJ(&$163, 8$57&*3,2 $0%$6ZLWFKHV $0%$6ZLWFKHV 6B$;,B+3ELW 6B$;,B*3EELW $;,6WUHDP ,3&RUH $38 'XDO&RUH &RUWH[$2&0 $;,,QWHUFRQQHFW $;, 9'0$ ,D/ 9LGHR ,QSXW $;, 9'0$ $;, 9'0$ 9LGHR 'LVSOD\ &RQWUROOHU ,D/ 9LGHR 3URFHVVLQJ &RPSRQHQW ; 図 3 : ビデオ処理のフ レーム バ ッ フ ァ ー アーキテ ク チ ャ こ のアプ リ ケーシ ョ ン ノ ー ト では、 柔軟性に優れ、 プ ロ セ ッ サ コ アでの ビデオ処理を高速化す る 方法を理解 し やすい フ レーム バ ッ フ ァ ー ス ト リ ー ミ ン グ アーキ テ ク チ ャ を扱い ます。高度に最適化 さ れた シ ス テ ム を実現す る ために、こ のアー キ テ ク チ ャ か ら ダ イ レ ク ト ス ト リ ー ミ ン グ アーキ テ ク チ ャ を作成す る のは比較的容易です。 AXI 4 ス ト リ ー ミ ング ビデオ ザ イ リ ン ク ス のビデオ処理 コ ン ポーネ ン ト は、一般的な AXI4 ス ト リ ー ミ ン グ プ ロ ト コ ルを使用 し て ピ ク セル デー タ をや り 取 り し ます。 こ のプ ロ ト コ ルは、 ビデオ ピ ク セルの各 ラ イ ン を AXI4 パケ ッ ト と し て記述 し 、 各 ラ イ ンの最後の ピ ク セ ルは TLAST 信号のアサー ト でマー ク し ます。 ま た、 ビデオ フ レームの開始は USER[0] ビ ッ ト のアサー ト で最初の ラ イ ン の先頭の ピ ク セルを マー ク す る こ と で示 し ます。 こ のプ ロ ト コ ルの詳細は、 [参照 2] を参照 し て く だ さ い。 基礎 と な る AXI4 ス ト リ ー ミ ン グ ビデオ プ ロ ト コ ルには、 イ メ ージ内の ラ イ ン サ イ ズに対す る 制約はあ り ませんが、 す べてのビデオ ラ イ ンが同 じ 長 さ であれば、 ほ と ん ど の複雑な ビデオ処理演算は大幅に簡略化 さ れます。 こ の制限は、 一連 の ビデオ フ レームの始め過渡状態の間を除けば、 ど のデジ タ ル ビデオ フ ォ ーマ ッ ト で も ほぼ常に満た さ れ ます。 こ の状 態は通常、 処理ブ ロ ッ ク の入力 イ ン タ ーフ ェ イ ス でのみ問題 と な り 、 継続的な矩形フ レームの処理に移行す る 前に適切に 扱 う 必要があ り ます。 AXI4 ス ト リ ー ミ ン グ ビデオ プ ロ ト コ ルを受信す る 入力 イ ン タ ーフ ェ イ ス では、 各ビデオ フ レーム が厳密に ROWS * COLS 個の ピ ク セルで構成 さ れ る よ う にで き ます。 そ し て、 パ イ プ ラ イ ン内の後続のブ ロ ッ ク は、 ビデ オ フ レームが完全な矩形フ レームであ る こ と を前提にで き ます。 Vivado HLS のビデオ イ ン タ ー フ ェ イ ス ラ イ ブ ラ リ こ の よ う な イ ン タ ーフ ェ イ ス の問題を扱いやす く す る ために、 Vivado HLS には一連の合成可能な ビデオ イ ン タ ーフ ェ イ ス ラ イ ブ ラ リ 関数が含まれてい ます。 こ れ ら の関数を次の表に示 し ます。 XAPP1167 (v3.0) 2015 年 6 月 24 日 japan.xilinx.com 5 制限 表 2 : Vivado HLS の合成可能な ビデオ関数 ビデオ ラ イ ブ ラ リ 関数 説明 hls::AXIvideo2Mat AXI4 ビ デ オ ス ト リ ー ム 表現 の デー タ を hls::Mat フ ォーマ ッ ト に変換する hls::Mat2AXIvideo hls::Mat フ ォ ーマ ッ ト で格納 さ れたデー タ を AXI4 ビデオ ス ト リ ームに変換す る 具体的にい う と 、 AXIvideo2Mat 関数は AXI4 ス ト リ ー ミ ン グ ビデオ を使用する 一連の イ メ ージ を受信 し 、 hls::Mat 表現を 生成 し ます。 同様に、 Mat2AXIvideo 関数は一連の イ メ ージの hls::Mat 表現を受信 し 、 AXI4 ス ト リ ー ミ ン グ ビデオ プ ロ ト コ ルを用いて正 し く エン コ ー ド し ます。 こ れ ら の関数は、 AXI4 ビデオ ス ト リ ーム に基づいて イ メ ージ サ イ ズ を決定す る のではな く 、 hls::Mat コ ン ス ト ラ ク タ ー 引数で指定 さ れた イ メ ージ サ イ ズ を使用 し ます。 AXI4 ス ト リ ー ミ ン グ イ ン タ ーフ ェ イ ス で任意のサ イ ズの入力 イ メ ージ を処理す る よ う に設計 さ れた シ ス テ ムでは、 ビデオ ラ イ ブ ラ リ ブ ロ ッ ク の外部で イ メ ージ サ イ ズ を決定す る 必要があ り ます。 Zynq ビデオ TRD では、 ア ク セ ラ レー タ に よ っ て処理 さ れ る イ メ ージ サ イ ズは、 AXI4-Lite 制御レ ジ ス タ と し て ア ク セ ス可能です。 ただ し 、 ソ フ ト ウ ェ ア と シ ス テ ムの残 り の部分は、 1920x1080 の解像度のみを処理す る よ う に設計 さ れ てい ます。 よ り 複雑なシ ス テ ムでは、 ザ イ リ ン ク ス の Video Timing Controller コ ア [参照 3] を使用 し て、 受信 し た ビデオ信 号のサ イ ズ を検出で き ます。 ビデオ ラ イ ブ ラ リ には、 次の合成不可の ビデオ イ ン タ ーフ ェ イ ス ラ イ ブ ラ リ 関数 も 含まれてい ます。 表 3 : Vivado HLS の合成不能な ビデオ関数 ビデオ ラ イ ブ ラ リ 関数 hls::cvMat2AXIvideo hls::AXIvideo2cvMat hls::IplImage2AXIvideo hls::AXIvideo2IplImage hls::CvMat2AXIvideo hls::AXIvideo2CvMat こ れ ら の関数は、通常は合成可能な関数 と 組み合わせて OpenCV ベース のテ ス ト ベンチの イ ンプ リ メ ン ト に使用 さ れます。 制限 現在の合成可能な ラ イ ブ ラ リ にはい く つかの制限があ り 、 それ ら は注意 し な ければ見落 と し がちです。 基本的な制限は、 OpenCV 関数は直接合成で き ず、 合成可能な ラ イ ブ ラ リ の関数に よ っ て置 き 換えが必要な こ と です。 こ の制限の理由は第 一に、 OpenCV 関数には通常は (合成可能ではない任意のサ イ ズの cv::Mat オブジ ェ ク ト の コ ン ス ト ラ ク タ ーな ど) 動的 な メ モ リ 割 り 当てが含まれ る ためです。 2 つ目の制限は、 イ メ ージのモデル化に使用 さ れ る hls::Mat<> デー タ 型は、 外部 メ モ リ 内の ピ ク セルの配列 と し てでは な く 、 hls::stream<> デー タ 型を使用 し て内部で ピ ク セルの ス ト リ ーム と し て定義 さ れ る こ と です。 その結果、 イ メ ー ジ上で ラ ン ダ ム ア ク セ ス はサポー ト さ れ ません。 ま た、 cv::Mat<>.at() メ ソ ッ ド と cvGet2D() 関数に対応す る 等価 な関数は合成可能な ラ イ ブ ラ リ 内にあ り ません。 イ メ ージへのア ク セ ス は ス ト リ ー ミ ン グ ア ク セ ス にな る ため、 複数の関 数に よ っ て イ メ ージ を処理す る 場合は、 hls::Duplicate<> 関数な ど で最初に イ メ ージ を 2 つの ス ト リ ームに複製す る 必要があ り ます。ま た、イ メ ージのエ リ ア を変更す る には、イ メ ージの周囲の未変更の ピ ク セルを処理す る 必要があ り ます。 も う 1 つの制限はデー タ 型に関す る も のです。 OpenCV 関数は、 通常は整数デー タ 型ま たは浮動小数点デー タ 型をサポー ト し ます。 し か し 、 プ ロ グ ラ マブル ロ ジ ッ ク を タ ーゲ ッ ト と する 場合、 浮動小数点型の方が よ り コ ス ト がかか る ため敬遠 さ れます。 ほ と ん ど の場合、 Vivado HLS でfloat 型お よ び double 型を Vivado HLS の固定小数点テ ンプ レー ト ク ラ ス ap_fixed<> お よ び ap_ufixed<> に置 き 換え る こ と がで き ます。 さ ら に、 OpenCV と 合成可能な ラ イ ブ ラ リ の動作は概 し て機能的に同等にな る こ と こ と を意図 し てい ますが、 OpenCV は浮動小数点演算を実行す る ため、 合成可能な ラ イ ブ ラ リ の結果がそれに対応す る OpenCV 関数 と 等 し い ビ ッ ト 精度にな る こ と は想定で き ません。 場合に よ っ ては、 合成可能 ラ イ ブ ラ リ は内部で固定小数点の最適化を実行 し 、 浮動小数点演算を削減 し ます。 最後の制限 と し て、 イ ン タ ーフ ェ イ ス関数は AXI4 ス ト リ ー ミ ン グ ビデオ用にのみ提供 さ れます。 こ れ ら の イ ン タ ーフ ェ イ ス は、 シ ス テ ム レベルでザ イ リ ン ク ス の Video DMA (VDMA) コ アお よ びほかの ビデオ処理 IP コ ア と 統合で き ますが、 AXI4 ス レーブ ポー ト や AXI4 マ ス タ ー ポー ト に直接接続す る こ と はで き ません。 し たがっ て、 (た と えば複数の連続す る フ レーム を ま と めて処理す る 目的で) 外部 メ モ リ フ レーム バ ッ フ ァ ーを必要 と す る デザ イ ンでは、 プ ロ セ ッ サに よ っ て管 理 さ れ る 複数の VDMA コ ア を使用 し て、 フ レーム バ ッ フ ァ ーを外部で イ ンプ リ メ ン ト す る 必要があ り ます。 XAPP1167 (v3.0) 2015 年 6 月 24 日 japan.xilinx.com 6 リ フ ァ レ ン ス デザイ ン リ フ ァ レ ン ス デザイ ン こ のアプ リ ケーシ ョ ン ノ ー ト には、複数の HLS デザ イ ンが含まれてい ます。 こ れ ら のデザ イ ンは、プ ロ グ ラ マブル ロ ジ ッ ク 内の画像処理 フ ィ ル タ ーを Vivado HLS お よ び Vivado HLS 合成可能 ラ イ ブ ラ リ に よ っ て生成 し た フ ィ ル タ ーで置 き 換 え、 Zynq ベー ス タ ーゲ ッ ト リ フ ァ レ ン ス デザ イ ン の動作を変更 し ま す。 合成可能な フ ィ ル タ ーの ゴールデン モデルが OpenCV ラ イ ブ ラ リ を使用 し て イ ン プ リ メ ン ト さ れ、 合成 さ れた コ ー ド の動作が検証で き る よ う にな り ます。 ま た、 こ れ ら のデザ イ ンは Linux アプ リ ケーシ ョ ン を変更 し 、 フ ィ ル タ ーの OpenCV イ ンプ リ メ ン テーシ ョ ン ま たは合成可能 イ ンプ リ メ ン テーシ ョ ン を Cortex-A9 コ アで実行で き る よ う に し ます。 リ フ ァ レ ン ス デザ イ ンには次の も のがあ り ます。 • demo : 一連の ピ ク セル処理関数 • fast-corners : コ ーナー検出用の高速アルゴ リ ズ ム • pass-through : パ ス スルー以外何 も 実行 し ない • simple-median : 単純な Median フ ィ ル タ ー • simple-posterize : 単純なポ ス タ ラ イ ゼーシ ョ ン • sobel : し き い値あ り の Sobel フ ィ ル タ ー (Zynq ベース TRD 内のデザ イ ン と 同 じ ) こ のセ ク シ ョ ンでは、 3 つの標準的な リ フ ァ レ ン ス デザ イ ン を順に紹介 し 、 OpenCV アプ リ ケーシ ョ ン を高速化す る 方法 の概要を示 し ます。 最初の リ フ ァ レ ン ス デザ イ ンは 「pass-through 」 と 呼ばれ る 透過的な画像フ ィ ル タ ーで、 入力フ レーム を変更せずに出力 に渡すだけです。 こ れはユーザーのアプ リ ケーシ ョ ン で フ ィ ル タ ーのテ ン プ レー ト と し て使用で き ます。 OpenCV コ ー ド は次の よ う に簡単です。 49 void opencv_image_filter(IplImage *src, IplImage *dst) { 50 cvCopy(src, dst); 51 } OpenCV コ ー ド と 比較す る と 、合成可能 コ ー ド には イ ン タ ーフ ェ イ ス を容易にす る #pragma 指示子が多数含まれてい ます。 こ れ ら の指示子は、 入力お よ び出力 ス ト リ ーム を AXI4 ス ト リ ー ミ ン グ イ ン タ ー フ ェ イ ス と し て ア ク セ ス 可能に し (行 46-47)、 バン ド ル さ れた制御バ ス内のその他の入力を AXI4 Lite ス レーブ イ ン タ ーフ ェ イ ス と し て ア ク セ ス可能に し ます (行 49-51)。 TRD が使用 し ていた ド ラ イ バー と の位置を合わせる ために、 rows お よ び cols のオ フ セ ッ ト が指定 さ れてい る こ と に注意 し て く だ さ い。 ま た、 ブ ロ ッ ク は同 じ サ イ ズの イ メ ージ を繰 り 返 し 処理す る こ と が予想 さ れ る ため、 rows お よ び cols 入力は安定入力 と し て指定 さ れ ます (行 53-54)。 変数はパ イ プ ラ イ ン の各段を通 し てプ ッ シ ュ さ れ る 必要はないた め、 こ の指定に よ っ て さ ら に最適化で き る よ う にな り ます。 最後に、 dataflow モー ド が選択 さ れ る こ と で (行 57)、 ピ ク セ ルがブ ロ ッ ク 間で ス ト リ ー ミ ン グ さ れて、 さ ま ざ ま な処理関数の同時実行が可能にな り ます。 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 void image_filter(AXI_STREAM& video_in, AXI_STREAM& video_out, int rows, int cols) { //Create AXI streaming interfaces for the core #pragma HLS INTERFACE axis port=video_in bundle=INPUT_STREAM #pragma HLS INTERFACE axis port=video_out bundle=OUTPUT_STREAM #pragma HLS INTERFACE s_axilite port=rows bundle=CONTROL_BUS offset=0x14 #pragma HLS INTERFACE s_axilite port=cols bundle=CONTROL_BUS offset=0x1C #pragma HLS INTERFACE s_axilite port=return bundle=CONTROL_BUS #pragma HLS INTERFACE ap_stable port=rows #pragma HLS INTERFACE ap_stable port=cols YUV_IMAGE img_0(rows, cols); #pragma HLS dataflow hls::AXIvideo2Mat(video_in, img_0); hls::Mat2AXIvideo(img_0, video_out); } demo と い う 名前の第 2 の リ フ ァ レ ン ス デザ イ ンには、 図 4 に示す関数の簡単なパ イ プ ラ イ ンが含まれてい ます。 XAPP1167 (v3.0) 2015 年 6 月 24 日 japan.xilinx.com 7 リ フ ァ レ ン ス デザイ ン X-Ref Target - Figure 4 6XEWUDFW 7KUHVKKROG 6FDOH9DOXH (URGH 'LODWH ; 図 4 : 「demo」 のデザイ ン ブ ロ ッ ク図 OpenCV では、 次の コ ー ド 例に示す一連の ラ イ ブ ラ リ 呼び出 し を使用 し て、 こ のアプ リ ケーシ ョ ン を イ ン プ リ メ ン ト で き ます (apps/demo/opencv_top.cpp か ら の抜粋)。 49 void opencv_image_filter(IplImage *src, IplImage *dst) { 50 IplImage* tmp = cvCreateImage(cvGetSize(src), src->depth, src->nChannels); 51 cvCopy(src, tmp); 52 cvSubS(tmp, cvScalar(50, 50), dst); 53 cvScale(dst, tmp, 2, 0); 54 cvErode(tmp, dst); 55 cvDilate(dst, tmp); 56 cvCopy(tmp, dst); 57 cvReleaseImage(&tmp); 58 } 一連の OpenCV 関数呼び出 し は、 類似 し た イ ン タ ーフ ェ イ ス を持ち等価な動作を行 う HLS ビデオ ラ イ ブ ラ リ 呼び出 し で 置 き 換え ら れてい ます。 pass-through デザ イ ンのテ ンプ レー ト に基づいた合成可能コ ー ド は簡単であ り 、 #pragma 指示子は 同 じ です。 pass-through デザ イ ン と の主な違いは、 い く つかの hls::Mat 宣言 (IMAGE_C2 は top.h で定義 さ れ る 2 チ ャ ネル YUV 画像の タ イ プ) を追加 し 、 HLS ラ イ ブ ラ リ 関数を使用 し た処理パ イ プ ラ イ ン を接続 し てい る こ と です。 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 void image_filter(AXI_STREAM& video_in, AXI_STREAM& video_out, int rows, int cols) { //Create AXI streaming interfaces for the core #pragma HLS INTERFACE axis port=video_in bundle=INPUT_STREAM #pragma HLS INTERFACE axis port=video_out bundle=OUTPUT_STREAM #pragma HLS INTERFACE s_axilite port=rows bundle=CONTROL_BUS offset=0x14 #pragma HLS INTERFACE s_axilite port=cols bundle=CONTROL_BUS offset=0x1C #pragma HLS INTERFACE s_axilite port=return bundle=CONTROL_BUS #pragma HLS INTERFACE ap_stable port=rows #pragma HLS INTERFACE ap_stable port=cols IMAGE_C2 img_0(rows, cols); IMAGE_C2 img_1(rows, cols); IMAGE_C2 img_2(rows, cols); IMAGE_C2 img_3(rows, cols); IMAGE_C2 img_4(rows, cols); PIXEL_C2 pix(50, 50); #pragma HLS dataflow hls::AXIvideo2Mat(video_in, img_0); hls::SubS(img_1, pix, img_1); hls::Scale(img_1, img_2, 2, 0); hls::Erode(img_2, img_3); hls::Dilate(img_3, img_4); hls::Mat2AXIvideo(img_4, video_out); } 「fast-corners」 と い う 名前の第 3 の リ フ ァ レ ン ス デザ イ ンには、 図 5 に示す よ う に、 よ り 複雑なパ イ プ ラ イ ンが含まれてい ます。 XAPP1167 (v3.0) 2015 年 6 月 24 日 japan.xilinx.com 8 リ フ ァ レ ン ス デザイ ン 7R *UD\VFDOH )DVW &RUQHUV 'HWHFWLRQ 'UDZ &RUQHUV ; X-Ref Target - Figure 5 図 5 : Fast‐Corners ア プ リ ケーシ ョ ン OpenCV では、 こ のアプ リ ケーシ ョ ンは次の コ ー ド 例を使用 し て イ ンプ リ メ ン ト で き ます (apps/fast-corners/opencv_top.cpp か ら の抜粋)。 49 void opencv_image_filter(IplImage *_src, IplImage *_dst) { 50 Mat src(_src); 51 Mat dst(_dst); 52 cvCopy(_src, _dst); 53 std::vector<Mat> layers; 54 std::vector<KeyPoint> keypoints; 55 split(src, layers); 56 FAST(layers[0], keypoints, 20, true); 57 for (int i = 0; i < keypoints.size(); i++) { 58 rectangle(dst, 59 Point(keypoints[i].pt.x-1, keypoints[i].pt.y-1), 60 Point(keypoints[i].pt.x+1, keypoints[i].pt.y+1), 61 Scalar(255,0), 62 CV_FILLED); 63 } 64 } こ のアプ リ ケーシ ョ ンは簡単に見え ますが、 合成可能な ラ イ ブ ラ リ 内に対応す る 関数を持た ない関数がい く つか含まれて い ます。 std::vector ク ラ ス は合成で き ません (行 54)。 cv::rectangle 関数は、 置き 換え更新のため、 現在の と こ ろ 合成可能 ラ イ ブ ラ リ 内に イ ンプ リ メ ン ト さ れてい ません (行 58-62)。 こ のアプ リ ケーシ ョ ン を イ ンプ リ メ ン ト す る 1 つの可能性 と し て、 アプ リ ケーシ ョ ン を分割 し 、 プ ロ セ ッ シ ン グ シ ス テ ム で動作す る コ ー ド に よ っ て FAST コ ーナーを矩形でマー ク し なが ら 、プ ロ グ ラ マブル ロ ジ ッ ク でグ リ ーン チ ャ ネルの抽出 と FAST コ ーナーの検出を実行す る こ と が考え ら れ ます。 こ こ では、 FPGA に イ ンプ リ メ ン ト で き る ピ ク セル処理パ ラ ダ イ ムの枠内に留ま り なが ら 、 コ ー ド を若干簡略化す る こ と に し ます。 次の コ ー ド 例に、 簡略化 し た コ ー ド を示 し ます。 69 void opencv_image_filter(IplImage *_src, IplImage *_dst) { 70 Mat src(_src); 71 Mat dst(_dst); 72 cvCopy(_src, _dst); 73 Mat mask(src.rows, src.cols, CV_8UC1); 74 Mat dmask(src.rows, src.cols, CV_8UC1); 75 std::vector<Mat> layers; 76 std::vector<KeyPoint> keypoints; 77 split(src, layers); 78 FAST(layers[0], keypoints, 20, true); 79 GenMask(mask, keypoints); 80 dilate(mask, dmask, getStructuringElement(MORPH_RECT, Size(3,3), Point(1,1))); 81 PaintMask(dst, dmask, Scalar(255,0)); 82 } こ の コ ー ド は OpenCV で記述 さ れてい ますが、 合成可能コ ー ド への変換が可能な形で構造化 さ れてい ます。 こ の組み合わ せは特に、 動的に割 り 当て ら れた構造 と し てではな く 、 イ メ ージ マ ス ク と し て キーポ イ ン ト を生成 し ます。 PaintMask 関数は、 こ の よ う なマ ス ク を使用 し て イ メ ージの上に描画 し ます。 次の コ ー ド 例に、 FAST コ ーナー アプ リ ケーシ ョ ンの 合成可能バージ ョ ン を示 し ます (apps/fast-corners/top.cpp か ら の抜粋)。 44 void image_filter(AXI_STREAM& video_in, AXI_STREAM& video_out, int rows, int cols) { 45 //Create AXI streaming interfaces for the core 46 #pragma HLS INTERFACE axis port=video_in bundle=INPUT_STREAM 47 #pragma HLS INTERFACE axis port=video_out bundle=OUTPUT_STREAM XAPP1167 (v3.0) 2015 年 6 月 24 日 japan.xilinx.com 9 ソ ース フ ァ イル と プ ロ ジ ェ ク ト デ ィ レ ク ト リ 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 #pragma HLS INTERFACE s_axilite port=rows bundle=CONTROL_BUS offset=0x14 #pragma HLS INTERFACE s_axilite port=cols bundle=CONTROL_BUS offset=0x1C #pragma HLS INTERFACE s_axilite port=return bundle=CONTROL_BUS #pragma HLS INTERFACE ap_stable port=rows #pragma HLS INTERFACE ap_stable port=cols IMAGE_C2 img_0(rows, cols); IMAGE_C2 img_1(rows, cols); IMAGE_C2 img_1_(rows, cols); IMAGE_C1 img_1_Y(rows, cols); IMAGE_C1 img_1_UV(rows, cols); IMAGE_C2 img_2(rows, cols); IMAGE_C1 mask(rows, cols); IMAGE_C1 dmask(rows, cols); PIXEL_C2 color(255,0); #pragma HLS dataflow #pragma HLS stream depth=20000 variable=img_1_.data_stream hls::AXIvideo2Mat(video_in, img_0); hls::Duplicate(img_0, img_1, img_1_); hls::Split(img_1, img_1_Y, img_1_UV); hls::Consume(img_1_UV); hls::FASTX(img_1_Y, mask, 20, true); hls::Dilate(mask, dmask); hls::PaintMask(img_1_, dmask, img_2, color); hls::Mat2AXIvideo(img_2, video_out); } こ の コ ー ド では、行 66 の指示子の使用に よ っ て 1 つの ス ト リ ームの深 さ が設定 さ れてい る こ と に注意 し て く だ さ い。 こ の 例では、 ラ イ ン バ ッ フ ァ ーがあ る ため、 Duplicate > FASTX > Dilate > PaintMask のパ ス上にビデオ ラ イ ン単 位の レ イ テ ン シがあ り ます。 こ の場合、 FASTX で最大 7 ラ イ ン、 Dilate で最大 3 ラ イ ン の レ イ テ ン シが発生す る ため、 少な く と も 1920 * (7+3) < 20000 ピ ク セルが必要です。 さ ら に、行 71 の hls::FASTX 呼び出 し は、前の変更 さ れた OpenCV コ ー ド の cv::FAST 関数 と GenMask 関数の組み合わせに対応 し ます。 ソ ース フ ァ イル と プ ロ ジ ェ ク ト デ ィ レ ク ト リ こ のアプ リ ケーシ ョ ン ノ ー ト の フ ァ イ ルの全体構造は、 Zynq ベース TRD の構造を反映 し てい ます。 SD カー ド 用にあ ら か じ め作成 さ れた イ メ ージが ready_to_test デ ィ レ ク ト リ に用意 さ れてお り 、 デザ イ ン を簡単に試す こ と がで き ます。 こ の イ メ ージは Zynq ベース TRD か ら 若干変更 さ れてお り 、 ブー ト 時に ロ ー ド さ れ る RAM デ ィ ス ク イ メ ージに、 ARM 用の OpenCV ラ イ ブ ラ リ のプ リ コ ンパ イ ル済みバージ ョ ン が含 ま れてい ま す。 デバ イ ス ツ リ ー も 変更 さ れ、 画像処理フ ィ ル タ ー内の制御レ ジ ス タ にア ク セ スす る ための汎用 UIO Linux カーネル ド ラ イ バーの適切な コ ン フ ィ ギ ュ レーシ ョ ンが含ま れてい ます。 apps デ ィ レ ク ト リ には HLS リ フ ァ レ ン ス デザ イ ンが含まれてい ます。 デザ イ ンの再構築を簡単にす る ため、 次のそれぞれを タ ーゲ ッ ト と す る makefile も 提供 さ れてい ます。 • make all -- sw お よ び hw の作成、 sd_image の生成 • make csim -- C シ ミ ュ レーシ ョ ンの実行 • make cosim -- C/RTL 協調シ ミ ュ レーシ ョ ンの実行 • make core -- 高位合成の実行 と IP コ アのエ ク ス ポー ト • make bitstream -- ビ ッ ト ス ト リ ームの生成 • make boot -- ブー ト イ メ ージの生成 • make elf -- ソ フ ト ウ ェ ア アプ リ ケーシ ョ ンの作成 • make help -- ヘルプの出力 XAPP1167 (v3.0) 2015 年 6 月 24 日 japan.xilinx.com 10 OpenCV ア プ リ ケーシ ョ ン を高速化する手順 各デザ イ ン デ ィ レ ク ト リ (apps/<design name>) で、 Linux コ マ ン ド ラ イ ン ま たは Windows の Vivado HLS コ マ ン ド プ ロ ンプ ト か ら make all を実行す る と デザ イ ン全体が再作成 さ れ、 実行可能な SD カー ド イ メ ージが生成 さ れます。 新 し い ア プ リ ケーシ ョ ン を作成す る には、 最初の apps/ サブデ ィ レ ク ト リ の 1 つを コ ピ ー し 、 ソ ー ス コ ー ド を変更 し て適切な makefile ルールを実行 し ます。 FPGA デザ イ ンの全体構造は C コ ー ド ベース では変更 さ れないため、 ソ ース コ ー ド の変更 は生成 さ れ る RTLの イ ン タ ーフ ェ イ ス を変更 し ない も のに限 ら れます。 あ る いは、 FPGA デザ イ ンで も 対応す る 箇所を変 更す る のであれば、 イ ン タ ーフ ェ イ ス を変更で き ます。 OpenCV ア プ リ ケーシ ョ ン を高速化する手順 こ のセ ク シ ョ ンでは、 OpenCV アプ リ ケーシ ョ ン を高速化 し 、 ボー ド でテ ス ト す る ウ ォー ク スルーを示 し ます。 OpenCV ア プ リ ケーシ ョ ンの例 と し て、 画像処理の簡単な 2D フ ィ ル タ ーであ る erode (収縮処理) を考え ます。 こ こ で示すウ ォー ク ス ルーに従っ て画像処理アルゴ リ ズ ム を置 き 換え る こ と で、 独自の OpenCV アプ リ ケーシ ョ ン を簡単に作成で き ます。 こ の アプ リ ケーシ ョ ン ノ ー ト に付属す る 2 つの リ フ ァ レ ン ス デザ イ ン も 、 こ の手順に従っ て利用で き ます。 こ の目的を達成す る には、 次の前提要件があ り ます。 • ザ イ リ ン ク ス の Zynq-7000 SoC ZC702 評価キ ッ ト ま たは Zynq-7000 SoC ビデオお よ び画像処理キ ッ ト • HDMI™ ポー ト ま たは DVI ポー ト 搭載 (HDMI/DVI ケーブルが必要)、 解像度 1920x1080、 60 フ レーム レー ト 表示対応 のモニ タ ー • Linux/Windows ホ ス ト • XAPP1167 パ ッ ケージ ( こ のアプ リ ケーシ ョ ン ノ ー ト に付属) • Vivado Design Suite 2014.4 System Edition • (オプシ ョ ン) HDMI ラ イ ブ ビデオ入力を有効にする ための FMC-IMAGEON ボー ド 次に説明す る 手順の大半は、 Linux コ マ ン ド ラ イ ンで示 さ れます。 Windows 用には、 同 じ コ マ ン ド に対応す る Vivado HLS コ マ ン ド プ ロ ン プ ト を適切に設定 さ れたパ ス で起動す る バ ッ チ フ ァ イ ルが提供 さ れ ます。 Vivado ツールがデフ ォ ル ト の 場所に イ ン ス ト ール さ れていない場合は、 イ ン ス ト ール パ ス を反映す る よ う にバ ッ チ フ ァ イ ルを変更す る 必要があ り ま す。 最初にパ ッ ケージの内容を展開 し 、 ホーム デ ィ レ ク ト リ と し て使用 し ます。 $ export VIDEO_HOME=/path/to/the/extracted/package/root $ cd ${VIDEO_HOME} $ ls apps doc hardware ready_to_test software xapp1167_windows.bat 注記 : FMC-IMAGEON ボー ド を使用す る 場合は、 行 95 の apps/common/configure.mk を WITH_FMC := y に変更 し 、 適切な デバ イ ス ツ リ ーを選択 し ます。 デフ ォ ル ト は WITH_FMC := n です。 手順 1 : 新 し いデザイ ン を作成する pass-through デザ イ ンは、 画像処理デザ イ ン のテ ン プ レー ト と し て使用で き ます。 新 し い erode デザ イ ン を作成す る には、 apps デ ィ レ ク ト リ 内の pass-through デザ イ ン デ ィ レ ク ト リ を コ ピー し ます。 $ cd ${VIDEO_HOME}/apps $ cp –r pass-through erode $ cd erode ソ ース フ ァ イ ル opencv_top.cpp を編集 し 、 cvCopy 関数を cvErode 関数で置 き 換え ます。 void opencv_image_filter(IplImage *src, IplImage *dst) { cvErode(src, dst); } ソ ース フ ァ イ ル top.cpp を編集 し 、 各 イ ン タ ーフ ェ イ ス関数の間に HLS ビデオ ラ イ ブ ラ リ の erode 関数 hls::Erode を追加 し ます。 44 void image_filter(AXI_STREAM& video_in, AXI_STREAM& video_out, int rows, int cols) { XAPP1167 (v3.0) 2015 年 6 月 24 日 japan.xilinx.com 11 OpenCV ア プ リ ケーシ ョ ン を高速化する手順 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 //Create AXI streaming interfaces for the core #pragma HLS INTERFACE axis port=video_in bundle=INPUT_STREAM #pragma HLS INTERFACE axis port=video_out bundle=OUTPUT_STREAM #pragma HLS INTERFACE s_axilite port=rows bundle=CONTROL_BUS offset=0x14 #pragma HLS INTERFACE s_axilite port=cols bundle=CONTROL_BUS offset=0x1C #pragma HLS INTERFACE s_axilite port=return bundle=CONTROL_BUS #pragma HLS INTERFACE ap_stable port=rows #pragma HLS INTERFACE ap_stable port=cols YUV_IMAGE img_0(rows, cols); YUV_IMAGE img_1(rows, cols); #pragma HLS dataflow hls::AXIvideo2Mat(video_in, img_0); hls::Erode(img_0, img_1); hls::Mat2AXIvideo(img_1, video_out); } C シ ミ ュ レーシ ョ ン を実行 し て アルゴ リ ズ ム を検証 し ます。 $ make csim こ れに よ り 、 hls::Erode を実行 し て出力 イ メ ージ を生成 し 、 OpenCV 関数 cvErode に よ っ て生成 さ れ る ゴールデン イ メ ージ と 比較す る テ ス ト が作成 さ れます。 「Test passed!」 と 表示 さ れ る と 、 2 つの イ メ ージが ま っ た く 同一であ る こ と がわ か り ます。 出力 イ メ ージ を表示 し て、 収縮処理の結果を検証す る こ と を推奨 し ます。 手順 2 : ARM 用 OpenCV ア プ リ ケーシ ョ ン を作成する ホ ス ト 上で ARM アプ リ ケーシ ョ ン を ク ロ ス ビル ド す る には、 ARM GNU ツールが イ ン ス ト ール さ れてい る 必要があ り ま す。 ARM GNU ツールは、 ザ イ リ ン ク ス の ソ フ ト ウ ェ ア開発キ ッ ト (SDK) に含まれてい ます。 こ のデザ イ ンでは、 次の コ マ ン ド ルールを実行 し て ARM アプ リ ケーシ ョ ン を作成 し ます。 $ make elf ビル ド が完了す る と 、ARM 実行フ ァ イ ル video_cmd が apps/erode/software/xsdk/video_cmd/bin/video_cmd に作成 さ れます。 ARM アプ リ ケーシ ョ ンには、 プ ロ セ ッ サで OpenCV の erode を実行する オプシ ョ ンがあ り ます。 手順 3 : Vivado HLS を実行 し て IP コ ア を作成する こ の手順では、 Vivado HLS を使用 し て ビデオ ラ イ ブ ラ リ 関数を合成 し 、 次の手順のために IP コ ア を作成 し ます。 次の コ マ ン ド を実行 し て先に進みます。 $ make core 注記 : こ こ では手順を迅速化す る ために C/RTL 協調シ ミ ュ レーシ ョ ン を省略 し てい ます。 ただ し 、 Vivado HLS デザ イ ン で は常に協調シ ミ ュ レーシ ョ ン を実行す る こ と を推奨 し ます。 協調シ ミ ュ レーシ ョ ンは、 次の コ マ ン ド で実行で き ます。 $ make cosim 手順 4 : ア ク セ ラ レー タ を使用 し て新 し いシ ス テムを構築する 次の コ マ ン ド は、 新たに生成 さ れた IP コ ア をハー ド ウ ェ ア プ ロ ジ ェ ク ト に コ ピー し 、 FPGA イ ンプ リ メ ン テーシ ョ ン フ ロ ーを開始 し て ビ ッ ト ス ト リ ーム を生成 し ます。 $ make bitstream 次に、 ビ ッ ト ス ト リ ーム フ ァ イ ルに よ っ て、 SD カー ド のブー ト イ メ ージが、 プ リ コ ンパ イ ル済み FSBL 実行フ ァ イ ルお よ びプ リ コ ンパ イ ル済み U-Boot 実行フ ァ イ ル と 共に生成 さ れます。 $ make boot XAPP1167 (v3.0) 2015 年 6 月 24 日 japan.xilinx.com 12 OpenCV ア プ リ ケーシ ョ ン を高速化する手順 ブー ト イ メ ージは、 boot/BOOT.bin に置かれ ます。 こ こ で、 新 し いデザ イ ンのハー ド ウ ェ ア と ソ フ ト ウ ェ アの両方がボー ド でテ ス ト で き ます。 最後に、 次の コ マ ン ド を実行 し て、 オン ボー ド テ ス ト 用の sd_image を生成 し ます。 $ make all 注記 : デザ イ ン デ ィ レ ク ト リ で make all を実行す る と 、 手順 2 ~ 4 が実行 さ れます。 こ の処理が完了す る と 、 使用可能 な状態の SD カー ド イ メ ージが ./sd_image に作成 さ れます。 手順 5 : ボー ド で テ ス ト を行 う 生成 さ れた sd_image/ 内のすべてのフ ァ イ ル と デ ィ レ ク ト リ を、 SD カー ド のルー ト デ ィ レ ク ト リ に コ ピー し ます。 ボー ド を次のよ う にセ ッ ト ア ッ プ し ます。 • HDMI ま たは HDMI/DVI ケーブルを使用 し て、 ZC702 ボー ド の HDMI 出力ポー ト にモニ タ ーを接続 し ます。 • UART 通信用に、 ZC702 ボー ド の USB UART と 表示 さ れた Mini USB ポー ト J17 に USB Mini-B ケーブルを接続 し 、 ホ ス ト PC の空 き USB ポー ト に USB Type-A ケーブル コ ネ ク タ を接続 し ます。 • ZC702 ボー ド に電源を接続 し ます。 • (オプシ ョ ン) 1080p60 ビデオを出力する ビデオ ソ ース を FMC_IMAGEON ボー ド の HDMI 入力ポー ト に接続 し 、 ラ イ ブ入力を有効に し ます。 • (オプシ ョ ン) RJ45 イ ーサネ ッ ト ケーブルを使用 し て、 ZC702 ボー ド の イ ーサネ ッ ト ポー ト を ネ ッ ト ワー ク に接続 し ます。 図 6 に示す よ う に ス イ ッ チが設定 さ れてい る こ と を確認 し ます。 こ れに よ り 、 ZC702 ボー ド を SD カー ド か ら ブー ト で き ます。 X-Ref Target - Figure 6 図 6 : ZC702 ボー ド 上の SW16 ス イ ッ チの設定 端末プ ロ グ ラ ム (TeraTerm な ど) を 開 き 、 Baud Rate = 115200、 Dat a bits = 8、 Parity = None、 Stop Bits = 1、 Flow control = None に設定 し ます。 sd_image の内容を格納 し た SD カー ド を、 ZC702 ボー ド の SD ス ロ ッ ト に挿入 し ます。 ボー ド の電源を オンに し て、 シ ス テ ムが起動す る のを待ち、 root/root で ロ グ イ ン し ます。 コ マ ン ド ラ イ ン モー ド でアプ リ ケーシ ョ ン を実行 し ます。 root@zynq:~# run_video.sh -cmd XAPP1167 (v3.0) 2015 年 6 月 24 日 japan.xilinx.com 13 ま とめ ま とめ OpenCV は、 コ ン ピ ュ ー タ ー ビ ジ ョ ン デザ イ ンの開発に便利な フ レーム ワー ク です。 OpenCV アプ リ ケーシ ョ ンは、 ARM アーキ テ ク チ ャ 向けに再 コ ンパ イ ル し て Zynq デバ イ ス で実行す る こ と に よ り 、 エンベデ ッ ド シ ス テ ムで も 使用可能にな り ます。 ま た、 Vivado HLS の合成可能ビデオ ラ イ ブ ラ リ を利用 し て、 OpenCV アプ リ ケーシ ョ ン を高速化 し 、 高精細ビデ オ を リ アル タ イ ムで処理で き ます。 参考資料 1. www.opencv.org 2. 『AXI リ フ ァ レ ン ス ガ イ ド 』 (UG761) 3. 『Video Timing Controller 製品ガ イ ド 』 (PG016) 4. 『Vivado Design Suite ユーザー ガ イ ド : 高位合成』 (UG902 : 英語版、 日本語版) 5. 『Zynq ベース TRD』 (UG925) 6. Vivado HLS の ウ ェ ブ ページ : japan.xilinx.com/hls 改訂履歴 次の表に、 こ の文書の改訂履歴を示 し ます。 日付 バージ ョ ン 内容 2015 年 6 月 24 日 v3.0 最新 リ リ ース を反映す る よ う に 「 リ フ ァ レ ン ス デザ イ ン」 お よ びその他の セ ク シ ョ ン を更新。 2013 年 7 月 23 日 v2.0 最新 リ リ ース を反映す る よ う に各セ ク シ ョ ン を更新。 2013 年 3 月 20 日 v1.0 初版 XAPP1167 (v3.0) 2015 年 6 月 24 日 japan.xilinx.com 14