Zhen Zeng
Zhen Zeng
最近,我在研究RCNN论文,对于你的这两个问题其实可以在论文的 Appendix C.Bounding-box regression 中找到。 1. 针对第一个问题,为什么边框回归得到的是五个值。 首先,后四个值(第2个值到第5个值)表示当前的边框与真实目标边框的误差,分别表示边框中心的偏差率($t_x,t_y$)和边框宽高的偏差率($t_w,t_h$)。这些偏差率是真实偏差值与当前边框宽高的比值,具体可见论文Appendix C,这里贴出论文的部分截图:  其中,$(P_x,P_y,P_w,P_h)$ 表示当前的边框,$(G_x,G_y,G_w,G_h)$表示真实目标边框。 其次,边框框回归得到的第一个值,是表示该当前边框与真实目标边框是否十分接近。如果很接近(即偏差小),则采用后四位的偏差率;否则,舍弃后四位的值,即当前边框与真实边框相差太大,不适合估计进一步估计真实边框位置。对于这一接近程度的描述,是设置阈值`F_regression_threshold`,如果当前边框与真实边框的IOU大于这一阈值,则表示接近(此时边框回归的第一个值取1,否则取0) 。这一部分论文只是稍加提及,具体可见下图的划线部分:  这一部分的实现可以参考代码 `process_data.py` 的第 `300~314` 行。 2. 针对第二个问题,为什么边框回归的训练数据是用的4096维的特征数据。 论文有提到边框回归是利用CNN网络提取的特征来进行,因此,边框回归的训练数据是AlexNet卷积层池化后(全连接层前)的图像特征,其维度是4096。而标签即为第一个问题所提到的。  以上为我对论文以及代码的一些理解,如果有疑问,非常希望能够进一步讨论。如有错误,迫切希望能够你能够指出。
@Ostnie 非常感谢你的认同 你提到的针对每一个类别分别需要独立的训练一个Bounding-box 回归器,论文我没有找到详细的说明。不过我从[论文作者的 R-CNN 代码](https://github.com/rbgirshick/rcnn)中找到具体的实现过程,可以发现你的说法是对的,即20个类需要20个Bounding-box 回归器训练。 如果对你对这些实现细节感兴趣,可以尝试阅读具体代码([RCNN](https://github.com/rbgirshick/rcnn)),不过原作者是用matlab实现,且代码中存在很多其他方面的处理,阅读起来可能不是特别好理解。但是,我们只需要注意“Bounding-box 回归器训练是否针对每个类别单独训练”,这样我们只需要理解代码 `bbox_regression/rcnn_train_bbox_regressor.m` 中的第 `76~111` 行。我在这里列出了我对这部分的理解: ``` models = cell(num_clss, 1); for i = 1:num_clss fprintf('Training regressors for class %s (%d/%d)\n', ... rcnn_model.classes{i},...
``` In [1]: from numpy.random import rand values = rand(10000,4) lst = [list(row) for row in values] tup = tuple(tuple(row) for row in values) a=1 In [2]: %timeit for row...