anchors的大小和比例设置问题

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

参考:https://zhuanlan.zhihu.com/p/44106492

https://zhuanlan.zhihu.com/p/55824651

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yang_daxia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值