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

  • vivox70pro怎么拍月亮(vivox70pro怎么拍log模式)

    vivox70pro怎么拍月亮(vivox70pro怎么拍log模式)

  • 苹果13promax怎么安装软件(苹果13promax怎么强制重启)

    苹果13promax怎么安装软件(苹果13promax怎么强制重启)

  • iwatch7怎么看照片(applewatch怎么看全部照片)

    iwatch7怎么看照片(applewatch怎么看全部照片)

  • 荣耀x10有屏幕指纹解锁吗(荣耀x10屏幕指纹解锁怎么设置)

    荣耀x10有屏幕指纹解锁吗(荣耀x10屏幕指纹解锁怎么设置)

  • 理正勘察无法启用CAD(win10理正勘察无法启用cad)

    理正勘察无法启用CAD(win10理正勘察无法启用cad)

  • 微信的健康码在哪里找(微信上健康码在哪)

    微信的健康码在哪里找(微信上健康码在哪)

  • 抖音直播间怎么隐身(抖音直播间怎么设置观众的隐私)

    抖音直播间怎么隐身(抖音直播间怎么设置观众的隐私)

  • hdd1000g什么意思(hd是多少g)

    hdd1000g什么意思(hd是多少g)

  • 差评对于天猫重要吗(给天猫店差评买家的评价管理会显示吗)

    差评对于天猫重要吗(给天猫店差评买家的评价管理会显示吗)

  • 表格中怎么复制一竖列(表格中怎么复制同样的内容到一列)

    表格中怎么复制一竖列(表格中怎么复制同样的内容到一列)

  • 华为手机屏幕出现一个圆点(华为手机屏幕出现条纹怎么自修)

    华为手机屏幕出现一个圆点(华为手机屏幕出现条纹怎么自修)

  • qq情侣标识别人能看见吗(扣扣情侣标识别人能看到吗)

    qq情侣标识别人能看见吗(扣扣情侣标识别人能看到吗)

  • 三星s20支持内存卡吗(三星s20支持内存卡扩展吗)

    三星s20支持内存卡吗(三星s20支持内存卡扩展吗)

  • qq电话可以听回放吗(qq电话可以回听吗)

    qq电话可以听回放吗(qq电话可以回听吗)

  • 怎么去掉word修订模式(怎么去掉word修订红线)

    怎么去掉word修订模式(怎么去掉word修订红线)

  • 手机邮箱格式怎么写(手机邮箱格式怎么写QQ)

    手机邮箱格式怎么写(手机邮箱格式怎么写QQ)

  • mate30怎么插卡(华为mate30怎样插卡)

    mate30怎么插卡(华为mate30怎样插卡)

  • 抖音忘记密码怎么打开(抖音忘记密码怎么办)

    抖音忘记密码怎么打开(抖音忘记密码怎么办)

  • vivo手机视频通话怎么美颜

    vivo手机视频通话怎么美颜

  • 0pp0r17后盖能更换其他材料吗(oppor17pro后盖更换)

    0pp0r17后盖能更换其他材料吗(oppor17pro后盖更换)

  • oppor17支持多少w快充(oppor17支持多少瓦)

    oppor17支持多少w快充(oppor17支持多少瓦)

  • win10怎么看已安装更新(win10怎么看已安装的驱动)

    win10怎么看已安装更新(win10怎么看已安装的驱动)

  • Win7网络无法加载远程访问连接管理器服务?(windows7网络无法连接)

    Win7网络无法加载远程访问连接管理器服务?(windows7网络无法连接)

  • Html5钢琴块游戏制作(音乐游戏)(钢琴块小游戏在线玩)

    Html5钢琴块游戏制作(音乐游戏)(钢琴块小游戏在线玩)

  • Vue3 reactive丢失响应式问题(vuex状态丢失)

    Vue3 reactive丢失响应式问题(vuex状态丢失)

  • 税务局退给企业的多交的所得税该怎样帐务处理?
  • 个人注册电子税务局
  • 如何进行增值税发票认证
  • 年度所得税汇算清缴操作流程
  • 库存商品结转成本摘要怎么写
  • 以前未入账固定资产补入账涉及的房产税
  • 金税三期电子发票怎么领取
  • 新办企业一定要社保登记吗
  • 税费漏报
  • 政府补助计入资本公积是老准则吗
  • 废品损失一般不由本月生产的产品成本负担
  • 合并利润表抵消事项包括
  • 酒店业小规模纳税人可以享受2023年应纳税额抵减政策吗
  • 管理费用中的水费电费在纳税申报表A104000
  • 公司增值税发票有限额吗
  • 离线开票时间超限怎么办 发票都已经报送
  • 出口退税预审在申报系统怎么做
  • 查账征收的成本费用
  • 勒索病毒文件怎么恢复
  • 出租车收税吗
  • 怎么批量给指定条件加入批注
  • 房产税如何进行计提
  • 工会经费会计分局
  • 以房抵债房屋能否判决过户
  • php数组可以使用哪些键名
  • 补交上一年度的养老保险
  • 未分配收益余额在哪方
  • 手机短信是哪一年开始的
  • 白沙国家公园中标公告
  • 设备拆修痕迹影响大吗
  • 过拟合能不能从根本上解决
  • mac环境搭建
  • web防盗链
  • 机器学习篇-指标:AUC
  • nn.lstm输出
  • 深入vue3+typescript技术栈
  • react_router
  • Yii2中DropDownList简单用法示例
  • 进口增值税科目
  • phpcms安装无法连接数据库服务器
  • 扶贫资金入股问题
  • js数组 filter
  • 存货暂估入账会计分录
  • mysql的一些命令
  • 商品流通企业的含义
  • 支付给个人的佣金没有发票
  • 费用支出要求
  • 开专票还是开发票
  • 核定征收的企业所得税怎么算
  • 专用发票和普通发票 报销
  • 实收资本印花税最新政策2023年
  • 电费已支付未充值
  • 未开票的收入如何确认分录
  • 当月的进项票可以下月做账吗
  • 驾校挂靠车辆账务处理是?
  • 小规模增值税减免
  • 会计计量属性主要包括()
  • 保险赔偿收入如何减税额
  • 农民专业合作社属于什么经济类型
  • 企业装卸费抵扣怎么做账
  • 账面余额与账面净值
  • 被征用的不动产或者动产使用后应当怎样
  • win7经典版怎么换回win10
  • win10预览版好吗
  • 神之浩劫能玩吗
  • win8系统优化
  • win7适用ie几
  • windows7系统下给WORD2010设置打开密码的方法
  • JavaScript数组去重
  • nodejs示例
  • android游戏开发框架
  • input和button按钮合到一起
  • career和calling的区别
  • android download(international)
  • 深入解析windows第7版pdf
  • 怎么监控键盘输入
  • centos6.5设置网络
  • 四川 国税
  • 德税手卷烟海淘
  • 一般纳税人财务报表月报还是季报
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设