正文代码参考:
3359 github.com/Lars 76/k means-anchor-boxes
Yolov3中默认的9个anchors是作者通过对voc数据进行聚类得到的。
anchors=10、14、23、27、37、58、81、82、135、169、344、319
但是,如果我们训练自己的数据时,也采用默认的anchors,可能不太适合。
现在,您需要重新群集自己的数据,以获得适合自己数据的anchors。
本文聚类的数据是VOC2012中人员类别的数据。 关于数据提取,请参考我之前的博客:
3359 blog.csdn.net/c 2250645962/article/details/104840953
代码如下。
导入博客
import XML.etree.element treea set
import numpy as np
from kmeans import kmeans,avg_iou
annotations _ path='./VOC person/annotations '
群集=9
efload_dataset(path ) :
dataset=[]
forxml _ file in glob.glob ({ }/* XML '.format ) (path ) ) :
#print(XML_file ) )为
tree=et.parse(XML_file )
height=int(tree.findtext ) (./size/height ) )
idth=int (tree.find text ('./size/width ' ) )
forobjintree.Iter(object ) ) :
xmin=int(float(obj.findtext ) ' bndbox/xmin ' )/width
ymin=int(float(obj.findtext ) ' bndbox/ymin ' )/height
xmax=int(float(obj.findtext ) ' bndbox/xmax ' )/width
ymax=int(float(obj.findtext ) ' bndbox/ymax ' )/height
dataset.append([xmax-xmin,ymax - ymin]
returnNP.Array(dataset ) )。
data=load _ dataset (annotations _ path ) )。
打印(datashapeis (}.format ) data.shape ) )。
out=kmeans(data,k=CLUSTERS ) ) )。
yolo v3 clusters=[ 10,13 ]、[ 16,30 ]、[ 33,23 ]、[ 30,61 ]、[ 62,45 ]、[ 59,119 ]、[ 116,90 ]、[ 156,156,16 ]
yolo v3 out=NP.array (yolo v3 clusters )/416.0
打印(selfdataaccuracy :65:2 f } % ).format (avg _ iou (data,out ) (100 ) ) )
print (yolo v3 accuracy :65:2 f } % ).format (avg _ iou (data,yolov3out ) * 100 ) )
根据resize生成与416对应的anchor
打印(boxes : (n { }-{ }.format ) out [ :0 ] * 416,out [ :1 ] * 416 )
# print (boxes : (n { }.format ) (out ) ) ) ) ) ) ) ) )。
ratios=NP.around (out [ :0 ]/out [ :1 ],decimals=2).tolist ) ) ) ) ) ) )。
ratios : (n { }.format (sorted ) ratios ) )
代码中的
yolo v3 clusters=[ 10,13 ]、[ 16,30 ]、[ 33,23 ]、[ 30,61 ]、[ 62,45 ]、[ 59,119 ]、[ 116,90 ]、[ 156,156,16 ]
yolo v3 out=NP.array (yolo v3 clusters )/416.0
这两行带着yolov3的默认9个anchors出来,为了以后和自己聚类得到的anchors进行计算,与avg_iou进行比较。
您只需更改annotations _ path="./VOC人员/annotations "为其数据的标记文件路径即可。
此处的标记文件如下图所示。
执行结果如下。
datashapeis (14470,2 ) )。
自数据存取: 71.85 %
yolov3 Accuracy: 60.80%
Boxes:
[ 24.12812.4892.352213.824107.32842.432143.104342.78458.24 ]-[ 61.01333333329.952270.67733333333332.8888832
108.7146667289.536382.13953488193.63363363 ]
Ratios:
[0.3、0.34、0.39、0.4、0.42、0.49、0.64、0.67、0.9]
从结果中可以看出,使用yolov3的9个默认anchors计算的平均iou为60.80%,
通过自身聚类得到的9个anchors计算的平均iou为71.85%。
九个anchor分别是24、61、13、30、92、271、214、333、107、160、42、108、143、290、343和160
为了对他们进行排序并替换原来的默认anchors,得到了以下内容:
anchors=13、30、24、61、42、108、58、193、92、271、107、160、143、290、214、333、343和382
那么,使用自己聚类得到的anchors进行训练应该更有效。
通过聚类获得的9个anchors可以按照大小顺序排列cfg文件中的9个anchors来代替yolov3。