一、本文小结

预选赛阶段,考虑到数据集场景单一,本文就未对网络结构进行改进,更多的是对不同模型特性分析之后比较选出模型的效果,然后利用传统的数据增强,当然,如何使用非极大值抑制,怎么设置阈值,这个确实是整个预选赛最为关键的问题!
其实我们在国赛阶段是仿造宇树提供SDK的高层api来控制GO1运动,这个应该是我们速度较慢的原因之一。
下图展示笔者在预选赛的部分成绩

1.1调参前后得分变化情况

在这里插入图片描述

在这里插入图片描述

二、赛题简介:当机器狗成为导盲犬

根据世界卫生组织报告显示,全球2.85亿的视力残疾(包括盲和低视力)患者,我国视力残障人数居多,一只导盲犬能够给盲人带来许多生活上的便利,但是导盲犬的培训周期长,费用高昂,因此,不是所有盲人能够拥有导盲犬,如果有机器狗代替导盲犬,将极大的造福盲人,此项比赛为智能导盲机器狗比赛,通过比赛来考评智能导盲机器狗的智能感知能力及综合运动性能,要求智能四足仿生机器人沿布置好的城市人行道场景走完全程并完成指定任务。
要想使机器导盲犬顺利地完成导盲任务,它的首要任务就是要感知周围的环境,比如盲道、红绿灯(红灯状态)、红绿灯(绿灯状态)、红绿灯(不亮灯状态)、障碍物。

三、开发环境:PaddleDetection助力机器狗环境感知

3.1.安装PaddleDetection

注意:如果github下载代码较慢,可尝试使用gitee或者代理加速。

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

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

