(yolo v3)使用自己数据集k-means聚类产生的anchor效果反而变差解决方法

(yolo v3)使用自己数据集k-means聚类产生的anchor效果反而变差解决方法

最近在使用yolo v3训练自己的数据集时,先使用k-means聚类出自己数据集anchors,然后训练自己数据集,最后结果发现预测的效果并不好,预测框得分很低,且容易误检,而使用COCO数据集都感觉效果更好一点,这就让我很怀疑使用k-means聚类产生anchor这个方法是否有效了。

而经过观察发现,原来通过聚类方法产生anchor其实跟你的数据集本身有很大关系,在使用我自己数据集进行训练时,我自己数据集类型单一,且标记框大小都差不多,尺寸比较集中,这个时候通过k-means聚类的方法产生的锚框(anchor box)自然就很集中,几乎相差不大,这就体现不出模型的多尺度输出的优势;同时我发现此时标记框其实有较多是比得到的锚框尺寸大的,这样在训练时对模型要求更高。因此我使用了一种将锚框进行线性尺度的缩放的方式,将锚框尺寸往两边进行一个拉伸,其计算公式和效果如下图所示:
(yolo v3)使用自己数据集k-means聚类产生的anchor效果反而变差解决方法
(yolo v3)使用自己数据集k-means聚类产生的anchor效果反而变差解决方法
(yolo v3)使用自己数据集k-means聚类产生的anchor效果反而变差解决方法
(yolo v3)使用自己数据集k-means聚类产生的anchor效果反而变差解决方法

(yolo v3)使用自己数据集k-means聚类产生的anchor效果反而变差解决方法
实现代码如下:

import numpy as np
anchor = open('model_data/neuron_anchors.txt') #原始anchors
expand_anchor = open('model_data/neuron_anchors1.txt','w')  #变换后的anchor保存地址
ratio=0.5   #最小的锚框缩小倍数
base_ratio=3  #最大的锚框扩大倍数
box=anchor.read().split(',')
box=np.array(box)
for i in range(0,len(box)):
    box[i]=float(box[i].strip())  
box=box.reshape((len(box)//2,2))
new_box=np.zeros((len(box),2))
length = len(box)
new_box[0,0]=int(float(box[0,0])*ratio)
new_box[0,1]=int(float(box[0,1])*ratio)
new_box[-1,0]=int(float(box[-1,0])*base_ratio)
new_box[-1,1]=int(float(box[-1,1])*base_ratio)
print(box)
for i in range(1,length-1):
    new_box[i,0]=(float(box[i,0])-float(box[0,0]))/(float(box[-1,0])-float(box[0,0]))*(new_box[-1,0]-new_box[0,0])+new_box[0,0]
    new_box[i,1]=new_box[i,0]*float(box[i,1])/float(box[i,0])
    new_box[i,0]=int(new_box[i,0])
    new_box[i,1]=int(new_box[i,1])

for i in range(length):
    if i == 0:
        x_y = "%d,%d" % (new_box[i][0], new_box[i][1])
    else:
        x_y = ",  %d,%d" % (new_box[i][0], new_box[i][1])
    expand_anchor.write(x_y)
expand_anchor.close()
anchor.close()

print(new_box)

anchor的txt文件内容如下:
(yolo v3)使用自己数据集k-means聚类产生的anchor效果反而变差解决方法

使用我的数据集的预测结果对比图如下,可以看出模型还是有不错的提升:
使用原始anchor:
(yolo v3)使用自己数据集k-means聚类产生的anchor效果反而变差解决方法
使用变换后的anchor:
(yolo v3)使用自己数据集k-means聚类产生的anchor效果反而变差解决方法
如有任何误解,欢迎在评论区指正,不胜感激! ! !
相关博客:YOLOV3中k-means聚类获得anchor boxes过程详解

版权声明:本文为博主恩泽君原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/qq_42109740/article/details/105948768

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(2)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2022年2月15日
下一篇 2022年2月15日

相关推荐