热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

fasterR-CNN中anchors的生成过程

转自:https:blog.csdn.netsinat_33486980articledetails81099093本博客记录generate_anchors的解读,帮助理解

转自:https://blog.csdn.net/sinat_33486980/article/details/81099093


本博客记录generate_anchors的解读,帮助理解anchor的生成过程

首先看main函数


   
   
  1. if __name__ == '__main__':
  2. import time
  3. t = time.time()
  4. a = generate_anchors() #最主要的就是这个函数
  5. print time.time() - t
  6. print a
  7. from IPython import embed; embed()

进入到generate_anchors函数中:


   
   
  1. def generate_anchors(base_size=16, ratios=[0.5, 1, 2],
  2. scales=2**np.arange(3, 6)):
  3. """
  4. Generate anchor (reference) windows by enumerating aspect ratios X
  5. scales wrt a reference (0, 0, 15, 15) window.
  6. """
  7. base_anchor = np.array([ 1, 1, base_size, base_size]) - 1
  8. print ( "base anchors",base_anchor)
  9. ratio_anchors = _ratio_enum(base_anchor, ratios)
  10. print ( "anchors after ratio",ratio_anchors)
  11. anchors = np.vstack([_scale_enum(ratio_anchors[i, :], scales)
  12. for i in xrange(ratio_anchors.shape[ 0])])
  13. print ( "achors after ration and scale",anchors)
  14. return anchors

参数有三个:

1.base_size=16

这个参数指定了最初的类似感受野的区域大小,因为经过多层卷积池化之后,feature map上一点的感受野对应到原始图像就会是一个区域,这里设置的是16,也就是feature map上一点对应到原图的大小为16x16的区域。也可以根据需要自己设置。

2.ratios=[0.5,1,2]

这个参数指的是要将16x16的区域,按照1:2,1:1,2:1三种比例进行变换,如下图所示:

                                                   图1 宽高比变换 

3.scales=2**np.arange(3, 6)

这个参数是要将输入的区域,的宽和高进行三种倍数,2^3=8,2^4=16,2^5=32倍的放大,如16x16的区域变成(16*8)*(16*8)=128*128的区域,(16*16)*(16*16)=256*256的区域,(16*32)*(16*32)=512*512的区域,如下图所示

                                                                            图2 面积放大变换 

接下来看第一句代码:


   
   
  1. base_anchor = np.array([ 1, 1, base_size, base_size]) - 1
  2. '''base_anchor值为[ 0, 0, 15, 15]'''

表示最基本的一个大小为16x16的区域,四个值,分别代表这个区域的左上角和右下角的点的坐标。

ratio_anchors = _ratio_enum(base_anchor, ratios)

  
  

这一句是将前面的16x16的区域进行ratio变化,也就是输出三种宽高比的anchors,这里调用了_ratio_enum函数,其定义如下:


   
   
  1. def _ratio_enum(anchor, ratios):
  2. """
  3. Enumerate a set of anchors for each aspect ratio wrt an anchor.
  4. """
  5. size = w * h #size:16*16=256
  6. size_ratios = size / ratios #256/ratios[0.5,1,2]=[512,256,128]
  7. #round()方法返回x的四舍五入的数字,sqrt()方法返回数字x的平方根
  8. ws = np.round(np.sqrt(size_ratios)) #ws:[23 16 11]
  9. hs = np.round(ws * ratios) #hs:[12 16 22],ws和hs一一对应。as:23&12
  10. #给定一组宽高向量,输出各个预测窗口,也就是将(宽,高,中心点横坐标,中心点纵坐标)的形式,转成
  11. #四个坐标值的形式
  12. anchors = _mkanchors(ws, hs, x_ctr, y_ctr)
  13. return anchors

输入参数为一个anchor(四个坐标值表示)和三种宽高比例(0.5,1,2)

在这个函数中又调用了一个_whctrs函数,这个函数定义如下,其主要作用是将输入的anchor的四个坐标值转化成(宽,高,中心点横坐标,中心点纵坐标)的形式。


   
   
  1. def _whctrs(anchor):
  2. """
  3. Return width, height, x center, and y center for an anchor (window).
  4. """
  5. w = anchor[ 2] - anchor[ 0] + 1
  6. h = anchor[ 3] - anchor[ 1] + 1
  7. x_ctr = anchor[ 0] + 0.5 * (w - 1)
  8. y_ctr = anchor[ 1] + 0.5 * (h - 1)
  9. return w, h, x_ctr, y_ctr

