位置: IT常识 - 正文

【目标检测】YOLOv5模型从大变小,发生了什么?(目标检测yolo)

编辑:rootadmin
【目标检测】YOLOv5模型从大变小,发生了什么? 前言

推荐整理分享【目标检测】YOLOv5模型从大变小,发生了什么?(目标检测yolo),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:目标检测算法yolo,目标检测如何入门,目标检测 知乎,目标检测tricks,目标检测 知乎,目标检测教程,目标检测yolov5,目标检测yolo,内容如对您有帮助,希望把文章链接给更多的朋友!

在某次使用YOLOv5进行实验时,看到模型已经收敛得差不多,于是想提前停止训练,就果断直接终止程序。然而在查看文件大小时,突然发现,正常训练的yolov5m模型大小为40M左右,而此时生成的yolov5m模型大小达到了160M,于是产生如题疑问:模型从大变小,发生了什么?

问题根源

回到train.py这个文件,发现在模型训练完成之后,还存在这样一段代码:

if rank in [-1, 0]: # Plots if plots: plot_results(save_dir=save_dir) # save as results.png # Test best.pt logger.info('%g epochs completed in %.3f hours.\n' % (epoch - start_epoch + 1, (time.time() - t0) / 3600)) if opt.data.endswith('coco.yaml') and nc == 80: # if COCO for m in (last, best) if best.exists() else (last): # speed, mAP tests results, _, _ = test.test(opt.data, batch_size=batch_size * 2, imgsz=imgsz_test, conf_thres=0.001, iou_thres=0.7, model=attempt_load(m, device).half(), single_cls=opt.single_cls, dataloader=testloader, save_dir=save_dir, save_json=True, plots=False, is_coco=is_coco) # Strip optimizers final = best if best.exists() else last # final model for f in last, best: if f.exists(): strip_optimizer(f) # strip optimizers if opt.bucket: os.system(f'gsutil cp {final} gs://{opt.bucket}/weights') # upload else: dist.destroy_process_group() torch.cuda.empty_cache() return results

和模型大小直接挂钩的是这一句:

strip_optimizer(f) # strip optimizers

这个方法定义在/utils/general.py文件中:

def strip_optimizer(f='best.pt', s=''): # from utils.general import *; strip_optimizer() # Strip optimizer from 'f' to finalize training, optionally save as 's' x = torch.load(f, map_location=torch.device('cpu')) if x.get('ema'): x['model'] = x['ema'] # replace model with ema for k in 'optimizer', 'training_results', 'wandb_id', 'ema', 'updates': # keys x[k] = None x['epoch'] = -1 x['model'].half() # to FP16 for p in x['model'].parameters(): p.requires_grad = False torch.save(x, s or f) mb = os.path.getsize(s or f) / 1E6 # filesize print(f"Optimizer stripped from {f},{(' saved as %s,' % s) if s else ''}{mb:.1f}MB")

阅读代码,不难发现,这一步,程序将模型文件中的'optimizer', 'training_results', 'wandb_id', 'ema', 'updates'这几个设为None,也就是去除这几个值,同时将模型从FP32转成FP16。

因此,早停的模型没有经过这个步骤,导致模型精度是FP32,同时包含了大量优化器信息,导致模型过于庞大。

实验验证【目标检测】YOLOv5模型从大变小,发生了什么?(目标检测yolo)

为了验证答案的正确性,重新来加载模型看看。

首先加载官方提供的yolov5m.pt模型

import torchif __name__ == '__main__': ckpt = torch.load('yolov5m.pt') print(ckpt)

输出:

