位置: 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源码解读)

  • 腾讯QQ新增了哪些表情(腾讯最新qq)

    腾讯QQ新增了哪些表情(腾讯最新qq)

  • adobe flash是什么(adobeflash是什么软件可以删除吗?)

    adobe flash是什么(adobeflash是什么软件可以删除吗?)

  • 微信主题如何设置(微信主题如何设置全局的)

    微信主题如何设置(微信主题如何设置全局的)

  • 苹果长截屏功能在哪里打开(苹果长截屏功能微信)

    苹果长截屏功能在哪里打开(苹果长截屏功能微信)

  • win7显示不满屏(win7显示不满屏幕怎么调整)

    win7显示不满屏(win7显示不满屏幕怎么调整)

  • 苹果8plus内存有128吗(苹果8plus的内存)

    苹果8plus内存有128吗(苹果8plus的内存)

  • 华为gt2跟gt2e有什么区别(华为gt2和gt2e功能对比)

    华为gt2跟gt2e有什么区别(华为gt2和gt2e功能对比)

  • 电脑重装系统是什么意思(电脑重装系统复杂吗)

    电脑重装系统是什么意思(电脑重装系统复杂吗)

  • 表示主程序结束的功能指令是(表示主程序结束的指令是哪一个)

    表示主程序结束的功能指令是(表示主程序结束的指令是哪一个)

  • 邮件超过多久不能撤回(邮件多少天不收会退回去)

    邮件超过多久不能撤回(邮件多少天不收会退回去)

  • 微信拉黑再删除和直接删除有区别吗(微信拉黑再删除后黑名单里也消失了)

    微信拉黑再删除和直接删除有区别吗(微信拉黑再删除后黑名单里也消失了)

  • 天猫预售商品什么意思(天猫预售时间最长多长)

    天猫预售商品什么意思(天猫预售时间最长多长)

  • 耳机音量50分贝是几格(耳机音量30分贝)

    耳机音量50分贝是几格(耳机音量30分贝)

  • 苹果xr电池不耐用怎么办(苹果xr电池寿命掉的快)

    苹果xr电池不耐用怎么办(苹果xr电池寿命掉的快)

  • 微信视频正常多久过期(微信视频时间多长)

    微信视频正常多久过期(微信视频时间多长)

  • 小米平板可以打电话吗(小米平板可以打英雄联盟吗)

    小米平板可以打电话吗(小米平板可以打英雄联盟吗)

  • 陌陌beta已过期怎么办(陌陌该版本已停止服务怎么升级)

    陌陌beta已过期怎么办(陌陌该版本已停止服务怎么升级)

  • ios13特点(iphone 13 新特性)

    ios13特点(iphone 13 新特性)

  • 水印相机如何删除地点(水印相机如何删除已添加地点)

    水印相机如何删除地点(水印相机如何删除已添加地点)

  • 手机上芒果tv二维码在哪里可以找到(手机上芒果tv二维码图片在哪)

    手机上芒果tv二维码在哪里可以找到(手机上芒果tv二维码图片在哪)

  • ipad自带的天气在哪(ipad天气怎么设置城市)

    ipad自带的天气在哪(ipad天气怎么设置城市)

  • 潘塔纳尔湿地的风信子金刚鹦鹉,巴西 (© David Pattyn/Minden Pictures)(潘塔纳尔湿地的主要成因)

    潘塔纳尔湿地的风信子金刚鹦鹉,巴西 (© David Pattyn/Minden Pictures)(潘塔纳尔湿地的主要成因)

  • python中的sum函数是什么意思?(python中的sum函数怎么用)

    python中的sum函数是什么意思?(python中的sum函数怎么用)

  • 公司纳税证明怎么开
  • 个税哪种申报方式计税最好
  • 贴现利息应计入什么费用
  • 本年利润包含增值税吗
  • 不按出资比例取得分红怎么纳税?
  • 保险收入如何做账务处理?
  • 营业外收入的核算内容主要有哪些
  • 支付收购股权款如何做账
  • 购买预付油卡的账务处理
  • 预收账款缴税的计算公式
  • 样品不收钱怎么做会计分录
  • 假的手撕票已经入账了怎么办?
  • 免税企业取得增值税专用发票怎么处理
  • 现金折扣若缴纳增值税,怎么进行会计处理?
  • 蔬菜销售收入免增值税吗
  • 预收房款不征税发票
  • 固定资产装修费用计入房产税吗
  • 收到政府补助用于购买环保设备
  • 本月没开发票怎样报税
  • 未计提印花税会计分录
  • 原始股东减持要交多少税
  • 荣耀x10升级鸿蒙系统好用吗
  • window10安装教程u盘
  • macbookpro安装dmg
  • 材料发票可以抵税吗
  • 什么是减值测试方法
  • php解析xml数据
  • 增值税发票月度统计
  • 小企业会计准则和一般企业会计准则的区别
  • svc语法
  • yolo改进方法
  • 电池成本什么时候能降低
  • 关联公司开发票
  • 保险费的增值税税率
  • wordpress限制下载次数
  • 摊余成本和账面价值
  • 允许从销项税额中扣除的有
  • 事业单位会计制度
  • 付了工资的资产负债表怎么填
  • 利润是非限定净现值吗
  • 跨年度冲红字发票补正账务如何处理
  • 公司个税如何申报流程
  • 小规模纳税人销售不动产适用税率
  • 发票审核中是什么意思
  • 一般纳税人金税盘分录
  • 以前年度的损益调整为负值说明什么
  • 公司注销时财务报表要注意什么
  • 私募基金公司收入高吗
  • 接受捐赠财产净价值属于所有者权益吗
  • 委托加工农产品的扣除率
  • 业务招待费需附上清单
  • 发票入账的时候能作废吗
  • 个人借款产生的利息怎么计算的
  • 房地产公司员工购房
  • 关于数据库的叙述
  • xp系统怎么取消自动关机
  • mac osx 10.12
  • freebsd版本选择
  • centos6开机启动
  • ubuntu 上不了网
  • debian linux教程
  • linux系统概述
  • win8系统怎么设置桌面图标
  • win10切换登陆账户为administrator
  • win7开机错误代码
  • android.system.suspend@1.0-service耗电
  • opengl es3.0metal
  • react父组件触发子组件方法
  • android点击图片跳转页面
  • perl @inc
  • unity3d初学者教程视频
  • Node.js中的construct
  • python ftps
  • javascript中的函数如何理解
  • 细说javascript
  • jquery弹出div遮罩层
  • jquery使用css方法添加图片边框视频教学
  • 合肥房子契税退税
  • 税局退回多交的增值税的账务处理
  • 一巩固三衔接
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设