第十五届中国大学生计算机设计大赛——智慧导盲犬赛项经历分享

从baselines出发,基于PaddleDetection,一步步改进模型到部署untree GO1的jeston nano上

一、前言

中国大学生计算机设计大赛是由教育部高等学校计算机类专业教学指导委员会、教育部高等学校软件工程专业教学指导委员会、教育部高等学校大学计算机课程教学指导委员会、教育部高等学校文科计算机基础教学指导分委员会、中国教育电视台联合主办。本赛道的主旨即为采用飞桨框架训练且部署于一条能够代替传统导盲犬的机器狗,能够在模拟的城市微缩场景中符合交通规则条件的完成各种任务。通过对此实现AI走进大众生活,提高人们生活质量水平,造福社会的目标。

本文为参加中国大学生计算机设计大赛人工智能挑战赛的心得与关键步骤介绍,本赛道的任务为实现一个能够识别盲道、红绿灯(红灯状态)、红绿灯(绿灯状态)、红绿灯(不亮灯状态)、障碍物的深度学习模型,不限制深度学习任务,并且成功部署在机器狗上,让机器狗能够在规定的时间内完成识别障碍物、红绿灯(红灯状态)、红绿灯(绿灯状态)、红绿灯(不亮灯状态)等功能。主要包括数据集准备、模型训练与评估、部署与演示,训练详细流程请移步
https://aistudio.baidu.com/aistudio/projectdetail/3921687

二、赛题背景介绍

根据中国视力残疾人协会官方数据显示,我国有大约1730万视障人士,占我国总人口的百分之一点二一,位列世界视障人数第一位。但是我们在生活中却很少看见他们,主要原因有以下几点:第一,我国的盲道设计并不规范,我国的盲道设施存在连续性差、被占用等一系列问题,主要表现为由于后期管理维护不到位造成的盲道破损,自行车和汽车对盲道空间的侵占及井盖、灯杆等市政设施的阻断,导致盲道使用率极低,未能发挥引导盲人出行的预期效能。第二,一只难求的导盲犬,由于导盲犬的数量十分稀少,而且培养一只导盲犬无论是在时间上还是在内容以及金钱上要求都十分的苛刻,所以我国目前仅有不足两百头导盲犬。在如此稀少的导盲犬的情况下,普通视力残疾人想申请一头免费的导盲犬很难。幸运的视力残疾人在感受导盲犬带给他们喜悦的同时,又尝到了苦涩——导盲犬经常被拒绝出入公共场所,担心导盲犬会出现随意排便、受到刺激恶意攻击人群等问题,对公共场所的环境和乘客的人身安全造成威胁。

一条表现良好的导盲犬通常需要单独挑选和训练。此外,一只狗的技能无法转移到另一只狗身上。这使得训练导盲犬既费时又费力,而且这个过程不容易扩展。相反,在一个导盲犬机器人上开发的算法,则可以很容易地部署到另一个机器人上。因此,如果有机器狗代替导盲犬,则将具有高效省时,智能便利,造价低昂等优点,同时也将会目前盲人出行的一些困难,从而极大的造福盲人。

在这里插入图片描述

三、开发环境与使用套件

PaddleDetection为基于飞桨PaddlePaddle的端到端目标检测套件,内置30+模型算法及250+预训练模型,覆盖目标检测、实例分割、跟踪、关键点检测等方向,其中包括服务器端和移动端高精度、轻量级产业级SOTA模型、冠军方案和学术前沿算法,并提供配置化的网络模块组件、十余种数据增强策略和损失函数等高阶优化支持和多种部署方案,在打通数据处理、模型开发、训练、压缩、部署全流程的基础上,提供丰富的案例及教程,加速算法产业落地应用。

1.环境要求

  • PaddlePaddle 2.2
  • OS 64位操作系统
  • Python 3(3.5.1+/3.6/3.7/3.8/3.9),64位版本
  • pip/pip3(9.0.1+),64位版本
  • CUDA >= 10.1
  • cuDNN >= 7.6

AI Studio中,已经配置好了基础环境,可以直接安装PaddleDetection

2.安装PaddleDetection

# 克隆PaddleDetection仓库
# 如果已经克隆,则不需要重复运行,可把第3行直接注释,从第6行开始运行
#!git clone https://gitee.com/PaddlePaddle/PaddleDetection.git

# 安装其他依赖
%cd PaddleDetection
!pip install -r requirements.txt

# 编译安装paddledet
!python setup.py install
%cd ~

四、数据集准备

本次官方提供了数据集

数据集为COCO格式,总共分为五类:盲道、红绿灯(红灯状态)、红绿灯(绿灯状态)、红绿灯(不亮灯状态)、障碍物

COCO数据标注是将所有训练图像的标注都存放到一个json文件中。数据以字典嵌套的形式存放。

