YOLOv1和YOLOv2简单看了一下,详细看了看YOLOv3,刚看的时候是蒙圈的,经过一番研究,分步记录一下几个关键的点:
v2和v3中加入了anchors和Faster rcnn有一定区别,这个anchors如何理解呢?
个人理解白话篇:
(1)就是有一批标注数据,里面有中心坐标和宽高,对应格式就是voc数据集标xml注格式即可。
代码提取标注数据里的宽高并用图像的宽高进行归一化:
def load_dataset(path):
dataset = []
for xml_file in glob.glob("{}/*xml".format(path)):
tree = ET.parse(xml_file)
height = int(tree.findtext("./size/height"))
width = int(tree.findtext("./size/width"))
for obj in tree.iter("object"):
xmin = int(obj.findtext("bndbox/xmin")) / width
ymin = int(obj.findtext("bndbox/ymin")) / height
xmax = int(obj.findtext("bndbox/xmax")) / width
ymax = int(obj.findtext("bndbox/ymax")) / height
dataset.append([xmax - xmin, ymax - ymin])
return np.array(dataset)
(2)具体怎么分的呢?就是用K-means对所有标注的bbox数据根据宽高进行分堆,voc数据被分为9个堆,距离是用的distance = 1-iou
import numpy as np
'''
(1)k-means拿到数据里所有的目标框N个,得到所有的宽和高,在这里面随机取得9个作为随机中心
(2)然后其他所有的bbox根据这9个宽高依据iou(作为距离)进行计算,计算出N行9列个distance吧
(3)找到每一行中最小的那个即所有的bbox都被分到了9个当中的一个,然后计算9个族中所有bbox的中位数更新中心点。</