位置: IT常识 - 正文

YOLOv5 6.0/6.1结合ASFF(yolov5 教程)

编辑:rootadmin
YOLOv5 6.0/6.1结合ASFF

推荐整理分享YOLOv5 6.0/6.1结合ASFF(yolov5 教程),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:yolov2结构,yolov2结构,yolov5结构解析,yolov5结构解析,yolov5结构解析,yolov3.cfg,yolov5搭建,yolov5 教程,内容如对您有帮助,希望把文章链接给更多的朋友!

YOLOv5 6.0/6.1结合ASFF

前言

YOLO小白纯干货分享!!!

一、主要修改代码YOLOv5 6.0/6.1结合ASFF(yolov5 教程)

二、使用步骤1. models/common.py:加入要修改的代码, 类ASFFV5 class ASFFV5(nn.Module): class ASFFV5(nn.Module): def __init__(self, level, multiplier=1, rfb=False, vis=False, act_cfg=True): """ ASFF version for YoloV5 only. Since YoloV5 outputs 3 layer of feature maps with different channels which is different than YoloV3 normally, multiplier should be 1, 0.5 which means, the channel of ASFF can be 512, 256, 128 -> multiplier=1 256, 128, 64 -> multiplier=0.5 For even smaller, you gonna need change code manually. """ super(ASFFV5, self).__init__() self.level = level self.dim = [int(1024*multiplier), int(512*multiplier), int(256*multiplier)] #print("dim:",self.dim) self.inter_dim = self.dim[self.level] if level == 0: self.stride_level_1 = Conv(int(512*multiplier), self.inter_dim, 3, 2) #print(self.dim) self.stride_level_2 = Conv(int(256*multiplier), self.inter_dim, 3, 2) self.expand = Conv(self.inter_dim, int( 1024*multiplier), 3, 1) elif level == 1: self.compress_level_0 = Conv( int(1024*multiplier), self.inter_dim, 1, 1) self.stride_level_2 = Conv( int(256*multiplier), self.inter_dim, 3, 2) self.expand = Conv(self.inter_dim, int(512*multiplier), 3, 1) elif level == 2: self.compress_level_0 = Conv( int(1024*multiplier), self.inter_dim, 1, 1) self.compress_level_1 = Conv( int(512*multiplier), self.inter_dim, 1, 1) self.expand = Conv(self.inter_dim, int( 256*multiplier), 3, 1) # when adding rfb, we use half number of channels to save memory compress_c = 8 if rfb else 16 self.weight_level_0 = Conv( self.inter_dim, compress_c, 1, 1) self.weight_level_1 = Conv( self.inter_dim, compress_c, 1, 1) self.weight_level_2 = Conv( self.inter_dim, compress_c, 1, 1) self.weight_levels = Conv( compress_c*3, 3, 1, 1) self.vis = vis def forward(self, x_level_0, x_level_1, x_level_2): #s,m,l """ # 128, 256, 512 512, 256, 128 from small -> large """ # print('x_level_0: ', x_level_0.shape) # print('x_level_1: ', x_level_1.shape) # print('x_level_2: ', x_level_2.shape) x_level_0=x[2] x_level_1=x[1] x_level_2=x[0] if self.level == 0: level_0_resized = x_level_0 level_1_resized = self.stride_level_1(x_level_1) level_2_downsampled_inter = F.max_pool2d( x_level_2, 3, stride=2, padding=1) level_2_resized = self.stride_level_2(level_2_downsampled_inter) #print('X——level_0: ', level_2_downsampled_inter.shape) elif self.level == 1: level_0_compressed = self.compress_level_0(x_level_0) level_0_resized = F.interpolate( level_0_compressed, scale_factor=2, mode='nearest') level_1_resized = x_level_1 level_2_resized = self.stride_level_2(x_level_2) elif self.level == 2: level_0_compressed = self.compress_level_0(x_level_0) level_0_resized = F.interpolate( level_0_compressed, scale_factor=4, mode='nearest') x_level_1_compressed = self.compress_level_1(x_level_1) level_1_resized = F.interpolate( x_level_1_compressed, scale_factor=2, mode='nearest') level_2_resized = x_level_2 # print('level: {}, l1_resized: {}, l2_resized: {}'.format(self.level, # level_1_resized.shape, level_2_resized.shape)) level_0_weight_v = self.weight_level_0(level_0_resized) level_1_weight_v = self.weight_level_1(level_1_resized) level_2_weight_v = self.weight_level_2(level_2_resized) # print('level_0_weight_v: ', level_0_weight_v.shape) # print('level_1_weight_v: ', level_1_weight_v.shape) # print('level_2_weight_v: ', level_2_weight_v.shape) levels_weight_v = torch.cat( (level_0_weight_v, level_1_weight_v, level_2_weight_v), 1) levels_weight = self.weight_levels(levels_weight_v) levels_weight = F.softmax(levels_weight, dim=1) fused_out_reduced = level_0_resized * levels_weight[:, 0:1, :, :] +\ level_1_resized * levels_weight[:, 1:2, :, :] +\ level_2_resized * levels_weight[:, 2:, :, :] out = self.expand(fused_out_reduced) if self.vis: return out, levels_weight, fused_out_reduced.sum(dim=1) else: return out2. models/yolo.py:添加 类ASFF_Detect