json文件中包含以下key:

  • info,表示标注文件info。
  • licenses,表示标注文件licenses。
  • images,表示标注文件中图像信息列表,每个元素是一张图像的信息。
  • annotations,表示标注文件中目标物体的标注信息列表,每个元素是一个目标物体的标注信息。

五、模型训练

1.使用模型介绍

结合官方飞桨平台已有的模型库和批量测试几组常用的模型,即可得到测试 结果波动不大,结果稳定的模型为 PicoDet。在经过查阅相关文献和对 模型的熟练度基础上,分别对已有模型进行了有目的的训练。从中不难得出, pecodet 系列的模型在训练的过程中可以得到相对稳定的评估结果,运行时长也 相对稳定。
在这里插入图片描述

PP-PicoDet最大的特色就是又快又准,而之所以有这样的优势,是因为PP-PicoDet有一些不错的优化策略,一个高性能的骨干网络对目标检测模型的性能提升有着至关重要的作用,PP-PicoDet采用了百度自研的超轻量、高精度骨干网络–ESNet(Enhanced ShuffleNet),使得整个目标检测模型不仅计算量更小、延迟更低、精度更高,同时还拥有更好的鲁棒性,能够更好地适配多种硬件环境。ESNet是在ShuffleNetV2的基础上引入了SE模块和GhostNet中的Ghost模块,并新增深度可分离卷积,对不同通道信息进行融合来提升模型精度,同时还使用神经网络搜索(NAS) 搜索更高效的模型结构,进一步提升模型性能,最终得到了在精度、速度全方面提升 的骨干网络。PP-PicoDet与相较于其他模型有众多优秀的特色,具体指标对比如图所示

在这里插入图片描述

为了更好的验证该模型在目标识别 中的优越性,我们参考了大量文献,发现其预测精度普遍高于 YOLO 系列模型。 基于稳定的模型再去调试参数和一些阈值会有助于评估分数的增长。

2.开始训练

%cd ~
%cd PaddleDetection
!python tools/train.py -c configs/picodet/picodet_m_416_coco_lcnet.yml

3.模型预测

%cd ~
%cd PaddleDetection
# 更换"--infer_img"里的图片路径以预测不同的图片
!python tools/infer.py -c configs/picodet/picodet_m_416_coco_lcnet.yml \
                    --infer_img=/home/aistudio/WisdomGuide/val/no_light_629.png \
                    --output_dir=infer_output/ \
                    --draw_threshold=0.5 \
                    -o weights=/home/aistudio/checkpoint/best_model.pdparams \
                    --use_vdl=Ture

4.模型导出

%cd ~
%cd PaddleDetection
# 将"-o weights"里的模型路径换成你自己训好的模型
!python tools/export_model.py -c configs/picodet/picodet_m_416_coco_lcnet.yml \
                    -o weights=/home/aistudio/PaddleDetection/output/picodet_m_416_coco_lcnet/model_final.pdparams \
                    TestReader.fuse_normalize=true

5.模型优化

调参是我们优化模型提升分数的主要途径,通过大量的训练找到了合适的参数,并总结了对调参的心得
(1)快速试错:刚开始, 先上小规模数据, 模型往大了放, 只要显存不爆, 直接奔着过拟合去,其实 就是训练过拟合网络, 连测试集验证集这些都可以不用;

(2)Loss设计要合理:多任务情况下, 各loss想法限制在一个量级上, 或者最终限制在一个量级上, 初期可以着重一个任务的loss;

(3)观察loss胜过观察准确率:准确率虽然是评测指标, 但是训练过程中还是要注意loss的. 我们发现有些情况下, 准确率是突变的, 原来一直是0, 可能保持上千迭代, 然后突然变1., 而loss是不会有这么奇怪的情况发生的, 毕竟优化目标是loss;

(4)确认分类网络学习充分:分类网络就是学习类别之间的界限. 我们发现, 网络就是慢慢的从类别模糊到类别清晰的;

(5)对比训练集和验证集的loss:判断过拟合, 训练是否足够, 是否需要early stop的依据;

(6)Learning Rate设置合理:如果学习率设置太小,网络收敛非常缓慢,会增大找到最优值的时间,如果学习率设置的太大忽略了某些阶段直接学到了下一个阶段的东西。在训练过程中,一般根据训练轮数设置动态变化的学习率。刚开始训练时:学习率以 0.01 ~ 0.001 为宜。一定轮数过后:逐渐减缓。接近训练结束:学习速率的衰减应该在100倍以上。如果是 迁移学习 ,由于模型已在原始数据上收敛,此时应设置较小学习率 (≤0.0001) 在新数据上进行微调。

(7)阈值的设置合理:我们主要使用的是二分类分类阈值的方法来进行不断的测试得到一个最佳的阈值。

经过不断地调参与选择不断缩小调参范围,确定的了picodet_m_416_coco _lcnet模型在base_lr为0.01 ,batch Size为32,steps在3000,epoch在270轮左右,预测函数中阈值为0.43时,m模型训练结果最好,我们得出了一个最佳成绩0.87+

