anchors设置应该和待检测的目标尺寸以及比例相匹配.而不是只是默认值.
注意:模型输入尺寸改变, 那么目标尺寸也会改变.
所以先分析anchor ratio和anchor scale的分布, 这个根据数据分布分析, 进行相应设置即可.
以下是分析代码:
import json import cv2 import os import numpy as np import argparse import random from matplotlib import pyplot as plt _GRAY = (218, 227, 218) _GREEN = (18, 127, 15) _RED = (0, 255, 0) _WHITE = (255, 255, 255) def draw(x, name): fig, (ax0, ax1) = plt.subplots(nrows=2, figsize=(9, 6)) # 第二个参数是柱子宽一些还是窄一些,越大越窄越密 ax0.hist(x, 50, normed=1, histtype='bar', facecolor='yellowgreen', alpha=0.75) ##pdf概率分布图,一万个数落在某个区间内的数有多少个 ax0.set_title(name + '_pdf') ax1.hist(x, 50, normed=1, histtype='bar', facecolor='pink', alpha=0.75, cumulative=True, rwidth=0.8) # cdf累计概率函数,cumulative累计。比如需要统计小于5的数的概率 ax1.set_title(name + "_cdf") fig.subplots_adjust(hspace=0.4) plt.savefig(name + ".png") plt.title(name) plt.show() def get_scale_factor(scale, max_size, img_h, img_w): short = min(img_w, img_h) large = max(img_w, img_h) scale_factor = min(scale / short, max_size / large) return scale_factor def load_pod(path): ret = {} for line in open(path, 'r').readlines(): bboxs = [] line = json.loads(line.strip()) filename = line.get('filename', '') for instance in line['instances']: bboxs.append(instance.get('bbox', [])) ret[filename] = bboxs return ret def main(): d_gt = load_pod(gtf) idx = 0 hs, ws, bhs, bws = [], [], [], [] areas, aspects = [], [] total = [] keys = d_gt.keys() if n > 0: keys = random.sample(keys, n) for key in keys: img = cv2.imread(os.path.join(image_dir, key)) h, w, _ = img.shape scale = get_scale_factor(s, l, h, w) bboxs = d_gt[key] bw_0, bh_0 = bboxs[0][2] - bboxs[0][0], bboxs[0][3] - bboxs[0][1] bw, bh = scale * bw_0, scale * bh_0 mean_w = (bw * bh) ** 0.5 aspect = bw / max(bh, 1e-5) areas.append(mean_w) aspects.append(aspect) total.append(np.array([bw, bh, aspect, mean_w])) # print(bw, bh,mean_w) idx += 1 # print(idx, key, bw, bh, aspect, mean_w) draw(areas, 'anchor_scale') draw(aspects, 'anchor_ratio') print(np.mean(total, axis=0)) return areas, aspects if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('-g', "--gt_file", type=str, default='../podtest/testdata/podinput/all.json') parser.add_argument('-i', "--imagedir", type=str, default='../../dataset/chinese-city-parking/test') parser.add_argument('-n', "--num", type=int, default=0) parser.add_argument('-s', "--short_scale", type=int, default=256) parser.add_argument('-l', "--long_scale", type=int, default=256) args = parser.parse_args() image_dir = args.imagedir gtf = args.gt_file s = args.short_scale l = args.long_scale n = args.num main()
可以看出比例在1~4之间, scale,在0-75之间, 如果stride为16
所以ratio可以设置为0.2, 0.3, 0.5, 1
scale 可以设置为5, 3, 1, 0.5
2. 分析resize后的目标大小,设置相应的scale