★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>

一、赛题简介:赋予机器狗感知能力

2023年“中国软件杯”大学生软件设计大赛飞桨小汪赛道的主题是“电力巡检智能软硬件系统开发”。参赛选手需要让飞桨小汪学会感知复杂环境,为智能电力工作提供实时智能分析与决策支持。

参赛选手需要基于给定数据集设计,利用百度飞桨PaddlePaddle深度学习平台及宇树四足机器狗平台,在现有模型的基础上设计环境感知算法,打造面向复杂环境的智能电力巡检机器狗。

二、数据集简介:飞桨小汪的知识源泉

该数据集有两个部分,分别用于目标检测任务和语义分割任务:

└── robot_dog_dataset # 数据集根目录├── detection # 用于目标检测任务的数据集│   ├── annotations # 标签│   └── images # 图像└── segmentation # 用于语义分割任务的数据集├── annotations # 标签└── images # 图像
# 在使用前,请先解压数据集
!unzip /home/aistudio/data/data199384/robot_dog_dataset.zip -d /home/aistudio/data/

1.检测数据集

用于目标检测任务的数据放在robot_dog_dataset/detection文件夹下。该数据集采用COCO格式给出标注信息,即将所有训练图像的标注都存放到一个json文件中,数据以字典嵌套的形式存放。

关于目标检测数据集的介绍以及相关处理方法,可参考:【目标检测】从数据的角度深入解析比赛数据集的处理方法

检测数据集涉及3个场景,分别是“火灾检测”、“工业仪表检测”和“安全帽检测”,共7114张图像。这些图像按8:2的比例划分为训练集、验证集,即训练集中有5691张图像,验证集中有1423张图像。图像示例如下:

2.分割数据集

用于语义分割任务的数据放在robot_dog_dataset/segmentation文件夹下,其大致结构如下:

└── segmentation # 分割数据根目录├── annotations # 存放标签文件 .png├── images # 存放图片 .jpg├── labels.txt # 存放具体类别名称├── test.txt # 不需要使用,空文件├── train.txt # 训练集└── val.txt # 验证集

通常分割任务的标注图片是单通道的灰度图,显示是全黑效果,无法直接观察标注是否正确。因此,我们可以在原来的灰度标注图中注入调色板,就可以得到伪彩色的标注图。

import numpy as np
import cv2
import matplotlib.pyplot as plt# 配置数据集根目录
root = "/home/aistudio/data/data199384/robot_dog_dataset/segmentation/"
train_file = open("{}train.txt".format(root), 'r')# 取训练集中第一张图像
paths = train_file.readline().split(" ")
image_path = root + paths[0]
gt_path = root + paths[1].strip('\n')# 可视化图像、标签
image, label = cv2.imread(image_path), cv2.imread(gt_path)
image, label = cv2.cvtColor(image, cv2.COLOR_BGR2RGB), cv2.cvtColor(label, cv2.COLOR_BGR2GRAY)plt.subplot(1,2,1),
plt.title('Train Image')
plt.imshow(image)
plt.axis('off')plt.subplot(1,2,2),
plt.title('Label')
plt.imshow(label)
plt.axis('off')plt.show()

分割数据集只涉及1个场景,即“工业仪表检测”,共414张图像。这些图像按9:1的比例划分为训练集、验证集,即训练集中有374张图像,验证集中有40张图像。

三、参考思路:飞桨开发套件助力机器狗环境感知

在比赛任务中,“火灾检测”和“安全帽检测”是纯目标检测任务,“工业仪表检测”既有目标检测任务,又有语义分割任务。因此,在提交测评系统时,可以先进行检测任务,如果检测出的类别是“工业仪表”,那么再送入语义分割模型得到最终结果;如果检测结果是“火灾”、“安全帽”,那么就不需要送入语义分割模型,从而提高效率。

1.检测任务

下面,我们将基于检测数据集训练一个目标检测模型。

环境安装:PaddleDetection

PaddleDetection是一个基于PaddlePaddle的目标检测端到端开发套件,在提供丰富的模型组件和测试基准的同时,注重端到端的产业落地应用,通过打造产业级特色模型|工具、建设产业应用范例等手段,帮助开发者实现数据准备、模型选型、模型训练、模型部署的全流程打通,快速进行落地应用。

# 克隆PaddleDetection仓库
# 如果已经克隆,则不需要重复运行,可把第3行直接注释,从第6行开始运行
# !git clone https://gitee.com/PaddlePaddle/PaddleDetection.git# 更新pip版本
!pip install --upgrade pip# 安装其他依赖
%cd PaddleDetection
!pip install -r requirements.txt --user# 编译安装paddledet
!python setup.py install
%cd ~

配置数据集

