yolov5 anchors 中 K-means聚类

anchors

运行trains.py没有生成anchor原因

yolov5运行后有一行 autoanchor:

yolov5 anchors 中 K-means聚类

一些教程的生成图如下

yolov5 anchors 中 K-means聚类

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

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

yolov5s.yaml anchor:

yolov5 anchors 中 K-means聚类

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


import torch
from models.experimental import attempt_load

model = 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)

yolov5 anchors 中 K-means聚类

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

程序

train.py

yolov5 anchors 中 K-means聚类
utils.autoanchor.py
BPR < 0.98时,再在 kmean_anchors函数中进行 k 均值 和 遗传算法 更新 anchors
yolov5 anchors 中 K-means聚类

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

yolov5 anchors 中 K-means聚类

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

用 kmean_anchors 进行聚类。yolov5中用了kmeans和遗传算法。源代码 Kmeans calculation &#x6B27;&#x6C0F;&#x8DDD;&#x79BB;&#x805A;&#x7C7B;&#x9057;&#x4F20;&#x7B97;&#x6CD5;

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

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

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

autoanchor.py


    k = k_means(wh, n)

新建 yolo_kmeans.py

import numpy as np

def wh_iou(wh1, wh2):

    wh1 = wh1[:, None]
    wh2 = wh2[None]
    inter = np.minimum(wh1, wh2).prod(2)
    return inter / (wh1.prod(2) + wh2.prod(2) - inter)

def 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,))

    if not use_pp:
        clusters = boxes[np.random.choice(box_number, k, replace=False)]

    else:
        clusters = calc_center(boxes, k)

    while True:

        if use_iou:
            distances = 1 - wh_iou(boxes, clusters)
        else:
            distances = calc_distance(boxes, clusters)

        current_nearest = np.argmin(distances, axis=1)

        if (last_nearest == current_nearest).all():
            break
        for cluster in range(k):

            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:

        distance = []
        for center in clusters:

            distance.append(single_distance(box, center))
        distances.append(distance)

    return distances

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

还要多远才能进入你的心 还要多久才能和你接近

Original: https://blog.csdn.net/zrg_hzr_1/article/details/121714910
Author: 国服最强貂蝉
Title: yolov5 anchors 中 K-means聚类

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/625944/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球