然后在yolo.py 中 Detect 类下面,添加一个ASFF_Detect类

class ASFF_Detect(nn.Module): #add ASFFV5 layer and Rfb stride = None # strides computed during build export = False # onnx export def __init__(self, nc=80, anchors=(), multiplier=0.5,rfb=False,ch=()): # detection layer super(ASFF_Detect, self).__init__() self.nc = nc # number of classes self.no = nc + 5 # number of outputs per anchor self.nl = len(anchors) # number of detection layers self.na = len(anchors[0]) // 2 # number of anchors self.grid = [torch.zeros(1)] * self.nl # init grid self.l0_fusion = ASFFV5(level=0, multiplier=multiplier,rfb=rfb) self.l1_fusion = ASFFV5(level=1, multiplier=multiplier,rfb=rfb) self.l2_fusion = ASFFV5(level=2, multiplier=multiplier,rfb=rfb) a = torch.tensor(anchors).float().view(self.nl, -1, 2) self.register_buffer('anchors', a) # shape(nl,na,2) self.register_buffer('anchor_grid', a.clone().view(self.nl, 1, -1, 1, 1, 2)) # shape(nl,1,na,1,1,2) self.m = nn.ModuleList(nn.Conv2d(x, self.no * self.na, 1) for x in ch) # output conv

接着在 yolo.py的parse_model 中把函数放到模型的代码里: (大概在283行左右)

if m in [Conv, GhostConv, Bottleneck, GhostBottleneck, SPP, DWConv, MixConv2d, Focus, CrossConv, BottleneckCSP,CBAM,ResBlock_CBAM, C3]: c1, c2 = ch[f], args[0] if c2 != no: # if not output c2 = make_divisible(c2 * gw, 8) args = [c1, c2, *args[1:]] if m in [BottleneckCSP, C3]: args.insert(2, n) # number of repeats n = 1 elif m is nn.BatchNorm2d: args = [ch[f]] elif m is Concat: c2 = sum([ch[x] for x in f]) elif m is ASFF_Detect: args.append([ch[x] for x in f]) if isinstance(args[1], int): # number of anchors args[1] = [list(range(args[1] * 2))] * len(f) elif m is Contract: c2 = ch[f] * args[0] ** 2 elif m is Expand: c2 = ch[f] // args[0] ** 2 elif m is ASFFV5: c2=args[1] else: c2 = ch[f]3.models/yolov5s-asff.yaml

在models文件夹下新建对应的yolov5s-asff.yaml 文件 然后将yolov5s.yaml的内容复制过来,将 head 部分的最后一行进行修改; 将[[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5) ] 修改成下面:

