AI算法创新赛-人车目标检测竞赛总结04
队伍:AI000038
小组成员:杨志强,林松
1. 算法介绍
1.1 相关工作
当前流行的目标检测算法主要分为三种,一阶段算法:SSD,FCOS,Scaled,YOLO系列等;二阶段算法:Faster-RCNN,Mask R-CNN,Cascade R-CNN等;Transformer系列算法:DETR,Deformable-DETR,DINO,Swin Transformer等等。其中优秀的算法性能都比较相近,Transformer系列的算法在渐渐崛起的时候已经超越了传统的卷积神经网络,代价是需要更好的预训练和更大的模型和更长训练推理时间,二阶段的算法精度也相对较高,但是最近一阶段的算法,尤其是YOLO系列,有很多优秀的工作也在COCO上达到了很强的性能,比如2022年提出的YOLOv7,YOLOv6,RTMDet,DAMO-YOLO等以及2023年提出的YOLOv8算法。YOLO系列一直是实时目标检测的代名词,他们在保持精度的同时可以达到一个很快的速度,基于决赛的分数评判标准,我们选择了性能和泛化性都相对较好的YOLOv5算法作为我们的baseline算法展开我们的后续研究。
1.2 初步思路
我们参考了TPH-YOLOv5的思想,他们的算法在VisDrone Challenge 2021竞赛中获奖,数据集为针对无人机捕获场景,包含很多尺度变化大的物体和小物体,最简单的结论是适当提高训练的图像分辨率可以达到很好的性能提升。我们观察了人车目标检测数据集,发现小目标确实很多,所以一开始基于速度性能综合考虑,我们初步选择了YOLOv5M-P6模型,并使用1280尺寸训练和推理。同时预想到了以下两点:第一,1280训练推理无疑会带来更大的推理延时,可能造成不利影响,后续可以考虑减少尺度,使用960训练和推理。第二,优先使用coco预训练模型可以显著提升性能,但是如果对模型进行改进,就无法完整加载预训练权重,导致性能损失。我们决定对模型做出改进后使用额外的人车数据集进行预训练,然后使用比赛数据集迁移学习。
1.3 初步算法实验过程
Fig.1. 不同基线模型的性能延时比较
如图一所示,我们针对初步思路进行了实验,以便于重新确认baseline模型,发现了训练尺度和模型大小对MAP和延时的关系。
第一步使用YOLOv5M-P6,1280训练和推理,我们得到了最高的80%MAP,但是延时达到了236ms,导致最终成绩只有156.4。
第二步,为了提高推理速度我们试图将传统YOLOv5中的Silu激活函数替换为Relu激活函数,发现MAP掉了2个点,但是速度提升了20%多,最终成绩反而更高。
第三步,我们尝试了使用参数量和GFLOPs更小的YOLOv5s-P6模型进行实验,还是采用1280的训练推理尺度,MAP只掉了2个点,但是延时继续提高了20%左右,达到了更高的成绩。
第四步,我们采用960训练和推理尺度,MAP只下降1个点,速度缩减到了80ms。
最终我们采用了YOLOv5s模型,960训练推理,并将所有激活函数替换为Relu,达到了最高成绩。通过初步的实验,我们得到了以下结论:
综合考虑性能和速度,小模型相比大模型,精度略有下降,但是速度提升很多,最终的分数可能更高,使用小模型是更优选择。
最终成绩的计算公式为score=mAP*100+(1000-i_time)*0.1,实验中大模型和小模型MAP仅相差2个点,性能带来的score差距为2,但是延时相差了100ms,延时带来的score差距为10,所以得出结论:提升速度带来的收益在一定程度上大于MAP提升的收益。
使用960训练推理为同时提升性能和速度的折衷方案。
使用 relu激活函数替换silu激活函数可以加快部署的推理速度。
1.4 算法改进
DAMO-YOLO是2022年阿里达摩院提出的YOLO系列的算法改进工作,其中比较有意思的一点就是他们针对于YOLO的neck改进的RepGFPN。最初的想法是GFPN,作者认为GFPN有效的主要原因之一是因为它可以充分交换高级语义信息和低级空间信息。在GFPN中,多尺度特征在前一层和当前层的层次特征中都被融合。更重要的是,log2(n)跳过层连接提供了更有效的信息传输,可以扩展到更深层次的网络。他们发现在现代yolo系列模型上用GFPN直接替换原先的Neck结构后,可以获得了更高的精度。问题在于基于GFPN的模型的延迟远远高于基于改进的panet的模型,所以精度的提升或许有些得不偿失。然后提出一种新颖的高效—RepGFPN来满足实时目标检测的设计。
如图二所示,RepGFPN允许检测网络在网络早期阶段就以相同优先级处理高层语义信息和低层空间信息,使其在检测任务上更加有效。其中Fusion融合模块的输入通常是两到三个语义信息,融合模块参考了经典的CSP思想,YOLOv6中的RepCov重参数化卷积思想以及YOLOv7中ELAN特征聚合网络的思想,它由两个1x1卷积和N个RepConv和普通3x3卷积组成。达到了比传统YOLO中的PANnet更优秀的性能。
Fig.2. DAMO-YOLO结构图
Fig.3. DAMO-YOLO融合模块的消融实验
我们在比赛中对RepGFPN做出了改进,首先我们发现代码中的RepGFPN结构与论文中的图片有所出入,论文中有6个融合模块,但是代码中只有5个。询问作者后得知,因为右下角的模块只有一个输入,所以是否用融合模块差距不大,所以他们去除了这个模块,直接将上层的信息做输出。为了改善这一问题,如图4所示,我们扩展了RepGFPN 模块,并增加了两个额外连接。经在coco数据集实验,该操作可以有效提升0.8MAP。同时考虑到RepConv重参数化不利于部署,可能对延时产生不利影响,我们去掉了结构中的RepConv,替换为普通的3X3卷积,最终组成GFPN+结构加入到yolov5s中。最终的算法结构图如图5所示。
Fig.4. 改进的GFPN+结构
Fig.5. YOLOv5s_GFPN+模型结构图
1.5 预训练问题
我们替换了YOLOv5s的neck结构,因此只有主干部分可以加载coco的预训练权重。为了解决这个问题,我们找到了额外数据集BDD100k,由加州大学伯克利分校AI实验室(BAIR)公开,包含十个类别。
Fig.6. BDD100k类别
为了和比赛数据集对应,我们先将数据集标注进行转化,将吧bdd100k中的bus,truck,car类别合并为car类别,将person和rider合为person类别,将bike,motor合为bike类别。在使用额外数据集的时候我们观察到了一个问题,比赛数据集的标注和bdd100k存在出入,如图7所示。比赛数据集,一个骑车的人由三个框组成,包含一个bike框,一个person框,整体为一个bike框,bdd100k中一个骑车的人由两个框组成,包含一个bike框,一个person框,我们尝试自己融合标签,使用了人和自行车的最大外接矩形合成一个大的框来解决,最终由于时间关系,重叠问题,数据集比例不均衡。融合算法还有问题没有采用,所以我们只采用bdd100k进行预训练,没有直接加入训练集中一起训练。
Fig.7. 左图为比赛数据集标注,右图为bdd100k标注
1.6 最终策略
我们选择模型为YOLOv5s_GFPN+_relu激活函数,训练推理尺寸为960。第一阶段:先使用4669张bdd100k转化图像进行训练,593张作为验证集,使用仅加载主干网络的coco预训练权重,训练50轮。第二阶段:使用2592张比赛数据集训练,293张作为验证集使用bdd100k的预训练权重,训练100轮,用最终的best权重作为最终的推理权重。最终模型的参数量,GFLOPs,MAP,Latency,score如下图所示。
Fig.8. 最终模型的详细信息
2. 模型移植问题
2.1 PyTorch 1.13 转换的 TorchScript 无法通过编译
如下图所示,报错提示输出Tuple问题,经过修改源码中模型 Detect 层输出后仍然无效。解决方案:降级 PyTorch 版本到 1.8.1 后导出 TorchScript 正常。
Fig.9. PyTorch 1.13 转换的 TorchScript 无法通过编译
2.2 使用torch.utils.mobile_optimizer.optimize_for_mobile API 优化的 TorchScript 模型无法通过编译
如下图所示,依据报错提示无法定位异常位置,无法解决问题。
Fig.10. 使用 `torch.utils.mobile_optimizer.optimize_for_mobile` API 优化的 TorchScript 模型无法通过编译
2.3 使PNNX重新编译优化 TorchScript 然后再导出优化后的 TorchScript
再次转换时报错 torch.permute 接口不存在,是由于 PyTorch 1.8.1 没有这个接口,修改下图部分代码可以解决。
Fig.11. 使用 `PNNX` 重新编译优化 TorchScript 然后再导出优化后的 TorchScript
3. 模型部署阶段的优化策略
1. 将后处理从模型移除,单独实现后处理代码。
·后处理时提前通过置信度筛选候选框,然后再对候选框解码,避免多余的计算。
·实现了较简单的类间 NMS,通过类别将不同类框隔离到不同空间然后进行整体运算。
·应用了 OpenCV 最新的 API cv2.dnn.NMSBoxesBatched 加速类间 NMS 计算。
·使用 PyBind11 调用 C++ 进行后处理计算 (加速效果不理想)。
·尝试将 letterbox 预处理的缩放和填充的还原操作固定在模型最后,减少 CPU 后处理运算。
2. 前处理融合到模型中。
·尝试将 Resize 算子集成到模型中,由于数据类型限制,实验没有完成。
·将 Normalize 集成到模型中,通过 除法(÷255) 和乘法(÷255)分别实现和测试,影响速度较小。
·将通道转换集成到模型中,BGR->RGB 通过 Gather 算子实现重排通道。
·通过修改第一层卷积的权重实现 Normalize 和 通道转换,会影响 INT8 量化精度。
·尝试使用 BMCV 实现前处理的 Resize 和 Padding,测试环境运行失败。
3. 模型部分算子调整。
4. 自定义模块中 Conv + BN 没有完全融合,在 PyTorch 层面单独融合这些层,然后导出。
5. 后处理中的 Sigmoid 算子考虑还原到模型中运算,CPU 版本的 Sigmoid 耗时比较大。
6. 尝试将 NMS 算子注册到 ONNX 然后转换 bmodel,犹豫时间原因仅做了 ONNX 转换。
7. 使用 bmnetp 转换模型,ufw.cali.cali_model 量化模型。
8. bmnetp 转换模型时 --dyn=False 关闭动态性状优化,--opt=2 开启最高优化等级。
9. ufw.cali.cali_model 调整前处理中 scales 和 bgr2rgb,这部分已经集成到模型。
10. 模型推理预热,防止模型前几次推理速度较慢,避免模型激活值内存开辟等模型运行开销。在正式推理前,提前推理10次随机噪声,让模型推理速度稳定。
4. 总结
经过本次的竞赛,我们在算法中找到了兼顾性能和速度的优化技巧,比如使用960尺度进行训练和推理,使用relu激活函数加快部署的推理速度,去除RepConv重参数化卷积方便量化,小模型综合成绩更优,最终成功在YOLOv5中融入RepGFPN的思想,在提升精度的同时没有产生很大的延时。在算能的TPU平台完成部署和量化,也熟悉了SDK端口的使用,取得了很大进步,还发现很多优化速度的trick,自我也得到了很大的提升。
我们同样存在不足之处:比如没有完美优化bdd100k数据集,否则可以直接加入训练集中一起训练。因为时间原因,没有对新模型进行深入的优化和实验,MAP还有很大的提升空间。我们还在YOLOv6上进行实验,发现收敛速度很快且验证集精度很高,但是在实际测试集上效果一般。在部署的时候我们也尝试了int8量化,多次提交结果之后,发现精度损失比较严重,速度提升在10%左右,基于score的权衡我们还是采用了fp32的推理结果。第二点是我们在TPU推理的时候采用了batch1推理,如果采用大batch推理,可能可以获得更快的速度。
相关文章:

