FC2カウンター FPGAの部屋 Vivado HLS を使用した車の白線検出5(hls::HoughLine2())

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

FPGAの部屋

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

Vivado HLS を使用した車の白線検出5(hls::HoughLine2())

Vivado HLS を使用した車の白線検出4(ヒストグラム均一化)”の続き。

前回はヒストグラムの均一化を行ってから、グレー変換、Canny フィルタ、Hough 変換を行うと白線検出をすることができた。今回は、”Vivado HLS を使用した車の白線検出1(初めに)”で使用した”ka367/Lane-Detecting-Using-Hough-Transform”が動作して、C シミュレーションとC コードの合成をすることができた。

どうやって、C シミュレーションとC コードの合成をすることができたか?なのだが、ひたすら他力本願当事になってしまった。
まずは、”Vivado HLS を使用した車の白線検出1(初めに)”に、Xilinx の Community Forums の”Vivado HLS Video Libraries - HoughLines2 - Unable to synthesize”の”Hough_Top.zip ‏9 KB”をダウンロードして、top.cpp と top.h を入れ替えた。そのファイル名を top_2.cpp と top_2.h に変更した。 top_2.cpp と top_2.h の画像サイズが 320 x 240 ピクセルだったので、640 x 480 ピクセルに変更した。top_2.cpp のコード内にも 240 ラインを直接書いてある部分があったので、それを 480 ラインに変更した。
top_2.cpp の 464 行目を

hls::Polar_< ap_fixed<16,3>, ap_fixed<12,12> >lines[50];

にした。つまり line[500] から line[50] に変更した。この値は、合成時に効いてくるようだ。リソース使用量が増えてしまうし、合成時のメモリ使用量が極端に増えてしまう。
それに伴って、468行目の Hough_plotting<500> も Hough_plotting<50>に変更した。
Lane-Detecting_26_160518.png

これで、C シミュレーションを行った。HLS ビデオライブラリを使用した結果と OpenCV の結果の比較結果はエラーだったが、result_1080p.bmp と result_1080p_golden.bmp が生成された。
result_1080p.bmp と result_1080p_golden.bmp を示す。左が result_1080p.bmp で、右が result_1080p_golden.bmp だ。
Lane-Detecting_27_160518.jpgLane-Detecting_28_160518.jpg

全く違うが、result_1080p.bmp が HLS ビデオライブラリを使用した結果で、 result_1080p_golden.bmp はOpenCV で白線検出を行った結果だ。OpenCV の方はCanny フィルタの出力に白線検出の結果を表示している(白線検出はされていない)。 HLS ビデオライブラリの方は、原画像に白線検出した結果の赤い線を載せている。白線検出ができているようだ。

次にC コードの合成を行った。結果を示す。
Lane-Detecting_29_160518.png

動作周波数が満足していないし、ZYBO のZynq 7010 のリソースではまったくもって足りない。LUT は 2262 % 必要だった。つまり、今のZynq の 22 倍以上大きな FPGA が必要ということだ。
ちなみに、C:\Users\Masaaki\Documents\Vivado_HLS\ZYBO\test\Lane-Detecting\Lane-Detecting_HLS_16_1\solution1\syn\verilog フォルダを示す。ファイル数は 126 ファイルあった。
Lane-Detecting_30_160518.png

なんとか Canny フィルタだけでもZYBO のFPGA 部分に乗らないだろうか?Hough 変換は諦めて ARM プロセッサで動作させることも考えたい。
この HLS ビデオライブラリを使用した top_2.cpp は、Canny フィルタがHLS ビデオライブラリに無いので、Canny フィルタを作っているようだ。

hls::GaussianBlur<5,5>()
hls::Sobel<1,0,3>()
hls::Sobel<0,1,3>()
gradient_decomposition( sobel_gx, sobel_gy, grad_gd ),
nonmax_suppression()
hysteresis()


Canny フィルタの概要は”Canny Edge Detection -アルゴリズム-”を参照のこと。

Analysis 表示を示す。
Lane-Detecting_31_160518.png

Recource Profile を見ると、各モジュールのリソース使用量が見える。
Hough_plotting_50が圧倒的にリソース使用量が多い。その他もかなりDSP を消費している。

”Zynq-7000 All Programmable SoC 概要 DS190 (v1.9) 2016 年 1 月 20 日”から表1を引用する。
Lane-Detecting_32_160518.png

このままでは、一番大きい XC7Z100 にも入らないのか。。。絶望的だが、Hough_plotting() のPIPELINE をやめれば、700% 程度にまでLUT のリソース使用量が落ちたので、結構入るZynq も増えるだろう。
この辺りは、ハードウェアにするにしてもリソース使用量が極端に増えてしまうので、注意が必要だし、CPUでやった方が良いのかもしれない?う~ん。残念。。。

Hough_plotting() は画像に検出した線を示すために必要なので、実際の白線検出は検出した線を書かなくて良いので、HoughLine2() まで実装できれば良い。しかし、ZYBO にはそれもDSP が足りなくて無理そうではある。せめてCanny フィルタだけでも実装できれば。。。
もっと大きなZynq が切実に欲しい。。。Zynq-7020 のZYBO が出ないものか。。。
  1. 2016年05月18日 04:56 |
  2. Vivado HLS
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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