目标检测——PP-PicoDet算法解读

2024-03-20 07:36

本文主要是介绍目标检测——PP-PicoDet算法解读,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PP-YOLO系列,均是基于百度自研PaddlePaddle深度学习框架发布的算法,2020年基于YOLOv3改进发布PP-YOLO,2021年发布PP-YOLOv2和移动端检测算法PP-PicoDet,2022年发布PP-YOLOE和PP-YOLOE-R。由于均是一个系列,所以放一起解读,方便对比前后改进地方。


PP-YOLO系列算法解读:

  • PP-YOLO算法解读
  • PP-YOLOv2算法解读
  • PP-PicoDet算法解读
  • PP-YOLOE算法解读
  • PP-YOLOE-R算法解读

YOLO系列算法解读:

  • YOLOv1通俗易懂版解读
  • SSD算法解读
  • YOLOv2算法解读
  • YOLOv3算法解读
  • YOLOv4算法解读
  • YOLOv5算法解读

文章目录

  • 1、算法概述
  • 2、PP-PicoDet细节
    • 2.1 Better Backbone
    • 2.2 CSPPAN and Detector Head
    • 2.3 Label Assignment Strategy and Loss
    • 2.4 Other Strategies
  • 3、实验
    • 3.1 消融实验
    • 3.2 与其他检测算法对比


PP-PicoDet(2021.11.1)

论文:PP-PicoDet: A Better Real-Time Object Detector on Mobile Devices
作者:Guanghua Yu, Qinyao Chang, Wenyu Lv, Chang Xu, Cheng Cui, Wei Ji, Qingqing Dang, Kaipeng Deng, Guanzhong Wang, Yuning Du, Baohua Lai, Qiwen Liu, Xiaoguang Hu, Dianhai Yu, Yanjun Ma
链接:https://arxiv.org/abs/2111.00902
代码:https://github.com/PaddlePaddle/PaddleDetection


1、算法概述

从论文标题可以看出来,该算法主要是针对移动端设备提出来的,所以该算法特点是模型小推理速度快。本文中,作者致力于研究目标检测的关键优化和神经网络架构选择,以提高准确性和推理速度。作者研究了无锚框策略在轻量级目标检测模型中的适用性,并且增强了主干结构,设计了颈部轻量化结构,提高了网络的特征提取能力。改进了标签分配策略和损失函数,使训练更加稳定和高效。通过这些优化,作者建立了一个新的实时目标检测器系列,名为PP-PicoDet,它在移动设备的目标检测上实现了卓越的性能。与其他流行的模型相比,该模型在准确性和延迟之间实现了更好的权衡。只有0.99M个参数的PicoDet-S实现了30.6%的mAP,与YOLOX-Nano相比,mAP值提高了4.8%,同时将移动CPU推理延迟降低了55%;与NanoDet相比,mAP提高了7.1%。当输入大小为320时,它在移动ARM CPU上达到123 FPS(使用Paddle Lite时为150 FPS)。仅使用330万个参数的PicoDet-L实现了40.9%的mAP, mAP提高了3.7%,比YOLOv5s快44%。在COCO数据集上的表现为:
在这里插入图片描述
PP-PicoDet的贡献如下:

  • 1、neck中改进PAN结构,采用CSP-PAN,用1x1卷积减少参数的情况下提升了特征提取能力,用5x5的深度可分离卷积(depthwise separable convolution)替换了3x3的可分离卷积,提升了感受野的大小。
  • 2、采用SimOTA动态标签分配策略,对部分计算细节进行优化。具体来说,使用了变焦损失(VFL)的加权求和与GIoU loss来计算成本矩阵,在不损害效率的前提下提高了准确性。
  • 3、提出了基于ShuffleNetV2改进的Enhanced ShuffleNet(ESNet),性能比原版ShuffleNetV2好。
  • 4、提出一种改进的单次神经网络检测架构搜索(NAS)流水线,自动查找最优的架构进行目标检测。

2、PP-PicoDet细节

PP-PicoDet网络结构图如下所示:
Backbone:基于shuffleNetV2改进,ESNet,输出C3,C4,C5特征图进入neck;
Neck:CSP-PAN,接受C3,C4,C5输入,输出P3,P4,P5,P6;
在这里插入图片描述

2.1 Better Backbone

