YoloV3 先验框

YoloV3 先验框

先验框

  • 提前在图像上预设好的不同大小,不同长宽比的框,使得模型更加容易学习
  • 使用不同尺寸和长宽比可以得到更大的交并比,就有更高的概率出 现对于目标物体有良好匹配度的先验框(体现为高IoU)
  • 简单的一句话来讲,先验框就是帮助我们定好了 常见目标的宽和高,在进行预测的时候,我们可以利用这个已经定好的宽和高处理,可以帮助我们进行预测。
先验框的生成主要有以下方法:
先验框生成方式
  • 在此使用k-means聚类对人工标注好的数据集中目标 宽高进行聚类,目的是计算出对于目标物体有良好匹配度的先验框。
  • 一般使用k-means聚类时用的是欧拉距离完成聚类,但先验框这是和 宽高(我理解为面积)强相关的,所以使用IOU进行计算。
  • 注意在k-means聚类时'”距离值”越小重合度越大,但是”IOU值”与之相反(“IOU值”越大重合度越大),所以计算时用不可直接用”IOU值”计算,可以用”1-IOU值”使其满足数值越小重合度越大
    d i s t a n c e ( i , c e n t e r ) = 1 − I O U ( i , c e n t e r ) distance(i,center)=1−IOU(i,center)d i s t a n c e (i ,c e n t e r )=1 −I O U (i ,c e n t e r )
先验框生成关键代码
def kmeans(box, k):
    #-------------------------------------------------------------#
    #   取出一共有多少框
    #-------------------------------------------------------------#
    row = box.shape[0]
    #-------------------------------------------------------------#
    #   每个框各个点的位置
    #-------------------------------------------------------------#
    distance = np.empty((row, k))
    #-------------------------------------------------------------#
    #   最后的聚类位置
    #-------------------------------------------------------------#
    last_clu = np.zeros((row, ))
    np.random.seed()
    #-------------------------------------------------------------#
    #   随机选k个当聚类中心
    #-------------------------------------------------------------#
    cluster = box[np.random.choice(row, k, replace = False)]
    iter = 0
    while True:
        #-------------------------------------------------------------#
        #   cas_iou:计算当前框和随机选的k个当聚类中心的IOU,distance: shape = (row, k)
        #-------------------------------------------------------------#
        for i in range(row):
            distance[i] = 1 - cas_iou(box[i], cluster)
        #-------------------------------------------------------------#
        #   计算当前框到k个当聚类中心最小距离,near是一个下标值,存储所有框最近的距离中心index
        #-------------------------------------------------------------#
        near = np.argmin(distance, axis=1)
        if (last_clu == near).all():
            break
        #-------------------------------------------------------------#
        #   求每一个类的中位点,更新k个聚类中心点的值
        #-------------------------------------------------------------#
        for j in range(k):
            cluster[j] = np.median(
                box[near == j],axis=0)
        last_clu = near
        if iter % 5 == 0:
            print('iter: {:d}. avg_iou:{:.2f}'.format(iter, avg_iou(box, cluster)))
        iter += 1
    return cluster, near
IOU的计算

YoloV3 先验框
def cas_iou(box, cluster):
    x = np.minimum(cluster[:, 0], box[0])
    y = np.minimum(cluster[:, 1], box[1])
    intersection = x * y
    area1 = box[0] * box[1]
    area2 = cluster[:,0] * cluster[:,1]
    iou = intersection / (area1 + area2 - intersection)
    return iou

Original: https://blog.csdn.net/damon93/article/details/123199800
Author: damon93
Title: YoloV3 先验框

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

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

(0)

大家都在看

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