【项目二、蜂巢检测项目】二、模型改进:YOLOv5s 您所在的位置:网站首页 yolov7tiny和yolov5s参数量 【项目二、蜂巢检测项目】二、模型改进:YOLOv5s

【项目二、蜂巢检测项目】二、模型改进:YOLOv5s

2024-07-12 04:16| 来源: 网络整理| 查看: 265

目录 前言一、蜂巢数据集二、YOLOv5s-ShuffleNetV2的实现2.1、backbone部分2.1.1、Focus替换2.1.2、所有Conv+C3替换为Shuffle_Block2.1.3、砍掉SPP 2.2、head部分2.2.1、所有层结构输入输出channel相等2.2.2、所有C3结构全部替换为DWConv2.2.3、PAN的两个Concat改为ADD 2.3、总结 三、实验结果Reference

前言

马上要找工作了,想总结下自己做过的几个小项目。

这个项目主要改进点来源于ppogg/YOLOv5-Lite,用的里面的Lite-e模型,非常厉害的轻量化模型,感谢大佬的开源工作。

之前已经总结过了我做的第一个项目:xxx病虫害检测项目,github源码地址:HuKai97/FFSSD-ResNet。CSDN讲解地址:

【项目一、xxx病虫害检测项目】1、SSD原理和源码分析【项目一、xxx病虫害检测项目】2、网络结构尝试改进:Resnet50、SE、CBAM、Feature Fusion【项目一、xxx病虫害检测项目】3、损失函数尝试:Focal loss

而这篇主要介绍我做的第二个项目,也是实验室项目。这次是在YOLOv5的基础上进行的改进,同项目其他讲解:

【项目二、蜂巢检测项目】一、串讲各类经典的卷积网络:InceptionV1-V4、ResNetV1-V2、MobileNetV1-V3、ShuffleNetV1-V2、ResNeXt、Xception

如果对YOLOv5不熟悉的同学可以先看看我写的YOLOv5源码讲解CSDN:【YOLOV5-5.x 源码讲解】整体项目文件导航,注释版YOLOv5源码我也开源在了Github上:HuKai97/yolov5-5.x-annotations,欢迎大家star!

因为我的数据集相对简单,只需要检测单类别:蜂巢。所以在原始的YOLOv5的baseline上,mAP就已经达到了96%了,所以这篇工作主要是对YOLOv5进行轻量化探索,在保证mAP不下降太多的情况下,尽可能的提升速度,使模型能够部署在一些边缘设备上,如树莓派等。

思路:利用ShuffleNetv2中的轻量化思路,改进YOLOv5s的网络结构,使网络更适合一些单类/几个类的数据集。

代码已全部上传GitHub: HuKai97/YOLOv5-ShuffleNetv2

一、蜂巢数据集

蜂巢数据集是实验室的数据集,总共有1754张原图,划分为训练集:测试集=8:2。

蜂巢图片样例: 在这里插入图片描述

二、YOLOv5s-ShuffleNetV2的实现 2.1、backbone部分

yaml配置文件:

backbone: # [from, number, module, args] [[-1, 1, conv_bn_relu_maxpool, [32]], # 0-P2/4 [-1, 1, Shuffle_Block, [116, 2]], # 1-P3/8 [-1, 3, Shuffle_Block, [116, 1]], # 2 [-1, 1, Shuffle_Block, [232, 2]], # 3-P4/16 [-1, 7, Shuffle_Block, [232, 1]], # 4 [-1, 1, Shuffle_Block, [464, 2]], # 5-P5/32 [-1, 1, Shuffle_Block, [464, 1]], # 6 ] 2.1.1、Focus替换

原始的YOLOv5s-5.0的stem是一个Focus切片操作,而v6是一个6x6Conv,这里是仿照v6对Focus进行改进,改为1个3x3卷积(因为我的任务本身不复杂,改为3x3后可以降低参数)

class conv_bn_relu_maxpool(nn.Module): def __init__(self, c1, c2): # ch_in, ch_out super(conv_bn_relu_maxpool, self).__init__() self.conv = nn.Sequential( nn.Conv2d(c1, c2, kernel_size=3, stride=2, padding=1, bias=False), nn.BatchNorm2d(c2), nn.ReLU(inplace=True), ) self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False) def forward(self, x): return self.maxpool(self.conv(x)) 2.1.2、所有Conv+C3替换为Shuffle_Block

在这里插入图片描述

def channel_shuffle(x, groups): batchsize, num_channels, height, width = x.data.size() # bs c h w channels_per_group = num_channels // groups # reshape x = x.view(batchsize, groups, channels_per_group, height, width) # [bs,c,h,w] to [bs,group,channels_per_group,h,w] x = torch.transpose(x, 1, 2).contiguous() # channel shuffle [bs,channels_per_group,group,h,w] # flatten x = x.view(batchsize, -1, height, width) # [bs,c,h,w] return x

在这里插入图片描述

class Shuffle_Block(nn.Module): def __init__(self, inp, oup, stride): super(Shuffle_Block, self).__init__() if not (1 84%)。

检测结果(左图yolov5s,右图yolov5s-shufflenetv2): 请添加图片描述请添加图片描述

Reference

ppogg/YOLOv5-Lite

深度学习中模型计算量(FLOPs)和参数量(Params)的理解以及四种计算方法总结



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有