首页 > 编程知识 正文

yolov3算法详解,yolov5识别数量统计

时间:2023-05-06 09:17:39 阅读:108737 作者:4881

正文代码参考:

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。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。