当前位置: 首页 > news >正文

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系列等;二阶段算法&#xff1a…...

【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 的应用天花板在哪里,经过试探不少人发现&#xff0c…...

【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.使用转化炉原理测量氮氧化物的排气分析仪进行排气污…...

【Java】用记事本实现“HelloWorld”输出

【在进行以下操作前需要下载好JDK并配置好对应的环境变量】 一、在任意文件夹中创建一个新的文本文档文件并写入以下代码 public class Hello{public static void main (String[] args){System.out.print("Hello,World!");} } 二、修改文件名称及文件类型为 Hello.j…...

我希望早点知道的关于成长的建议

人上了年纪,往往在诸如更加闭塞,更加固执这些缺点之外,再多出来一个缺点:那就是动不动就爱给别人建议。我当然也未能免俗。有时候会听到同样悲观且固执的过来人告诉我,这些建议说了和没说效果都一样,人们在…...

【哈希表】使用方法总结

1. uthash简介开源的第三方头文件,这只是一个头文件:uthash.h。uthash还包括三个额外的头文件,主要提供链表,动态数组和字符串。utlist.h为C结构提供了链接列表宏。utarray.h使用宏实现动态数组。utstring.h实现基本的动态字符串。…...

【笑小枫-面试篇】Java基础面试题整理,努力做全网最全

写在前面 或许你只是想白嫖内容,或许你也会忽略这段文字,但我还是想弱弱的说 题目整理耗费了大量精力,希望可以给博主点赞收藏,谢谢大家啦 我呢,笑小枫,一个努力的普通人,也希望可以花1秒钟记住…...

亚马逊短期疲软,但长期前景乐观

来源:猛兽财经 作者:猛兽财经 由于投资者对亚马逊(AMZN)前景的担忧,导致该公司的股价在过去一年中下跌了39%。然而猛兽财经认为亚马逊近期面临的不利因素只是暂时的,该公司还是有充分的条件可以在医疗保健和物流领域获得重大增长机…...

webgis高德地图

webgis高德地图 首先准备工作,注册一个高德地图账号,然后在创建一个新应用生一个key跟appId 高德开放平台 接着创建一个html页面 高德配置手册 <style>* {margin: 0;padding: 0;}#...

django项目实战十(django+bootstrap实现增删改查)进阶数据统计

目录 一、echarts 1、下载 2、配置 二、实现统计分析页面--架构和柱图 1、url 2、chart.py 3、chart_list.html 4、修改url 5、新增chart_bar方法 6、修改chart_list.html 四、饼图 1、url 2、视图chart.py新增 3、修改chart_list.html 五、折线图 1、url 2、char…...

【布隆过滤器(Bloom Filter)基本概念与原理、Bloom Filter优点与缺点、以及应用场景】

布隆过滤器&#xff08;Bloom Filter&#xff09;基本概念与原理、Bloom Filter优点与缺点、以及应用场景 Bloom Filter 基本概念 布隆过滤器是1970年由一个叫布隆的小伙子提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在…...

unity的Rendertexture上面显示粒子特效最便捷的解决方案

一、为什么不显示 1.为什么粒子特效也不显示? 不显示是正常的,因为当前为背景的点设置为A为0时已经被剔除,当前位置粒子特效的颜色也会被剔除。 因为clip发生在融合blend之前,blend发生在所有颜色输出之后的帧缓存。 2.为什么NGUI的Unlit/Premultiplied Colored的shade…...

Docker 查询、停止、删除和重启容器

docker 列出所有容器IDdocker ps -aq[rootlocalhost conf]# docker ps -aq f81aa5f48427 06a66409d7ce 1c3d38b948ba 62233dfad35b 4b0032878886 0f6f368c4c1d 7d98a59a8012 1906ba6bfbe1 [rootlocalhost conf]#docker 查看所有运行容器docker ps -a[rootlocalhost conf]# dock…...