{'epoch': -1,'best_fitness': array([0.45065]), 'training_results': None, 'model': Model(...)'optimizer': None,'wandb_id': None

可以看到,这个模型文件中,只有best_fitness以及model的结构和参数为有效信息,不包含优化器信息。

再加载160M的模型:

import torchif __name__ == '__main__': ckpt = torch.load(r'runs\train\exp\weights\last.pt') print(ckpt)

发现这里输出了大量内容,主要内容是training_results和optimizer,由此可见结论正确。

{'epoch': 0,'best_fitness': 0.0, 'training_results':'....''model': Model(...)'updates': 4'optimizer': {'state':...}...

同时,也可以发现,模型文件实际上是一个字典,例如,可以用下面的方式获取某层结构或参数信息:

print(ckpt.model[0].conv.conv) # 打印某层print(ckpt.model[0].conv.conv.state_dict()) # 打印该层参数信息模型加载解读

阅读代码,发现官方在加载模型时,并没有直接torch.load,而是单独写了一个attempt_load函数

def attempt_load(weights, map_location=None): # Loads an ensemble of models weights=[a,b,c] or a single model weights=[a] or weights=a model = Ensemble() for w in weights if isinstance(weights, list) else [weights]: attempt_download(w) ckpt = torch.load(w, map_location=map_location) # load model.append(ckpt['ema' if ckpt.get('ema') else 'model'].float().fuse().eval()) # FP32 model # 适配pytorch不同版本 for m in model.modules(): if type(m) in [nn.Hardswish, nn.LeakyReLU, nn.ReLU, nn.ReLU6, nn.SiLU]: m.inplace = True # pytorch 1.7.0 compatibility elif type(m) is Conv: m._non_persistent_buffers_set = set() # pytorch 1.6.0 compatibility# 如果一个模型就直接返回 if len(model) == 1: return model[-1] # return model else: print('Ensemble created with %s\n' % weights) for k in ['names', 'stride']: setattr(model, k, getattr(model[-1], k)) return model # return ensemble

注意到模型加载完成之后,还有.float().fuse().eval()这样一个操作。

这三个函数功能如下:

float():FP16转换成FP32fuse():将conv和bn层合并,提速模型推理速度eval():eval()是模型进行预测推理时关闭BN(预测数据均值方差计算)和Dropout,从而让结果稳定 训练过程中,BN会不断计算均值和方差,Dropout比例会使一部分的网络连接不进行计算 预测过程中,需要让均值和方差稳定不变化,同时会使所有网络连接参与计算
本文链接地址:https://www.jiuchutong.com/zhishi/299637.html 转载请保留说明!

上一篇:Node.js | 从前端到全栈的必经之路(nodejs如何与前端交互)

下一篇:yolov5源码解析(9)--输出(yolov4源码解读)

  • 北京科技公司logo设计多少钱(北京科技公司是干什么的)

    北京科技公司logo设计多少钱(北京科技公司是干什么的)

  • 真我q3s机身尺寸(真我q3多少寸)

    真我q3s机身尺寸(真我q3多少寸)

  • 网络设置还原到windows初始状态什么意思(网络设置还原到windows初始状态会怎么样)

    网络设置还原到windows初始状态什么意思(网络设置还原到windows初始状态会怎么样)

  • 苹果x怎么看电池寿命(苹果X怎么看电量百分比)

    苹果x怎么看电池寿命(苹果X怎么看电量百分比)

  • 小米10充电速度(小米10充电速度怎么样)

    小米10充电速度(小米10充电速度怎么样)

  • 淘宝默认几天自动收货(淘宝几天后会自动付款)

    淘宝默认几天自动收货(淘宝几天后会自动付款)

  • 微信相机美颜设置方法是什么(微信相机美颜设置方法)

    微信相机美颜设置方法是什么(微信相机美颜设置方法)

  • 华为nova7耳机插哪里(华为nova7耳机插上还是外放)

    华为nova7耳机插哪里(华为nova7耳机插上还是外放)

  • 手机键盘打字卡顿怎么解决(手机键盘打字卡是什么原因)

    手机键盘打字卡顿怎么解决(手机键盘打字卡是什么原因)

  • 机器语言程序在机器内是以什么形式表示(ai编程语言)

    机器语言程序在机器内是以什么形式表示(ai编程语言)

  • 小米手机上hd是什么意思啊(小米手机上面hd)

    小米手机上hd是什么意思啊(小米手机上面hd)

  • 滴滴平台查证期是几天(滴滴车证怎么查询)

    滴滴平台查证期是几天(滴滴车证怎么查询)

  • excel表格怎么排序(excel表格怎么排序123)

    excel表格怎么排序(excel表格怎么排序123)

  • 苹果手机麦克风启用不成功怎么办(苹果手机麦克风权限怎么打开)

    苹果手机麦克风启用不成功怎么办(苹果手机麦克风权限怎么打开)

  • 淘宝店铺几颗心升一钻(淘宝店铺几颗心是一个钻)

    淘宝店铺几颗心升一钻(淘宝店铺几颗心是一个钻)

  • 手机qq如何充q币(手机qq如何充q币划算)

    手机qq如何充q币(手机qq如何充q币划算)

  • 版本更新在哪里(手机版本更新在哪里)

    版本更新在哪里(手机版本更新在哪里)

  • 手机时间长了卡怎么办(手机时间长了卡顿怎么解决华为)

    手机时间长了卡怎么办(手机时间长了卡顿怎么解决华为)

  • 黑鲨分屏设置在哪(黑鲨手机分屏模式)

    黑鲨分屏设置在哪(黑鲨手机分屏模式)

  • 键盘漏电怎么办(电脑键盘漏电怎么处理)

    键盘漏电怎么办(电脑键盘漏电怎么处理)

  • Windows11插耳机没反应怎么办? win11耳机没声音的多种解决办法(win11插耳机没声音)

    Windows11插耳机没反应怎么办? win11耳机没声音的多种解决办法(win11插耳机没声音)

  • 如何设置谷歌Chrome浏览器打开新的标签页为指定网页(New Tab Redirect插件)(如何设置谷歌浏览器语言为中文)

    如何设置谷歌Chrome浏览器打开新的标签页为指定网页(New Tab Redirect插件)(如何设置谷歌浏览器语言为中文)

  • JavaScript鼠标拖动事件监听使用方法及实例效果(javascript移动鼠标)

    JavaScript鼠标拖动事件监听使用方法及实例效果(javascript移动鼠标)

  • 进项税额转出就是要多交税吗
  • 税收滞纳金调增填哪张表
  • 税务师财务与会计难不难
  • 中国注册税务师协会法律法规库
  • 小企业会计准则是什么意思
  • 企业所得税季度预缴
  • 用库存现金支付职工医药费用69元会计人员编制的
  • 员工离职补偿需要计提吗
  • 发现账实不符,第一件事就是要干嘛?
  • 菜场摊位租赁合同
  • 税收滞纳金可以免除吗
  • 财政补贴金额
  • 转租的门面怎么办营业执照
  • 总公司给分公司开发票
  • 季度企业所得税计算公式
  • 支付职工一次性补助
  • 收外汇需要提供什么
  • 运费抵扣的税收筹划是怎样的?
  • 个人所得税申报错误如何更正申报
  • 住房公积金证书更新
  • 代开专票交的城建税怎么申报附加税
  • windows为什么从7开始
  • 电子承兑到期怎样接收
  • 个人股权转让如何申报个人所得税
  • 公司美团提现到个人银行账户会有什么风险吗
  • 存货包括生产成本,在资产负债表中表示
  • 按实际成本结转6日和7日的材料采购成本
  • 承租人对经营租赁的会计分录
  • 蕾德纳斯
  • PHP:mcrypt_module_is_block_algorithm()的用法_Mcrypt函数
  • php发送短信
  • php 图片上传
  • 广告代理费收取比例
  • web全栈工程师是干什么的
  • 营业执照上住所和经营场所
  • 框架 frame
  • php自定义变量的方法是
  • 黄金零售环节增值税的缴纳
  • 开了红字发票申请还要做进项税转出吗
  • 营改增之后增值税怎么算
  • 银行承兑汇票存在的风险
  • 未认证的进项税额会计分录
  • 电子税务局怎么查询开票记录
  • 印花税减免优惠政策2019
  • 原材料的会计处理有哪些
  • sqlserver阻止保存要求重新
  • 集团公司一般怎么称呼
  • 工业企业的会计核算程序
  • 公司支付的劳务费如何走不用交税
  • 下脚料属于什么科目
  • 长期未用的定金可以退吗
  • 以原材料投入资本
  • 开个人普票需要身份证吗
  • 研发费加计扣除申报表怎么填
  • 收到税务局汇算清缴退所得税怎么做账
  • 电子秤计入什么费用
  • 福利补贴制度
  • 查询存储过程中的文件
  • sqlserver高可用集群搭建
  • sqlserver自动更新工资
  • mysql随机选择
  • ubuntu的快捷键
  • 如何将用户加入某个组
  • win7开始菜单找不到启动项
  • ic_launcher.xml
  • s24evmon.exe - s24evmon是什么进程 有什么用
  • win8电脑d盘不见了怎么恢复
  • linux cat命令的用法
  • ie6浏览器兼容模式怎么设置在哪里
  • js中创建函数的方法
  • Node.js中的construct
  • linux查看内存型号与数量
  • 求链表内节点的指针
  • shell 数组变量
  • js中top/parent/frame概述及案例应用
  • shell脚本的实现
  • 考察后多久公示公务员
  • 预缴增值税是否要预缴城建税及附加
  • 应缴增值税
  • 电子税务局申报流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设