# 编译安装paddledet
!python setup.py install
%cd ~
正克隆到 'PaddleDetection'...
remote: Enumerating objects: 23983, done.[K
remote: Counting objects: 100% (4453/4453), done.[K
remote: Compressing objects: 100% (2058/2058), done.[K
error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received.
fatal: The remote end hung up unexpectedly
fatal: 过早的文件结束符(EOF)
fatal: index-pack failed
[Errno 2] No such file or directory: 'PaddleDetection'
/home/aistudio
[31mERROR: Could not open requirements file: [Errno 2] 没有那个文件或目录: 'requirements.txt'[0m[31m
[0mpython: can't open file 'setup.py': [Errno 2] No such file or directory
/home/aistudio

四、数据准备:飞桨小汪的知识源泉

该数据集已上传至本项目,可以一键解压。

数据集总共分为五类:盲道、红绿灯(红灯状态)、红绿灯(绿灯状态)、红绿灯(不亮灯状态)、障碍物
该数据集已上传至本项目,可以一键解压。

4.1预选赛数据集从左图中采集而来

在这里插入图片描述

# 解压数据集
!gzip -dfq /home/aistudio/data/data137625/WisdomGuide.tar.gz
!tar -xf /home/aistudio/data/data137625/WisdomGuide.tar

4.2配置数据集

我们需要为PaddleDetection配置数据集的路径。

PaddleDetection/configs/datasets/路径下新建一个coco_WisdomGuide.yml文件,并配置数据集格式、类别、加载路径等信息:

metric: COCO
num_classes: 5

TrainDataset:
  !COCODataSet
    image_dir: train
    anno_path: annotations/instance_train.json
    dataset_dir: /home/aistudio/WisdomGuide/
    data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']

EvalDataset:
  !COCODataSet
    image_dir: val
    anno_path: annotations/instance_val.json
    dataset_dir: /home/aistudio/WisdomGuide/

TestDataset:
  !ImageFolder
    ! anno_path: annotations/instance_val.json
    image_dir: val
    dataset_dir: /home/aistudio/WisdomGuide/

五、模型训练

本项目将基于PP-PicoDet算法让飞桨小汪学会识别盲道、红绿灯(红灯状态、绿灯状态、不亮灯状态)和障碍物。最终生成端到端的深度学习模型。
下图为效果图

在这里插入图片描述

5.1.训练配置

在正式开始训练前,我们需要选择配置文件,并修改参数。

我们在PaddleDetection/configs/下找到picodet文件夹(如果需要使用别的算法,则进入到别的文件夹里找相应的配置文件即可,当然,ppvolo-tiny也是一个蛮好的轻量级模型,可以多动动手尝试一些。),这里使用输入尺寸为640x480的PicoDet-L-416:

我们可以直接加载在COCO数据集上预训练的模型参数,然后再在比赛数据集上做微调

PaddleDetection/configs/picodet/picodet_l_416_coco_lcnet.yml里的数据集配置改成我们在配置数据集使用的数据集配置

5.2.模型训练

当一切准备工作都做好以后,我们就可以“教”飞桨小汪学习了!

# 模型训练
%cd ~
%cd PaddleDetection
!python tools/train.py -c configs/picodet/picodet_l_416_coco_lcnet.yml
# 如果你想尝试其他模型,就只需要将这里的picodet/picodet_l_416_coco_lcnet.yml替换为对应config下面的即可

5.3.模型预测

训练好模型以后,我们可以检验一下飞桨小汪的“学习效果”。

%cd ~
%cd PaddleDetection
# 更换"--infer_img"里的图片路径以预测不同的图片
!python tools/infer.py -c configs/picodet/picodet_l_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
/home/aistudio
/home/aistudio/PaddleDetection
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/tensor/creation.py:130: DeprecationWarning: `np.object` is a deprecated alias for the builtin `object`. To silence this warning, use `object` by itself. Doing this will not modify any behavior and is safe. 
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  if data.dtype == np.object:
W0423 06:45:52.678421  1134 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0423 06:45:52.681596  1134 device_context.cc:465] device: 0, cuDNN Version: 7.6.
[04/23 06:45:55] ppdet.utils.checkpoint INFO: Finish loading model weights: /home/aistudio/checkpoint/best_model.pdparams
loading annotations into memory...
Done (t=0.44s)
creating index...
index created!
100%|█████████████████████████████████████████████| 1/1 [00:00<00:00, 13.29it/s]
[04/23 06:45:56] ppdet.engine INFO: Detection bbox results save in infer_output/no_light_629.png

5.4.导出模型

转换并保存静态图模型。因为生成版本时,PaddleDetection文件夹下的文件较多,无法保存,故这里把训练好的模型单独拿出来,放在/home/aistudio/checkpoint/best_model.pdparams

%cd ~
%cd PaddleDetection
# 将"-o weights"里的模型路径换成你自己训好的模型
!python tools/export_model.py -c configs/picodet/picodet_l_416_coco_lcnet.yml \
                    -o weights=/home/aistudio/checkpoint/model_final.pdparams \
                    TestReader.fuse_normalize=true
/home/aistudio
/home/aistudio/PaddleDetection
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/tensor/creation.py:130: DeprecationWarning: `np.object` is a deprecated alias for the builtin `object`. To silence this warning, use `object` by itself. Doing this will not modify any behavior and is safe. 
Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations
  if data.dtype == np.object:
[04/23 06:50:01] ppdet.utils.checkpoint INFO: Finish loading model weights: /home/aistudio/checkpoint/model_final.pdparams
loading annotations into memory...
Done (t=0.05s)
creating index...
index created!
[04/23 06:50:01] ppdet.engine INFO: Export inference config file to output_inference/picodet_m_320_coco_lcnet/infer_cfg.yml
W0423 06:50:05.829931  1565 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0423 06:50:05.829984  1565 device_context.cc:465] device: 0, cuDNN Version: 7.6.
[04/23 06:50:08] ppdet.engine INFO: Export model and saved in output_inference/picodet_m_320_coco_lcnet

六、代码提交:检验飞桨小汪的学习成果

%cd ~
# 在work目录下整理提交代码
# 创建model文件夹(已经创建好的话,就不用再创建了)
!mkdir /home/aistudio/work/model

# 将检测模型拷贝到model文件夹中
!cp -r /home/aistudio/PaddleDetection/output_inference/picodet_m_320_coco_lcnet/ /home/aistudio/work/model/

# 将训练脚本拷贝到work目录下,与model同级
!cp /home/aistudio/PaddleDetection/tools/train.py /home/aistudio/work/

# 将PaddleDetection也复制进来
!cp -r /home/aistudio/PaddleDetection/ /home/aistudio/work/
/home/aistudio
# 删除隐藏文件,使提交压缩包更小
!rm -rf /home/aistudio/work/PaddleDetection/.git/

注意:
在打包前,请将work/PaddleDetection/deploy/python/preprocess.py的第17行改为:

from .keypoint_preprocess import get_affine_transform

否则会出现报错

下面我们测试运行一下能否跑通:

# 测试运行
%cd /home/aistudio/work/
!python predict.py data.txt result.json
/home/aistudio/work
Model Arch: GFL
--transform op: Resize
--transform op: Permute
--transform op: PadStride
total time: 4.611513376235962
# 打包代码,下载submission.zip提交即可
%cd /home/aistudio/work/
!zip -r -q -o submission.zip model/ PaddleDetection/ train.py predict.py
/home/aistudio/work

七、总结与升华

本文分享了笔者在计算机设计大赛中的想过工作,包括预选赛算法流程,以及国赛阶段完成任务的实践效果,当然本作品距离理想效果还有一定的距离,在后续开发中,我将进一步完善本作品,争取尽早落地理想化导盲

7.1智慧导盲实际效果(部分任务效果)

7.2智慧导盲理想效果(实际人行盲道)

然后从aistudio上下载打包好的submission.zip文件,就可以直接到官网提交

此文章为搬运
原项目链接

Logo

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

更多推荐