【目标检测】Anchor-based模型:基于K-means算法获取自制数据集的Anchor(yolo源码)

news2024/11/18 16:24:02

在Anchor-based目标检测模型中,根据数据集选择合适的Anchor有利于加快模型的收敛速度以及减少模型的边框预测误差。本篇文章首先介绍Anchor在目标检测模型中的作用;然后介绍K-means聚类算法;最后介绍yolo源码自制数据集的Anchor的获取方法。

本文目录

  • 1 Anchor的理解
  • 2 K-means聚类算法
  • 3 基于K-means获取自制数据集Anchor
    • Anchors获取
    • Anchors评价
    • Anchors更新(遗传算法)

1 Anchor的理解

  在Anchor-based目标检测模型中(SSD,YOLO v3/v4/v5等),其通过预先设定的具有不同宽高比尺度的Anchor得到目标的粗略边框,并训练回归参数对Anchor进行修正以得到目标的准确边框。以YOLOv5为例,其基于Anchor的检测流程如图1所示,在不同尺度的输出特征图使用不同尺度的Anchor实现对不同大小目标的检测,在一个检测单元中,使用不同宽高比的Anchor对目标进行预测。

  • 在较大的特征图上使用较小的Anchor,实现对小目标的检测;
  • 在中等的特征图上使用中等的Anchor,实现对中等大小目标的检测;
  • 在较小的特征图上使用较大的Anchor,实现对大目标的检测;

在这里插入图片描述

图1 Anchor设定方法

  在目标检测模型中,目标的类别预测结果不会随着其在图像中位置的改变而改变;但目标的边框信息会随着其在图像中位置的改变而改变,通过设定Anchor,实现目标边框对Anchor的偏移量预测,该偏移量不会随着目标在图像中位置的改变而改变,更有利于模型的回归,符合神经网络位移不变性
  模型在训练中,根据Anchor和目标实际边框之间的IoU大小,分配用于检测该目标的Anchor。根据数据集科学的设置Anchor有利于加快模型训练时的收敛速度减少模型对目标的漏检率

2 K-means聚类算法

  K-means是最常见的聚类算法,算法接受未标记的数据集,然后将数据聚集成不同的组,其方法如下:

  1. 首先选取K个随机的点,作为聚类中心;
  2. 对于数据集中的每一个数据,计算其与聚类中心点的距离,并将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类;
  3. 计算每一类的平均值,将该类的中心点移动到平均值的位置;
  4. 重复步骤2-3,直到中心点不再改变。
    在这里插入图片描述
图2 K-means分类示例

3 基于K-means获取自制数据集Anchor

Anchors获取

基于Scipy库中的kmeans函数计算K-means聚类(kmean_anchors)

  • 输入:shapes(原图大小),labels(图像标签),n(聚类中心点个数),img_size(模型训练图像大小)
  • 输出:anchors(在模型训练图像上的绝对大小)
def kmean_anchors(shapes, labels, n=9, img_size=640):
	'''
	shapes: 数据集图像大小
	labels: 数据集标签 [N, 5] 5->(cls, x, y, w, h)(相对大小) 
	n: Anchors数量(在img_size上绝对大小)
	img_sie:模型训练图像大小
	'''
	from scipy.cluster.vq import kmeans # 导入kmeans函数, 返回-> k:Anchors; distortion:每一类内点到中心点的平均距离
	
	# 数据集图像输入模型的大小(保持原图比例, 长边缩放为img_size)
	shapes = img_size * shapes / shapes.max(1, keepdims=True)
	# 得到所有目标的边框(在输入图像上绝对大小)
	wh0 = np.concatenate([l[:, 3:5] * s for s, l in zip(shapes, labels)]) 
	# 滤除边框像素过小的目标
	wh = wh0[(wh0 >= 2.0).any(1)].astype(np.float32)
	# K-means
	try:
		assert n <= len(wh)  # 中心点个数应小于等于边框数目
		s = wh.std(0)  # 坐标标准差
		k = kmeans(wh / s, n, iter=30)[0] * s  # points
		assert n == len(k) # # kmeans 可能无法找到足够的点,若输入数据太少或太小
		except Exception:
			k = np.sort(npr.rand(n * 2)).reshape(n, 2) * img_size  # 随机初始化
	k = k[np.argsort(k.prode(1))]  # 根据面积从小到大对得到的Anchors进行排序
	print('Anchors:', k)

  随机生成300点,使用以上函数得到的聚类结果示例如图3所示。
在这里插入图片描述

图3 聚类结果示例图

Anchors评价

  在YOLO中,判断Anchors与目标边框是否匹配有以下两种指标:

  • 根据Anchors和目标实际边框的宽高比(r > anchors_t)
  • 根据Anchors和目标实际边框的IoU(iou > iou_t)