PaddleDetection/configs/datasets文件夹下,新建一个配置文件dog_detection.yml

配置超参数

在本教程中,使用的是PP-YOLOE模型,那么可以在PaddleDetection/configs/ppyoloe文件夹下找到README_cn.md,里面会有详细的说明。

模型 Epoch GPU个数 每GPU图片个数 骨干网络 输入尺寸 Box APval
0.5:0.95
Box APtest
0.5:0.95
Params(M) FLOPs(G) V100 FP32(FPS) V100 TensorRT FP16(FPS) 模型下载 配置文件
PP-YOLOE+_s 80 8 8 cspresnet-s 640 43.7 43.9 7.93 17.36 208.3 333.3 model config
PP-YOLOE+_m 80 8 8 cspresnet-m 640 49.8 50.0 23.43 49.91 123.4 208.3 model config
PP-YOLOE+_l 80 8 8 cspresnet-l 640 52.9 53.3 52.20 110.07 78.1 149.2 model config
PP-YOLOE+_x 80 8 8 cspresnet-x 640 54.7 54.9 98.42 206.59 45.0 95.2 model config

使用PP-YOLOE+_l进行训练时,使用的GPU个数为8,每GPU图片个数为8,那么batchsize就是64( 8 x 8 = 64 8x8=64 8x8=64),假设此时的学习率为0.001,而你想用单卡来跑这个模型,此时你的实际batchsize为8( 1 x 8 = 8 1x8=8 1x8=8),为了保持一致,学习率应该除以8,即0.000125( 0.001 / 8 = 0.000125 0.001/8=0.000125 0.001/8=0.000125)。

不同模型的默认配置不一样,具体请查看模型的文档。

模型训练

配置好基本参数以后,就可以用一行代码开启训练。

%cd ~
%cd PaddleDetection
!python tools/train.py -c configs/ppyoloe/ppyoloe_plus_crn_l_80e_coco.yml --eval

训练结束后,其模型会保存在PaddleDetection/output/ppyoloe_plus_crn_l_80e_coco文件夹下。

导出模型

将训练好的模型导出。

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

2.分割任务

下面,我们将基于数据集中的“工业仪表数据集”训练一个语义检测模型。

环境安装:PaddleSeg

PaddleSeg是基于飞桨PaddlePaddle的端到端图像分割套件,内置45+模型算法及140+预训练模型,支持配置化驱动和API调用开发方式,打通数据标注、模型开发、训练、压缩、部署的全流程,提供语义分割、交互式分割、Matting、全景分割四大分割能力,助力算法在医疗、工业、遥感、娱乐等场景落地应用。

# 克隆PaddleSeg仓库
# 如果已经克隆,则不需要重复运行,可把第4行直接注释,从第7行开始运行
%cd ~
# !git clone https://github.com/PaddlePaddle/PaddleSeg# 更新pip版本
!pip install --upgrade pip# 安装其他依赖
%cd PaddleSeg
!pip install -r requirements.txt --user# 编译安装paddleseg
!pip install -v -e .
%cd ~

配置数据集

/home/aistudio/PaddleSeg/configs/_base_文件夹下,新建一个配置文件dog.yml


配置时,可以以`PaddleSeg/configs/_base_/cityscapes.yml`为参考进行配置。### 配置超参数再在这里,我们使用使用PaddleSeg轻量级语义分割模型bisenet模型进行训练。在`PaddleSeg/configs/bisenet`文件夹下新建一个配置文件`new_bisenet_480x480.yml`,并设置数据集路径等参数:![](https://ai-studio-static-online.cdn.bcebos.com/2d5d7952e29a42dcadde83a94c5e078efa980942e2294c2da38e440c1b71bc3d)### 模型训练配置好基本参数以后,就可以开始训练了。```python
%cd ~
%cd PaddleSeg
!python train.py --config configs/bisenet/new_bisenet_480x480.yml \--do_eval \--save_interval 400

训练结束后,其模型会保存在PaddleSeg/output文件夹下。

导出模型

将训练好的模型导出。

%cd ~
%cd PaddleSeg
!python export.py --config configs/bisenet/new_bisenet_480x480.yml \--model_path output/best_model/model.pdparams

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

为了检验飞桨小汪的学习成果,我们在AI Studio上提供了一套测评系统,选手可以将训练好的模型和预测代码打包上传,测评系统会自动算分。

1.格式要求

参赛选手需要提交一个命名为submission.zip的压缩包,并且压缩包内应包含:

| -- model # 存放模型,并且大小不超过400M(检测+分割)
| | -- xxx.pdmodel
| | -- xxx.pdiparams
| | …
| -- env # 存放依赖库,如PaddleDetection、PaddleSeg
| | --
| |…
| -- det_predict.py # 专用于目标检测任务的评估代码
| -- seg_predict.py # 专用于目标检测任务的评估代码
| -- …

