改进的yolov5目标检测-yolov5替换骨干网络-yolo剪枝(TensorRT及NCNN部署)

YOLOv5改进点

在这里插入图片描述

  • 2022.10.30 复现TPH-YOLOv5

  • 2022.10.31 完成替换backbone为Ghostnet

  • 2022.11.02 完成替换backbone为Shufflenetv2

  • 2022.11.05 完成替换backbone为Mobilenetv3Small
    在这里插入图片描述

  • 2022.11.10 完成EagleEye对YOLOv5系列剪枝支持

  • 2022.11.14 完成MQBench对YOLOv5系列量化支持

  • 2022.11.16 完成替换backbone为EfficientNetLite-0

  • 2022.11.26 完成替换backbone为PP-LCNet-1x

  • 2022.12.12 完成SwinTrans-YOLOv5(C3STR)

  • 2022.12.15 完成Slimming对YOLOv5系列剪枝支持

Requirements

pip install -r requirements.txt

Multi-Backbone Substitution for YOLOs

1、Base Model

Train on Visdrone DataSet (Input size is 608)

No.ModelmAPmAP@50Parameters(M)GFLOPs
1YOLOv5n13.026.201.784.2
2YOLOv5s18.434.007.0515.9
3YOLOv5m21.637.8020.9148.2
4YOLOv5l23.239.7046.19108.1
5YOLOv5x24.340.8086.28204.4

2、高精度模型

A、TPH-YOLOv5 在这里插入图片描述

Train on Visdrone DataSet (6-7 size is 640,8 size is 1536)

No.ModelmAPmAP@50Parameters(M)GFLOPs
6YOLOv5xP230.049.2990.96314.2
7YOLOv5xP2 CBAM30.149.4091.31315.1
8YOLOv5x-TPH40.763.00112.97270.8
用法:
nohup python train.py --data VisDrone.yaml --weights yolov5n.pt --cfg models/yolov5n.yaml --epochs 300 --batch-size 8 --img 608 --device 0,1 --sync-bn >> yolov5n.txt &
组成部分:

P2 Head、CBAM、TPH、BiFPN、SPP

在这里插入图片描述

1、TransBlock的数量会根据YOLO规模的不同而改变,标准结构作用于YOLOv5m

2、当YOLOv5x为主体与标准结构的区别是:(1)首先去掉14和19的CBAM模块(2)降低与P2关联的通道数(128)(3)在输出头之前会添加SPP模块,注意SPP的kernel随着P的像素减小而减小(4)在CBAM之后进行输出(5)只保留backbone以及最后一层输出的TransBlock(6)采用BiFPN作为neck

3、更改不同Loss分支的权重:如下图,当训练集的分类与置信度损失还在下降时,验证集的分类与置信度损失开始反弹,说明出现了过拟合,需要降低这两个任务的权重

消融实验如下:

boxclsobjacc
0.050.51.037.90
0.050.30.738.00
0.050.20.437.5
B、SwinTrans-YOLOv5在这里插入图片描述
pip install timm
Usage:
python train.py --data VisDrone.yaml --weights yolov5x.pt --cfg models/accModels/yolov5xP2CBAM-Swin-BiFPN-SPP.yaml --hyp data/hyps/hyp.visdrone.yaml --epochs 60 --batch-size 4 --img 1536 --nohalf

(1)Window size由7替换为检测任务常用分辨率的公约数8

(2)create_mask封装为函数,由在init函数执行变为在forward函数执行

(3)若分辨率小于window size或不是其公倍数时,在其右侧和底部Padding

debug:在计算完之后需要反padding回去,否则与cv2支路的img_size无法对齐

(4)forward函数前后对输入输出reshape