def metrix(k, wh, m='ratio', thr=0.25):
	k = k[np.argsort(k.prod(1))]  # 根据面积从小到大对得到的Anchors进行排序
	r = wh[:, None] / k[None]  # 计算目标与所有Anchor的宽高比
	# 目标匹配的所有Anchors
	if m == 'ratio':  # 宽高比指标
		x = torch.min(r, 1 / r).min(2)[0]  # 计算所有宽高比的最小值:目标/Anchors; Anchors/目标
	elif m == 'iou':  # iou指标
		x = wh_iou(wh, k)
	best = x.max(1)[0]  # 目标匹配的所有Anchors, 目标匹配的最好Anchor(大小最接近)
	fitness = (best * (best > thr).float()).mean()  # fitness[0, 1], 反映目标实际边框与Anchors的匹配情况
	return x, best, fitness

def print_result(x, best, thr=0.25, img_size=640):
	bpr, aat = bpr, aat = (best > thr).float().mean(), (x > thr).float().mean() * n  # 最好的匹配结果, 所有匹配结果
    s = f'{PREFIX}thr={thr:.2f}: {bpr:.4f} best possible recall, {aat:.2f} anchors past thr\n' \
        f'n={n}, img_size={img_size}, metric_all={x.mean():.3f}/{best.mean():.3f}-mean/best, ' \
        f'past_thr={x[x > thr].mean():.3f}-mean: '
    # 添加Anchors信息
    for x in k:
        s += '%i,%i, ' % (round(x[0]), round(x[1]))
    print(s[:-2])

Anchors更新(遗传算法)

根据评价指标,基于遗传算法更新Anchors,以得到在数据集中表现最好的Anchors

def ga_anchors(k, wh, gen=1000):
	_, _, f = metrix(k, wh)
	sh, mp, s = k.shape, 0.9, 0.1  # 遗传算法中系数更新
	for _ in range(gen):
		v = np.ones(sh)  # 随机更新系数
		while (v==1).all():
			v = ((np.random.random(sh) < mp) * random.random() * npr.randn(*sh) * s + 1).clip(0.3, 3.0)
		kg = (k.copy() * v).clip(min=2.0)  # 根据系数构造新的Anchors
		_, _, fg = metrig(kg, wh)  # 计算新的fitness
		if fg > f:  # 若效果更好, 则更新k
			f, k = fg, kg.copy()  
			print('Evolving anchors with Genetic Algorithm: fitness = {f:.4f}')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1378666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业如何做到安全又极速的分发传输大文件

在当代企业运营中&#xff0c;文件的传输和分发是至关重要的任务。然而&#xff0c;随着文件体积的增大和信息敏感性的凸显&#xff0c;企业需要找到一种既安全又能够高效传输大文件的方法。本文将深入探讨如何在企业环境中实现安全又高效的大文件传输。 一、分发大文件时需要注…

.NET core 中的Kestrel 服务器

什么是Kestrel&#xff1f; Kestrel 是一个跨平台的Web服务器&#xff0c;会默认在ASP.NET Core 项目模板中对其进行配置。未使用 IIS 托管时&#xff0c;ASP.NET Core 项目模板默认使用 Kestrel。 Kestrel 的功能包括&#xff1a; 跨平台&#xff1a;Kestrel 是可在 Window…

spring boot mybatis-plus dynamic-datasource 配置文件 相关依赖环境配置

spring boot mybatis-plus dynamic-datasource 配置文件 相关依赖环境配置 ##yaml配置 server:port: 8866servlet:context-path: /yymtomcat:max-threads: 300connection-timeout: 57000max-connections: 500connection-timeout: 57000 spring:datasource:dynamic:primary: m…

【纯CSS特效源码】(一)几款漂亮的文字特效

