AI算法创新赛-人车目标检测竞赛总结04

news2025/7/19 15:48:57

队伍: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推理,可能可以获得更快的速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/368886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宝塔搭建实战php悟空CRM前后端分离源码-后端server篇(一)

大家好啊,我是测评君,欢迎来到web测评。 有个朋友发消息跟我说,能不能让我录制一期一套开源的悟空CRM系统,然后网上搜了下,搭建起来测试后,感觉还不错,是一套前后端分离的CRM系统,前…

Java浅析电信数据采集

技术:Java等摘要:电信运营系统中,电信计费系统是主要的支撑系统,占有重要地位。对于电信计费系统是电信运营商的核心竞争力之一这一观点愈来愈被业界认同。电信计费系统中的数据蕴含着企业经营态势、客户群分布特征及消费习惯、各…

什么是隔离式数字输入?

隔离式数字输入与数字隔离器虽然它们听起来很相似,但隔离式数字输入和数字隔离器之间实际上存在一些值得注意的差异。看完这篇文章,希望大家能轻松分辨出两种隔离功能的区别。 内部结构 数字隔离器具有提供电流隔离数字信号路径的基本(或经…

网易的“草长莺飞二月天”:增长稳健,加码研发,逐浪AI

2月23日,网易发布了2022年第四季度财报。 这是网易与暴雪分道扬镳后的首份财报,加上近期AIGC热度扩散至游戏、教育等各个领域,网易第四季度业绩及其对于GPT等热门技术的探索受到市场关注。 根据财报,第四季度,网易营…

从单管单色到单管RGB,这项MicroLED工艺不可忽视

微显示技术商Porotech,在CES 2023期间展示了最新的MicroLED显示模组。近期,AR/VR光学领域的知名博主Karl Guttag深度分析了该公司的微显示技术,并指出Porotech带来了他见过最有趣的MicroLED技术。Guttag表示:Porotech是本届CES上给…

Airbyte的同步复制模式

ELT 哲学的核心原则,即数据在提取和加载阶段移动时应保持不变,以便始终可以在目标中访问原始数据。由于目标中存在数据的未修改版本,因此将来可以重新转换该版本,而无需从源系统重新同步数据。 基于此哲学,我们看看Air…

已经准备上千道软件测试面试题了,建议大家收藏!!!还有视频详解!

2023华为软件测试笔试面试真题,抓紧收藏不然就看不到了_测试小鬼的博客-CSDN博客_华为软件测试工程师面试题1、对计算机软件和硬件资源进行管理和控制的软件是(D)A.文件管理程序B.输入输出管理程序C.命令出来程序D.操作系统2、在没有需求文档…

C++类和对象:类的定义、类对象的存储、this指针

目录 一. 对于面向过程和面向对象的认识 二. 类 2.1 struct关键字定义类 2.1.1 C语言中的struct关键字 2.1.2 C中的struct关键字 2.2 class关键字 2.1 使用class关键字定义类 三. 类的访问限定及封装 3.1 类的访问权限及访问限定符 3.1.1 访问权限 3.1.2 访问限定…

3款百里挑一的国产软件,逆天好用,装了就舍不得卸载

推荐3款让你偷懒,让你上头的提效电脑软件,个个功能强大,让你远离加班! 很多几个小时才能做好的事情,用上它们,只需要5分钟就行!! 1、JNPF快速开发平台 JNPF 是一款精巧耐用的软件…

Linux 练习一(思维导图 + 练习过程)

文章目录一、Linux 用户管理及文件操作第一段练习记录:主要对用户进行删除添加设置密码等操作第二段练习记录:主要包括权限设置和查找命令第三段练习记录:关于文件的命令练习第四段练习记录:查找命令及查看内存命令的使用二、Linu…

Linux c:使用二级指针传参,交换两个字符串的函数测试

代码&#xff1a; #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <string.h> int swap1(char **p1, char **p2) { char * temp NULL; temp *p1; *p1 *p2; *p2…

C语言和C++的区别和联系,大多数人都说错了

前言 C语言和C到底是什么关系&#xff1f; 首先C和C语言本来就是两种不同的编程语言&#xff0c;但C确实是对C语言的扩充和延伸&#xff0c;并且对C语言提供后向兼容的能力。对于有些人说的C完全就包含了C语言的说法也并没有错。 C一开始被本贾尼斯特劳斯特卢普&#xff08;Bj…

【JDK8新特性之Stream流-Stream流常用的API以及案例实操】

JDK8新特性之Stream流&#xff0c;不知道你在投递简历的时候有没有看到JD(工作岗位要求去描述)上写到熟悉JDK中Stream流的相关使用。如果没有的话&#xff0c;接下来就和我一起学习一下吧 1.原始集合处理数据的弊端->Stream流优势之处&#xff0c;案例演示 自定义一个集合&…

通过操作Cortex-A7核,串口输入相应的命令,控制LED灯进行工作增加编程要求

2.编程要求&#xff1a; 1&#xff09;结构体封装 typedef struct{ char* cmd_arr; //命令行字符串 gpio_t* gpiox;//GPIO组号 unsigned int pin; //引脚编号 status_t status; //LED灯状态 void(*gpio_write_pin)(gpio_t* gpiox,unsigned int pin,status_t status); }cmd_t; 2…

【GlobalMapper精品教程】054:标签(标注)功能案例详解

同ArcGIS标注一样,globalmapper提供了动态标注的功能,称为标签,本文详解标签的使用方法。 文章目录 一、标签配置二、创建标签图层三、标签图层选项1. 标签字段2. 标签样式3. 标签格式4. 标签语言5. 标签优先级一、标签配置 在配置页面的【矢量显示】→标签选项卡下,有标签…

《高性能MySQL》读书笔记(上)

目录 MySQL的架构 MySQL中的锁 MySQL中的事务 事务特性 隔离级别 事务日志 多版本并发控制MVCC 影响MySQL性能的物理因素 InnoDB缓冲池 MySQL常用的数据类型以及优化 字符串类型 日期和时间类型 数据标识符 MySQL的架构 默认情况下&#xff0c;每个客户端连接都…

Java高级编程之Lambda表达式

Lambda表达式 1&#xff0c;语法 利用Lambda 可以更简洁的实现匿名内部类与函数声明与调用&#xff1b;另外&#xff0c;基于Lambda 提供stream 流式处理极大简化对集合的操作 public static void main(String[] args) {//1.标准Lambda使用方式,其中MathOperation为定义的一个…

React 跨域的配置

1、为什么会出现跨域&#xff1f; 浏览器遵循同源政策&#xff08;同源策略三要素&#xff1a;协议相同、域名相同、端口相同&#xff09; 2、配置跨域代理 使用中间件 http-proxy-middleware&#xff08;安装依赖&#xff09; npm install http-proxy-middleware 创建setupP…

为什么需要这个岗位,软件测试是干什么

目录 一、软件测试概念 二、软件测试目的 三、软件测试基本原则 四、软件测试主要工作内容 五、软件测试方法 六、测试工程师的职责 七、为什么要软件测试这个岗位 一、软件测试概念 软件测试&#xff1a;为了发现软件错误和缺陷&#xff08;统称bug&#xff09;而执行…

网络协议(八):传输层-TCP(三次握手、四次挥手原理)

网络协议系列文章 网络协议(一)&#xff1a;基本概念、计算机之间的连接方式 网络协议(二)&#xff1a;MAC地址、IP地址、子网掩码、子网和超网 网络协议(三)&#xff1a;路由器原理及数据包传输过程 网络协议(四)&#xff1a;网络分类、ISP、上网方式、公网私网、NAT 网络…