LoginSignup
36
32

More than 1 year has passed since last update.

OpenCVのFPGAハードウェア化 KRIAで行うOpenCVの高速化(Vitis2022.1版)

Last updated at Posted at 2022-07-31

FPGAでOpcnCVのハードウェア化

画像ライブラリーとして、人気の高い、OpenCV
C言語でもPythonでも簡単に使えることが大きな特徴です。

このOpenCVをもっと高速化できないのか?
その答えの一つが、FPGAを使って、OpenCVをハードウェア化する方法です。

今回は、2021年に登場した、新FPGAボード KRIA AIスターターキットを使って、
OpenCVのハードウェア化を試したいと思います。

ザイリンクスの新FPGAボードKRIA登場。

2021年になりますが、ザイリンクスから新FPGAボート「KRIA」が登場しました。
これからのFPGA入門機として、大活躍します。

大きな特徴は高性能なのに安い。そして、簡単に使えるようになったことです。
FPGAでAIが実現できる性能を持ちながら、AIスターターキットが3万円台で、購入できます。
今までの3万円台のFPGAボードに比べると、性能は8倍以上。(ZYBO Z7-10 比較)

また、FPGAをソフトウェア的に使える用に工夫されているため、今まで敷居が高かった人にも
簡単に使えるのが特徴になっています。

image.png

今回は、KRIAを使って、OpenCVのハードウェア化を実現したいと思います。

KRIA AIスタータキットの購入

日本ではアヴネット社が通販で扱ってくれてます。

https://www.avnet.com/shop/japan/products/amd-xilinx/sk-kv260-g-3074457345646111168/
また、オプションとして、ベーシックアクセサリーパックもあったほうが色々楽しめます。

直接海外から、購入できる人は、ザイリンクス社から直接購入もできます。
https://www.xilinx.com/products/som/kria/kv260-vision-starter-kit.html

また、通販会社でも販売を始めているようです。在庫がかなり揃っています。

開発ツール Vitis(ヴァイティス)

開発ツールは無料でダウンロードできるVitisと言うツールを使います。
詳しい使い方は別の機会にご紹介しますので、ここではダウンロード先をご紹介します。

無料登録後ダウンロードが可能になっています。
かなり容量が大きいので気をつけてダウンロードしてください。

OpenCVをハードウェア化。ザイリンクスのビジョンライブラリーのご紹介。

KRIA KV260は、高性能FPGAを使っているため、画像が扱いやすいのが大きな特徴となっています。
一例として、OpenCVのハードウェア化が簡単にできます。

ザイリンクス社からはVitis Vision Library というのが、オープンソースで公開されています。
このライブラリーを使うと、画像ライブラリーがハードウェア化可能です。

使用できる、関数はOpenCVにある関数が多く、100近い数になっています。
下の三角じるしをクリックして、展開すると、使える関数が見れます。

KRIAで使えるOpenCVの関数一覧

3dlut
accumulate
accumulatesquared
accumulateweighted
addweighted
aec
arithm
autowhitebalance
badpixelcorrection
bfmatcher
bilateralfilter
blacklevel
boundingbox
boxfilter
canny
ccacustom
channelcombine
channelextract
clahe
colorcorrectionmatrix
convertbitdepth
convertscaleabs
crop
custom_bgr2y8
customconv
cvtcolor
demosaicing
dilation
distancetransform
erosion
fast
flip
gaincontrol
gammacorrection
gaussianfilter
globaltonemapping
harris
histequalize
histogram
hog
houghlines
inrange
integralimg
kalmanfilter
laplacian
lensshadingcorrection
lkdensepyrof
lknpyroflow
lut
magnitude
meanshifttracking
meanstddev
medianblur
minmaxloc
modefilter
otsuthreshold
paintmask
phase
pyrdown
pyrup
quantizationdithering
reduce
remap
resize
rotate
scharrfilter
sgbm
sobelfilter
stereolbm
sum
svm
threshold
tonemapping
warptransform