AI算法创新赛-人车目标检测竞赛总结04
队伍:AI000038 小组成员:杨志强,林松 1. 算法介绍 1.1 相关工作 当前流行的目标检测算法主要分为三种,一阶段算法:SSD,FCOS,Scaled,YOLO系列等;二阶段算法:…...

【C语言进阶】动态内存管理详解与常见动态内存错误以及柔性数组使用与介绍
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:C语言进阶 🎯长路漫漫浩浩,万事皆有期待 文章目录1.动态内存1.1 概述…...

【C++】string的模拟实现
文章目录1. string的模拟实现1.构造函数使用new开辟空间优化成全缺省的构造函数2. C_str3. operator[]4.拷贝构造浅拷贝深拷贝5. 赋值三种情况6. 迭代器7.比较(ASCII值)大小8. reserve(扩容)9. push_back(尾插字符)10. append(尾插字符串)11. (字符/字符串)12. insert在pos位置…...

前端借助Canvas实现压缩base64图片两种方法
一、具体代码 1、利用canvas压缩图片方法一 // 第一种压缩图片方法(图片base64,图片类型,压缩比例,回调函数)// 图片类型是指 image/png、image/jpeg、image/webp(仅Chrome支持)// 该方法对以上三种图片类型都适用 压缩结果的图片base64与原类型相同// …...