注意:model文件夹的名称以及det_predict.py、'seg_predict.py`的文件命名应保持一致

参赛选手在代码提交页面提交压缩包后,测评系统会解压你提交的压缩包,并执行如下命令:

python det_predict.py det_data.txt det_result.json
python seg_predict.py seg_data.txt seg_result.json

其中,det_predict.py用来执行目标检测任务,并将检测结果保存至det_result.json;相应地,seg_predict.py用来执行语义分割任务,并将分割结果保存至seg_result.json。执行完毕后,测评系统会分别计算目标检测任务和语义分割任务的得分,并按 9 : 1 9:1 9:1的比例计算最终得分。

2.评分规则

具体地,模型预测速度在v100显卡需达到20 FPS及以上(预测时间包括前处理和后处理用时),视为有效,在满足速度基础上,按照精度高低进行排名。

对于目标检测任务,我们采用平均F1-score来评估结果,针对每一个类别F1-score 计算公式如下:

Accuracy  = T P + T N T P + T N + F P + F N Precision  = T P T P + F P Recall  = T P T P + F N F1-score  = 2 × Precision  × Recall  Precision  + Recall  \begin{aligned} & \text { Accuracy }=\frac{T P+T N}{T P+T N+F P+F N} \\ & \text { Precision }=\frac{T P}{T P+F P} \\ & \text { Recall }=\frac{T P}{T P+F N} \\ & \text { F1-score }=\frac{2 \times \text { Precision } \times \text { Recall }}{\text { Precision }+ \text { Recall }} \end{aligned} ​ Accuracy =TP+TN+FP+FNTP+TN​ Precision =TP+FPTP​ Recall =TP+FNTP​ F1-score = Precision + Recall 2× Precision × Recall ​​

对于语义分割任务,我们采用平均交并比MIoU来评估结果,记真实值为 i i i,预测为 j j j的像素数量为 p i j p_{ij} pij​,则MIoU的具体计算公式为:

M I o U = 1 K + 1 ∑ i = 0 k p i i ∑ j = 0 k p i j + ∑ j = 0 k p j i − p i i MIoU=\frac{1}{K+1} \sum_{i=0}^k \frac{p_{i i}}{\sum_{j=0}^k p_{i j}+\sum_{j=0}^k p_{j i}-p_{i i}} MIoU=K+11​i=0∑k​∑j=0k​pij​+∑j=0k​pji​−pii​pii​​

最终得分:

S c o r e = ( F1-score  × 0.9 + MIoU-score  × 0.1 ) × 100 Score=(\text { F1-score } \times {0.9} + \text { MIoU-score } \times {0.1}) \times 100 Score=( F1-score ×0.9+ MIoU-score ×0.1)×100

3.整理提交代码

本次线上赛的测评逻辑是分别计算目标检测任务和语义分割任务的得分,并根据测试集的数据量按 9 : 1 9:1 9:1的比例计算最终得分。所以,跟以往的比赛不不同,参赛选手需要在submission.zip中为目标检测任务和语义分割任务分别准备一个执行预测用的predict.py

在本基线系统中,已经整理好了一个submission.zip,该提交代码还有很大的提升空间,仅供各位参赛选手参考。

# 请解压后再测试运行
%cd /home/aistudio/submission
!python det_predict.py det_data.txt det_result.json
!python seg_predict.py seg_data.txt seg_result.json
/home/aistudio/submission
detection cost: 5.238214492797852s
segmentation cost: 0.0018520355224609375s
5s

作者简介

郑博培,百度飞桨开发者技术专家,AI Studio精选项目审稿人,前任百度飞桨北京领航团团长、百度飞桨领航团技术面试官,多次参与各大竞赛基线系统的开发、多次担任课程讲师及助教。

我在AI Studio上获得至尊等级,点亮10个徽章,来互关呀!!!
https://aistudio.baidu.com/aistudio/personalcenter/thirdview/147378

此文章为搬运
原项目链接