ハードウェアの特徴は高速なので、大きな画面をリアルタイムで処理、というのも可能になります。

予め用意しておくもの

開発ツール Vitisが動くパソコン

 Vitisは高性能パソコンを好みます。できれば、メモリーを多く用意したほうがいいです。32Gbyteくらいです。
 ただ、遅くはなりますが、16Gbyteでも動かしている方は多いので、試すことはできます。
 アマゾンのAWSや、Google Cloudを使うのもいいでしょう。
 日本では、ACRiルームと言うところが、FPGA開発ツールを無料で貸してくれます。KRIAも一台ありますので、お試しに使うのもいいでしょう。
 
https://gw.acri.c.titech.ac.jp/wp/

ZYNQMPの共通イメージ

KRIA上でLinuxを使うための、イメージファイルが入っています。

image.png

image.png

KRIAで動く、2022.1版、SDカード

KRIAで動けばどの SD カードでも良いのですが、今回は下記で作ったものを使用します。
SD カードイメージを作るのは大変なので、あらかじめ用意したしました。ダウンロードして使うことも可能です。

KV260 Vitisプラットホーム

下記ホームページのステップ2までで、作ったものです。
ダウンロードファイルも用意しました。

デバイスツリージェネレータ

KRIAを動かすのには、デバイスツリーが必要になります。これを作るプログラムがオープンソースで公開されてます。これをあらかじめダウンロードします。バージョンが決まってますので注意してください。

device-tree.git
git clone https://github.com/Xilinx/device-tree-xlnx.git
cd device-tree-xlnx/
git checkout xlnx_rel_v2022.1

Vitisでopencv アクセレーターの準備を行う。

実際に opencv で出来るのか確認するためにサンプルを参考してクリアでopencv の関数を作ってみます

KRIAではVisionLibraryが豊富にあります。それを使って、Vitisで組み立てる方法をご紹介します。
開発ツールはVitis2022.1を使用しました。

Vitisで作成する必要があるのは、ソフトウェアアプリケーション、ハードウェアアクセラレータ、デバイスツリーの3種類のファイルになります。

アプリケーションプロジェクトの作成

1-1 Vitisを立ち上げます。
Vitisが動く環境をセッティングします。その後、Vitisの立ち上げを行います。

source /tools/Xilinx/Vitis/2022.1/settings64.sh
vitis & 

1-2 今回はアプリケーションを作るのでCreate Application Projectを作成します。メニューのFile → New → Application Projectでも可能です。

image.png

1-3 ネクスト一回押して、プラットフォーム選択画面が出てきます。kv260_customを選択します。まだ登録されていない場合は右上のAddボタンを押してください。

image.png

1-4 プラットフォームを選択する画面です。事前に作成したプラットフォームを使用します。ダウンロードした方はkv260_custom.zipを解凍して使用してください。場所はxpfmファイルがあるとフォルダーになります。
image.png

1-5 プラットフォームの中から、kv260_customを選択します。

image.png

1-6 アプリケーションの名前を決めます。今回はresizeとしました。

image.png

1-7 事前にダウンロードした共通イメージを解凍します。その中に入っている sdk を実行してさらに解凍します。sdkを実行中にディレクトリーの確認を行いますので、yを押して、解凍を進めます。

common.tar.gz
tar xzvf xilinx-zynqmp-common-v2022.1_04191534.tar.gz 
cd xilinx-zynqmp-common-v2022.1
./sdk.sh -d .
sdk.log
./sdk.sh -d .
PetaLinux SDK installer version 2022.1
======================================
You are about to install the SDK to "/home/tadaaki/WorkSpace/xilinx-zynqmp-common-v2022.1". Proceed [Y/n]? y
Extracting SDK.........................................................................................................................................................................................................................................................................................done
Setting it up...done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
 $ . /home/tadaaki/WorkSpace/xilinx-zynqmp-common-v2022.1/environment-setup-cortexa72-cortexa53-xilinx-linux

