本文转载自:<span id="profileBt"><a href="https://mp.weixin.qq.com/s/4fsQXSitgG6_j1u26nBCPQ"> 硬码农二毛哥微信公众号</a></span>
Vitis AI提供两种应用例程,VART和Vitis AI Library,下文详细描述了Vitis AI Library中refinedet应用的实现过程。
<strong>编译AI模型</strong>
DNNDK 和Vitis AI Library编译AI库的方式相同。
<strong>编译refinedet模型</strong>
RefineDet模型用来检测人体。
<pre>$~/Vitis-AI/AI-Model-Zoo/all_models_1.2/caffe
$cp -r cf_refinedet_coco_480_360_0.8_25G_1.2/ ../../../Tool-Example/
$cd ~/Vitis-AI
$./docker_run.sh xilinx/vitis-ai:1.2.82
$conda activate vitis-ai-caffe</pre>
生成.dcf文件,修改.json文件,这两步已经完成。
运行编译指令
<pre>vai_c_caffe -p cf_refinedet_coco_480_360_0.8_25G_1.2/quantized/Edge/deploy.prototxt -c cf_refinedet_coco_480_360_0.8_25G_1.2/quantized/Edge/deploy.caffemodel -a arch.json -o cf_refinedet_coco_480_360_0.8_25G_1.2/output -n refinedet</pre>
出现如下错误:
<pre> Error parsing text-format caffe.NetParameter: 2310:21: Message type "caffe.DetectionOutputParameter" has no field named "objectness_score".
[VAI_C][Error] Open prototxt file failed: cf_refinedet_coco_480_360_0.8_25G_1.2/quantized/Edge/deploy.prototxt</pre>
在readme中:
remove layers after "arm_conf_reshape",将arm_conf_reshape层和它之后的层删除,再进行编译正常输出。
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553633-22…; alt=""></center>
将编译生成的.elf模型拷贝到sd卡
<strong>编译AI应用</strong>
<strong>编译Vitis-AI-Library应用</strong>
安装交叉编译环境
进入https://github.com/Xilinx/Vitis-AI/tree/v1.2/Vitis-AI-Library#quick-sta…,下载sdk-2020.1.0.0sh。
<pre>$mkdir petalinux_sdk
$cd petalinux_sdk
$./sdk-2020.1.0.0.sh</pre>
创建环境变量
<pre>$source ~/petalinux_sdk/environment-setup-aarch64-xilinx-linux</pre>
下载 vitis_ai_2020.1-r1.2.0.tar.gz,并安装
<pre>$tar -xzvf vitis_ai_2020.1-r1.2.x.tar.gz -C ~/petalinux_sdk/sysroots/
aarch64-xilinx-linux</pre>
交叉编译refinedet
<pre>$cd ~/Vitis-AI/Vitis-AI-Library/overview/samples/refinedet
$bash -x build.sh</pre>
编译后生成4个可执行文件:
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553633-22…; alt=""></center>
将生成的文件拷贝到sd卡。
下载 Vitis AI Runtime 1.2.0并拷贝到sd卡
下载vitis_ai_library_r1.2.x_images.tar.gz 和 vitis_ai_library_r1.2.x_video.tar.gz并拷贝到sd卡
<strong>启动单板</strong>
sd卡FTA32中的内容:
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553633-22…; alt=""></center>
refinedet_lib文件夹中的内容包括refinedet模型和可执行文件。
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553633-22…; alt=""></center>
查看ip,通过ssh访问单板
<pre>$ifconfig</pre>
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553633-22…; alt=""></center>
启动单板后,先执行init.sh, XRT环境变量
<pre>$cd /mnt/sd_mmcblk1p1
$source ./init.sh</pre>
进入sd_mmcblk1p1目录
<pre>$cd /mnt/sd_mmcblk1p1
$ cp dpu_sw_optimize.tar.gz vitis-ai-runtime-1.2.0.tar.gz vitis_ai_library_r1.2.0_images.tar.gz vitis_ai_library_r1.2.0_video.tar.gz ~/</pre>
运行dpu_sw_optimize
<pre>$cd ~
$tar -xzf dpu_sw_optimize.tar.gz
$cd dpu_sw_optimize/zynqmp/
$./zynqmp_dpu_optimize.sh</pre>
安装 Vitis AI Runtime 1.2.0
<pre>tar -xzvf vitis-ai-runtime-1.2.0.tar.gz
cd ~/vitis-ai-runtime-1.2.0/aarch64/centos
rpm -ivh --force libunilog-1.2.0-r10.aarch64.rpm
rpm -ivh --force libxir-1.2.0-r12.aarch64.rpm
rpm -ivh --force libtarget-factory-1.2.0-r10.aarch64.rpm
rpm -ivh --force libvart-1.2.0-r16.aarch64.rpm
rpm -ivh --force libvitis_ai_library-1.2.0-r15.aarch64.rpm</pre>
<strong>运行Vitis AI Library应用</strong>
解压vitis_ai_library_r1.2.x_images.tar.gz和 vitis_ai_library_r1.2.x_video.tar.gz
<pre>mkdir -p ~/Vitis-AI/vitis_ai_library
tar -xzvf vitis_ai_library_r1.2.0_images.tar.gz -C Vitis-AI/vitis_ai_library
tar -xzvf vitis_ai_library_r1.2.0_video.tar.gz -C Vitis-AI/vitis_ai_library</pre>
拷贝refinedet_lib文件夹到 ~/Vitis-AI/vitis_ai_librarysamples/refinedet/
修改/etc/vart.conf文件
<pre>firmware:/run/media/mmcblk1p1/dpu.xclbin</pre>
安装 ZCU104 AI Model ,运行命令:
<pre>rpm -ivh --force xilinx_model_zoo_zcu102-1.2.0-1.aarch64.rpm</pre>
模型安装到/usr/share/vitis_ai_library/models中,进入refinedet_pruned_0_8文件夹
<pre>cd /usr/share/vitis_ai_library/models</pre>
进入refinedet_pruned_0_8文件夹,文件夹中有如下两个文件。
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553633-22…; alt=""></center>
模型存放位置
新建与模型名字相同的文件夹,将与模型名字相同的.elf文件拷贝到新建的文件夹,然后执行。
<pre>cd ~Vitis-AI/vitis_ai_library/samples/refinedet/refinedet_lib
mkdir refinedet_pruned_0_8</pre>
将.elf文件改名成refinedet_pruned_0_8.elf,拷贝到refinedet_pruned_0_8文件夹,将reffinedet_pruned_0_8.prototxt拷贝到refinedet_pruned_0_8文件夹。
查找模型,在configurable_dpu_task_imp.cpp 中指出了查找模型的位置。
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553633-22…; alt=""></center>
删除zcu104模型
/usr/share/vitis_ai_library/models/refinedet_pruned_0_8的,模型是针对ZCU104单板器件的,不能使用,因此将refinedet_pruned_0_8文件夹名字进行修改,防止程序执行时运行。
在refinedet_lib目录,运行例程
<pre>./test_jpeg_refinedet refinedet_pruned_0_8 sample_refinedet.jpg</pre>
输出结果
<center><img src="http://xilinx.eetrend.com/files/2021-09/%E5%8D%9A%E5%AE%A2/100553633-22…; alt=""></center>
启动摄像头识别
<pre>export DISPLAY=:0.0
xrandr --output DP-1 --mode 640x480
./test_video_refinedet refinedet_pruned_0_8 0</pre>