bbox回归预测时所采用公式思路讨论(1)

本文探讨了目标检测任务中,为何使用特定的bbox回归公式tx=(x-xa)/wa, ty=(y-ya)/ha, tw=log(w/wa), th=log(h/ha),而不是更直观的tx=x-xa, ty=y-ya, tw=w/wa, th=h/ha。通过数学推导解释了这一选择的原因,并分析了采用对数形式的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在深度学习框架中,从faster rcnn开始,中间的预测模型,不如ssd,yolo,yolov2等,一直在用如下公式对bbox的位置进行回归,
tx=(x-xa)/wa
ty=(y-ya)/ha
tw=log(w/wa)

th=log(h/ha)

这里,其实很多人看到这里时,会有个疑问,为什么不用如下公式来做回归呢?
tx=x-xa
ty=y-ya
tw=w/wa

th=h/ha

这样不是更加直观,简洁么?

其实,采用上面的公式,原因如下。

这里 x,y,w,h,分别代表当前的bbox的左上角点的横轴,左上角点的纵轴,宽和高。

xa,ya,wa,ha 分别代表ground truth的相应参数。

这里,要从x回归得出xa,与两个bbox中心点的位移和宽度的变化倍数有关,两者关系如下:

假设两个矩形中心点位移为d

xa +0.5*wa = x+0.5*w+d.

这里w 和wa肯定也是有个函数关系的,定为wa = tw*w,那么上式就变为:

xa+0.5wa = x+0.5*wa/tw+d,

从上式上看,xa 与x的位置关系,由wa和d共同决定,换算如下公式为:

(x-xa)/wa = 0.5-0.5/tw-d.

这样就可以把上式右边的部分等价为一个未知量tx,来回归得到。

同理ty。


那么来看tw=log(w/wa)的道理。

这个我感觉主要因为计算机在数值计算上精度不够,才采用指数来运算的,就好像我们采用softmax一样。

利用了指数函数把无限小的数据映射为0,把0映射为1的特性,避免了计算机的精度粒度,在处理过小数据时,不够用的问题。

同理th=log(h/ha),也一样。

不知道我说的对不对,大家有没有补充、纠正的,请不吝赐教啊,

注:在bbox回归预测时所采用公式思路讨论(2)中,我打算讨论下yolov2在这上面的改进工作,说说原理,这样做的好处,以及实际实验结果。

### 支持向量机回归预测实例 支持向量机不仅能够处理分类问题,在回归分析方面同样表现出色。对于目标变量 \(y\) 是连续数值的情况,即当 \(y\) 表示价格、温度或尺寸等浮点数,所涉及的任务被称为回归[^2]。 下面展示了一个简单易懂的支持向量机进行回归预测的例子: #### 使用Python中的Scikit-Learn库实现SVM回归模型 ```python from sklearn.svm import SVR import numpy as np import matplotlib.pyplot as plt # 创建虚拟数据集 X = np.sort(5 * np.random.rand(40, 1), axis=0) y = np.sin(X).ravel() # 添加噪声到部分样本上 y[::5] += 3 * (0.5 - np.random.rand(8)) # 定义并训练SVR模型 svr_rbf = SVR(kernel='rbf', C=100, gamma=0.1, epsilon=.1) svr_lin = SVR(kernel='linear', C=100, gamma='auto') svr_poly = SVR(kernel='poly', C=100, gamma='auto', degree=3, epsilon=.1, coef0=1) lw = 2 svrs = [svr_rbf, svr_lin, svr_poly] kernel_label = ['RBF', 'Linear', 'Polynomial'] model_color = ['m', 'c', 'g'] fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(15, 5), sharey=True) for ix, svr in enumerate(svrs): axes[ix].plot(X, svr.fit(X, y).predict(X), color=model_color[ix], lw=lw, label=f'{kernel_label[ix]} model') axes[ix].scatter(X[svr.support_], y[svr.support_], facecolor="none", edgecolor=model_color[ix], s=50, label=f'{kernel_label[ix]} support vectors') axes[ix].scatter(X[np.setdiff1d(np.arange(len(X)), svr.support_)], y[np.setdiff1d(np.arange(len(X)), svr.support_)], facecolor="none", edgecolor="k", s=50, label='other training data') axes[ix].legend(loc='upper center', bbox_to_anchor=(0.5, 1.1), ncol=1, fancybox=True, shadow=True) plt.show() ``` 此代码片段展示了如何利用不同核函数(径向基函数[RBF]、线性和多项式)构建三个不同的支持向量回归(SVR)模型,并对比它们的表现效果。通过图形化方式呈现了每种内核对应的拟合曲线及其支撑向量的位置分布情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值