位置: 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远程协助灰色)

  • gmail邮箱网页登录入口(gmail被屏蔽)(gmail邮箱官网登录)

    gmail邮箱网页登录入口(gmail被屏蔽)(gmail邮箱官网登录)

  • 菜鸟裹裹能查一年前的快递吗(菜鸟裹裹可以看快递单号吗)

    菜鸟裹裹能查一年前的快递吗(菜鸟裹裹可以看快递单号吗)

  • 微信怎么更新最新版本呢(微信怎么更新最新版本8.0.21)

    微信怎么更新最新版本呢(微信怎么更新最新版本8.0.21)

  • 荣耀30pro屏幕尺寸大小(荣耀30pro手机屏幕尺寸)

    荣耀30pro屏幕尺寸大小(荣耀30pro手机屏幕尺寸)

  • 光猫和机顶盒怎么连接(光猫和机顶盒怎么接线)

    光猫和机顶盒怎么连接(光猫和机顶盒怎么接线)

  • 闲鱼小二介入成功技巧(闲鱼小二介入会影响店铺吗)

    闲鱼小二介入成功技巧(闲鱼小二介入会影响店铺吗)

  • wifi已连接需登录认证(wifi连接需要登录)

    wifi已连接需登录认证(wifi连接需要登录)

  • 如何在微信视频号上发视频(如何在微信视频号发视频)

    如何在微信视频号上发视频(如何在微信视频号发视频)

  • 怎么解决直播手机没电(直播间手机)

    怎么解决直播手机没电(直播间手机)

  • 华为荣耀10otG功能在哪(华为荣耀10手机ot g在哪儿打开)

    华为荣耀10otG功能在哪(华为荣耀10手机ot g在哪儿打开)

  • 微信号能更改吗(微信临时登录)

    微信号能更改吗(微信临时登录)

  • ipad可以收短信吗(iphone收不到短信)

    ipad可以收短信吗(iphone收不到短信)

  • 荣耀30pro和荣耀30pro+有什么不一样(荣耀30pro和荣耀30pro+手机壳区别)

    荣耀30pro和荣耀30pro+有什么不一样(荣耀30pro和荣耀30pro+手机壳区别)

  • 抖音一个手机号能绑定几个(抖音一个手机号能绑定两个账号吗)

    抖音一个手机号能绑定几个(抖音一个手机号能绑定两个账号吗)

  • 微信视频卡住不动有声音(微信视频卡住不动有声音跟别人视频不卡)

    微信视频卡住不动有声音(微信视频卡住不动有声音跟别人视频不卡)

  • vegas和pr的区别(pr和vegas哪个对电脑要求低)

    vegas和pr的区别(pr和vegas哪个对电脑要求低)

  • 手机数据网速不好怎么设置(手机数据网速不好怎么办)

    手机数据网速不好怎么设置(手机数据网速不好怎么办)

  • 华为nova4语音助手在哪(华为nova4语音助手叫什么名字)

    华为nova4语音助手在哪(华为nova4语音助手叫什么名字)

  • 淘宝心级怎么划分(淘宝心级怎么快速提升)

    淘宝心级怎么划分(淘宝心级怎么快速提升)

  • 手机听筒在哪(手机听筒在哪里找)

    手机听筒在哪(手机听筒在哪里找)

  • 淘宝已设置提醒怎么取消(淘宝已设置提醒怎么取消10.10)

    淘宝已设置提醒怎么取消(淘宝已设置提醒怎么取消10.10)

  • 华为mate30是什么系统(华为mate30什么型号)

    华为mate30是什么系统(华为mate30什么型号)

  • 华为freebud使用技巧(华为freebuds操作说明)

    华为freebud使用技巧(华为freebuds操作说明)

  • 畅享9s返回键在哪(畅享9s返回键在哪里设置)

    畅享9s返回键在哪(畅享9s返回键在哪里设置)

  • 苹果陀螺仪在哪设置(苹果陀螺仪在哪里)

    苹果陀螺仪在哪设置(苹果陀螺仪在哪里)

  • 电脑屏幕发黄解决方法(电脑屏发黄怎么调正常哪)

    电脑屏幕发黄解决方法(电脑屏发黄怎么调正常哪)

  • 蔚蓝海域中的马提尼克岛,加勒比海 (© Airpano LLC/Amazing Aerial Agency)(蔚蓝的海怎么样)

    蔚蓝海域中的马提尼克岛,加勒比海 (© Airpano LLC/Amazing Aerial Agency)(蔚蓝的海怎么样)

  • 初学者安装Sklearn详细步骤(有详细步骤截图,亲测完成)(初学者安装visual studio)

    初学者安装Sklearn详细步骤(有详细步骤截图,亲测完成)(初学者安装visual studio)

  • 增值税小规模纳税人申报表填表说明
  • 期末有留底税额可需要进行账务处理
  • 个人所得税如何办理退税
  • 没有销项税只有进项税需要结转未交增值税吗
  • 不征税发票需要预缴税款吗
  • 建筑综合税率包含企业所得税吗
  • 长期债权投资是什么科目借贷
  • 应收账款余额百分比法是什么意思
  • 上个月工资没有发
  • 综合利用资源减计收入
  • 开具红字增值税专用发票是什么意思
  • 转让企业全部产权属于增值税征税范围。A对B错
  • 企业的车辆因违法停放
  • 行政性罚款可以扣除吗
  • 退预收账款需要什么原始凭证
  • 公司注销固定资产交什么税
  • 花卉租赁发票税率是多少
  • 返聘人员工伤可以申请工伤鉴定吗
  • 造价咨询公司在哪里备案
  • 发票已经开但是没有收到发票怎么做
  • 企业拆迁补偿款要交税吗
  • 应纳税所得额应纳税额公式
  • 小微企业所得税税率2.5% 10% 25%
  • 京东白条账单制和订单制是什么样的
  • 信息化投入包括什么投入和什么投入
  • 服务佣金是什么意思
  • rundll.exe是什么程序
  • windows10右键刷新有点卡
  • uniapp实战视频教程
  • 用现金报销差旅费,合规吗
  • 外商投资企业和外资企业的区别
  • 存货核算的会计分录怎么写
  • ros urdf
  • 普通发票和增值税发票都能报销吗
  • 高新技术企业收入占比不到60%,能否享受税收优惠政策
  • 稽查补缴以前年度的社保
  • 包装费 增值税
  • 学长学姐面试要注意哪些细节
  • 命令执行语句
  • 资本化过程
  • 资本公积常用的计量方法
  • mysql5.7.17在win2008R2的64位系统安装与配置实例
  • 企业的利润率怎么算
  • 个税申报汇算清缴流程
  • sqlserver2008连接
  • 工程施工企业转账手续费计入什么会计科目
  • 企业进行存货清查时,对于盘亏的存货
  • 已经经营中的企业有哪些
  • 无形资产摊销是按原值吗
  • 内资非独立核算的企业
  • 没有计提坏账如何做账
  • 福利企业增值税退税标准
  • 小规模纳税人转一般纳税人当月如何申报
  • 代收水电费如何入账
  • 漏记以前年度财务费用怎么处理
  • 个体工商户是否要交税
  • 成本结转怎么结转
  • 个体户生产经营所得税减半征收
  • 营改增 交通运输
  • 其他流动资产是
  • 如何查询公司经营异常
  • 什么叫归集和分配
  • win10图片修改
  • centos6.1安装
  • win10系统更新后无法开机
  • ubuntu20.04安装配置
  • 如何配置sendmail
  • win8无法安装inter显卡驱动
  • 微信小程序异步回调函数
  • 新浪微博随时随地
  • jquery删除所有class
  • JQueryEasyUI之DataGrid数据显示
  • vue分页组件page
  • node.js中使用文件流进行文件复制,首先需要创建一个
  • jquery easyui 教程
  • 税务局着装规定文件
  • 税务局发票邮寄需要多久
  • 税务总局纪律作风
  • 支付税控服务费的账务处理
  • 两税法的历史解释
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设