紧接着之前的博客,我们继续来看faster rcnn中的AnchorTargetLayer层:

该层定义在lib>rpn>中,见该层定义:

首先说一下这一层的目的是输出在特征图上所有点的anchors(经过二分类和回归)

(1)输入blob:bottom[0]储存特征图信息,bottom[1]储存gt框坐标,bottom[2]储存im_info信息;

(2)输出blob:top[0]存储anchors的label值(fg是1,bg是0,-1类不关心),top[1]存储的是生成的anchors的回归偏移量,即论文中的tx,ty,tw,th四个量(所以说整个faster rcnn总共两次bbox回归,第一次在RPN中,第二次在fast rcnn中),top[2]和top[3]分别存储的是bbox_inside_weights和bbox_outside_weights,这两者的具体形式后面再说,作用还不是很清楚;

好的,先进入层的setup函数:

该函数通过解析父类对自己的一些参数进行初始化,同时定义该层的输入输出blob;

该函数中要注意的是generate_anchors()函数,它的作用是产生对应与特征图上最左上角那个点的九种anchor(尺寸对应与输入图像),这9个anchor在后面被用来产生所有图像上的anchors,进入generate_anchors()函数:

三种长宽比(0.5,1,2)和三种参考尺寸(128,256,512)形成了九种anchors(注意这里只是参考尺寸,是用来计算anchors尺寸时用到的三种规格,并不是说anchors的规格就是这三种);

接着向下看该层的前向传播函数forward函数:

这里获得输入bottom[0]、bottom[1]、bottom[2],继续:

这里的shift_x和shift_y分别对应x和y轴上的偏移量,用在之前说过的用generate_anchors()函数生成的最左上角的anchors上,对其进行偏移,从而获得所有图像上的anchors;all_anchors用来存储所有这些anchors,total_anchors用来存储这些anchors的数量K×A,其中,K是输入图像的num,A是一幅图像上anchor的num;之后作者还对这些anchors进行了筛选,超出图像边界的anchors都将其丢弃~继续:

这一部分主要就是获得这些anchors和对应gt的最大重叠率的情况,以及正样本的划分标准:a.对于每一个gt,重叠率最大的那个anchor为fg;b,对于每一个gt,最大重叠率大于0.7的为fg;

cfg.TRAIN.RPN_CLOBBER_POSITIVE则涉及到一种情况,即如果最大重叠率小于cfg.TRAIN.RPN_NEGATIVE_OVERLAP=0.3,则到底正还是负,这里的cfg.TRAIN.RPN_CLOBBER_POSITIVE默认是False;

继续:

这一部分是说,如果我们得到的正样本或者负样本太多的话,那么就选取一定数量的,丢弃一定数量的anchors,应该是为了加速(这里的选取方法也很直接,就是随机选取),继续:

这一部分是生成bbox_targets、bbox_inside_weights、bbox_inside_weights;其中对于bbox_targets,它这里是调用了_compute_targets()函数,见:

在该函数又接着调用了bbox_transform函数,见:

从而得到了论文中所需要的四个偏移量tx,ty,tw,th四个量;

而对于后两个bbox_inside_weights和bbox_outside_weights,函数中定义的是bbox_inside_weights初始化为n×4的0数组,然后其中正样本的坐标的权值均为1;而bbox_outside_weights同样的初始化,其中正样本和负样本都被赋值1/num(anchors的数量),还有另一种非统一的赋值方式在else中,这里就不说了;继续:

这里则是通过_unmap()函数实现将之前在所有图像上产生的anchors都赋上label、bbox_targets、bbox_inside_weights、bbox_outside_weights属性,见该函数:

之后会把这些属性信息经过reshape封装进该网络层的输出blob,即top[0]、top[1]、top[2]、top[3]中;之后:

由于该层不需要反向传播,所以backward函数也不需要写了,在前向传播中已经reshape了,就不用再写reshape函数了~

好了,到此,AnchorTargetLayer层的定义就写到这儿,若有错误请指出~

(转载请注明出处)

最新文章

  1. Android java传递int类型数组给C
  2. 技术那么多,你想看看JSON Schema的测试吗?
  3. 关于UIView的autoresizingMask属性的研究【转】
  4. 开源搜索引擎Iveely 0.7.0发布,不一样,那就让他不一样!
  5. item3 二维数组中的查找[剑指offer]
  6. C:\Windows\system32\config\systemprofile\AppData\Local\Microsoft\Team Foundation\4.0\Cache\VersionControl.config is not valid and cannot be loaded.
  7. hdu 1281 棋盘游戏
  8. linux脚本^M: bad interpreter:解决方法
  9. linux下利用backtrace追踪函数调用堆栈以及定位段错误
  10. CodeForces 689B Mike and Shortcuts (bfs or 最短路)
  11. [妙味DOM]第六课:鼠标滚轮和COOKIE
  12. Install Composer on CentOS
  13. 02-安装linux系统
  14. Mybatis--01
  15. [Leetcode] Template to rotate matrix
  16. POJ 2230 Watchcow (欧拉回路)
  17. Office Word等双击空白处的“隐藏的模块中的编译错误:MTW5”解决
  18. 系统出现bootmgr is missing解决方式,戴尔dellserver装系统须要特别注意的问题
  19. Hadoop: Setup Maven project for MapReduce in 5mn
  20. Linux下常用命令汇总

热门文章

  1. MT【13】三角函数求范围
  2. 架构师成长之路6.4 DNS服务器搭建(部署主从DNS)
  3. 小trick总结
  4. 逆向---03.mov、test等汇编指令、EAX、关键Call、OD调试技巧
  5. poco
  6. MyEclipse上有main函数类运行报错:Editor does not contain a main type
  7. Linux网络基本网络配置
  8. QQ企业邮箱+Spring+Javamail+ActiveMQ(发送企业邮件)
  9. 2018.9青岛网络预选赛(C)
  10. linux的一个find命令配合rm删除某天前的文件