1-8 Sysroot pathを指定します。先程解凍したフォルダーの中から、sysroot/cortexa72-coterxa53-xilinx-linuxを選択します。
ここはライブラリーがあります。特別なライブラリーを使いたい場合は他のsysrootを選択することもできます

image.png

1-9 テンプレートを選択することができます。最初の状態ではほとんど情報が入っていません。Vitisの良さはたくさんのライブラリが用意されていることです。ここでライブラリーのダウンロードを行います。 Vites IDE Libraryをクリックします。
image.png

1-10 Vitis Accelerated Library Repository が出てきますので Downloadをクリックします。

image.png

1-11 インストールすることが確認できました。Vitisで使えるライブラリーが登録されました。

image.png

1-12 Show only cetified exampleのチェックを外します。ライブラリーが多数出てきます。その中から、Vitis Vision Libraryの中でL2のexamples を展開します。

image.png

1-13 Vision Libraryの中から、下の方にスクロールしていって、Resize L2 Testを選択します。

image.png

ソフトウェアアプリケーションのビルド

1-14 ソフトウェアとアクセレーターの両方をビルドします。今回はいきなりKRIAを動かしますのでハードウェアのビルドを行います。アイリスの右上の方にある Avtive build configuration をHardwareにします。

image.png

1-15 アプリケーションをビルドするには、ライブラリーを登録しないといけません。今回はコンパイルのためのインクルードファイルを設定します。

image.png

1-16 includesの追加を行います。Settingsを確認してから、includesをクリックします。include path(-I)の右側のプラスのアイコンをクリックします。

image.png

1-17 opencv4 を設定します。file systemをマウスで、クリックして、Directoryを選びます。入力するディレクトリーは sysroot の中に入ってます。これは1-7 で、準備した sdk を解凍したディレクトリで作成しました。sysroot/cortexa72-coterxa53-xilinx-linux/usr/include/opencv4 を選びます。

image.png

1-18 インクルードパスが登録されたのを確認してください。確認が終わりましたら 右下にある、Apply and Close をクリックします。

image.png

1-19 ビルドを行います。ハンマーのアイコンをクリックします。エラーが無ければ数秒でビルドが終了します。
image.png

1-20 ソフトウェアの目的のファイルはresizeというファイルです。resizeの中の、Hardwareの中にresizeがあることを確認します。

image.png

ハードウェアアクセラレータのビルド

1-21 ハードウェアアクセラレータもビルドします。resize_system_hw_link を選択して、上の方のアイコンのハンマーのアイコンをクリックします。こちらのビルドは数分から数10分かかります。

image.png

注意、同時に動かす CPU の数によってはメモリー不足になり、エラーになる可能性があります。この時は同時に動かす CPU に制限をかけてください。

1-22 ハードウェアアクセラレータの目的のファイルは、krnl_resize.xclbinです。resize_system_hw_linkの下のHardwareのしたに、krnl_risize.xclbinがあることを確認してください。
image.png

デバイスツリーファイルの作成。

デバイスツリーは Linux にハードウェア情報等を提供するファイルになります。Vitisではデバイスツリーコンパイラー前の、ソースファイルまで作成します。事前準備が必要なのでそこから行います。

1-23 デバイスツリーを作るには、Vitisにデバイスツリーのコンパイルの場所を提供する必要があります。メニューからXilinx→Software Repositoriesを選択します。

image.png

1-24 デバイスツリーの場所は事前にダウンロードしたところにあります。Local Repositories の右側の New をクリックして、ファイルを選択します。今回はdevice-tree-xlnxのを選択します。内容を確認しましたら、Apply and Close をクリックして確定させます。

image.png

1-25 デバイスツリーを作成します。メニューからXilinx→Generate Device Tree を選択します。
image.png

1-26 入力ファイルと出力ディレクトリを設定します。入力ファイルは xsa ファイルを使用します。今回は事前ダウンロードしたVitis プラットホームの中に入っています。Hardware Specification Fileには、プラットフォームの hw/kv260_hardware_platform.xsaを選択します。
Output Directryはデバイスツリーのソースファイルが入るところです。今回は dt というフォルダを作ってそこを指定しました。
デバイスツリーを作成するのに設定をいたします。Modify DeviceTree Settingをクリックします。

image.png

1-27 デバイスツリーのセッティングを行います。今回はオーバーレイという仕組みと、KRiaに必須な、ZOCLライブラリーを使うのでその設定を行います。まず、左側のdevice_tree を選択します。それからdt_overlayの右側をtureに、dt_zoclの右側もtrueにします。OKを押します。1-26の画面に戻りますので、Garerateをクリックします。これでデバイスツリーのソースファイルが作成できました。dtフォルダに、pl.dtsiができますのでそれが目的のファイルになります。これをこの後、デバイスツリーのコンパイルします。
image.png

KRIAを動作させ、OpenCVが動いているのを確認する。

Kriaに送るファイルを準備する。

2-1 Kriaに送るためのファイルは次のものになります。それぞれ準備をいたします。

tree
.
├── krnl_resize.bin
├── krnl_resize.xclbin
├── pl.dtbo
├── resize
└── shell.json

2-2 フォルダを用意して送るファイルをまとめます。今回はkria_cpというフォルダを作成しました。フォルダを作成した後そこに移動します。

cd ~/WorkSpace
mkdir kria_cp
cd kria_cp

2-3 ハードウェアアクセラレータのファイルをコピーします。knrl_resize.xclbinが必要になります。また同じファイルなのですが、ファイル名を変えたkrnl_resize.binも用意します。アプリを動かすためとライブラリに登録されるためで、二つ必要になります

cp ../opecv_demo/resize_system_hw_link/Hardware/krnl_resize.xclbin .
cp krnl_resize.xclbin krnl_resize.bin

2-4 デバイスツリーファイルを用意します。Vitisで作ったファイルはデバイスツリーのソースファイルです。デバイスツリーコンパイラを使ってコンパイルし、このファイルを使います。ソースファイルは dt フォルダーにあると想定しています。デバイスツリーコンパイラーはVitisの開発環境に入っています。

cd ~/WorkSpace
dtc -@ -I dts -O dtb -o dt/pl.dtbo dt/pl.dtsi 
cd kria_cp
cp ../dt/pl.dtbo  .

2-5 ソフトウェアアプリをコピーします。

cp ../opecv_demo/resize/Hardware/resize .

2-6 shell.jsonファイルは自分で作る必要があります。今回はgeditを使いました。お好きなエディターを使えば大丈夫です。できましたら保存します。

gedit shell.json
shell.json
{
  "shell_type" : "XRT_FLAT",
  "num_slots": "1"
}

2-7 集めたファイルを確認します。

tree
.
├── krnl_resize.bin
├── krnl_resize.xclbin
├── pl.dtbo
├── resize
└── shell.json
KRIAで動作確認

2-8 KRIAを準備します。マイクロ SD カード入れます。 J4のMicro-USB UART・JTAGをパソコンのUSBに接続します。J10 RJ-45 Ethernetはダウンロードできるように、インターネットに接続します。J12 DC Jackに電源を入れ、動作させます。

image.png

2-9 パソコン側でターミナルソフトを動かします。KRIAは、USB を接続するというUARTが4チャンネル見えるようになってます。その下から2番目を接続します。Linux上で動かす、GTKTERMの動作の例を示します。Windows MAC Linuxなら大抵は、ドライバーがすでに入っています。

gtkterm --port /dev/ttyUSB1 --speed 115000

2-10 KRIAを起動させます。loginを行います。パソコンからファイルを送るため、KRIAのIPアドレスを調べます。KRIAでifconfigを実行します。inetに表示されているのがIPアドレスです。ここでは、192.168.0.13になります。

