边框回归(Bounding Box Regression)详解

博文传送门

作者详细的解释了边界框回归的相关问题

1.为什么要边框回归?
2.什么是边框回归?
3.边框回归怎么做的?
4.边框回归为什么宽高,坐标会设计这种形式?
5.为什么边框回归只能微调,在离Ground Truth近的时候才能生效?

代码:(取自MDNet)

class BBRegressor():
    def __init__(self, img_size, alpha=1000, overlap=[0.6, 1], scale=[1, 2]):
        self.img_size = img_size
        self.alpha = alpha
        self.overlap_range = overlap
        self.scale_range = scale
        self.model = Ridge(alpha=self.alpha)#Ridge岭回归,alpha正则化力度???不是应该多为1嘛
    #X为提取到的特征,bbox为提取到的样本区域,所存为正样本的边界框,gt为该图片的真值(x,y,w,h)
    def train(self, X, bbox, gt):
        X = X.cpu().numpy()#Xw本来为一个张量,.numpy()是将张量变成数组numpy
        bbox = np.copy(bbox)#copy是复制一份,而不是简单的引用。
        gt = np.copy(gt)

        if gt.ndim==1:#gt的维度。一维数组就返回1
            gt = gt[None,:]#将gt扩展成二维的。

        r = overlap_ratio(bbox, gt)#计算重叠率
        # print("bbox_为:")
        # print(bbox)
        # print("gt 为:")
        # print(gt)
        # print(r)
        s = np.prod(bbox[:,2:], axis=1) / np.prod(gt[0,2:])#np.prod(x)x内元素相乘,axis是指定维度。axis是指一行中的两个元素相乘,正好是w*h,为面积。除以真值的面积。
        #
        idx = (r >= self.overlap_range[0]) * (r <= self.overlap_range[1]) * \
              (s >= self.scale_range[0]) * (s <= self.scale_range[1])#这里不是很明白为什么s要大于等于1,小于等于2.This is a question!
        #idx获得一个布尔型的数组。

        X = X[idx]#筛选出idx为True,即满足条件的特征以及边界框。
        #因为只有比较靠近真值的边界框才能满足线性回归,所以这里要选出iou大于0.6小于1的候选框。
        bbox = bbox[idx]

        Y = self.get_examples(bbox, gt)#得到的y值为,实际应该移动的变化值,即正确的调整方案。这个函数,输入X为正样本特征,Y为正确的调整方案,然后让其自己学习,博客上说用的是岭回归。(在初始化中,定义了岭回归模型)
        self.model.fit(X, Y)

    def predict(self, X, bbox):
        X = X.cpu().numpy()
        bbox_ = np.copy(bbox)

        Y = self.model.predict(X)

        bbox_[:,:2] = bbox_[:,:2] + bbox_[:,2:]/2
        bbox_[:,:2] = Y[:,:2] * bbox_[:,2:] + bbox_[:,:2]
        bbox_[:,2:] = np.exp(Y[:,2:]) * bbox_[:,2:]
        bbox_[:,:2] = bbox_[:,:2] - bbox_[:,2:]/2

        bbox_[:,:2] = np.maximum(bbox_[:,:2], 0)
        bbox_[:,2:] = np.minimum(bbox_[:,2:], self.img_size - bbox[:,:2])
        return bbox_

    def get_examples(self, bbox, gt):
        bbox[:,:2] = bbox[:,:2] + bbox[:,2:]/2#求得中心左边(x,y)
        gt[:,:2] = gt[:,:2] + gt[:,2:]/2#求得真值边界框的的中心坐标

        dst_xy = (gt[:,:2] - bbox[:,:2]) / bbox[:,2:]#根据公式,求出目标移动的值x,y,w,h
        dst_wh = np.log(gt[:,2:] / bbox[:,2:])

        Y = np.concatenate((dst_xy, dst_wh), axis=1)
        return Y

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值