(5)验证C3STR时,需要手动关闭默认模型在half精度下验证(–nohalf

3、Slighter Model

Train on Visdrone DataSet (1 size is 608,2-6 size is 640)

NoModelmAPmAP@50Parameters(M)GFLOPsTrainCost(h)Memory Cost(G)PT FileFPS@CPU
1YOLOv5l23.239.746.19108.1
2YOLOv5l-GhostNet18.433.824.2742.427.444.97PekingUni Cloud
3YOLOv5l-ShuffleNetV216.4831.121.2740.510.982.41PekingUni Cloud
4YOLOv5l-MobileNetv3Small16.5531.220.3838.410.195.30PekingUni Cloud
5YOLOv5l-EfficientNetLite019.123523.0143.913.942.04PekingUni Cloud
6YOLOv5l-PP-LCNet17.6332.821.6441.718.521.66PekingUni Cloud
A、GhostNet-YOLOv5

(1)为保持一致性,下采样的DW的kernel_size均等于3

(2)neck部分与head部分沿用YOLOv5l原结构

(3)中间通道人为设定(expand)

B、ShuffleNetV2-YOLOv5

在这里插入图片描述

(1)Focus Layer不利于芯片部署,频繁的slice操作会让缓存占用严重

(2)避免多次使用C3 Leyer以及高通道的C3 Layer(违背G1与G3准则)

(3)中间通道不变

C、MobileNetv3Small-YOLOv5

在这里插入图片描述

(1)原文结构,部分使用Hard-Swish激活函数以及SE模块

(2)Neck与head部分嫁接YOLOv5l原结构

(3)中间通道人为设定(expand)

D、EfficientNetLite0-YOLOv5

在这里插入图片描述

(1)使用Lite0结构,且不使用SE模块

(2)针对dropout_connect_rate,手动赋值(随着idx_stage变大而变大)

(3)中间通道一律*6(expand)

E、PP-LCNet-YOLOv5

在这里插入图片描述

(1)使用PP-LCNet-1x结构,在网络末端使用SE以及5*5卷积核

(2)SeBlock压缩维度为原1/16

(3)中间通道不变

Pruning for YOLOs

ModelmAPmAP@50Parameters(M)GFLOPsFPS@CPU
YOLOv5s18.4347.0515.9
YOLOv5n1326.21.784.2
YOLOv5s-EagleEye@0.614.327.94.599.6

1、Prune Strategy

(1)基于YOLOv5块状结构设计,对Conv、C3、SPP(F)模块进行剪枝,具体来说有以下:

  • Conv模块的输出通道数
  • C3模块中cv2块和cv3块的输出通道数
  • C3模块中若干个bottleneck中的cv1块的输出通道数

(2)八倍通道剪枝(outchannel = 8*n)

(3)ShortCut、concat皆合并剪枝

2、Prune Tools

(1)EagleEye

EagleEye: Fast Sub-net Evaluation for Efficient Neural Network Pruning

基于搜索的通道剪枝方法,核心思想是随机搜索到大量符合目标约束的子网,然后快速更新校准BN层的均值与方差参数,并在验证集上测试校准后全部子网的精度。精度最高的子网拥有最好的架构,经微调恢复后能达到较高的精度。

Usage
  1. 正常训练模型
python train.py --data data/VisDrone.yaml --imgsz 640 --weights yolov5s.pt --cfg models/prunModels/yolov5s-pruning.yaml --device 0

(注意训练其他模型,参考/prunModels/yolov5s-pruning.yaml进行修改,目前已支持v6架构)

  1. 搜索最优子网
python pruneEagleEye.py --weights path_to_trained_yolov5_model --cfg models/prunModels/yolov5s-pruning.yaml --data data/VisDrone.yaml --path path_to_pruned_yolov5_yaml --max_iter maximum number of arch search --remain_ratio the whole FLOPs remain ratio --delta 0.02
  1. 微调恢复精度
python train.py --data data/VisDrone.yaml --imgsz 640 --weights path_to_Eaglepruned_yolov5_model --cfg path_to_pruned_yolov5_yaml --device 0
(2)Network Slimming

Learning Efficient Convolutional Networks through Network Slimming

Usage
  1. 模型BatchNorm Layer \gamma 稀疏化训练
python train.py --data data/VisDrone.yaml --imgsz 640 --weights yolov5s.pt --cfg models/prunModels/yolov5s-pruning.yaml --device 0 --sparse

(注意训练其他模型,参考/prunModels/yolov5s-pruning.yaml进行修改,目前已支持v6架构)

  1. BatchNorm Layer剪枝
python pruneSlim.py --weights path_to_sparsed_yolov5_model --cfg models/prunModels/yolov5s-pruning.yaml --data data/VisDrone.yaml --path path_to_pruned_yolov5_yaml --global_percent 0.6 --device 3
  1. 微调恢复精度
python train.py --data data/VisDrone.yaml --imgsz 640 --weights path_to_Slimpruned_yolov5_model --cfg path_to_pruned_yolov5_yaml --device 0

Quantize Aware Training for YOLOs

MQBench是实际硬件部署下评估量化算法的框架,进行各种适合于硬件部署的量化训练(QAT)

Requirements

  • PyTorch == 1.8.1

Install MQBench Lib

由于MQBench目前还在不断更新,选择0.0.2稳定版本作为本仓库的量化库。

git clone https://github.com/ZLkanyo009/MQBench.git
cd MQBench
python setup.py build
python setup.py install

Usage

训练脚本实例:

python train.py --data VisDrone.yaml --weights yolov5n.pt --cfg models/yolov5n.yaml --epochs 300 --batch-size 8 --img 608 --nosave --device 0,1 --sync-bn --quantize --BackendType NNIE

Deploy

目前已支持TensorRT及NCNN部署,详见deploy

To do

  • Multibackbone: MobileNetV3-small
  • Multibackbone: ShuffleNetV2
  • Multibackbone: GhostNet
  • Multibackbone: EfficientNet-Lite0
  • Multibackbone: PP-LCNet
  • Multibackbone: TPH-YOLOv5
  • Module: SwinTrans(C3STR)
  • Module: Deformable Convolution
  • Pruner: Network Slimming
  • Pruner: EagleEye
  • Pruner: OneShot (L1, L2, FPGM), ADMM, NetAdapt, Gradual, End2End
  • Quantization: MQBench
  • Knowledge Distillation

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt之基本数据类型

Qt 基本数据类型定义在#include <QtGlobal>中&#xff0c;如表下表所示。 (1)打开Qt Creator&#xff0c;新建一个控制台项目&#xff0c;项目名为test。 (2)在 main.cpp 中输入如下代码: #include <QCoreApplication> #include <QtGlobal> int main(int…

《数据结构、算法与应用C++语言描述》-红黑树的C++实现-百万级数据量测试通过

红黑树 完整可编译运行代码见仓库&#xff1a;GitHub - Jasmine-up/Data-Structures-Algorithms-and-Applications/_3matrix。 如有问题请在评论区指出。另外&#xff0c;Github仓库会根据我的学习情况持续更新&#xff0c;欢迎大家点star&#xff0c;谢谢。 基本概念 红-黑…

实验笔记之——服务器链接

最近需要做NeRF相关的开发,需要用到GPU,本博文记录本人配置服务器远程链接的过程,本博文仅供本人学习记录用~ 连上服务器 首先先确保环境是HKU的网络环境(HKU AnyConnect也可)。伙伴已经帮忙创建好用户(第一次登录会提示重新设置密码)。用cmd ssh链接ssh -p 60001 <u…

软件测试|MySQL逻辑运算符使用详解

简介 在MySQL中&#xff0c;逻辑运算符用于处理布尔类型的数据&#xff0c;进行逻辑判断和组合条件。逻辑运算符主要包括AND、OR、NOT三种&#xff0c;它们可以帮助我们在查询和条件语句中进行复杂的逻辑操作。本文将详细介绍MySQL中逻辑运算符的使用方法和示例。 AND运算符 …

Spark SQL基础知识

一.DataFrame详解 1.清洗相关的API 去重API:dropDuplicates 总结:用来删除重复数据,如果没有指定参数subset,那么要比对行中的所有字段内容,如果全部相同,就认为是重复数据,会被删除;如果有指定参数subset,那么只比对subset中指定的字段范围,如果指定不存在的字段会报错. 删…

小红书素人种草笔记铺量推广,有素人资源合作吗?

小红书&#xff0c;作为国内领先的社交电商平台&#xff0c;以其独有的口碑效应和海量素人资源&#xff0c;成为了品牌推广界的新宠。如何利用小红书素人笔记进行铺量推广&#xff0c;提升品牌知名度呢&#xff1f;本文伯乐网络传媒将来给大家进行全面解析。 一、小红书素人笔记…

C#封装服务

C#封装服务 新建服务项目&#xff1b;重构 OnStart 和 OnStop using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Linq; using System.ServiceProcess; using System.Text; using S…

进阶学习——Linux网络

目录 一、网络配置命令 1.ifconfig——IP地址 1.1ifconfig的基础用法 1.1.1ifconfig命令详解 1.2常用格式 1.3修改网卡名称 1.3.1临时修改 1.3.2永久修改 1.4临时修改网卡 1.4.1设置虚拟网卡 1.4.2延伸——ethtool 1.5永久修改网卡 1.6实验 —— 双网卡配置 1.…

@PolarDB,你的动手体验搭子,来啦

前言 PolarDB是阿里云自研的新一代云原生数据库&#xff0c;在计算存储分离架构下&#xff0c;利用了软硬件结合的优势&#xff0c;为用户提供具备极致弹性、高性能、海量存储、安全可靠的数据库服务。100%兼容MySQL和PostgreSQL生态&#xff0c;高度兼容Oracle语法。 1月17日…

vivado 创建编译后工程

创建后期合成项目 合成后项目以合成网表、完全生成的块设计、完全生成的IP以及相应的约束。然后&#xff0c;您可以分析、布局和实施设计 注意&#xff1a;您可以使用XST或第三方合成工具来创建合成网表。 重要&#xff01;使用EDIF和NGC文件时&#xff0c;顶部单元格名称必…

“器官短缺”将被打破 基因编辑猪成为人类的“二师兄”

器官移植被称为生命之灯。但是&#xff0c;受制于传统观念及对人体器官捐献意义的不了解&#xff0c;人体器官捐献的数量&#xff0c;还远远达不到需求。目前&#xff0c;全国有近30万的患者在等待器官移植&#xff0c;但每年只有近一万的患者能真正得到器官移植&#xff0c;缺…

高性能、可扩展、支持二次开发的企业电子招标采购系统源码

在数字化时代&#xff0c;企业需要借助先进的数字化技术来提高工程管理效率和质量。招投标管理系统作为企业内部业务项目管理的重要应用平台&#xff0c;涵盖了门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等…

JSON数据处理

1.添加json依赖 springmvc 默认使用jackson作为json类库,不需要修改applicationContext-servlet.xml任何配置&#xff0c;只需引入以下类库springmvc就可以处理json数据&#xff1a; <!--spring-json依赖--> <dependency><groupId>com.fasterxml.jackson.c…

宝塔上的琉璃灯(for循环试炼)

8层宝塔上共有765盏琉璃灯&#xff0c;每层灯数都是上层的一倍&#xff0c;编程输出每层灯数。 (笔记模板由python脚本于2024年01月09日 16:41:22创建&#xff0c;本篇笔记适合熟悉循环编程的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python…

全新链动2+1模式,提升用户粘性度,增加产品复购率!

在互联网电商行业中&#xff0c;消费增值模式已经成为一种强大的营销工具。通过将消费者所消费的金额转化为积分&#xff0c;再利用平台的销售业绩作为托底&#xff0c;使得积分的价值不断增长&#xff0c;从而增加了消费者的忠诚度和黏性。然而&#xff0c;在实际操作中&#…

C++力扣题目-- 二叉树层序遍历

102.二叉树的层序遍历(opens new window)107.二叉树的层次遍历II(opens new window)199.二叉树的右视图(opens new window)637.二叉树的层平均值(opens new window)429.N叉树的层序遍历(opens new window)515.在每个树行中找最大值(opens new window)116.填充每个节点的下一个右…

1883_把FreeRTOS中的heap_4作为一个通用模块使用并初步测试

全部学习汇总&#xff1a; GreyZhang/c_units: A small piece of code which can be reuse anywhere, I call it a unit. This is a collection of unit in C language! Ok, yes, it would be my toolbox. (github.com) 在嵌入式&#xff0c;尤其是控制类的嵌入式中很少有mallo…

SUDA-计算机网路-期末复习提纲

写在前面 帮苏大的同学整理的计网复习材料&#xff0c;用的是他们老师划定的范围。 1.负责互联网协议开发、标准制定、地址分配的国际组织名称及其主要职责 (1) 地址支持组织&#xff08;ASO&#xff09;负责IP地址系统的管理。 (2) 域名支持组织&#xff08;DNSO&#xff09;…

CMU15-445-Spring-2023-Project #1 - 前置知识(lec01-06)

Lecture #01_ Relational Model & Relational Algebra Databases 数据库是相互关联的数据的有组织集合&#xff0c;对现实世界的某些方面进行建模。区别于DBMS&#xff08;MySQL、Oracle&#xff09;。 Flat File Strawman 数据库以CSV文件的形式存储&#xff0c;并由D…

非常漂亮的外贸网站完整代码,适合机械加工和金属零件等领域。

非常漂亮的外贸网站完整代码&#xff0c;适合机械加工和金属零件等领域。整站代码&#xff0c;上传到服务器虚拟主机即可使用。 独家原创资源。源码是asp开发的&#xff0c;数据库是access&#xff0c;主流的虚拟主机空间都支持asp&#xff0c;直接上传就可以使用。 站长保证…