用ChatGPT生成Excel公式,太方便了
ChatGPT 自去年 11 月 30 日 OpenAI 重磅推出以来,这款 AI 聊天机器人迅速成为 AI 界的「当红炸子鸡」。一经发布,不少网友更是痴迷到通宵熬夜和它对话聊天,就为了探究 ChatGPT 的应用天花板在哪里,经过试探不少人发现,…...

【Kubernetes 企业项目实战】09、Rancher 2.6 管理 k8s-v1.23 及以上版本高可用集群
目录 一、Rancher 介绍 1.1Rancher简介 1.2 Rancher 和 k8s 的区别 1.3 Rancher 企业使用案例 二、安装 Rancher 2.1 初始化环境 2.2 安装 Rancher 2.3 登录 Rancher 平台 三、通过 Rancher 管理已存在的 k8s 集群 3.1 配置 rancher 3.2 导入 k8s 四、通过 Ranc…...

在Excel中按条件筛选数据并存入新的表
案例 老板想要看去年每月领料数量大于1000的数据。手动筛选并复制粘贴出来,需要重复操作12次,实在太麻烦了,还是让Python来做吧。磨刀不误砍柴工,先整理一下思路: 1读取原表,将数量大于1000的数据所对应的行整行提取(如同在excel表中按数字筛选大于1000的) 2将提取的数…...
【面试题】MySQL索引相关知识点
1.什么是索引 索引是存储引擎快速查找记录的一种数据结构,就类似书的目录,通过目录可以快速的查找到想要查找的内容 2.索引的特点 特点:索引是基于数据引擎的,不同的数据引擎实现索引的方式不一定相同 好处:通过索引…...

MySQL索引类型及原理?一文读懂
一、什么是MySQL索引? MySQL索引是一种数据结构,用于提高数据库查询的性能。它类似于一本书的目录,通过在表中存储指向数据行的引用,使得查询数据的速度更快。 在MySQL中,索引通常是在表上定义的,它们可以…...

【C语言】字符分类函数+内存函数
目录 1.字符函数 1.1字符分类函数 1.2.字符转换函数 //统一字符串中的大小写 2.内存处理函数 2.1内存拷贝函数memcpy //模拟实现memcpy 2.2内存移动函数memmove //模拟实现memmove 2.3内存比较函数memcmp 2.4内存设置函数memset 1.字符函数 1.1字符分类函数 头文…...

高通平台开发系列讲解(SIM卡篇)SIM卡基础概念
文章目录 一、SIM卡基本定义二、卡的类型三、SIM卡的作用三、SIM卡基本硬件结构四、SIM卡的内部物理单元五、卡文件系统沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍SIM的相关组件。 一、SIM卡基本定义 SIM卡是一种智能卡(ICC Card/UICC Card) SIM…...

记录一次ubuntu下配置ssh登录出现的问题
现象描述: 1. 配置完服务器端公钥和本地的私钥之后,ssh登录始终会让输入密码,用ssh -vvv rootip 查看发现发送密钥之后就没反应了。 本机debug info: debug1: Trying private key: C:\Users\wangc/.ssh/id_xxxx (私钥文件) debug3…...

