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

  • 华为mate30pro手机的重量是多少(华为mate30pro手机壳)

    华为mate30pro手机的重量是多少(华为mate30pro手机壳)

  • miui12如何设置图标大小(miui12怎么在桌面上放图片框)

    miui12如何设置图标大小(miui12怎么在桌面上放图片框)

  • 怎么将word只读模式取消(怎么将word只读模式转为可修改模式)

    怎么将word只读模式取消(怎么将word只读模式转为可修改模式)

  • iphone a1586是苹果几(a1586是苹果哪个型号)

    iphone a1586是苹果几(a1586是苹果哪个型号)

  • 微信能恢复多久的聊天记录(微信能恢复多久的转账记录)

    微信能恢复多久的聊天记录(微信能恢复多久的转账记录)

  • 美图秀秀拍视频能拍多久(美图秀秀拍视频没保存怎么找回)

    美图秀秀拍视频能拍多久(美图秀秀拍视频没保存怎么找回)

  • 苹果8跟se有什么区别(苹果8和se1)

    苹果8跟se有什么区别(苹果8和se1)

  • 红米note8pro有红外吗(红米note8pro亮点和槽点)

    红米note8pro有红外吗(红米note8pro亮点和槽点)

  • 三星优思版和行货差距(三星优思版和行业版区别)

    三星优思版和行货差距(三星优思版和行业版区别)

  • 华为p40多少寸(华为p40多少寸的手机屏幕)

    华为p40多少寸(华为p40多少寸的手机屏幕)

  • 美团永久封禁,怎么办(美团永久封禁 能封多长时间)

    美团永久封禁,怎么办(美团永久封禁 能封多长时间)

  • 抖音可以屏蔽关键词吗(抖音可以屏蔽关键词视频吗)

    抖音可以屏蔽关键词吗(抖音可以屏蔽关键词视频吗)

  • iphonex控制中心怎么打开(iphonex控制中心拉不出)

    iphonex控制中心怎么打开(iphonex控制中心拉不出)

  • iphonexs外放有杂音滋滋(iphonexs外放有破音声)

    iphonexs外放有杂音滋滋(iphonexs外放有破音声)

  • 电脑b站怎么下载视频缓存(电脑b站怎么下载原神)

    电脑b站怎么下载视频缓存(电脑b站怎么下载原神)

  • shine是什么意思(英文shine是什么意思)

    shine是什么意思(英文shine是什么意思)

  • 恋爱记app怎么解除关系(恋爱记app怎么解除关系卡情侣)

    恋爱记app怎么解除关系(恋爱记app怎么解除关系卡情侣)

  • iqoo背光灯在哪里设置(iqoo1背面灯怎么设置)

    iqoo背光灯在哪里设置(iqoo1背面灯怎么设置)

  • qq如何设置亲密关系(qq怎么设置亲密关系)

    qq如何设置亲密关系(qq怎么设置亲密关系)

  • oppoa5锁屏时间怎么改成横的(oppoa5锁屏时间位置移动)

    oppoa5锁屏时间怎么改成横的(oppoa5锁屏时间位置移动)

  • 抖音直播能看回放么(抖音直播能看回放吧)

    抖音直播能看回放么(抖音直播能看回放吧)

  • PS如何画带虚线的箭头和虚线箭头(用ps怎么画虚线)

    PS如何画带虚线的箭头和虚线箭头(用ps怎么画虚线)

  • 小米9怎么设置防口袋触碰(小米9怎么设置老人模式)

    小米9怎么设置防口袋触碰(小米9怎么设置老人模式)

  • p30耳机型号(华为p30耳机是国标还是美标)

    p30耳机型号(华为p30耳机是国标还是美标)

  • 苹果xsm电池百分比在哪里(苹果xsm手机电池容量)

    苹果xsm电池百分比在哪里(苹果xsm手机电池容量)

  • 住宿业的小规模纳税标准
  • 个人所得税怎么申报退税
  • 附加税税率分别是多少
  • 小规模纳税人不开票收入怎么报增值税
  • 综合所得申报怎么作废
  • 小企业会计准则2023电子版
  • 成本核算的三种基本方法
  • 企业关联方利息支出税前扣除的标准扣除
  • 两免三减半的概率是多少
  • 报销粘贴单怎么写
  • 长期股权投资的交易费用计入哪里
  • 现金日记账年结模板
  • 质保期内质量问题
  • 职工培训费进项能抵扣吗
  • 年终红包怎么入账
  • 企业股权投资损失
  • 离职补偿金要交个税的例子
  • 预缴纳税申报怎么报
  • 理财赎回本金没赎回利息咋办
  • 资源税进什么科目
  • 契税纳税义务发生时间税屋
  • 个体工商户变更法人
  • 租金收入发票税目
  • 企业支付微信认证怎么弄
  • 微软发布新windows
  • 预存500抵扣1000是几折活动?
  • php获取农历日期
  • php创建二维数组
  • 招标公司在招标过程中的注意事项
  • php的面向对象
  • uniapp自定义组件模式
  • 资产负债所有者权益损益类会计科目
  • 临时工工资计入哪里
  • php中\n
  • 微信小程序如何删除
  • 其他应付款的项目
  • 机器学习中的数学原理——过拟合、正则化与惩罚函数
  • php隐藏跳转
  • 个人的无形资产
  • 增值税专用发票几个点
  • 进什么税额
  • 织梦怎么改网站主页
  • 收到餐饮费专用发票会计分录
  • 跨月已计入费用后收到发票
  • 怎么填红字信息表
  • 发放工资的转账支票收款人
  • sqlserver2008数据库备份和恢复步骤
  • 固定资产计入管理费用就不用折旧了吗
  • 所得税 补税
  • 应交税费和应交增值税的关系
  • 经营过程中借股怎么处理
  • 对于在某一时点履行的履约义务,企业应当在客户
  • 机票差额发票和全额发票的区别
  • 弃置费用预计负债的会计处理
  • 捐赠货物的账务处理和纳税调整
  • 公司员工借款后还款收据怎么填
  • 投资收益 增加
  • 企业生育津贴发放细则
  • 损益类科目增加记哪方
  • 以前年度损益调整属于哪类科目
  • 企业为什么要进行绩效管理?
  • 中小企业筹资渠道和筹资方式
  • 公司委托公司收款范本
  • sql server连接方式
  • win8.1电脑设置在哪里
  • xp怎么删除电脑系统
  • awk命令的功能是什么
  • linux 清除垃圾
  • 用unity做2d游戏
  • 命令行批处理文件
  • 命令行net
  • jquery validation plugin
  • 手把手教你用python破解wifi
  • javascript总结笔记
  • JavaScript的removeChild()函数用法详解
  • 海南海葬需要多少费用
  • 十大经济
  • 国家税务总局2011年34号公告
  • 2020年个税截止时间
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设