背景:985本,保研985硕,方向微服务与软件架构
上次面试后,面试官说给我一周时间看一下faster-rcnn相关内容,再进行一次面试
损失函数
讲一下faster-rcnn的损失函数
faster-rcnn一共有四个小的损失函数,在反向传播过程中有两个大的损失函数。其中RPN部分,前景/背景分类有一个损失函数,bbox-regression有一个损失函数,这两个函数加起来作为多任务损失函数在反向传播过程中一起进行传播。后面的fast-rcnn网络中,多分类有一个损失函数,bbox-regression有一个损失函数,同样,也是一起作为多任务损失函数进行反向传播。
具体使用的是哪些损失函数
回归使用的是smooth l1, 分类使用的**交叉熵*
作者为什么要用smooth l1?
因为smooth l1对outliner比较鲁棒
你对比一下l2、l1,smooth l1,说一下优缺点吧
l2是平方误差,可以加大误差的值,加快收敛速度,但是相对L1来说对outliner更敏感,如果有错误的样本值,非常影响模型的学习。L1是绝对值,相对速度较慢,也对outliner没那么鲁邦。smooth l1是两者的结合,在0-0.5的范围内是平方,0.5以外是绝对值,比l1收敛快,比l2更鲁棒。
RPN与NMS
讲一下RPN吧,RPN是怎么生成proposal的?
- 生成anchor
- 映射回原图
- 用预测的的bbox_regression进行回归,裁剪
- 提取分数最大的前N个,NMS,返回TOPN个
从NMS我们可以展开讲,你讲讲NMS算法流程吧
一个list里面放的是我们的候选框,从里面拿出评分最大的,然后把list中跟他iou大于阈值的都去掉,把这个放到结果集中。重复以上步骤,直到候选框为空,返回结果集。(面试官提醒有个地方没说到,想了半天,要先对list排序,可能我默认这个list是排序过的,所以没说出来...)
现在你面前有一个桌子,桌子上有3类物体,有两种方法进行NMS,一种是全部放一起计算,一种是按类别进行NMS,你从算法性能和场景讲一下他们的优缺点
如果三个类分别有A,B,C个,那么如果所有的放在一起计算复杂度是o(A+B+C)^2,如果分开NMS是o(A^2+B^2+C^2),第二种少了二次项和一次项,会快一些。考虑遮挡的情况,第一种如果有遮挡的话,置信度低的物体可能会被移除掉
现在有了proposal,那你讲一下在训练过程中RPN是如何进行监督学习的?
- 计算anchor和gt_box的iou,大于阈值的设为pos,小于阈值的设为neg
- 计算anchor到gt_box的bbox_regression
- 最后对正负样本进行采样,以1:1的比例,一共采样256个
介绍了下论文里的公式,比如multi-task loss中几个权值的计算。
讲一下anchor吧,现在给你一系列scale和ratio,你说说你怎么生成anchor并且将它映射回原图尺寸
讲了对源码的理解,包括每一步数据的shape([batch,h*w*9,4]),以及np.meshgrid(),np.vstack()函数等的用法。
训练策略
有一个四步交替训练,你有了解吗
嗯,这个部分第一步是用一个conv层来训练rpn,生成proposal,第二布,用一个全新的conv层,和第一步的proposal训练一个fast-rcnn网络。第三部,用第二部的conv层生成proposal,第四部,固定fast-rcnn外的所有层开始训练
你说一下这个RPN的性能与这四步中哪些步骤有关系吧
前两步,第一步生成的proposal影响第二步的faster-rcnn,第二步的卷积层用来提取特征,后面的rpn都使用这个特征
感想
因为比较重视这次机会,所以代码看得比较细,在面试的过程中很多内容都问到了,考察得还是比较深入的,源码+论文的学习方式可以继续下去