深度剖析数据在内存中的存储(下)(适合初学者)
上篇讲解了整形在内存中的存储方式,这篇文章就来继续讲解浮点数在内存中的存储方式。 上篇地址: (5条消息) 深度剖析数据在内存中的存储(上)_陈大大陈的博客-CSDN博客 目录: 3.浮点型在内存中的存储 3.1.浮点数的…...

智慧物联网系统源码:一个用于数据的收集、处理、可视化、设备管理、设备预警、报警的平台
项目简介: 一个用于数据的收集、处理、可视化、设备管理、设备预警、报警的平台,通过平台将所有设备连接起来,为上层应用提供设备的管理、数据收集、远程控制等核心物联网功能。 支持支持远程对设备进行实时监控、故障排查、远程控制&#…...

2023年,拥有软考证书在这些地区可以领取福利补贴
众所周知,软考的含金量很高,比如可以入户、领取技能补贴、抵扣个税、以考代评、招投标加分,入专家库… 今天小编给大家收集了拥有软考证书可以领取软考福利的地区,希望对大家有所帮助! 【深圳】 入户 ①核准类入户:…...
使用Unity在材质球上实现绘画:详细解释每一行Shader代码!
在Unity中实现在材质球上绘画可以使用下面这个步骤:创建一个基础的材质球:在Unity的项目面板中创建一个新材质球,然后将其分配给您要绘画的对象。创建一个Shader:为了实现在材质球上绘画,您需要使用一种特殊的Shader。…...
Tesseract 4.0训练字库并且识别训练后的图片
各个工具下载链接在文章底部! 重要!!自己先创建一个空文件夹(名字随意),用来保存训练后的模型 ,还需要在里面创建一个 名称为tessdata 的文件夹 ,必须叫这个名 可以先使用下载后的进行测试训练(只需要把ja…...

ChatGPT热潮背后,金融行业大模型应用路在何方?——金融行业大模型应用探索
ChatGPT近两个月以来不断引爆热点,对人工智能应用发展的热潮前所未有地高涨,ChatGPT所代表的大模型在语义理解、多轮交互、内容生成中所展现的突出能力令人惊喜。而人工智能技术在金融行业的落地应用仍然面临挑战,虽然已经让大量宝贵的人力从…...
【怎么预防sql注入,以及还有预防其他的什么网络攻击】
SQL注入是一种常见的Web攻击,通过在Web应用程序中注入恶意SQL语句来获取或修改数据库中的数据。为了防止SQL注入,开发者可以采取以下措施: 1、使用参数化查询(Prepared Statement)或存储过程(Stored Proce…...
2023年全国最新机动车签字授权人精选真题及答案4
百分百题库提供机动车签字授权人考试试题、机动车签字授权人考试预测题、机动车签字授权人考试真题、机动车签字授权人证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 11.使用转化炉原理测量氮氧化物的排气分析仪进行排气污…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...