[[17, 20, 23], 1, ASFF_Detect, [nc, anchors]], # Detect(P3, P4, P5) ]4.查看网络结构

修改 models/yolo.py --cfg models/yolov5s-asff.yaml 接下来run yolo.py 即可查看网络结构

5.将train.py 中 --cfg中的 yaml 文件修改成本文文件即可,开始训练总结

本人在多个数据集上做了大量实验,针对不同的数据集效果不同,需要大家进行实验。有效果有提升的情况占大多数。

最后,希望能互粉一下,做个朋友,一起学习交流。

本文链接地址:https://www.jiuchutong.com/zhishi/300716.html 转载请保留说明!

上一篇:2022年微信小程序授权登录的最新实现方案(2022年微信小程序游戏)

下一篇:【windows Server 2019系列】 构建IIS服务器(windowsserver2012r2远程协助灰色)

  • 华为p40pro有仿真键盘的吗(高仿p40pro)

    华为p40pro有仿真键盘的吗(高仿p40pro)

  • 快手下拉菜单没有分类(快手下拉没有推荐呢)

    快手下拉菜单没有分类(快手下拉没有推荐呢)

  • 钢化膜边缘不贴合怎么办(钢化膜边缘不贴合用吹风机管用吗)

    钢化膜边缘不贴合怎么办(钢化膜边缘不贴合用吹风机管用吗)

  • WPS文本框高度宽度怎么设置(wps文本框高度宽度在哪)

    WPS文本框高度宽度怎么设置(wps文本框高度宽度在哪)

  • 移动硬盘最大多少容量(移动硬盘最大多少tb)

    移动硬盘最大多少容量(移动硬盘最大多少tb)

  • 小米手机还原设置在哪(小米手机还原设置不会丢失数据)

    小米手机还原设置在哪(小米手机还原设置不会丢失数据)

  • 知乎读书卡有什么用(知乎读书卡是什么)

    知乎读书卡有什么用(知乎读书卡是什么)

  • 畅联语音是什么意思(畅联语音是什么情况)

    畅联语音是什么意思(畅联语音是什么情况)

  • 表格怎么改成三线表(表格怎么改成三线表格)

    表格怎么改成三线表(表格怎么改成三线表格)

  • qq消息多久之内可以撤回(qq消息多久内可以撤回)

    qq消息多久之内可以撤回(qq消息多久内可以撤回)

  • 新买的手机卡被别人注册了怎么办(新买的手机卡被别人绑定了银行卡)

    新买的手机卡被别人注册了怎么办(新买的手机卡被别人绑定了银行卡)

  • 苹果热点自动断开(苹果热点自动断掉)

    苹果热点自动断开(苹果热点自动断掉)

  • 屏蔽消息是什么意思(屏蔽发信息显示什么)

    屏蔽消息是什么意思(屏蔽发信息显示什么)

  • 为什么打开数据连接却上不了网(为什么打开数据网络不能用)

    为什么打开数据连接却上不了网(为什么打开数据网络不能用)

  • 网速200兆是什么意思(网速二百兆是什么意思)

    网速200兆是什么意思(网速二百兆是什么意思)

  • 华为图标设置在哪(华为图标怎么设置)

    华为图标设置在哪(华为图标怎么设置)

  • 快手几个人举报可以封号(快手几个人举报会被永久封号)

    快手几个人举报可以封号(快手几个人举报会被永久封号)

  • xr原彩显示有什么好处(xr的原彩显示)

    xr原彩显示有什么好处(xr的原彩显示)

  • 抖音上传照片怎么剪音乐(抖音上传照片怎么不能滑动了呢)

    抖音上传照片怎么剪音乐(抖音上传照片怎么不能滑动了呢)

  • 苹果电池多少需要更换(苹果电池达到多少需要换)

    苹果电池多少需要更换(苹果电池达到多少需要换)

  • 微信电话没声音怎么回事(微信电话没声音是什么原因)

    微信电话没声音怎么回事(微信电话没声音是什么原因)

  • 爱奇艺动漫上的vf什么意思(爱奇艺出的动漫)

    爱奇艺动漫上的vf什么意思(爱奇艺出的动漫)

  • 抖音可以看关注的人的评论吗(抖音可以看关注时间吗)

    抖音可以看关注的人的评论吗(抖音可以看关注时间吗)

  • 京东自营店如何开店(京东自营店如何投诉客服)

    京东自营店如何开店(京东自营店如何投诉客服)

  • U盘启动盘如何安装Win7+Win8双系统史上最详细教程(u盘启动盘如何分区)

    U盘启动盘如何安装Win7+Win8双系统史上最详细教程(u盘启动盘如何分区)

  • 申请退还增量留抵税额的条件包括
  • 环保税的纳税义务人是施工方还是建设方安徽
  • 房产税相关问题
  • 个人独资企业增值税税率是多少
  • 减值准备为什么影响利润总额
  • 房地产企业还有未来吗
  • 职工食堂支出明细表
  • 企业所得税季度预缴怎么计算
  • 免税申请怎么办理
  • 公益捐赠税前扣除凭证
  • 员工异地交纳保险怎么交
  • 个体户个人所得税怎么交
  • 增值税扣完税款还能更改吗
  • 长期租赁存在的主要原因为什么是节税
  • 个税滞纳金如何调增所得税费用
  • 长期股权投资权益法初始计量
  • 企业短期投资的计划和管理过程叫做资本预算
  • 收购公司收购款转给谁
  • 固定资产验收单图片
  • 工程部物品领用表格模板
  • 企业所得税弥补
  • 一次性收取的租金怎么纳税
  • 采购流程会计分录怎么写
  • 货物装卸过程中由于操作不当或违反操作规程
  • 旧货销售的增值税税率
  • 农村合作社补贴政策
  • window休眠
  • win7系统如何查看主板型号
  • 投资收益科目的借贷方向
  • win7提示windows进行了未授权的更改
  • macos catalina新功能
  • windows10护眼色设置
  • 企业补充养老保险
  • mcappins.exe - mcappins进程是什么文件 什么意思.
  • 成本法转为权益法属于会计政策变更吗
  • 用支票购入厂部办公用品2000元,车间办公用品1000元
  • fsockopen pfsockopen函数被禁用,SMTP发送邮件不正常的解决方法
  • 免税有那些
  • 目标检测现状
  • 手把手教你实现用户登录界
  • 增值税进项发票丢失最新处理办法
  • 保安行业税率是多少
  • vue axios.all
  • 蓝桥杯2021出结果
  • vue 登陆
  • php解释器工作流程
  • php公众号推送完整示例
  • 售后租回怎么理解
  • jwt中的jti
  • 为什么盈余公积减少,未分配利润增加
  • sql2008r2怎么用
  • 出口销售收入要交印花税吗
  • 营业总收入和营业利润
  • 减免所得税额怎么做分录
  • 小规模开票的税点是多少
  • 现金短缺无法查明计入什么科目
  • 银行开户存款流程
  • 应收账款和坏账准备的解题思路
  • xp系统能用谷歌吗
  • StatusClient.exe - StatusClient是什么进程 有什么作用
  • 电脑及网络维护
  • win8的ie浏览器
  • 在linux中使用什么命令可以执行shell脚本
  • win8突然没有声音
  • opengl坐标系原点
  • ztree getnodebytid
  • bootstrap需要学多久
  • 简单强悍是哪首歌
  • 安卓hid通信
  • javascript编程技术
  • node.js express中app.param的用法详解
  • e87移植
  • scrollview嵌套flatlist
  • 买车开增值票是什么意思
  • 深圳龙华九价怎么预约
  • 地税怎么交税
  • 在电脑上怎样做word的文档
  • 营业执照增加项目怎么办理
  • 钟楼在西安的哪里
  • 登录上海电子税务局显示获取公告失败
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设