Anchor Box
在讲解YOLO之前,有必要先解释什么是Anchor box。
在做目标检测任务时,我们首先需要将数据标注并得到训练集、验证集、测试集。已标注的数据label,其实就是在原始图片中用矩形框框出目标,得到的矩形框参数(中心点坐标、长、宽)就是label。Anchor box其实就是从训练集中将所有的矩形框的大小尺寸统计处最常出现的某几个矩形框,这里我们可以采用K-Means来得到。这样也就不难理解使用anchor的目的了:目标先验。即我们提前告诉模型,应该去用多大的矩形框去寻找目标,帮助模型快速收敛。
在使用K-Means前,需要将标注数据转换获得每个bounding box(标注框)的高宽并归一化:
(假设你的标注数据是voc数据集的格式)
import numpy as np
import glob
import xml.etree.ElementTree as ET
# normalize width and height
def normal_wh(path):
dataset = list()
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/xmi