本文介绍 PriorBox到底是如何生成的?

PriorBox到底是如何生成的?

This article was original written by Jin Tian, welcome re-post, first come with https://jinfagang.github.io . but please keep this copyright info, thanks, any question could be asked via wechat: jintianiloveu

最近在用libtorch部署一些先进的快速的one-stage检测器, 参考晚上的一个项目, 里面直接提供了一个csv里面包含的是Prior. 那么问题来了:

  • 这priorbox是如何生成的?
  • 它跟哪些预先设定的变量有关?

今天主要解决这两个问题.

## priorbox是如何生成的?

其实很多priorbox的翻译不正确, 直接意思应该是默认框. 因为接下来所有的预测, 都是相对于默认狂的offsets. 如果你没有默认框的位置, 即便是网络输出了offsets, 那也是没有用的.

因此假如你拿到一个检测模型, 只有模型而不知道预设值, 那么你就无法真正得到检测结果..

这就出现了两个问题, 这个默认框到底, 如何生成?

不管是SSd也好,RFBNet也好, 其本质上差不多,我们以SSD为例, 简单的记录一下如何生成SSD需要的priorbox.

# SSD中的,从6个地方抽取特征图, 你可以看做是从6个不同尺度的矩阵中提取默认框

# 对应VGG的相应层输出
feature_maps = [38, 19, 10, 5, 3, 1]
min_sizes = [...]
max_sizes = [...]
aspect_ratios = [[2], [2, 3], [2, 3], [2, 3], [2], [2]]
image_size = 300

prior_boxes = []

for k, f in emumerate(feature_maps):
	# 0, 38; 1, 19
	for i, j in iteraltools.product(range(f), repeat=2):
		# 38: 遍历38x38矩阵的每一个点
		# 先计算中心点
		c_x = ...
		c_y = ...
		
		s_k = min_sizes[k]/image_size
		# 第一种正方形框
		prior_boxes.append([c_x, c_y, s_k, s_k])
		
		s_k_max = max_sizes[k]/image_size
		prior_boxes.append([c_x, c_y, s_k_max, s_k_max])
		
		# 产生不同ratio的框
		for ratio in aspect_ratios[k]:
			prior_boxes.append([c_x, c_y, s_k*sqrt(ratio), s_k/sqrt(ratio)])
			prior_boxes.append([c_x, c_y, s_k/sqrt(ratio), s_k*sqrt(ratio)])
		
		

上面基本上就添加完成了.

思路也很简单, 你首先要遍历6个矩阵, 这6个矩阵中最大的是38x38, 最小的是1x1, 每一个矩阵中的每一个点, 你都要生成对应的默认框, 而这些框是对应于图片尺寸归一化的. 而与最终结果相关的, 就是你设定的max_sizes 和 min_sizes. 以及你设定的ratio, 以及图像尺寸. 其他的没有影响.

w