1.渐变文字 使用background: -webkit-linear-gradient(#d8ecec, #2d888b);定义背景渐变色 并使用-webkit-text-fill-color: transparent;指定了文本字符的填充颜色 <!DOCTYPE html> <html><style>body {background-color: #111;}#content {position: abso…

如何关闭iPhone 14或14 Pro Max,这里有详细步骤

你刚买了新的iphone 14或iphone 14 pro max&#xff0c;迫不及待地想开始使用它。但如果你需要关闭它怎么办&#xff1f;有几种方法可以用来关闭这两种设备。 如何关闭iPhone 14 你可以通过每个人都熟悉的老式侧按钮轻松关闭iPhone 14&#xff0c;也可以通过面部识别关闭它。 …

BitMap源码解析

文章目录 前言数据结构添加与删除操作 JDK中BitSet源码解析重要成员属性初始化添加数据清除数据获取数据size和length方法集合操作&#xff1a;与、或、异或优缺点 前言 为什么称为bitmap&#xff1f; bitmap不仅仅存储介质以及数据结构不同于hashmap&#xff0c;存储的key和v…

【复现】Spider-Flow RCE漏洞(CVE-2024-0195)_16

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 Spider Flow 是一个高度灵活可配置的爬虫平台&#xff0c;用户无需编写代码&#xff0c;以流程图的方式&#xff0c;即可实现爬虫…

乱码问题汇总

写在前面 在工作中经常会碰到各种莫名其妙的乱码问题&#xff0c;但通过之前的学习&#xff1a;字符集&字符编码-CSDN博客 &#xff0c;可以知道乱码的根本原因就是使用和数据源编码不一样的编码解码导致。 如&#xff1a;BIG5解码GB2312编码内容&#xff0c;编解码不一致…

面试算法118:多余的边

题目 树可以看成无环的无向图。在一个包含n个节点&#xff08;节点标号为从1到n&#xff09;的树中添加一条边连接任意两个节点&#xff0c;这棵树就会变成一个有环的图。给定一个在树中添加了一条边的图&#xff0c;请找出这条多余的边&#xff08;用这条边连接的两个节点表示…

Unity中URP下实现深度贴花

文章目录 前言一、场景设置二、实现思路1、通过深度图求出像素所在视图空间的Z值2、通过模型面片的求出像素在观察空间下的坐标值3、结合两者求出 深度图中像素的 XYZ值4、再将此坐标转换到模型的本地空间&#xff0c;把XY作为UV来进行纹理采样 三、URP下实现1、通过深度图求出…

2024年最新软件测试面试题

Part1 1、你的测试职业发展是什么&#xff1f;【文末有面试文档免费领取】 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做…

Spark的内核调度

目录 概述 RDD的依赖 DAG和Stage DAG执行流程图形成和Stage划分 Stage内部流程 Spark Shuffle Spark中shuffle的发展历程 优化前的Hash shuffle 经过优化后的Hash shuffle Sort shuffle Sort shuffle的普通机制 Job调度流程 Spark RDD并行度 概述 Spark内核调度任务: 1…

力扣67. 二进制求和算法

一、【写在前面】 这道题需要&#xff0c;给你两个字符串比如 a "1010", b "1011"答案是&#xff1a;"10101" 然后需要你给出计算结果&#xff0c;那么我们很容易想到两种做法 1. 调库做法&#xff1a;直接转化为整数&#xff0c;然后用内…

python统计分析——小提琴图(sns.violinplot)

参考资料&#xff1a;用python动手学统计学&#xff0c;帮助文档 使用seaborn.violinplot()函数绘制箱线图 sns.violinplot()的做出来的小提琴图比plt.violinplot()更像小提琴。 import numpy as np import pandas as pd from matplotlib import pyplot as plt import seabo…

【自控实验】4. 数字仿真实验

本科课程实验报告&#xff0c;有太多公式和图片了&#xff0c;干脆直接转成图片了 仅分享和记录&#xff0c;不保证全对 使用matlab中的simulink进行仿真 实验内容 线性连续控制系统的数字仿真 根据开环传递函数G(S)的不同&#xff0c;完成两个线性连续控制系统的仿真。 …

MySQL面试题 | 03.精选MySQL面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【linux】NIO中的FileChannel与mmap

FileChannel是Java NIO库中的一个类&#xff0c;用于对文件进行读写操作。它提供了一种高效的方式来读取、写入和操作文件。 使用FileChannel&#xff0c;你可以执行以下操作&#xff1a; 从文件读取数据到缓冲区&#xff08;Buffer&#xff09;&#xff1a;你可以使用FileCh…

QT 小组件 列表框以及微调框

.cpp文件 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);QListWidgetItem *pPhone new QListWidgetItem;pPhone->setText("西瓜");pPhone->…

SCI一区级 | Matlab实现RIME-CNN-BiLSTM-Mutilhead-Attention多变量多步时序预测

SCI一区级 | Matlab实现RIME-CNN-BiLSTM-Mutilhead-Attention多变量多步时序预测 目录 SCI一区级 | Matlab实现RIME-CNN-BiLSTM-Mutilhead-Attention多变量多步时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RIME-CNN-BiLSTM-Mutilhead-Attention多…

eclipse ADT安装及abap cds模版创建

文章目录 1.前提2.安装3.创建cds模版 abap cds 常用语法 https://blog.csdn.net/weixin_49198221/article/details/135531478?spm1001.2014.3001.5501 1.前提 需要了解版本关系: **1.eclipse:**2023-06 (4.28), 2023-09 (4.29), 2023-12 (4.30) 2.Windows: ​ 1.Windows …