【官方】2023年“中国软件杯”大学生软件设计大赛飞桨小汪赛道基线系统相关推荐

  1. 第九届“中国软件杯”大学生软件设计大赛总决赛落幕

    11月3-5日,第九届"中国软件杯"大学生软件设计大赛(以下简称大赛)总决赛在江苏常州圆满举办.经过九年积累,大赛已经吸引包括全部985.211高校在内的千余所院校.数万支团队.二 ...

  2. “中国软件杯”大学生软件设计大赛百度赛项东部赛区正式启动

    当前,生成式AI热潮推动,人工智能正驶入发展快车道,复合型AI人才需求攀升,产教融合持续深化.3月25日,在泉城济南,百度飞桨协同山东大学.济南大学.青岛理工大学,共同举办飞桨院长高峰论坛暨" ...

  3. 润和软件受邀参展第十一届“中国软件杯”大学生软件设计大赛

    "千秋基业,人才为本.强国建设,人才为先"8月16日,由工业和信息化部.教育部和江苏省人民政府共同主办的第十一届"中国软件杯"大学生软件设计大赛(简称" ...

  4. 实力吸引报名! 第八届“中国软件杯”大学生软件设计大赛课工场出题受热捧...

    近日,第八届"中国软件杯"大学生软件设计大赛(简称:大赛) 作品提交阶段结束,共吸引全国大学生(含高职生)提交作品5000余件,彰显了大赛非同寻常的魅力. 值得一提的是,作为本次大 ...

  5. 课工场“中国软件杯”大学生软件设计大赛表彰大会在京成功举办

    8月21日上午,第八届"中国软件杯"大学生软件设计大赛课工场指导老师与课工场代表队表彰大会在北京成功举办.课工场创始人兼总经理肖睿.课工场校企合作总监潘玉贞.课工场航天桥五道口中关 ...

  6. 第十二届“中国软件杯”大学生软件设计大赛线下集训营·武汉站活动圆满结束...

    青春五月,活力四射."中国软件杯"大学生软件设计大赛(简称"大赛")组委会携手中国移动云能力中心走进湖北工业大学开展武汉站线下集训活动. 深入高校 推动校企合作 ...

  7. 第十一届 “中国软件杯”大学生软件设计大赛——基于百度飞桨EasyDL平台的芯片质检系统分区赛

    本赛题由百度飞桨和广州万维视景科技有限公司联合设置,要求选手基于"芯片质量检测"的场景任务,使用 百度飞桨EasyDL平台 完 成数据标注.模型训练.模型部署等工作,并将模型部署到 ...

  8. 首届“中科杯”全国软件设计大赛拉开帷幕

    4月29日,中国科学院软件研究所隆重召开新闻发布会,中国软件行业协会理事长陈冲.中科院软件所副所长黄涛共同宣布了两家单位联合主办的首届"中科杯"全国软件设计大赛正式开赛.此次大赛面 ...

  9. 2020年TI杯大学生电子设计大赛 无线运动传感器节点 作品开源( PCB、设备/服务器工程、文档、测试视频、设计报告)

    2021.5.1更新: 需要焊接晶振,程序默认使用的是外部晶振 2021.4.22更新: 正值毕业设计季,近期有不少毕设题目是本作品的学长学姐私信询问,由于博主备考,无法及时回复. 本作品还有不少待优 ...

最新文章

  1. SpringMVC 表单验证
  2. 分布式session之token解决方案实现
  3. Java的后缀分类_java数据类型扩展及相应的面试题
  4. c#与access建立连接用作登录_组态王与Access数据库的数据交换
  5. 浅谈C/C++中的指针和数组(一)
  6. html分类页面,CSS网页设计 把HTML标记分类
  7. java query object_Object Query Language (OQL) query 基本使用
  8. 献给那些正在“奋起”的90后
  9. EXCEL 自定义格式(一)
  10. 虎牙改名字服务器升级维护中,王一博“虎牙直播”被占id,无奈改了名字,新名字却被吐槽...
  11. oracle10g lsnrctl,Oracle10g 服务丢失处理办法
  12. 软件创新实验室:微信小程序开发——音频录制与播放
  13. postgres 坐标_用postgreSQL做基于地理位置的app(zz)
  14. 【论文阅读】Causality matters in medical imaging
  15. Len和lenB的区别
  16. 2021年度总结:这一年你过的怎么样?
  17. Altium Designer-快速画封装,图解
  18. 事务(Transaction)的简单理解
  19. P2455 [SDOI2006]线性方程组
  20. 美国计算机硕士申请截止,美国大学研究生录取通知时间,美国研究生院录取时间和流程一览!附2021秋季截止日期...

热门文章

  1. MySQL数据库、表常用命令
  2. 你不可不知的《哈利波特》秘密之卑鄙的海尔波
  3. 会员获取积分的方式有哪些?
  4. 浏览器百家争鸣,国产能打的浏览器来了!
  5. python分析出nba球员的位置_【圆老司】用python展示NBA球员出手位置偏好
  6. CeSi 进程集中管理部署
  7. 平安科技移动开发二队技术周报(第十期)
  8. 如何快速的开发一个完整的iOS直播app(美颜篇)
  9. Qt-利用fmod库显示声音波形
  10. 光头探长正在连接服务器,光头探长全关卡攻略汇总 全关卡通关详解