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

  • 他通过几个月学会了移动营销 只因知道这3点(通过几个月的努力取得了明显的成绩修改病句)

    他通过几个月学会了移动营销 只因知道这3点(通过几个月的努力取得了明显的成绩修改病句)

  • 手机怎么连接音响usb插口怎么没用(手机怎么连接音箱)

    手机怎么连接音响usb插口怎么没用(手机怎么连接音箱)

  • 电话号码不用了怎么注销(电话号码不用了微信怎么登录)

    电话号码不用了怎么注销(电话号码不用了微信怎么登录)

  • 2020微信退群群里会有提示吗(微信退群群里的人知道吗)

    2020微信退群群里会有提示吗(微信退群群里的人知道吗)

  • 淘宝退货方式上门取件什么意思(淘宝退货方式上门取件、寄件点自寄的区别)

    淘宝退货方式上门取件什么意思(淘宝退货方式上门取件、寄件点自寄的区别)

  • 魅族17有没有无线充电(魅族17带nfc吗)

    魅族17有没有无线充电(魅族17带nfc吗)

  • 华为beam功能是什么(华为bey)

    华为beam功能是什么(华为bey)

  • 作业帮什么时候创立的(作业帮什么时候发工资)

    作业帮什么时候创立的(作业帮什么时候发工资)

  • 刷机和出厂设置有什么区别吗(刷机和出厂设置一样吗)

    刷机和出厂设置有什么区别吗(刷机和出厂设置一样吗)

  • 抖音号权重什么意思(抖音权重什么时候更新)

    抖音号权重什么意思(抖音权重什么时候更新)

  • 防火墙自身会不会被攻击(防火墙自身不需要抵抗攻击)

    防火墙自身会不会被攻击(防火墙自身不需要抵抗攻击)

  • ipad6代是什么型号(ipad6代是几代)

    ipad6代是什么型号(ipad6代是几代)

  • 手机左边的按键是什么(手机左边的按键按不了怎么办)

    手机左边的按键是什么(手机左边的按键按不了怎么办)

  • word2003页面背景在哪(word2003页面背景在哪里)

    word2003页面背景在哪(word2003页面背景在哪里)

  • 手机如何设置自动关机(手机如何设置自动拨号)

    手机如何设置自动关机(手机如何设置自动拨号)

  • 手机设备名称怎么看(手机设备名称怎么自动改了呢)

    手机设备名称怎么看(手机设备名称怎么自动改了呢)

  • 一加7T Pro如何查看内存使用情况(一加7怎么检查是不是翻新机)

    一加7T Pro如何查看内存使用情况(一加7怎么检查是不是翻新机)

  • 手机关机了怎么定位(手机关机了怎么找到手机)

    手机关机了怎么定位(手机关机了怎么找到手机)

  • xr有nfc功能吗(苹果xr如何设置nfc门禁卡)

    xr有nfc功能吗(苹果xr如何设置nfc门禁卡)

  • oppo一键搬家到sd卡(oppoa37一键搬家到sd卡)

    oppo一键搬家到sd卡(oppoa37一键搬家到sd卡)

  • 小红书买的东西怎么查(小红书买的东西别人能看到吗)

    小红书买的东西怎么查(小红书买的东西别人能看到吗)

  • 怎么取消美团会员自动续费(怎么取消美团会员红包)

    怎么取消美团会员自动续费(怎么取消美团会员红包)

  • 电脑记事本在哪个文件夹(电脑记事本在哪里打开)

    电脑记事本在哪个文件夹(电脑记事本在哪里打开)

  • 目标检测算法——垃圾分类数据集汇总(附下载链接)(目标检测算法的主要目的是找到图像中用户感兴趣的)

    目标检测算法——垃圾分类数据集汇总(附下载链接)(目标检测算法的主要目的是找到图像中用户感兴趣的)

  • 代销商品的手续费税率是多少
  • 所得税损益类科目包括
  • 城市维护建设税为什么是流转税
  • 贷方账户日累计金额超限怎么办
  • 发生了原材料运进和成品运出,但并未发生所有权
  • 合并报表盈余公积等于母公司盈余公积
  • 对方开具红字发票信息表后我们怎么开负数
  • 小型微利企业年应纳税所得额不超过100万元的部分
  • 银行提备用金怎么提
  • 其他综合收益税后
  • 没有抵扣的进项发票,开错了对方没有作废
  • 残疾人就业保障金征收使用管理办法
  • 煤矸石算能源吗
  • 利润分配的核算PPT
  • 上缴财政收入怎么做账
  • 无形资产应当按照公允价值进行初始计量吗
  • 外购已税什么意思
  • 营改增后销售不动产的收入
  • 以前年度社保计提出错了怎么调整
  • 银行询证函费用计入财务费用还是管理费用
  • 公司租房子出去物业费可以代付吗
  • 分公司清算和总公司清算
  • 收到的财政补贴如何做账
  • 公对公转账银行拒绝是什么意思
  • 报关单增值税税单收货人更改
  • 已认证未抵扣进项税如何做账
  • 酒生产车间
  • 如何开具红字专用发票信息表
  • 员工个人学历教育费用不能在企业所得税前列支
  • 建筑材料发票备注栏没写工程名称和工程地点能用吗
  • 收入负数怎么分录
  • 银行承兑电子汇票到期要怎么操作
  • 养殖专业合作社业务范围包括哪些
  • 联想旧电脑怎么连接wifi
  • php smarty
  • windows无法配置用户文件
  • 冲回上年多提的费用会计分录
  • 差额征收是啥意思
  • 化妆品与药品
  • 在企业兼并时,被兼并企业价值评估的最适用假设是
  • 政府性基金和行政事业性收费区别
  • 井冈山游击队的口号
  • 聊聊vue3的defineProps、defineEmits、defineExpose
  • 有意义的分享
  • 计算模型的层次划分
  • 消费税购置税价格一样
  • 缴纳医疗保险费会计分录
  • 小企业的流动资产
  • 个体户开普票有没有完税证明
  • 尾款忘记支付,交易关闭怎么办
  • 税金及附加如何预测
  • 收到发票未收到货物
  • 取得虚开增值税专用发票罪量刑标准
  • 税控服务费如何入账
  • 外经证报验登记流程
  • 城投公司是什么东西
  • 缴纳房产税如何做账务处理
  • 企业购买原材料属于什么活动
  • 小规模纳税人购入货物收到增值税专用发票
  • 场地租赁都需要交什么税
  • xp系统运行怎么打开
  • unsecapp.exe - unsecapp是什么进程
  • 电脑系统安装流程
  • win8录音文件保存在哪
  • 升级 win10
  • win10升级后小娜不能用
  • Win10 Mobile 10586.29重要更新 可以玩wp7中的游戏
  • windows8开机启动项在哪里设置
  • windows10总是弹出用户账户控制
  • listview安卓
  • perl $?
  • shell脚本自动化
  • jquery mobile开发环境
  • bootstrap的表格
  • javascript基础书
  • jquery基础知识梳理
  • 个税申报网上操作步骤
  • 上海社保联网
  • 如何打印个税缴纳记录
  • 税务机关支部活动方案
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设