手工设计的backbone: 基于之前的经验,作者发现ShuffleNetV2在移动端设备上比其他网络更强大,为了进一步提高ShuffleNetV2的性能,作者遵循了PPLCNet的一些方法优化网络结构,构建新的骨干网络,即Enhanced ShuffleNet(ESNet)。ESNet主要由ES Block组成,其结构如下:
在这里插入图片描述
神经网络结构搜索: 作者首次提出了单次搜索目标探测器的方法。配备了用于分类的高性能主干的对象检测器可能不是最优的,因为分类和检测是两个不同的任务。所以作者不是搜索更好的分类器,而是直接在检测数据集上训练和搜索检测超级网络(the detection supernet),这可以节省大量的计算量并优化检测任务而不是优化分类任务。该框架包括两个步骤:(1)在检测数据集上训练单次超级网络;(2)在训练好的超级网络上使用进化算法(EA)进行架构搜索。为了方便起见,作者在这里简单地使用通道搜索主干网。具体来说,作者提供了灵活的比率选项来选择不同的通道比率。比如:[0.5, 0.675, 0.75, 0.875, 1]。

2.2 CSPPAN and Detector Head

本文使用PAN结构获得多层次特征图,使用CSP结构进行相邻特征图之间的特征拼接和融合。具体的使用用1x1卷积减少参数的情况下提升了特征提取能力,用5x5的深度可分离卷积提升感受野大小。具体参考上图CSP-PAN结构图。
在detector head部分,作者也使用5x5的深度可分离卷积提升感受野大小,不像YOLOX解耦了回归分支和分类分支,PP-PicoDet没有将两者解耦,获得的性能相同。

2.3 Label Assignment Strategy and Loss

作者采用了SimOTA动态分配标签策略(和YOLOX一样),SimOTA首先通过中心先验确定候选区域,然后计算预测框和候选区域中gt框的IoU,最后通过对每个gt框的n个最大IoU求和得到参数k。成本矩阵(The cost matrix)是通过直接计算所有预测框的损失与候选区域内的gt框得到的。原始的SimOTA是CEloss和IoUloss加权求和得到成本矩阵。为了使SimOTA中的代价与目标函数保持一致,作者使用Varifocal损失和GIoU损失的加权和作为成本矩阵。公式为:
在这里插入图片描述
实验中λ设置为6
在检测头中,对于分类任务,作者利用Varifocal损失将分类预测和质量预测结合起来;对于回归任务,作者利用GIoU损失和Distribution Focal Loss,公式如下:
在这里插入图片描述

2.4 Other Strategies

激活函数: 作者将检测算法中的激活函数从ReLU替换为H-Swish,在保持推理时间不变的情况下,性能显著提高。
学习率下降策略: 采用Cosine learning rate decay,余弦学习率平稳下降,在batchsize比较大时,有利于训练过程。
数据增强: 过多的数据增强往往会增加正则化效果,使训练更难以收敛。所以在这项工作中,作者只使用随机翻转、随机裁剪和多尺度调整来进行训练中的数据增强。


3、实验

在COCO-2017 training集上训练,在COCO-2017 test-dev集上评估。

3.1 消融实验

关于改进措施的消融实验,如下表所示:
在这里插入图片描述
Base模型为与NanoDet相似的基础模型,主干采用ShuffleNetV2-1x,颈部采用无卷积的PAN,Loss采用标准GFL损失,标签分配策略采用ATSS。所有激活函数都使用LeakyRelu。得到的mAP(0.5:0.95)为25.3%。可以看到PAN经过改进变成CSP-PAN后,性能提升很大。

3.2 与其他检测算法对比

与其他先进检测算法对比,作者使用NCNN库进行延迟测试,并为PP-PicoDet模型添加了Paddle Lite推理延迟,实验结果如下所示:
在这里插入图片描述

这篇关于目标检测——PP-PicoDet算法解读的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/828731

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

MCU7.keil中build产生的hex文件解读

1.hex文件大致解读 闲来无事,查看了MCU6.用keil新建项目的hex文件 用FlexHex打开 给我的第一印象是:经过软件的解释之后,发现这些数据排列地十分整齐 :02000F0080FE71:03000000020003F8:0C000300787FE4F6D8FD75810702000F3D:00000001FF 把解释后的数据当作十六进制来观察 1.每一行数据

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL