位置: IT常识 - 正文

yolov5 anchors 中 K-means聚类

编辑:rootadmin
yolov5 anchors 中 K-means聚类 anchors运行trains.py没有生成anchor原因程序kmeans改动(距离、k-means++)运行trains.py没有生成anchor原因

推荐整理分享yolov5 anchors 中 K-means聚类,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

yolov5运行后有一行 autoanchor:

一些教程的生成图如下

训练一开始会先计算Best Possible Recall (BPR),当BPR < 0.98时,再在kmean_anchors函数中进行 k 均值 和 遗传算法 更新 anchors 。

但是我的数据集BPR = 0.9997,所以没有生成新的anchors。 默认的预设anchors很匹配我的训练数据,anchors就不会在更改,就使用预设的。 改了聚类的欧氏距离为iou,和去掉遗传算法,都没有预设的效果好。

yolov5s.yaml anchor:

best.pt 的anchor查看一下和 s 一样

# #################查看模型 的 anchor #######################import torchfrom models.experimental import attempt_loadmodel = attempt_load('runs/train/exp_xxxxxxxxxxxx/weights/best.pt', map_location=torch.device('cpu'))m = model.module.model[-1] if hasattr(model, 'module') else model.model[-1]print(m.anchor_grid)

如果直接使用预设anchors: 训练时命令行添加–noautoanchor,表示不计算anchor,直接使用配置文件里的默认的anchor,不加该参数表示训练之前会自动计算。

程序yolov5 anchors 中 K-means聚类

train.py utils.autoanchor.py 当BPR < 0.98时,再在kmean_anchors函数中进行 k 均值 和 遗传算法 更新 anchors

如果就要看它生成anchor的结果,可以把0.98改为0.9999

kmeans改动(距离、k-means++)

用 kmean_anchors 进行聚类。yolov5中用了kmeans和遗传算法。源代码 Kmeans calculation 欧氏距离聚类和遗传算法。

作者默认使用的k-means方法是scipy包提供的,使用的是欧式距离。 博主改成了基于1-IOU(bboxes, anchors)距离的方法。

kmeans和kmeans++参考博客。k-means++算法,属于k-means算法的衍生,其主要解决的是k-means算法第一步,随机选择中心点的问题。

用聚类算法算出来的anchor并不一定比初始值即coco上的anchor要好,原因是目标检测大部分基于迁移学习,backbone网络的训练参数是基于coco上的anchor学习的,所以其实大部分情况用这个聚类效果并没有直接使用coco上的好!!而且聚类效果跟数据集的数量有很大关系,一两千张图片,聚类出来效果可能不会很好

autoanchor.py

# print(f'{prefix}Running kmeans for {n} anchors on {len(wh)} points...') # s = wh.std(0) # sigmas for whitening # k, dist = kmeans(wh / s, n, iter=30) # points, mean distance # assert len(k) == n, f'{prefix}ERROR: scipy.cluster.vq.kmeans requested {n} points but returned only {len(k)}' # k *= s k = k_means(wh, n)

新建 yolo_kmeans.py

import numpy as np# 这里IOU的概念更像是只是考虑anchor的长宽def wh_iou(wh1, wh2): # Returns the nxm IoU matrix. wh1 is nx2, wh2 is mx2 wh1 = wh1[:, None] # [N,1,2] wh2 = wh2[None] # [1,M,2] inter = np.minimum(wh1, wh2).prod(2) # [N,M] return inter / (wh1.prod(2) + wh2.prod(2) - inter) # iou = inter / (area1 + area2 - inter)# k-means聚类,且评价指标采用IOUdef k_means(boxes, k, dist=np.median, use_iou=True, use_pp=False): """ yolo k-means methods Args: boxes: 需要聚类的bboxes,bboxes为n*2包含w,h k: 簇数(聚成几类) dist: 更新簇坐标的方法(默认使用中位数,比均值效果略好) use_iou:是否使用IOU做为计算 use_pp:是否是同k-means++算法 """ box_number = boxes.shape[0] last_nearest = np.zeros((box_number,)) # 在所有的bboxes中随机挑选k个作为簇的中心 if not use_pp: clusters = boxes[np.random.choice(box_number, k, replace=False)] # k_means++计算初始值 else: clusters = calc_center(boxes, k) # print(clusters) while True: # 计算每个bboxes离每个簇的距离 1-IOU(bboxes, anchors) if use_iou: distances = 1 - wh_iou(boxes, clusters) else: distances = calc_distance(boxes, clusters) # 计算每个bboxes距离最近的簇中心 current_nearest = np.argmin(distances, axis=1) # 每个簇中元素不在发生变化说明以及聚类完毕 if (last_nearest == current_nearest).all(): break # clusters won't change for cluster in range(k): # 根据每个簇中的bboxes重新计算簇中心 clusters[cluster] = dist(boxes[current_nearest == cluster], axis=0) last_nearest = current_nearest return clusters# 计算单独一个点和一个中心的距离def single_distance(center, point): center_x, center_y = center[0] / 2, center[1] / 2 point_x, point_y = point[0] / 2, point[1] / 2 return np.sqrt((center_x - point_x) ** 2 + (center_y - point_y) ** 2)# 计算中心点和其他点直接的距离def calc_distance(boxes, clusters): """ :param obs: 所有的观测点 :param clusters: 中心点 :return:每个点对应中心点的距离 """ distances = [] for box in boxes: # center_x, center_y = x/2, y/2 distance = [] for center in clusters: # center_xc, cneter_yc = xc/2, yc/2 distance.append(single_distance(box, center)) distances.append(distance) return distances# k_means++计算中心坐标def calc_center(boxes, k): box_number = boxes.shape[0] # 随机选取第一个中心点 first_index = np.random.choice(box_number, size=1) clusters = boxes[first_index] # 计算每个样本距中心点的距离 dist_note = np.zeros(box_number) dist_note += np.inf for i in range(k): # 如果已经找够了聚类中心,则退出 if i + 1 == k: break # 计算当前中心点和其他点的距离 for j in range(box_number): j_dist = single_distance(boxes[j], clusters[i]) if j_dist < dist_note[j]: dist_note[j] = j_dist # 转换为概率 dist_p = dist_note / dist_note.sum() # 使用赌轮盘法选择下一个点 next_index = np.random.choice(box_number, 1, p=dist_p) next_center = boxes[next_index] clusters = np.vstack([clusters, next_center]) return clusters

还要多远才能进入你的心

还要多久才能和你接近

本文链接地址:https://www.jiuchutong.com/zhishi/295232.html 转载请保留说明!

上一篇:【Pytorch项目实战】之语义分割:U-Net、UNet++、U2Net(pytorch开源项目)

下一篇:如何配置openai的返回Stream数据并转发到h5页面按markdown格式流式输出(怎么配置opencv)

  • iphonex外屏碎了有必要换吗(iphonex外屏碎了换多少钱)

    iphonex外屏碎了有必要换吗(iphonex外屏碎了换多少钱)

  • 苹果mac截屏快捷键(苹果mac 截屏快捷键)

    苹果mac截屏快捷键(苹果mac 截屏快捷键)

  • 怎么把页眉横线往上移(怎么把页眉横线加粗)

    怎么把页眉横线往上移(怎么把页眉横线加粗)

  • 钉钉看回放老师知道是什么时候看的吗(钉钉看回放老师知道吗?)

    钉钉看回放老师知道是什么时候看的吗(钉钉看回放老师知道吗?)

  • 微信绑定的qq号出现异常怎么办(微信绑定的QQ号疑似被盗)

    微信绑定的qq号出现异常怎么办(微信绑定的QQ号疑似被盗)

  • qlv是什么视频格式(qlv格式和flv格式区别)

    qlv是什么视频格式(qlv格式和flv格式区别)

  • 路由器用户名和密码在哪里查看(路由器用户名和密码忘了怎么查)

    路由器用户名和密码在哪里查看(路由器用户名和密码忘了怎么查)

  • 什么叫漫游聊天记录(漫游是啥啊)

    什么叫漫游聊天记录(漫游是啥啊)

  • 耳机转接线是什么(耳机转接线是什么样子的)

    耳机转接线是什么(耳机转接线是什么样子的)

  • 手机微信接收的文件在哪个文件夹(手机微信接收的pdf文件在哪里找)

    手机微信接收的文件在哪个文件夹(手机微信接收的pdf文件在哪里找)

  • iphone7plus声音小解决方法(iphone7plus声音小很普遍吗)

    iphone7plus声音小解决方法(iphone7plus声音小很普遍吗)

  • ipad电源键在哪里(ipad2018电源键在哪里)

    ipad电源键在哪里(ipad2018电源键在哪里)

  • 快手怎么把视频保存到本地(快手怎么把视频拆分成照片)

    快手怎么把视频保存到本地(快手怎么把视频拆分成照片)

  • 乐视手机怎么拆开(乐视手机怎么拆电池)

    乐视手机怎么拆开(乐视手机怎么拆电池)

  • 手机qq怎么设置透明皮肤(手机qq怎么设置手机型号)

    手机qq怎么设置透明皮肤(手机qq怎么设置手机型号)

  • 手机怎么清空输入法记忆(手机怎么清空输入法常用词)

    手机怎么清空输入法记忆(手机怎么清空输入法常用词)

  • 苹果xr支持多少w充电(苹果XR支持多少w充电器)

    苹果xr支持多少w充电(苹果XR支持多少w充电器)

  • 万能收款码在哪里申请(万能收款码哪个好)

    万能收款码在哪里申请(万能收款码哪个好)

  • 小米手机不能安装微信(小米手机不能安装巅峰极速)

    小米手机不能安装微信(小米手机不能安装巅峰极速)

  • 有锁无面容是什么意思(无面容和有锁机哪个好)

    有锁无面容是什么意思(无面容和有锁机哪个好)

  • ip报头的目的地址表示什么(ip报头包含什么信息)

    ip报头的目的地址表示什么(ip报头包含什么信息)

  • 华为p30和nova5pro对比(华为p30和nova5pro和荣耀20pro)

    华为p30和nova5pro对比(华为p30和nova5pro和荣耀20pro)

  • 三星a70有nfc吗(三星a70nfc能加门禁卡吗)

    三星a70有nfc吗(三星a70nfc能加门禁卡吗)

  • 即显短信是什么(即显短信一般用来干什么的)

    即显短信是什么(即显短信一般用来干什么的)

  • 苹果6p摄像头抖动(苹果6p摄像头抖动怎么办)

    苹果6p摄像头抖动(苹果6p摄像头抖动怎么办)

  • 商业写字楼
  • 增值税加计扣除是什么意思啊
  • 进项税加计抵扣政策
  • 银行应发贷款和实际收到的贷款为什么不一致
  • 如何开银行卡账户
  • 金税盘税务申报
  • 转让不动产取得的收入
  • 半成品委托加工费计入成本还是费用
  • 现金股利什么时候发放
  • 亏损 纳税
  • 受托开发软件产品免征增值税
  • 企业管理咨询有限公司简介
  • 凭证更正方法有哪些
  • 驾校挂靠车辆账务处理?
  • 应付债券利息调整科目理解
  • 出售旧固定资产的税率是多少
  • 传媒公司的成本构成有哪些
  • 合伙制公司有董事会吗
  • 员工报销体检费,发票抬头开个人还是公司
  • 发票打印机的字偏上
  • 营改增后固定资产入账
  • 销售货物运费的增值税率
  • 办公低值易耗品的账务处理
  • 销项负数发票需要抵扣吗
  • 固定资产折旧和累计折旧的区别
  • abs付款是现金吗
  • 企业委托研发过程中发生的研发费用如何加计扣除?
  • 加计抵减10%政策文件
  • 以前年度的其他应付款不用付怎么处理
  • 没有实缴的股份转让要交个人所得税吗
  • 如何在Excel中合并计算
  • 少数股东持股比例
  • 开了红字发票销售方怎么账务处理?
  • 融资租赁货车
  • php 生成验证码
  • win11怎么打开磁盘管理
  • 如何找到您会获得的权限
  • 无偿调入固定资产计提折旧吗
  • 作废的凭证不能恢复吗
  • 无形资产摊销会影响利润吗
  • cuda版本更新
  • 所有者权益期末减期初等于净利润还是利润总额
  • 法国西南部城市
  • 企业会计准则股本
  • vue路由跳转的三种方法
  • yii框架入门
  • php哪本书最好
  • python字典怎么添加值
  • 预收账款需要申请吗
  • Servlet4.0 Response
  • dedecms v6
  • 返利销售的增值税怎么算
  • 个体户电子申报税流程
  • 技术使用费 收费标准
  • 企业所得税的营业收入怎么填
  • 建筑企业分项目信息采集表怎么填
  • 会计上视同销售的八种情况是哪些?
  • 预收账款的核算处理
  • 如何处理固定资产报废
  • 装修公司预收款要交增值税吗
  • 成本结转怎么做分录
  • 小规模季报成功后怎么缴费
  • 老板个人借款要纳税吗
  • 财务费用包括哪几项
  • 企业应该设置几个安全管理人员
  • vista电脑密码忘了怎么解除
  • win8默认输入法设置
  • linux pwdx命令
  • centos nis
  • outpost.exe - outpost是什么进程 有什么用
  • 正二十面体怎么建模
  • opengl粒子系统烟花
  • shell脚本的fi
  • Node.js中的全局对象有
  • shell正则表达式匹配文件名
  • jquery操作元素样式
  • android系统启动流程
  • js解析json字符串获取key
  • 安卓登录界面布局设计
  • 神马电力几号发行
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设