赞
踩
HydraMini是Xilinx推出的基于Pynq-Z2开发板的自动驾驶开发小车,其有着简单易学、高灵活性、高扩展性、高性能等优良特性,是研究人员和学生进入自动驾驶领域的一个平台。本教程会通过最基础的讲解和步骤带领读者熟悉这个平台的基本开发流程,包括实体小车的使用和模拟器的使用。详细的代码解读和流程分析见参考链接里的github项目。
小车采用两块电池给板子以及电机供电,通过单目摄像头感知环境。
在继续阅读后续教程前,笔者推荐掌握或熟悉的知识:
HydraMini通过人手动操控小车完成跑圈来搜集训练数据。下面为步骤详解。
/home/xilinx
(如果使用Xilinx提供的小车镜像则直接进入/home/xilinx/Car
即可)cd /home/xilinx/Car
su
# 提示输入密码:xilinx
./ini.sh #加载dpu.ko模块,配置X11转发,创建build文件夹
rm -rf images
make collect
./build/collect 50000 0.5 1# 第一个参数为所要搜集的图片数量,小车搜集到足够图片后会自动停止;第二个参数指定的小车运行速度,这个值在最后运行的时候建议保持一致;第三个参数如果为1则表示显示记录的图片,可以用来调节摄像头角度
* w: 启动,后轮上速维持设定值
* a: 左转
* d: 右转
* s: 停止
* t: 保存图片或暂停保存(在你觉得不适合拍照保存的时候暂停记录)
* r: 删除前n条记录以及图片(删除可能是噪声的数据)
* Esc: 终止进程(不会删除已保存的记录)
5.现在你将看到Car/images
文件夹,其中train.csv
为标签数据,其余为图片,将这个文件夹拷贝到安装了Host环境的虚拟机或物理机电脑上(可以通过scp或者读卡器拷贝),路径为/home/xilinx/pynq_car/Host-Part/images
请阅读HydraMini 模拟器用法完成数据搜集。
进入Host端系统,首先激活conda虚拟环境。输入以下命令会调用process_img.py
进行数据预处理并保存结果到training_data_npz/
,然后调用train.py
来进行训练并且把结果保存到model/
。process_img.py
和train.py
可以通过运行process_train.sh
脚本来执行,请注意,如果你的模型输出只输出一个steer值,那么train.py的--output_num=1
,如果输出steer和speed值,那么该参数赋值2,在process_train.sh
脚本中用的是默认值2。
~/pynq_car/Host-Part$ conda activate decent
~/pynq_car/Host-Part$ cd /home/xilinx/pynq_car/Host-Part
~/pynq_car/Host-Part$ ./process_train.sh
训练过程预置为100个epoch,但因为Early_Stop策略,所以会在没有太多改进的情况下提前结束,现在你应该能看到Host-Part/model/model.h5
文件,即为最终的模型。
~/pynq_car/Host-Part$ cd /home/xilinx/pynq_car/Virtual-Part/src
~/pynq_car/Host-Part$ ifconfig # 查看当前ip地址
~/pynq_car/Host-Part$ python predict_server.py --model=../../Host-Part/model/model.h5
Start Build
界面,创建随机道路或者加载道路脚本。然后进入Start Drive
界面,输入之前查看到的ip地址,然后点击NN Drive
,此时你可以看到模拟小车根据刚刚训练的模型进行自动驾驶了。要想在Pynq-Z2上用DPU加速模型的Inference,首先我们要在PC上进行模型的量化和编译。
~/pynq_car/Host-Part$ cd /home/xilinx/pynq_car/Host-Part/dnndk-host
~/pynq_car/Host-Part/dnndk-host$ ./freeze_detect.sh
~/pynq_car/Host-Part/dnndk-host$ ./quant.sh
~/pynq_car/Host-Part/dnndk-host$ ./compile.sh
首先,freeze_detect.sh
会将之前训练得到的keras模型转化为tensorflow模型,
然后打印出该模型的输入层和输出层。
接下来运行的quant.sh
会进行量化工作,
最后再把优化过的模型编译成可以被DPU加载执行的.elf
文件。
至此我们终于完成了Host端的所有工作,现在你应该可以看到compile/
文件夹下的dpu_testModel.elf
文件。将它拷贝到Pynq板子的/home/xilinx/Car/model/
下。
再次进入小车系统,如果你有重启或重连过的话,运行以下初始化指令。
~/Car$ cd /home/xilinx/Car
~/Car$ su
# 提示输入密码:xilinx
~/Car$ ./ini.sh #加载dpu.ko模块,配置X11转发,创建build文件夹
接下来编译运行即可,
~/Car$ cd /home/xilinx/Car
~/Car$ make run
~/Car$ ./build/run n 0.5 # 第一个参数是运行模式,我们的例子需要给n;第二个参数是运行速度,建议和你搜集数据时保持一致
根据小车跑的情况调整模型输出的处理过程,修改src/run.cc
中的run_model
函数,在得到模型输出后,根据实际情况修改。
常用修改参考:
collect.cc
中会把摄像头原始图片放缩成160*120大小的图片然后保存。process_img.py
预处理函数中会把读入的图片裁剪掉头部并对像素值进行/255 - 0.5
处理。train.py
中会对原始labels数据做范围处理,映射到0-1
的范围。run.cc
中摄像头会先放缩图片至160*120然后裁掉头部再放入数据队列,在设置DPU输入时会进行/255 - 0.5
处理。-1 - 1
范围再传给舵机。github项目链接
gitbook链接
FPT比赛设计论文
HydraMini论文
DNNDK教程
本文档为原创教程,任何转载和引用请注明出处,谢谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。