六、部署部分

1.场地布置

因为经费原因我们根据比赛要求自己搭建了比赛场地和DIY所需道具(略心酸i(;´д`)ゞ)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.狗子的环境配置&踩坑经历

本次比赛所用的硬件设备为Untree Go1,非常感谢百度和宇树的大力支持让我们有机会免费学习价格高昂的狗子

在这里插入图片描述

狗子用做深度学习的硬件平台为jetson nano,该开发平台配置NVIDIA Maxwell 架构,128 个 NVIDIA CUDA 核心的GPU,比起树莓派等开发板在模型推理速度上有极大提升,同时配置板子的环境是件麻烦事,也是国赛期间花时间较多的部分,在这里为大家分享一些我配置环境时所遇到的问题

  1. 首先是换源的问题,NVIDIA官方提供的Linux镜像版本为Ubuntu 18.04 LTS,镜像默认的是Ubuntu官方源,在国内使用该源下载程序速度较慢,所以需要更换。在执行换源命令
sudo apt-get update
sudo apt-get upgrade

可能会出现以下报错

Reading package lists... Done
E: Release file for https://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/focal-updates/InRelease is not valid yet (invalid for another 9d 23h 6min 27s). Updates for this repository will not be applied.
E: Release file for https://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/focal-backports/InRelease is not valid yet (invalid for another 9d 23h 6min 47s). Updates for this repository will not be applied.
E: Release file for https://mirrors.tuna.tsinghua.edu.cn/ubuntu/dists/focal-security/InRelease is not valid yet (invalid for another 9d 23h 6min 16s). Updates for this repository will not be applied.

该报错为系统时区问题,我们可以通过手动修改系统时间即可解决该问题

# 查看当前时间
$ date
# 修改日期
$ sudo date -s 8/4/22
# 修改时间
$ sudo date -s 14:43:50

因为我们的jetson nano是arm64架构与大多笔记本电脑不同,所以在添加镜像源链接时注意需要在最后加上-ports,如:

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic main multiverse restricted universe
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security main multiverse restricted universe
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates main multiverse restricted universe
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports main multiverse restricted universe

否则会出现如下报错:

在这里插入图片描述

  1. jeston nano开发板没有内置网卡,所以我们不能直接上网,有两种方法解决问题。

一是连接网线进行上网,该方法需要进行较多的网络配置,并且在进行untree Go1开发时新手朋友如果不熟悉系统操作失误会对狗子的各个主板之间的通信产生影响而导致狗子瘫痪失灵等问题(亲身经历!!因为狗子是3块jeston nano和一块树莓派4b之间通过交换机用udp协议通信)

二是通过无线网卡,可以在某宝上买一块支持Ubuntu系统的免驱usb网卡,插上后即可直接连接WiFi,非常方便,但是我遇到了一个问题,连接WiFi后不能正常上网,试过ping百度之类的也ping不通,在排除DNS解析域名之类的问题后,我发现是因为Go1的jetson nano上默认插了网线,占用了网口导致连不了网此时我们通过命令sudo ifconfig eth0 down关闭eth0网口就可以正常上网啦

  1. 因为Jetson系列开发板在PaddlePaddle官方有已经编译好的python3.6的whl,故直接下载飞桨官方编译好的预测库即可 PaddlePaddle官方whl包
    当安装好whl后进行import paddle导入包时可能会出现Illegal instruction报错,是因为jetson nano开发板的CPU架构为arm64架构,所以我们需要添加环境变量
修改环境变量
sudo gedit /etc/profile 

把 export OPENBLAS_CORETYPE=ARMV8 #加入最后面一行,然后保存

更新环境变量
source /etc/profile

重新导入paddle后即可成功

  1. 调用摄像头问题

我们可以通过用python-opencv的cv2.VideoCapture()调用摄像头,但直接调用时可能会获取不了图像,是因为Go1默认一直运行着调用相机的进程,我们需要kill掉后可正常使用相机

#获得root权限
sudo su
ps -aux | grep point_cloud_node | awk '{print $2}' | xargs kill -9
ps -aux | grep mqttControlNode | awk '{print $2}' | xargs kill -9
ps -aux | grep live_human_pose | awk '{print $2}' | xargs kill -9

3.部署测试

通过Paddle Inference部署模型测试效果可以通过命令让模型跑起来

python3 PaddleDetection/deploy/python/infer.py  --model_dir=./picodet_m_416_coco_lcent --camera_id=0 --device=GPU

效果图:

在这里插入图片描述

七、总结

这次比赛是笔者第一次从训练模型到实际部署全流程开发的经历,希望这篇文章可以帮助和我一样的萌新少走一些弯路,以及为后面参加比赛同学做一个参考。同时再次感谢飞桨和宇树的帮助和疑难解答。

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