通过这个函数变换之后将原来的anchor坐标(0,0,15,15)转化成了w:16,h:16,x_ctr=7.5,y_ctr=7.5的形式,接下来按照比例变化的过程见_ratio_enum的代码注释。最后该函数输出的变换了三种宽高比的anchor如下:


   
   
  1. ratio_anchors = _ratio_enum(base_anchor, ratios)
  2. '''[[ -3.5, 2. , 18.5, 13. ],
  3. [ 0. , 0. , 15. , 15. ],
  4. [ 2.5, -3. , 12.5, 18. ]]'''

进行完上面的宽高比变换之后,接下来执行的是面积的scale变换,


   
   
  1. anchors = np.vstack([_scale_enum(ratio_anchors[i, :], scales)
  2. for i in xrange(ratio_anchors.shape[ 0])])

这里最重要的是_scale_enum函数,该函数定义如下,对上一步得到的ratio_anchors中的三种宽高比的anchor,再分别进行三种scale的变换,也就是三种宽高比,搭配三种scale,最终会得到9种宽高比和scale 的anchors。这就是论文中每一个点对应的9种anchors。


   
   
  1. def _scale_enum(anchor, scales):
  2. """
  3. Enumerate a set of anchors for each scale wrt an anchor.
  4. """
  5. w, h, x_ctr, y_ctr = _whctrs(anchor)
  6. ws = w * scales
  7. hs = h * scales
  8. anchors = _mkanchors(ws, hs, x_ctr, y_ctr)
  9. return anchors

_scale_enum函数中也是首先将宽高比变换后的每一个ratio_anchor转化成(宽,高,中心点横坐标,中心点纵坐标)的形式,再对宽和高均进行scale倍的放大,然后再转换成四个坐标值的形式。最终经过宽高比和scale变换得到的9种尺寸的anchors的坐标如下:


   
   
  1. anchors = np.vstack([_scale_enum(ratio_anchors[i, :], scales)
  2. for i in xrange(ratio_anchors.shape[ 0])])
  3. '''
  4. [[ -84. -40. 99. 55.]
  5. [-176. -88. 191. 103.]
  6. [-360. -184. 375. 199.]
  7. [ -56. -56. 71. 71.]
  8. [-120. -120. 135. 135.]
  9. [-248. -248. 263. 263.]
  10. [ -36. -80. 51. 95.]
  11. [ -80. -168. 95. 183.]
  12. [-168. -344. 183. 359.]]
  13. '''

下面这个表格对比了9种尺寸的anchor的变换:

base_anchor ratios (宽,高,中心点横坐标,中心点纵坐标) 坐标
16x16

23x12

(2:1)

[184,96,7.5,7.5]    scale=8

[ -84.  -40.   99.   55.]

[368,192,7.5,7.5]   scale=16

[-176.  -88.  191.  103.]

[736,384,7.5,7.5]    scale=32

[-360. -184.  375.  199.]

16x16

(1:1)

[128,128,7.5,7.5]    scale=8

[ -56.  -56.   71.   71.]

[256,256,7.5,7.5]    scale=16

[-120. -120.  135.  135.]

[512,512,7.5,7.5]    scale=32

[-248. -248.  263.  263.]

11x22

(1:2)

[88,176,7.5,7.5]    scale=8 [ -36.  -80.   51.   95.] 
[176,352,7.5,7.5]    scale=16

[ -80. -168.   95.  183.]

[352,704,7.5,7.5]    scale=32 [-168. -344.  183.  359.]

以我的理解,得到的这些anchors的坐标是相对于原始图像的,因为feature map的大小一般也就是60*40这样的大小,而上面得到的这些坐标都是好几百,因此是相对于原始大图像而设置的这9种组合的尺寸,这些尺寸基本上可以包含图像中的任何物体,如果画面里出现了特大的物体,则这个scale就要相应的再调整大一点,来包含特大的物体。


推荐阅读
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • Day2列表、字典、集合操作详解
    本文详细介绍了列表、字典、集合的操作方法,包括定义列表、访问列表元素、字符串操作、字典操作、集合操作、文件操作、字符编码与转码等内容。内容详实,适合初学者参考。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
author-avatar
跑车世界Y
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有