KRIA.ifconfig
ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.13  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 2001:ce8:110:9f64:20a:35ff:fe0a:81d2  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::20a:35ff:fe0a:81d2  prefixlen 64  scopeid 0x20<link>
        ether 00:0a:35:0a:81:d2  txqueuelen 1000  (Ethernet)
        RX packets 70  bytes 14448 (14.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 71  bytes 9301 (9.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 38  

2-11 パソコンからファイルをKRIAにコピーします。パソコンがLINUXの場合は、scpコマンドを使います。送りたいフォルダー kria_cpにいるとして、次のコマンドをパソコンから実行します。パスワード等を聞かれますが、KRIA側のパスワードを入力してください。
scp * petalinux@192.168.0.13:~

2-12 パソコンにある、画像ファイルをKRIAにお送りします。テストするための画像です。今回はflower.jpgを送りました。ファイルであれば、JPEG、PINGでも大丈夫です。

scp flower.jpg petalinux@192.168.0.13:~

2-13 KRIA側で、ライブラリーを登録します。まずはそのためのディレクトリーを作成します。/lib/firmware/xilinx/resizeにします。

KRIA.mkdir
sudo mkdir /lib/firmware/xilinx/resize

2-14 作ったフォルダーにファイルをコピーします。ここでは必要なファイルのみコピーします。

KRIA.cp
sudo cp shell.json krnl_resize.bin pl.dtbo /lib/firmware/xilinx/resize/

2-15 アプリケーションを動かすためにOpenCVが必要なため、インストールします。インターネットを通して、手に入れます。dnfコマンドを使えば、手に入ります。
なお、予めPetalinuxというツールで、使うライブラリーを事前に登録することもできます。今回はxrtというライブラリーを事前登録しています。 xrtのインストールは sudo dnf install xrt で、できます。

KRIA.dnf
sudo dnf install packagegroup-petalinux-opencv

2-16 ライブラリーにresizeが登録してるのを確認します。その後既にロードしてあるアクセレーターを外して、あなたに作ったりサイズのアクセレーターを登録します。

KRIA.xmutil
sudo xmutlil listapps
sudo xmutlil unloadapp
sudo xmutlil loadapp resize

2-17 作成したアプリケーションを実行します。./resize 画像ファイル 高さ 幅 として、コマンドを打ちます。ハードウェアアクセラレータとソフトウェアで行った、リサイズの結果を比較して、間違いが少なければ Test PAssed 実行結果も下に載せてますので参考してください。

KRIA.resize
./resize flower.jpg 480 640
Input image height : 640
Input image width  : 1024
INFO: Running OpenCL section.
Found Platform
Platform Name: Xilinx
INFO: Device found - edge
Input Image Bit Depth:8
Input Image Channels:1
NPPC:1
XCLBIN File Name: krnl_resize
INFO: Importing ./krnl_resize.xclbin
Loading: './krnl_resize.xclbin'
3.41791ms
	Minimum error in intensity = 0
	Maximum error in intensity = 2
	Percentage of pixels above error threshold = 0
Test Passed 

アプリケーションの内容、展開

ソースコードでおこなっていること。

実際にソースコードを見てみると、ソフトウェアの方は opencv で画像を読み込んだ後白黒化しています。その白黒したデータを Open CL を使って ハードウェアアクセラレータ方にデータを渡しています。その後実行しています。読み込んだデータはソフトウェアでもリサイズをしまして、できた結果を比較しています。

その後の展開の仕方。

ソースコードを読み取っていただければ今回は白黒で行なっています。カラーがするにも簡単にできますのでソースファイルを確認の上お望みでカラー化にチャレンジしてみてください。

また今回はVitisでひとつのライブラリを使って実行しました。複数のライブラリーを同時に使用することも可能です。
Vitisハードウェアアクセラレータでもかなり速くなりました。ただし無理と転送で時間がかかります。この部分も早くしたい方は vivalo というハードウェアツールで作ることもできます。Vision Libraryは高位合成にも対応しており、Vitis HLSという、ハードウェアを C 言語で作るツールで作ることもできます。こちらを使うとさらに2倍程度速く動作が望めます。ただし、設計時間は3倍くらいかかります。

参考資料

36
32
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
32