提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、yolo模型和kmeans算法
yolo模型是啥我这里就不多做介绍了,搜索能有一堆大佬解释的很仔细。
kmeans算法是如何与yolo模型结合,又是如何实现模型优化的呢?
解释:
yolo系列的模型在做boundingbox预测的时候,使用了anchor boxes锚框。
.cfg文件内配置如下:
[yolo]
mask = 3,4,5
anchors = 10,14, 23,27, 37,58, 81,82, 135,169, 344,319
主要是用来表示最有可能的object的w和h,所以当模型对一个像素单元进行预测时,会预测出无数个object的框,但是并不能随便预测,主要是要参考anchor box大小,即从已标注的数据中统计到最有可能的object形状。
那这个时候,如果anchor box能够更好的被算出来,那么这个模型就能够更快、更好的框出物品。
在用自己的数据做训练的时候,要先修改anchors,匹配我们⾃⼰的数据,anchors大小通过kmeans聚类得到。
二、优化实现(附代码)
1.kmeans实现
一般来说,计算样本点到质点的距离时,直接算的是两点的距离,然后将样本点划归为距离最小的那个质心。在yolo系列模型中样本点的数据是有具体的业务上的含义,我们其实最终目的是想要知道最有可能的object对应的bounding box的形状。
所以在kmeans算法中,样本点到质点的距离被替换成两个box的iou,即2个box的相似度。d=1-iou(box1,box_cluster),这样d越小,box1与box_cluster越类似,将box划归为box_cluster。
2.读入数据
注:
yolo模型有自己的标注格式: <x_center> <y_center>
普通labelme标注生成的json文件,在输入数据之前要转换成对应的标注格式哦。
f = open(args.filelist)
lines = [line.rstrip('\n') for line in f.readlines()]
annotation_dims = []
size = np.zeros((1,1,3))
for line in lines:
#line = line.replace('images','labels')
#line = line.replace('img1'