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

  • 博客怎样进行推广(博客怎样进行推销)

    博客怎样进行推广(博客怎样进行推销)

  • 华为畅享8plus参数配置(华为畅享8plus)(华为畅享8 plus手机参数)

    华为畅享8plus参数配置(华为畅享8plus)(华为畅享8 plus手机参数)

  • 微信怎么修改手机号码绑定(微信怎么修改手机电话)

    微信怎么修改手机号码绑定(微信怎么修改手机电话)

  • 苹果13系统自动亮度调节在哪里(苹果13系统自动锁屏在哪里设置)

    苹果13系统自动亮度调节在哪里(苹果13系统自动锁屏在哪里设置)

  • 什么叫应用程序域(什么叫应用程序的模板)

    什么叫应用程序域(什么叫应用程序的模板)

  • 噪声会干扰声呐探测系统吗(噪声对人的干扰不仅和声压级有关,而且和频率也有关)

    噪声会干扰声呐探测系统吗(噪声对人的干扰不仅和声压级有关,而且和频率也有关)

  • 腾讯会议开会是视频吗(腾讯会议开会是怎么改名称)

    腾讯会议开会是视频吗(腾讯会议开会是怎么改名称)

  • 键盘抽屉尺寸是多少(键盘抽屉太短怎么改)

    键盘抽屉尺寸是多少(键盘抽屉太短怎么改)

  • 苹果激活一直正在安装(苹果激活一直正在连接)

    苹果激活一直正在安装(苹果激活一直正在连接)

  • 如何关闭qq随心贴(如何关闭qq随心贴展示)

    如何关闭qq随心贴(如何关闭qq随心贴展示)

  • 钉钉可以看到学生手机屏幕吗(钉钉可以看到学生的脸吗)

    钉钉可以看到学生手机屏幕吗(钉钉可以看到学生的脸吗)

  • 嘀嗒出行的邀请码是什么(嘀嗒出行邀请接单啥意思)

    嘀嗒出行的邀请码是什么(嘀嗒出行邀请接单啥意思)

  • 怎么在word里面画横线(怎么在word里面插目录)

    怎么在word里面画横线(怎么在word里面插目录)

  • 为什么苹果手机下载不了soul(为什么苹果手机无线局域网打不开)

    为什么苹果手机下载不了soul(为什么苹果手机无线局域网打不开)

  • 乐视手机怎么解绑账号(乐视手机怎么解除账号)

    乐视手机怎么解绑账号(乐视手机怎么解除账号)

  • 抖音怎么用原账户登录(抖音原账号)

    抖音怎么用原账户登录(抖音原账号)

  • iphone11有无线耳机吗(苹果11用无线耳机)

    iphone11有无线耳机吗(苹果11用无线耳机)

  • 抖音视频怎么去水印(抖音视频怎么去原声)

    抖音视频怎么去水印(抖音视频怎么去原声)

  • bkkal00是什么型号(bkl -al00是什么型号手机)

    bkkal00是什么型号(bkl -al00是什么型号手机)

  • GHOST不认硬盘或系统安装一半不能安装了该怎么办?(ghost读不出硬盘)

    GHOST不认硬盘或系统安装一半不能安装了该怎么办?(ghost读不出硬盘)

  • 葛根泡水喝的七大功效(图文)(葛根泡水喝的七大功效)

    葛根泡水喝的七大功效(图文)(葛根泡水喝的七大功效)

  • 2023英伟达显卡排名天梯图(已更新)(2023英伟达显卡天梯图完整版)

    2023英伟达显卡排名天梯图(已更新)(2023英伟达显卡天梯图完整版)

  • 已抵扣进项税额转出怎么申报
  • 收到投资款要交企业所得税吗为什么
  • 个体工商户是否跨省经营
  • 简易计税差额抵扣
  • 金蝶余额调节表怎么看当月的
  • 财务如何审核合同支付条款风险
  • 报价含税和不含税哪个划算
  • 零售业进销差价会计分录实例
  • 幼儿园伙食收支盈亏比例
  • 自然人纳税人识别号查询
  • 个税手续费返还政策最新规定2023
  • 生产成本明细科目是原材料的名称吗
  • 小规模公司退税
  • 公司预存话费应该怎么做会计处理?
  • 非货币性资产交换损益计算
  • 一般纳税人注销公司麻烦吗
  • 劳务税能不能抵扣
  • 免税和不征税货一样吗
  • 企业所得税季报填报说明
  • 免租要怎么交税
  • 白酒五行属火还是水
  • 以实物投资的税种有哪些
  • 外包的人力费用包括哪些
  • 物业管理体现在哪些地方
  • 税务局减免的税金会计分录
  • 小企业销售费用包括
  • 废旧物资收购价目表
  • 床垫专票可以抵扣吗
  • linux中rm命令详解
  • 电脑系统权限管理在哪里
  • 安装win7教程
  • macbookpro怎么打开活动监视器
  • php字符串定义的三种方式
  • 用应付票据付应收账款
  • 房地产公司股权收购
  • 应付职工薪酬包括个人社保和个税吗
  • 旅行社的会计
  • 餐饮行业采购
  • mp3格式最高音质
  • 研发费用加计扣除新税收政策
  • 应税消费品属于什么科目
  • 金蝶专业版怎么用
  • 史上伟大电影
  • 存根联明细是自动生成
  • gin框架使用案例
  • 税率开成0了怎么办
  • 开票资料更改
  • 合营企业和联营企业是关联方吗
  • 公司一般户需要年检吗
  • vs2015安装方法
  • 公司没有账套怎么做账
  • 应付职工薪酬的含义
  • 缴纳车辆购置税有发票吗
  • 银行汇票与商业汇票的本质不同
  • 企业征收所得税会计分录
  • 怎么调整应收账款分录
  • 分红做什么会计分录
  • 小规模收入不超过多少不用交税
  • 安装freebsd
  • win10选择一个选项
  • 怎么自己安装windows7
  • vim的配置文件名
  • win8如何使用网页版的onedrive
  • win7网络正常网页打不开是什么原因
  • Windows RT 8.1 Update 3九月发布 届时将加入改进版锁屏
  • linux isolcpus
  • Win10用户狂喷微软:更新日志功能还没加上去
  • win7无法登录桌面
  • raid磁盘阵列教程
  • perl如何使用
  • Windows下自动备份MongoDB的批处理脚本
  • pygame有哪些函数
  • opengl绘制坐标轴
  • shell 循环 for
  • 常用的jquery鼠标事件
  • jsp页面显示日历控件
  • unity游戏开发常用技术
  • nodejs实现微信公众号发红包
  • android入门教程
  • webpack循环引用
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设