{
  "source_file": "0930",
  "source_platform": "知乎专栏",
  "author": "白裳",
  "title_listed": "一文读懂 Faster RCNN",
  "keywords": "Faster RCNN,目标检测,RPN",
  "domain": "图像处理",
  "content_type": "深度技术解析",
  "is_paid_flag": "否",
  "url": "https://zhuanlan.zhihu.com/p/31426458",
  "publish_date": "2018",
  "corpus_stage": "应用",
  "notes": "目标检测经典模型全网最透彻讲解",
  "id": "5a31c0905c89",
  "collected_at": "2026-10-02T18:42:37",
  "title": "一文读懂Faster RCNN - 知乎",
  "body_markdown": "[![](https://zhuanlan.zhihu.com/p/31426458)](javascript:void\\(0\\))\n![ZhiHu logo](../images/body-e1fa91dbdb48b8055184.png)\n[](https://www.zhihu.com)\n[关注](https://www.zhihu.com/signin?next=%2Ffollow)[推荐](https://www.zhihu.com/signin?next=%2F)[热榜](https://www.zhihu.com/signin?next=%2Fhot)[专栏](https://www.zhihu.com/signin?next=%2Fcolumn-square)[圈子](https://www.zhihu.com/signin?next=%2Fring-feeds)[AI WorksBeta ](https://www.zhihu.com/project-square)[故事](https://www.zhihu.com/fiore/h5/vip-web)\n​\n[直答](https://zhida.zhihu.com/)\n切换模式\n登录/注册\n一文读懂Faster RCNN\n首发于[工作随笔](https://www.zhihu.com/column/ML-Algorithm)\n切换模式\n![一文读懂Faster RCNN](../images/000.img)\n# 一文读懂Faster RCNN\n[![你再好好想想](../images/039.jpg)](https://www.zhihu.com/people/george-zhang-84)\n[你再好好想想](https://www.zhihu.com/people/george-zhang-84)\n[收录于 · 工作随笔](https://www.zhihu.com/column/ML-Algorithm)\n1.1 万人赞同了该文章\n​\n目录\n经过[R-CNN](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=R-CNN&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJSLUNOTiIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjQ3NTkyMDYsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MSwiemRfdG9rZW4iOm51bGx9.obi07IaC9IKn2clzDxpULts4XP-tCRw9-gPzvTvl_U0&zhida_source=entity)和Fast RCNN的积淀，Ross B. Girshick在2016年提出了新的Faster RCNN，在结构上，Faster RCNN已经将[特征抽取](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E7%89%B9%E5%BE%81%E6%8A%BD%E5%8F%96&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLnibnlvoHmir3lj5YiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ._EN4IDuZGHFXBcPaeT0frA2iM0FGqxBbLK8DZKCSEtw&zhida_source=entity)(feature extraction)，proposal提取，bounding box regression(rect refine)，classification都整合在了一个网络中，使得综合性能有较大提高，在检测速度方面尤为明显。\n![](../images/004.jpg)\n图1 Faster RCNN基本结构（来自原论文）\n依作者看来，如图1，Faster RCNN其实可以分为4个主要内容：\n  1. Conv layers。作为一种CNN[网络目标检测方法](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E7%BD%91%E7%BB%9C%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLnvZHnu5znm67moIfmo4DmtYvmlrnms5UiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ._hP-CJ5yAl3dmcpTR1KBHgw9uQN0ujalUG9g9EOUbI0&zhida_source=entity)，Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。\n  2. Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative，再利用bounding box regression修正anchors获得精确的proposals。\n  3. Roi Pooling。该层收集输入的feature maps和proposals，综合这些信息后提取proposal feature maps，送入后续全连接层判定目标类别。\n  4. Classification。利用proposal feature maps计算proposal的类别，同时再次bounding box regression获得检测框最终的精确位置。\n\n\n所以本文以上述4个内容作为切入点介绍Faster R-CNN网络。\n图2展示了python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构，可以清晰的看到该网络对于一副任意大小PxQ的图像：\n  * 首先缩放至固定大小MxN，然后将MxN图像送入网络；\n  * 而[Conv layers](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=2&q=Conv+layers&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJDb252IGxheWVycyIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjQ3NTkyMDYsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MiwiemRfdG9rZW4iOm51bGx9.j4Yo_OGrtBFN_wJ3PDwj3tHwvFEGvz9FDodoFL-vS6o&zhida_source=entity)中包含了13个[conv层](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=conv%E5%B1%82&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJjb2525bGCIiwiemhpZGFfc291cmNlIjoiZW50aXR5IiwiY29udGVudF9pZCI6NDc1OTIwNiwiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjoxLCJ6ZF90b2tlbiI6bnVsbH0.2KB4KFZTBqdC9C-h1QOKftAXVWIuJDUgT6fo7jx_XEE&zhida_source=entity)+13个[relu层](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=relu%E5%B1%82&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJyZWx15bGCIiwiemhpZGFfc291cmNlIjoiZW50aXR5IiwiY29udGVudF9pZCI6NDc1OTIwNiwiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjoxLCJ6ZF90b2tlbiI6bnVsbH0.gJcl3slp2-rfdXf3EY_3ld5okr4PzIQxJDjk6Jk-6ik&zhida_source=entity)+4个pooling层；\n  * RPN网络首先经过3x3卷积，再分别生成positive anchors和对应bounding box regression偏移量，然后计算出proposals；\n  * 而Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification（即分类proposal到底是什么object）。\n\n\n![](../images/005.jpg)\n图2 faster_rcnn_test.pt网络结构 （pascal_voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt）\n _本文不会讨论任何关于R-CNN家族的历史，分析清楚最新的Faster R-CNN就够了，并不需要追溯到那么久。实话说我也不了解R-CNN，更不关心。有空不如看看新[算法](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E7%AE%97%E6%B3%95&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLnrpfms5UiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.YVLLNEhmAukxBKGkIYi2PpWbTAfp6uRtIRI2bHR1vlA&zhida_source=entity)。_\n新出炉的pytorch官方Faster RCNN代码导读：\n[](https://zhuanlan.zhihu.com/p/145842317)\n## 1 Conv layers\nConv layers包含了conv，pooling，relu三种层。以python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构为例，如图2，Conv layers部分共有13个conv层，13个relu层，4个pooling层。这里有一个非常容易被忽略但是又无比重要的信息，在Conv layers中：\n  1. 所有的conv层都是：[kernel_size=3](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=kernel_size%3D3&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJrZXJuZWxfc2l6ZT0zIiwiemhpZGFfc291cmNlIjoiZW50aXR5IiwiY29udGVudF9pZCI6NDc1OTIwNiwiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjoxLCJ6ZF90b2tlbiI6bnVsbH0.99UtSQ_XrRm8P2qFzT67xAlrF-sDBDbESby91kJHdEQ&zhida_source=entity)，pad=1，stride=1\n  2. 所有的[pooling层](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=4&q=pooling%E5%B1%82&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJwb29saW5n5bGCIiwiemhpZGFfc291cmNlIjoiZW50aXR5IiwiY29udGVudF9pZCI6NDc1OTIwNiwiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjo0LCJ6ZF90b2tlbiI6bnVsbH0.rECqNFw5DSPGP-FatZmdGzrS1I2yqQqmjyB3G65VDJw&zhida_source=entity)都是：[kernel_size=2](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=kernel_size%3D2&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJrZXJuZWxfc2l6ZT0yIiwiemhpZGFfc291cmNlIjoiZW50aXR5IiwiY29udGVudF9pZCI6NDc1OTIwNiwiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjoxLCJ6ZF90b2tlbiI6bnVsbH0.UmD5fJtEXsm5JqgSuyhFokNSFSUKhzbEo2zEAHkTrhA&zhida_source=entity)，pad=0，stride=2\n\n\n为何重要？在Faster RCNN Conv layers中对所有的卷积都做了扩边处理（ pad=1，即填充一圈0），导致原图变为 (M+2)x(N+2)大小，再做3x3卷积后输出MxN 。正是这种设置，导致Conv layers中的conv层不改变输入和输出[矩阵](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E7%9F%A9%E9%98%B5&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLnn6npmLUiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.MSwWF_lGGOUAtwjNExbngMivo1UtSUpLvLKBkBEaOCw&zhida_source=entity)大小。如图3：\n![](../images/006.jpg)\n图3 卷积示意图\n类似的是，Conv layers中的pooling层kernel_size=2，stride=2。这样每个经过pooling层的[MxN矩阵](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=MxN%E7%9F%A9%E9%98%B5&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJNeE7nn6npmLUiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.3ZOX4pCwotRuGoMvFxgB2m6Dwxf2hPMeuvO3e3ky_UE&zhida_source=entity)，都会变为(M/2)x(N/2)大小。综上所述，在整个Conv layers中，conv和relu层不改变输入输出大小，只有pooling层使输出长宽都变为输入的1/2。\n那么，一个MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16)！这样Conv layers生成的feature map中都可以和原图对应起来。\n## 2 Region Proposal Networks(RPN)\n经典的检测方法生成检测框都非常耗时，如OpenCV adaboost使用[滑动窗口](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLmu5Hliqjnqpflj6MiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.P97hz7FSPSjpibI11Xbo90g6LHK8dfi4llselE_IZSU&zhida_source=entity)+图像金字塔生成检测框；或如R-CNN使用SS(Selective Search)方法生成[检测框](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=4&q=%E6%A3%80%E6%B5%8B%E6%A1%86&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLmo4DmtYvmoYYiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjQsInpkX3Rva2VuIjpudWxsfQ.E2dgwXFmjyU-x1BSB4oBYFLnUho7aKHnJJmoYrvIgRY&zhida_source=entity)。而Faster RCNN则抛弃了传统的滑动窗口和SS方法，直接使用RPN生成检测框，这也是Faster R-CNN的巨大优势，能极大提升检测框的生成速度。\n![](../images/007.jpg)\n图4 RPN网络结构\n上图4展示了RPN网络的具体结构。可以看到RPN网络实际分为2条线，上面一条通过softmax分类anchors获得positive和negative分类，下面一条用于计算对于anchors的bounding box regression偏移量，以获得精确的proposal。而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals，同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里，就完成了相当于目标定位的功能。\n### 2.1 [多通道图像](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E5%A4%9A%E9%80%9A%E9%81%93%E5%9B%BE%E5%83%8F&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLlpJrpgJrpgZPlm77lg48iLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.Qay0Iea9cXB1QqPEPSOsoVeNIrz7pyclJD-xrOeEIfM&zhida_source=entity)卷积基础知识介绍\n在介绍RPN前，还要多解释几句基础知识，已经懂的看官老爷跳过就好。\n  1. 对于单通道图像+单卷积核做卷积，第一章中的图3已经展示了；\n  2. 对于多通道图像+多[卷积核](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=2&q=%E5%8D%B7%E7%A7%AF%E6%A0%B8&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLljbfnp6_moLgiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjIsInpkX3Rva2VuIjpudWxsfQ.oQNLCbWz6zSu3aTm25vKu4A62nbvRD-svmQ_Mysx1z8&zhida_source=entity)做卷积，计算方式如下：\n\n\n![](../images/008.jpg)\n图5 多通道卷积计算方式\n如图5，输入有3个通道，同时有2个卷积核。对于每个卷积核，先在输入3个通道分别作卷积，再将3个通道结果加起来得到卷积输出。所以对于某个[卷积层](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E5%8D%B7%E7%A7%AF%E5%B1%82&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLljbfnp6_lsYIiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.AnvGSF4m-8q_dxWMWEYCQZlm1YfzFACK0mBCSMjA0IY&zhida_source=entity)，无论输入图像有多少个通道，输出[图像通道](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E5%9B%BE%E5%83%8F%E9%80%9A%E9%81%93&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLlm77lg4_pgJrpgZMiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.Hd28OG-r71jEVTpzWKZV-hcBm_Bwsc392xxuQJZj5rQ&zhida_source=entity)数总是等于卷积核数量！\n对多通道图像做1x1卷积，其实就是将输入图像于每个通道乘以[卷积系数](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E5%8D%B7%E7%A7%AF%E7%B3%BB%E6%95%B0&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLljbfnp6_ns7vmlbAiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.k-bo7pKUxZDpWcvs5-BCvj5Ha7JR_MWgMuvaN_WiiiY&zhida_source=entity)后加在一起，即相当于把原图像中本来各个独立的通道“联通”在了一起。\n### 2.2 anchors\n提到RPN网络，就不能不说anchors。所谓anchors，实际上就是一组由rpn/generate_anchors.py生成的矩形。直接运行作者demo中的generate_anchors.py可以得到以下输出：\n\n```\n[[ -84.  -40.   99.   55.]\n [-176.  -88.  191.  103.]\n [-360. -184.  375.  199.]\n [ -56.  -56.   71.   71.]\n [-120. -120.  135.  135.]\n [-248. -248.  263.  263.]\n [ -36.  -80.   51.   95.]\n [ -80. -168.   95.  183.]\n [-168. -344.  183.  359.]]\n```\n\n其中每行的4个值 (x_1, y_1, x_2, y_2) 表矩形左上和右下角点坐标。9个矩形共有3种形状，长宽比为大约为 \\text{width:height}\\in\\\\{1:1, 1:2, 2:1\\\\} 三种，如图6。实际上通过anchors就引入了检测中常用到的[多尺度](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E5%A4%9A%E5%B0%BA%E5%BA%A6&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLlpJrlsLrluqYiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.KrvlFS0oQinETmSugRwo2m-jN6oE2aD5CRC8ahnbL5c&zhida_source=entity)方法。\n![](../images/009.jpg)\n图6 anchors示意图\n注：关于上面的anchors size，其实是根据检测图像设置的。在python demo中，会把任意大小的输入图像reshape成800x600（即图2中的M=800，N=600）。再回头来看anchors的大小，anchors中长宽1:2中最大为352x704，长宽2:1中最大736x384，基本是cover了800x600的各个尺度和形状。\n那么这9个anchors是做什么的呢？借用Faster RCNN论文中的原图，如图7，遍历Conv layers计算获得的feature maps，为每一个点都配备这9种anchors作为初始的检测框。这样做获得检测框很不准确，不用担心，后面还有2次[bounding box regression](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=7&q=bounding+box+regression&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJib3VuZGluZyBib3ggcmVncmVzc2lvbiIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjQ3NTkyMDYsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6NywiemRfdG9rZW4iOm51bGx9.Ftn7S33n3hw6gRr4MkTLR68eKb-gW7WPp6KFBb06L_s&zhida_source=entity)可以修正检测框位置。\n![](../images/010.jpg)\n图7\n解释一下上面这张图的数字。\n  1. 在原文中使用的是ZF model中，其Conv Layers中最后的conv5层num_output=256，对应生成256张[特征图](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E7%89%B9%E5%BE%81%E5%9B%BE&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLnibnlvoHlm74iLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.Z70HUM1Sqda4V-s8u_glLpsa5qWWNJnvqSGX1z-ZHAc&zhida_source=entity)，所以相当于feature map每个点都是256-dimensions\n  2. 在conv5之后，做了rpn_conv/3x3卷积且num_output=256，相当于每个点又融合了周围3x3的空间信息（猜测这样做也许更鲁棒？反正我没测试），同时256-d不变（如图4和图7中的红框）\n  3. 假设在conv5 feature map中每个点上有k个anchor（默认k=9），而每个anhcor要分positive和negative，所以每个点由256d feature转化为cls=2•k scores；而每个anchor都有(x, y, w, h)对应4个[偏移量](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=4&q=%E5%81%8F%E7%A7%BB%E9%87%8F&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLlgY_np7vph48iLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjQsInpkX3Rva2VuIjpudWxsfQ.DoRYkkwjRkTZUus1U_ug7juu8V_pC9Wh4fvoy_7x9q8&zhida_source=entity)，所以reg=4•k coordinates\n  4. 补充一点，全部anchors拿去训练太多了，训练程序会在合适的anchors中**随机** 选取128个postive anchors+128个negative anchors进行训练（什么是合适的anchors下文5.1有解释）\n\n\n注意，在本文讲解中使用的VGG conv5 num_output=512，所以是512d，其他类似。\n**其实RPN最终就是在原图尺度上，设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的positive anchor，哪些是没目标的negative anchor。所以，仅仅是个二分类而已！**\n那么Anchor一共有多少个？原图800x600，VGG[下采样](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E4%B8%8B%E9%87%87%E6%A0%B7&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLkuIvph4fmoLciLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.kMz612eV3ArVC_IOsPmyO6JcJewToqZ0SFYl3vEGzi8&zhida_source=entity)16倍，[feature map](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=11&q=feature+map&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJmZWF0dXJlIG1hcCIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjQ3NTkyMDYsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MTEsInpkX3Rva2VuIjpudWxsfQ.76UyaPqidxRo_H29y5iJeJ0cYpYjPRKA8lowyGdZkjo&zhida_source=entity)每个点设置9个Anchor，所以：\n\\text{ceil}(800/16) \\times \\text{ceil}(600/16) \\times 9=50\\times38 \\times9=17100 \\tag{1}\n其中ceil()表示向上取整，是因为VGG输出的feature map size= 50*38。\n![](../images/011.jpg)\n图8 Gernerate Anchors\n### 2.3 softmax判定positive与negative\n一副MxN大小的矩阵送入Faster RCNN网络后，到RPN网络变为(M/16)x(N/16)，不妨设 W=M/16，H=N/16。在进入reshape与softmax之前，先做了1x1卷积，如图9：\n![](../images/012.jpg)\n图9 RPN中判定positive/negative网络结构\n该1x1卷积的caffe prototxt定义如下：\n\n```\nlayer {\n  name: \"rpn_cls_score\"\n  type: \"Convolution\"\n  bottom: \"rpn/output\"\n  top: \"rpn_cls_score\"\n  convolution_param {\n    num_output: 18   # 2(positive/negative) * 9(anchors)\n    kernel_size: 1 pad: 0 stride: 1\n  }\n}\n```\n\n可以看到其num_output=18，也就是经过该卷积的输出图像为WxHx18大小（注意第二章开头提到的卷积计算方式）。这也就刚好对应了feature maps每一个点都有9个anchors，同时每个anchors又有可能是positive和negative，所有这些信息都保存WxHx(9*2)大小的矩阵。为何这样做？后面接softmax分类获得positive anchors，也就相当于初步提取了检测目标候选区域box（一般认为目标在positive anchors中）。\n那么为何要在softmax前后都接一个reshape layer？其实只是为了便于softmax分类，至于具体原因这就要从caffe的实现形式说起了。在caffe基本数据结构blob中以如下形式保存数据：\n\n```\nblob=[batch_size, channel，height，width]\n```\n\n对应至上面的保存positive/negative anchors的矩阵，其在caffe blob中的存储形式为[1, 2x9, H, W]。而在softmax分类时需要进行positive/negative二分类，所以reshape layer会将其变为[1, 2, 9xH, W]大小，即单独“腾空”出来一个维度以便softmax分类，之后再reshape回复原状。贴一段caffe softmax_loss_layer.cpp的reshape函数的解释，非常精辟：\n\n```\n\"Number of labels must match number of predictions; \"\n\"e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), \"\n\"label count (number of labels) must be N*H*W, \"\n\"with integer values in {0, 1, ..., C-1}.\";\n\n```\n\n综上所述，RPN网络中利用anchors和softmax初步提取出positive anchors作为候选区域（另外也有实现用[sigmoid](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=sigmoid&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJzaWdtb2lkIiwiemhpZGFfc291cmNlIjoiZW50aXR5IiwiY29udGVudF9pZCI6NDc1OTIwNiwiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjoxLCJ6ZF90b2tlbiI6bnVsbH0.BzbHvk97b88dDgaMyaiYKuGSP_agdz5u-PskZX2LvZs&zhida_source=entity)代替softmax，输出[1, 1, 9xH, W]后接sigmoid进行positive/negative二分类，原理一样）。\n### 2.4 bounding box regression原理\n如图9所示绿色框为飞机的Ground Truth(GT)，红色为提取的positive anchors，即便红色的框被分类器识别为飞机，但是由于红色的框定位不准，这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对红色的框进行微调，使得positive anchors和GT更加接近。\n![](../images/013.jpg)\n图10\n对于窗口一般使用四维向量  (x, y, w, h) 表示，分别表示窗口的中心点坐标和宽高。对于图 11，红色的框A代表原始的positive Anchors，绿色的框G代表目标的GT，我们的目标是寻找一种关系，使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G'，即：\n  * 给定anchor A=(A_{x}, A_{y}, A_{w}, A_{h}) 和 GT=[G_{x}, G_{y}, G_{w}, G_{h}]\n  * 寻找一种变换**F，** 使得：F(A_{x}, A_{y}, A_{w}, A_{h})=(G_{x}^{'}, G_{y}^{'}, G_{w}^{'}, G_{h}^{'})，其中(G_{x}^{'}, G_{y}^{'}, G_{w}^{'}, G_{h}^{'})≈(G_{x}, G_{y}, G_{w}, G_{h})\n\n\n![](../images/014.jpg)\n图11\n那么经过何种变换**F** 才能从图10中的anchor A变为G'呢？ 比较简单的思路就是:\n  * 先做平移\n\n\nG_x'=A_w\\cdot d_x(A) +A_x\\tag{2}\nG_y'=A_h\\cdot d_y(A) +A_y\\tag{3}\n  * 再做缩放\n\n\nG_w'=A_w\\cdot \\exp(d_w(A)) \\tag{4}\nG_h'=A_h\\cdot \\exp(d_h(A))\\tag{5}\n观察上面4个公式发现，需要学习的是 d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A) 这四个变换。当输入的anchor A与GT相差较小时，可以认为这种变换是一种线性变换， 那么就可以用线性回归来建模对窗口进行微调（注意，只有当anchors A和GT比较接近时，才能使用线性回归模型，否则就是复杂的非线性问题了）。\n接下来的问题就是如何通过线性回归获得 d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A) 了。线性回归就是给定输入的特征向量X, 学习一组参数W, 使得经过线性回归后的值跟真实值Y非常接近，即 Y=WX 。对于该问题，输入X是cnn feature map，定义为Φ；同时还有训练传入A与GT之间的变换量，即(t_{x}, t_{y}, t_{w}, t_{h})。输出是d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)四个变换。那么目标函数可以表示为：\nd_*(A)=W_*^T\\cdot \\phi(A)\\tag{6}\n其中 \\phi(A) 是对应anchor的feature map组成的特征向量， W_* 是需要学习的参数， d_*(A) 是得到的预测值（*表示 x，y，w，h，也就是每一个变换对应一个上述目标函数）。为了让预测值 d_*(A) 与真实值 t_* 差距最小，设计L1损失函数：\n\\text{Loss}=\\sum_{i}^{N}{|t_*^i-W_*^T\\cdot \\phi(A^i)|} \\tag{7}\n函数优化目标为：\n\\hat{W}_*=\\text{argmin}_{W_*}\\sum_{i}^{n}|t_*^i- W_*^T\\cdot \\phi(A^i)|+\\lambda||W_*|| \\tag{8}\n为了方便描述，这里以L1损失为例介绍，而真实情况中一般使用smooth-L1损失。\n需要说明，只有在GT与需要回归框位置比较接近时，才可近似认为上述线性变换成立。  \n说完原理，对应于Faster RCNN原文，positive anchor与ground truth之间的平移量 (t_x, t_y) 与尺度因子 (t_w, t_h) 如下：\nt_x=(x-x_a)/w_a\\ \\ \\ \\ t_y=(y-y_a)/h_a \\tag{9}\nt_w=\\log(w/w_a)\\ \\ \\ \\ t_h=\\log(h/h_a) \\tag{10}\n对于训练bouding box regression网络回归分支，输入是cnn feature Φ，监督信号是Anchor与GT的差距 (t_x, t_y, t_w, t_h)，即训练目标是：输入 Φ的情况下使网络输出与监督信号尽可能接近。那么当bouding box regression工作时，再输入Φ时，回归网络分支的输出就是每个Anchor的平移量和变换尺度 (t_x, t_y, t_w, t_h)，显然即可用来修正Anchor位置了。\n### 2.5 对proposals进行bounding box regression\n在了解bounding box regression后，再回头来看RPN网络第二条线路，如图12。\n![](../images/015.jpg)\n图12 RPN中的bbox reg\n先来看一看上图11中1x1卷积的caffe prototxt定义：\n\n```\nlayer {\n  name: \"rpn_bbox_pred\"\n  type: \"Convolution\"\n  bottom: \"rpn/output\"\n  top: \"rpn_bbox_pred\"\n  convolution_param {\n    num_output: 36   # 4 * 9(anchors)\n    kernel_size: 1 pad: 0 stride: 1\n  }\n}\n```\n\n可以看到其 num_output=36，即经过该卷积输出图像为WxHx36，在caffe blob存储为[1, 4x9, H, W]，这里相当于feature maps每个点都有9个anchors，每个anchors又都有4个用于回归的变换量。\n[d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)] \\tag{11}\n回到图8，VGG输出 50x38x512 的特征，对应设置 50x38xk anchors，而RPN输出：\n  1. 大小为 50x38x2k 的positive/negative softmax分类特征矩阵\n  2. 大小为 50x38x4k 的regression坐标回归特征矩阵\n\n\n恰好满足RPN完成positive/negative分类+bounding box regression坐标回归.\n### 2.6 Proposal Layer\nProposal Layer负责综合所有 [d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)] 变换量和positive anchors，计算出精准的proposal，送入后续[RoI Pooling](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=RoI+Pooling&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJSb0kgUG9vbGluZyIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjQ3NTkyMDYsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MSwiemRfdG9rZW4iOm51bGx9.HauoBvKE26DnYPHTebW94YcvYuHTIxWujbxuJL3arFs&zhida_source=entity) Layer。还是先来看看Proposal Layer的caffe prototxt定义：\n\n```\nlayer {\n  name: 'proposal'\n  type: 'Python'\n  bottom: 'rpn_cls_prob_reshape'\n  bottom: 'rpn_bbox_pred'\n  bottom: 'im_info'\n  top: 'rois'\n  python_param {\n    module: 'rpn.proposal_layer'\n    layer: 'ProposalLayer'\n    param_str: \"'feat_stride': 16\"\n  }\n}\n```\n\nProposal Layer有3个输入：positive vs negative anchors分类器结果rpn_cls_prob_reshape，对应的bbox reg的 [d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)] 变换量rpn_bbox_pred，以及im_info；另外还有参数feat_stride=16，这和图4是对应的。\n首先解释im_info。对于一副任意大小PxQ图像，传入Faster RCNN前首先reshape到固定MxN，im_info=[M, N, scale_factor]则保存了此次缩放的所有信息。然后经过Conv Layers，经过4次pooling变为WxH=(M/16)x(N/16)大小，其中feature_stride=16则保存了该信息，用于计算anchor偏移量。\n![](../images/016.jpg)\n图13\nProposal Layer forward（caffe layer的前传函数）按照以下顺序依次处理：\n  1. 生成anchors，利用[d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)]对所有的anchors做bbox regression回归（这里的anchors生成和训练时完全一致）\n  2. 按照输入的positive softmax scores由大到小排序anchors，提取前pre_nms_topN(e.g. 6000)个anchors，即提取修正位置后的positive anchors\n  3. 限定超出图像边界的positive anchors为图像边界，防止后续roi pooling时proposal超出图像边界（见文章底部QA部分图21）\n  4. 剔除尺寸非常小的positive anchors\n  5. 对剩余的positive anchors进行NMS（nonmaximum suppression）\n  6. Proposal Layer有3个输入：positive和negative anchors分类器结果rpn_cls_prob_reshape，对应的bbox reg的(e.g. 300)结果作为proposal输出\n\n\n之后输出proposal=[x1, y1, x2, y2]，注意，由于在第三步中将anchors映射回原图判断是否超出边界，所以这里输出的proposal是对应MxN输入图像尺度的，这点在后续网络中有用。另外我认为，严格意义上的检测应该到此就结束了，后续部分应该属于识别了。\nRPN网络结构就介绍到这里，总结起来就是：  \n**生成anchors - > softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals**\n## 3 RoI pooling\n而RoI Pooling层则负责收集proposal，并计算出proposal feature maps，送入后续网络。从图2中可以看到Rol pooling层有2个输入：\n  1. 原始的feature maps\n  2. RPN输出的proposal boxes（大小各不相同）\n\n\n### 3.1 为何需要RoI Pooling\n先来看一个问题：对于传统的CNN（如AlexNet和VGG），当[网络训练](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E7%BD%91%E7%BB%9C%E8%AE%AD%E7%BB%83&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLnvZHnu5zorq3nu4MiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.CTudhPrvOH84coMjGXaan4yoPzIJwwwm-36fbIFBk84&zhida_source=entity)好后输入的图像尺寸必须是固定值，同时网络输出也是固定大小的vector or matrix。如果输入图像大小不定，这个问题就变得比较麻烦。有2种解决办法：\n  1. 从图像中crop一部分传入网络\n  2. 将图像warp成需要的大小后传入网络\n\n\n![](../images/017.jpg)\n图14 crop与warp破坏图像原有结构信息\n两种办法的示意图如图14，可以看到无论采取那种办法都不好，要么crop后破坏了图像的完整结构，要么warp破坏了图像原始形状信息。\n回忆RPN网络生成的proposals的方法：对positive anchors进行bounding box regression，那么这样获得的proposals也是大小形状各不相同，即也存在上述问题。所以Faster R-CNN中提出了RoI Pooling解决这个问题。不过RoI Pooling确实是从[Spatial Pyramid Pooling](https://link.zhihu.com/?target=https%3A//arxiv.org/abs/1406.4729)发展而来，但是限于篇幅这里略去不讲，有兴趣的读者可以自行查阅相关论文。\n### 3.2 RoI Pooling原理\n分析之前先来看看RoI Pooling Layer的caffe prototxt的定义：\n\n```\nlayer {\n  name: \"roi_pool5\"\n  type: \"ROIPooling\"\n  bottom: \"conv5_3\"\n  bottom: \"rois\"\n  top: \"pool5\"\n  roi_pooling_param {\n    pooled_w: 7\n    pooled_h: 7\n    spatial_scale: 0.0625 # 1/16\n  }\n}\n```\n\n其中有新参数pooled_w和pooled_h，另外一个参数spatial_scale认真阅读的读者肯定已经知道知道用途。RoI Pooling layer forward过程：\n  * 由于proposal是对应MxN尺度的，所以首先使用spatial_scale参数将其映射回(M/16)x(N/16)大小的feature map尺度；\n  * 再将每个proposal对应的feature map区域水平分为 pool_w*pool_h 的网格；\n  * 对网格的每一份都进行max pooling处理。\n\n\n这样处理后，即使大小不同的proposal输出结果都是 pool_w*pool_h 固定大小，实现了固定长度输出。\n![](../images/018.jpg)\n图15 proposal示意图\n## 4 Classification\nClassification部分利用已经获得的proposal feature maps，通过full connect层与softmax计算每个proposal具体属于那个类别（如人，车，电视等），输出cls_prob[概率向量](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E6%A6%82%E7%8E%87%E5%90%91%E9%87%8F&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLmpoLnjoflkJHph48iLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.u3ibGgw4wZUWqJRava2oDSziYP832flCBMZlribx3ig&zhida_source=entity)；同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred，用于回归更加精确的目标检测框。Classification部分网络结构如图16。\n![](../images/019.jpg)\n图16 Classification部分网络结构图\n从RoI Pooling获取到7x7=49大小的proposal feature maps后，送入后续网络，可以看到做了如下2件事：\n  1. 通过全连接和softmax对proposals进行分类，这实际上已经是识别的范畴了\n  2. 再次对proposals进行bounding box regression，获取更高精度的rect box\n\n\n这里来看看全连接层InnerProduct layers，简单的示意图如图17，\n![](../images/020.jpg)\n图17 全连接层示意图\n其计算公式如下：\n![](../images/021.jpg)\n其中W和bias B都是预先训练好的，即大小是固定的，当然输入X和输出Y也就是固定大小。所以，这也就印证了之前Roi Pooling的必要性。到这里，我想其他内容已经很容易理解，不在赘述了。\n## 5 Faster RCNN训练\nFaster R-CNN的训练，是在已经训练好的model（如VGG_CNN_M_1024，VGG，ZF）的基础上继续进行训练。实际中训练过程分为6个步骤：\n  1. 在已经训练好的model上，训练RPN网络，对应stage1_rpn_train.pt\n  2. 利用步骤1中训练好的RPN网络，收集proposals，对应rpn_test.pt\n  3. 第一次训练Fast RCNN网络，对应stage1_fast_rcnn_train.pt\n  4. 第二训练RPN网络，对应stage2_rpn_train.pt\n  5. 再次利用步骤4中训练好的RPN网络，收集proposals，对应rpn_test.pt\n  6. 第二次训练Fast RCNN网络，对应stage2_fast_rcnn_train.pt\n\n\n可以看到训练过程类似于一种“迭代”的过程，不过只循环了2次。至于只循环了2次的原因是应为作者提到：\"A similar alternating training can be run for more iterations, but we have observed negligible improvements\"，即循环更多次没有提升了。接下来本章以上述6个步骤讲解训练过程。\n下面是一张训练过程流程图，应该更加清晰：\n![](../images/022.jpg)\n### 5.1 训练RPN网络\n在该步骤中，首先读取RBG提供的预训练好的model（本文使用VGG），开始迭代训练。来看看stage1_rpn_train.pt网络结构，如图19。\n![](../images/023.jpg)\n图19 stage1_rpn_train.pt（考虑图片大小，Conv Layers中所有的层都画在一起了，如红圈所示，后续图都如此处理）\n与检测网络类似的是，依然使用Conv Layers提取feature maps。整个网络使用的Loss如下：\n\\text{L}(\\\\{p_i\\\\},\\\\{t_i\\\\})=\\frac{1}{N_{\\text{cls}}}\\sum_{i}\\text{L}_\\text{cls}(p_i,p_i^*)+\\lambda\\frac{1}{N_{\\text{reg}}}\\sum_{i}p_i^*\\text{L}_\\text{reg}(t_i,t_i^*) \\tag{12}\n上述公式中 i 表示anchors index， p_{i} 表示positive softmax [probability](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=probability&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJwcm9iYWJpbGl0eSIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjQ3NTkyMDYsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MSwiemRfdG9rZW4iOm51bGx9.B1A4BbYy_CpUpOog_BcJL0eOVVB40lwgw41lVqhSGak&zhida_source=entity)，p_{i}^{*}代表对应的GT predict概率（即当第i个anchor与GT间IoU>0.7，认为是该anchor是positive，p_{i}^{*}=1；反之IoU<0.3时，认为是该anchor是negative，p_{i}^{*}=0；至于那些0.3<IoU<0.7的anchor则不参与训练）；t代表predict bounding box，t^{*}代表对应positive anchor对应的GT box。可以看到，整个Loss分为2部分：\n  1. cls loss，即rpn_cls_loss层计算的softmax loss，用于分类anchors为positive与negative的网络训练\n  2. reg loss，即rpn_loss_bbox层计算的soomth L1 loss，用于bounding box regression网络训练。注意在该loss中乘了 p_{i}^{*} ，相当于只关心positive anchors的回归（其实在回归中也完全没必要去关心negative）。\n\n\n由于在实际过程中，N_\\text{cls}和N_\\text{reg}差距过大，用参数λ平衡二者（如N_\\text{cls}=256，N_\\text{reg}=2400时设置 λ=\\frac{N_\\text{reg}}{N_\\text{cls}}\\approx10 ），使总的网络Loss计算过程中能够均匀考虑2种Loss。这里比较重要是 \\text{L}_\\text{reg} 使用的soomth L1 loss，计算公式如下：\n\\text{L}_\\text{reg}(t_i,t_i^*)=\\sum_{i\\in\\\\{x,y,w,h\\\\}}^{}\\text{smooth}_{\\text{L1}}(t_i-t_i^*) \\tag{13}\n\\text{soomth}_\\text{L1}(x) = \\begin{cases} 0.5x^2 & \\text{if |x|<1 } \\\\\\ |x|-0.5 & \\text{otherwise} \\end{cases} \\tag{14}\n了解数学原理后，反过来看图18：\n  1. 在RPN训练阶段，rpn-data（python AnchorTargetLayer）层会按照和test阶段Proposal层完全一样的方式生成Anchors用于训练\n  2. 对于rpn_loss_cls，输入的rpn_cls_scors_reshape和rpn_labels分别对应 p 与 p^{*} ， N_\\text{cls} 参数隐含在p与p^{*}的caffe blob的大小中\n  3. 对于rpn_loss_bbox，输入的rpn_bbox_pred和rpn_bbox_targets分别对应 t 与 t^{*} ，rpn_bbox_inside_weigths对应 p^{*}，rpn_bbox_outside_weigths未用到（从smooth_L1_Loss layer代码中可以看到），而 N_\\text{reg} 同样隐含在caffe blob大小中\n\n\n这样，公式与代码就完全对应了。特别需要注意的是，在训练和检测阶段生成和存储anchors的顺序完全一样，这样训练结果才能被用于检测！\n### 5.2 通过训练好的RPN网络收集proposals\n在该步骤中，利用之前的RPN网络，获取proposal rois，同时获取positive softmax probability，如图20，然后将获取的信息保存在python pickle文件中。该网络本质上和检测中的RPN网络一样，没有什么区别。\n![](../images/024.jpg)\n图20 rpn_test.pt\n### 5.3 训练Faster RCNN网络\n读取之前保存的pickle文件，获取proposals与positive probability。从data层输入网络。然后：\n  1. 将提取的proposals作为rois传入网络，如图21蓝框\n  2. 计算bbox_inside_weights+bbox_outside_weights，作用与RPN一样，传入soomth_L1_loss layer，如图21绿框\n\n\n这样就可以训练最后的识别softmax与最终的bounding box regression了。\n![](../images/025.jpg)\n图21 stage1_fast_rcnn_train.pt\n之后的stage2训练都是大同小异，不再赘述了。Faster R-CNN还有一种end-to-end的训练方式，可以一次完成train，有兴趣请自己看作者GitHub吧。\n[](https://link.zhihu.com/?target=https%3A//github.com/rbgirshick/py-faster-rcnn)\n## QA\n此篇文章初次成文于2016年内部学习分享，再后来经多次修正和完善成为现在的样子。感谢大家一直以来的支持，现在总结常见疑问回答如下：\n  * 为什么Anchor坐标中有负数\n\n\n回顾anchor生成步骤：首先生成9个base anchor，然后通过坐标偏移在 50*38 大小的 \\frac{1}{16} 下采样FeatureMap每个点都放上这9个base anchor，就形成了 50*38*k 个anhcors。至于这9个base anchor坐标是什么其实并不重要，不同代码实现也许不同。\n显然这里面有一部分边缘anchors会超出图像边界，而真实中不会有超出图像的目标，所以会有clip anchor步骤。\n![](../images/026.jpg)\n图21 clip anchor\n  * Anchor到底与网络输出如何对应\n\n\nVGG输出 50*38*512 的特征，对应设置 50*38*k 个anchors，而RPN输出 50*38*2k 的分类特征矩阵和 50*38*4k 的坐标回归特征矩阵。\n![](../images/027.jpg)\n图22 anchor与网络输出如何对应方式\n其实在实现过程中，每个点的 2k 个分类特征与 4k 回归特征，与 k 个anchor逐个对应即可，这实际是一种“人为设置的逻辑映射”。当然，也可以不这样设置，但是无论如何都需要保证**在训练和测试过程中映射方式必须一致** 。\n  * 为何有ROI Pooling还要把输入图片resize到固定大小的MxN\n\n\n由于引入ROI Pooling，从原理上说Faster R-CNN确实能够检测任意大小的图片。但是由于在训练的时候需要使用大batch训练网络，而不同大小输入拼batch在实现的时候代码较为复杂，而且当时以[Caffe](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=Caffe&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJDYWZmZSIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjQ3NTkyMDYsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MSwiemRfdG9rZW4iOm51bGx9.wWO5zzwQ6vZjECE9S9NKuaWm4suPbgCQUn1kMPLDHvI&zhida_source=entity)为代表的第一代深度学习框架也不如Tensorflow和PyTorch灵活，所以作者选择了把输入图片resize到固定大小的800x600。这应该算是历史遗留问题。\n另外很多问题，都是属于具体实现问题，真诚的建议读者阅读代码自行理解。\n  * 为什么这篇文章中的faster rcnn训练还要分步骤，这么复杂？\n\n\n因为faster rcnn发表于2015年，在那个年代只有caffe。当时会把数据送入caffe训练已经是高手了，网络能收敛都已经是高手中的高手。到后来出现tensorflow1.0，再到后面出现pytorch，框架优化做的越来越好，加入越来越多的trick进去，基本不存在大的收敛问题了。所以你看到的文章和现有代码的差异，这应该算是历史问题吧。考虑到和原文的对应问题，我就保留内容以供参考。\n## 拓展\n关于torchvision中的FasterRCNN代码：\n[](https://zhuanlan.zhihu.com/p/145842317)\nFaster RCNN在文字检测中的应用：CTPN\n[](https://zhuanlan.zhihu.com/p/34757009)\nFaster RCNN在高德导航中的应用：\n[](https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/IJUMCOBhgXHv7VC1YT4q_g)\n  \n\n**本文章只是介绍和分析原论文的思路，原文和代码怎么说我就怎么写，所以不涉及改进等内容。如对FasterRCNN论文和原代码有意见，建议向原作者询问，谢谢。**\n**创作不易，不想被白嫖，求点赞、关注、收藏三连。**\n编辑于 2024-07-16 02:52・四川\n[卷积神经网络（CNN）](https://www.zhihu.com/topic/20043586)\n[深度学习（Deep Learning）](https://www.zhihu.com/topic/19813032)\n[目标检测](https://www.zhihu.com/topic/19596960)\n​赞同 1.1 万​​463 条评论​1.4 万​1597 \n​分享\n​申请转载​\n​\n![](../images/body-7e064b35ba4350074989.jpeg)\n未登录用户\n  \n\n463 条评论\n默认\n最新\n评论内容由作者筛选后展示\n[![Qjtbs](../images/028.jpg)](https://www.zhihu.com/people/c53e472f5daa5b82ec880365dba3214a)\n[Qjtbs](https://www.zhihu.com/people/c53e472f5daa5b82ec880365dba3214a)\n之前做过检测一段时间，后来也一直在关注新方法。这fasterrcnn虽然被说烂了，但是很多''科普文''讲到关键部分大都刻意回避技术细节，很大可能是作者根本没看懂。这篇文章则非常详尽，几乎涵盖到所有细节。  \n  \nbtw，提一句，渗透到技术细节，只看论文是不够的，还得看代码。\n2017-12-01 · 热评\n​回复​455\n查看全部 7 条回复​\n[![毛熊](../images/029.jpg)](https://www.zhihu.com/people/dc6cf7a8305b3f30f6497aef02f10c9c)\n[毛熊](https://www.zhihu.com/people/dc6cf7a8305b3f30f6497aef02f10c9c)\n最近正在看Fast Faster Mask系列的代码，作者这篇文章从具体的实现原理和细节讲述了box的实现细节，帮助非常大。望作者大大啥时候能把Mask的实现也能具体的讲讲就好了。\n2017-12-22\n​回复​33\n[![狂热的小妖猴](../images/030.jpg)](https://www.zhihu.com/people/cfe7969c9cb24a3bf5fd8f361cbbfb6e)\n[狂热的小妖猴](https://www.zhihu.com/people/cfe7969c9cb24a3bf5fd8f361cbbfb6e)\n看了之后都怀疑你看的跟我是不是同一篇论文，为什么能如此精辟，让我瞬间明白了许多\n2018-05-08\n​回复​28\n展开其他 1 条回复​\n[![红红火火](../images/031.jpg)](https://www.zhihu.com/people/1279e903a01bac2db05a2239579ca086)\n[红红火火](https://www.zhihu.com/people/1279e903a01bac2db05a2239579ca086)\n22年依旧是知乎上讲的最好的FasterRCNN\n2022-02-28\n​回复​22\n查看全部 11 条回复​\n[![Fantasy](../images/032.jpg)](https://www.zhihu.com/people/280e5a04ac8058d3c0c16367eff2245a)\n[Fantasy](https://www.zhihu.com/people/280e5a04ac8058d3c0c16367eff2245a)\n距离看10次的目标还差6次，还是想要问关于Anchor的问题！\n文章中说“如图7，遍历Conv layers计算获得的feature maps，为每一个点都配备这9种anchors作为初始的检测框。”，又说“**其实RPN最终就是在原图尺度上，设置了密密麻麻的候选Anchor。** ”\n  \n\n那么我的问题是，Anchor到底是基于feature map的呢？还是在feature map上得到17100个anchor后乘以16映射回原图？ \n2019-02-20\n​回复​14\n[![谢小虫](../images/033.jpg)](https://www.zhihu.com/people/a5a1dd390f7606322b3f4cf108d493f6)\n[谢小虫](https://www.zhihu.com/people/a5a1dd390f7606322b3f4cf108d493f6)\nanchors都是在原图上的，每个resize后的原图比如是600x600，经过resnet50后变成38x38,映射回原图上是38X38个区域，这些区域中心是原图的archor中心，每个archor中心可以产生出9个不同尺寸的archors,每张原图都能产生38x38x9=12996个archors,然后这些archors和这张图的k个的真实框box求iou，就可以得到12996个archors相对于k个真实框的(tx,ty,tw,th)和对应的label(-1为过渡地带，要忽略，1表示这个archor为前景，0表示这个archor为背景)，就可以和rpn的输出计算loss了\n2022-06-02\n​回复​24\n查看全部 14 条回复​\n[![强化学徒](../images/034.jpg)](https://www.zhihu.com/people/de8a8d88a5a13996c98658c5a2daab9e)\n[强化学徒](https://www.zhihu.com/people/de8a8d88a5a13996c98658c5a2daab9e)\n整体思路真是非常适合新手，多谢张老板\n2018-01-14\n​回复​10\n展开其他 4 条回复​\n[![linhahhh](../images/035.jpg)](https://www.zhihu.com/people/7daf0a6c984641b0d6b65f28483ebd25)\n[linhahhh](https://www.zhihu.com/people/7daf0a6c984641b0d6b65f28483ebd25)\n谢谢作者！有2个问题想请教一下，RPN的softmax那里18通道，按照reshape操作的意图，应该是18维前9维对应9个anchor属于foreground的概率，后9维对应9个anchor属于background的概率，为什么要这样排列分开，而不是fg1, bg1; fg2, bg2; ... ; fg9, bg9这样排列的呢？还有，每个anchor属于foreground的概率等于1减属于background的概率，为什么两个都要算呢，直接9通道不是更好吗？\n2018-07-22\n​回复​9\n查看全部 12 条回复​\n[![夏雨](../images/036.jpg)](https://www.zhihu.com/people/c9939ce5555588bc8893dc747110caab)\n[夏雨](https://www.zhihu.com/people/c9939ce5555588bc8893dc747110caab)\n真的是一篇非常赞的文章，但是依然给作者提建议：\nFaster rcnn是为了end-to-end，那么在原始像素空间每个像素都有可能是anchor box的中心，这个空间太大了，所以背后的真正原因是：利用CNN抽取特征在（映射到低维度），在低维（也就是featuremaps）每个“像素点”上画不同尺寸的anchor boxes。\n2. 对featuremaps中每个”像素“点对应的anchor boxes进行赛选，微雕（回归）+分类（featuremaps每个像素点对应的anchor boxes可以映射回原始输入的像素空间）。\n2020-12-04\n​回复​8\n展开其他 1 条回复​\n[![aven](../images/037.jpg)](https://www.zhihu.com/people/35a9592568328358f85c956d1e3f63b1)\n[aven](https://www.zhihu.com/people/35a9592568328358f85c956d1e3f63b1)\n为啥你们这边都写的是缩放到800*600，代码里面不是1000*600吗\n2018-04-09\n​回复​8\n[![恐成最大赢家](../images/038.jpg)](https://www.zhihu.com/people/d16b23c773aff0a013a4e70027495e6b)\n[恐成最大赢家](https://www.zhihu.com/people/d16b23c773aff0a013a4e70027495e6b)\n从CSDN追过来\n2018-01-18\n​回复​7\n点击查看全部评论\n![](../images/body-7e064b35ba4350074989.jpeg)\n未登录用户\n  \n\n关于作者\n[![你再好好想想](../images/039.jpg)](https://www.zhihu.com/people/george-zhang-84)\n[你再好好想想](https://www.zhihu.com/people/george-zhang-84)\n[ 回答 **33** ](https://www.zhihu.com/people/george-zhang-84/answers)[ 文章 **16** ](https://www.zhihu.com/people/george-zhang-84/posts)[ 关注者 **26,178** ](https://www.zhihu.com/people/george-zhang-84/followers)\n​关注他​发私信\n大家都在搜\n换一换\n[江歌妈妈发长文尘埃终将落定704 万](https://www.zhihu.com/search?q=%E6%B1%9F%E6%AD%8C%E5%A6%88%E5%A6%88%E5%8F%91%E9%95%BF%E6%96%87%E5%B0%98%E5%9F%83%E7%BB%88%E5%B0%86%E8%90%BD%E5%AE%9A&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)热\n[中国男足 0-5 巴勒斯坦562 万](https://www.zhihu.com/search?q=%E4%B8%AD%E5%9B%BD%E7%94%B7%E8%B6%B3+0-5+%E5%B7%B4%E5%8B%92%E6%96%AF%E5%9D%A6&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)热\n[原央视主持人阿丘回应被通报419 万](https://www.zhihu.com/search?q=%E5%8E%9F%E5%A4%AE%E8%A7%86%E4%B8%BB%E6%8C%81%E4%BA%BA%E9%98%BF%E4%B8%98%E5%9B%9E%E5%BA%94%E8%A2%AB%E9%80%9A%E6%8A%A5&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)热\n[华为与赛力斯达成新五年合作409 万](https://www.zhihu.com/search?q=%E5%8D%8E%E4%B8%BA%E4%B8%8E%E8%B5%9B%E5%8A%9B%E6%96%AF%E8%BE%BE%E6%88%90%E6%96%B0%E4%BA%94%E5%B9%B4%E5%90%88%E4%BD%9C&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)热\n[迪拜航空确认航班发生事故398 万](https://www.zhihu.com/search?q=%E8%BF%AA%E6%8B%9C%E8%88%AA%E7%A9%BA%E7%A1%AE%E8%AE%A4%E8%88%AA%E7%8F%AD%E5%8F%91%E7%94%9F%E4%BA%8B%E6%95%85&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)热\n[东航回应网传空姐跪地道歉326 万](https://www.zhihu.com/search?q=%E4%B8%9C%E8%88%AA%E5%9B%9E%E5%BA%94%E7%BD%91%E4%BC%A0%E7%A9%BA%E5%A7%90%E8%B7%AA%E5%9C%B0%E9%81%93%E6%AD%89&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)\n[王楚钦：不知道为什么就是感觉累320 万](https://www.zhihu.com/search?q=%E7%8E%8B%E6%A5%9A%E9%92%A6%EF%BC%9A%E4%B8%8D%E7%9F%A5%E9%81%93%E4%B8%BA%E4%BB%80%E4%B9%88%E5%B0%B1%E6%98%AF%E6%84%9F%E8%A7%89%E7%B4%AF&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)热\n[江苏高考作文《衬衫的价格为 9 磅 15 便士》爆火268 万](https://www.zhihu.com/search?q=%E6%B1%9F%E8%8B%8F%E9%AB%98%E8%80%83%E4%BD%9C%E6%96%87%E3%80%8A%E8%A1%AC%E8%A1%AB%E7%9A%84%E4%BB%B7%E6%A0%BC%E4%B8%BA+9+%E7%A3%85+15+%E4%BE%BF%E5%A3%AB%E3%80%8B%E7%88%86%E7%81%AB&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)\n[女装网店开始用防拆带了265 万](https://www.zhihu.com/search?q=%E5%A5%B3%E8%A3%85%E7%BD%91%E5%BA%97%E5%BC%80%E5%A7%8B%E7%94%A8%E9%98%B2%E6%8B%86%E5%B8%A6%E4%BA%86&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)\n[孕妇骑车别车被司机踹翻257 万](https://www.zhihu.com/search?q=%E5%AD%95%E5%A6%87%E9%AA%91%E8%BD%A6%E5%88%AB%E8%BD%A6%E8%A2%AB%E5%8F%B8%E6%9C%BA%E8%B8%B9%E7%BF%BB&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)\n### 推荐阅读\n[ ![目标检测 Faster RCNN全面解读复现](../images/body-44760a67f07c0b27290b.jpg)目标检测 Faster RCNN全面解读复现 小酒馆燃着灯 ](https://zhuanlan.zhihu.com/p/667819268)# [Faster R-CNN Faster R-CNN { 说一下faster-rcnn的整个从输入到输出的框架流程 Faster-RCNN如何进行一次计算 如果有很长，很小，或者很宽的目标，应该如何处理 RPN哪里也可以提升小目标检出率 Faster-RCN… Cloud...发表于深度学习 ... ](https://zhuanlan.zhihu.com/p/89004308)# [【论文解读】精读Faster RCNN Faster R-CNN论文链接： Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks推荐代码： https://github.com/facebookresearch/Detectron （首推！Faster RCN… Alger...发表于Neura... ](https://zhuanlan.zhihu.com/p/82185598)# [【计算机视觉】faster R-CNN文章框架总结 写在前面：这是自己的学习笔记。 论文： Towards Real-Time Object Detection with Region Proposal Networkscode:matlab ShaoqingRen/faster_rcnn，python AssetionError: training py-fas… IronMan ](https://zhuanlan.zhihu.com/p/32905770) \n\n_想来知乎工作？请发送邮件到 jobs@zhihu.com_\n打开知乎App\n在「我的页」右上角打开扫一扫\n![](../images/body-0f9788d006ab0f4da762.png)\n其他扫码方式：微信\n下载知乎App\n无障碍模式\n验证码登录\n密码登录\n[开通机构号](https://zhuanlan.zhihu.com/org/signup)\n中国 +86\n获取短信验证码\n忘记密码\n登录/注册\n其他方式登录\n未注册手机验证后自动登录，注册即代表同意[《知乎协议》](https://www.zhihu.com/term/zhihu-terms)[《隐私保护指引》](https://www.zhihu.com/term/privacy)\n扫码下载知乎 App\n关闭二维码\n",
  "metadata": {
    "title": "一文读懂Faster RCNN - 知乎",
    "description": "经过R-CNN和Fast RCNN的积淀，Ross B. Girshick在2016年提出了新的Faster RCNN，在结构上，Faster RCNN已经将特征抽取(feature extraction)，proposal提取，bounding box regression(rect refine)，classification…",
    "keywords": "卷积神经网络（CNN）,深度学习（Deep Learning）,目标检测",
    "author": null,
    "og:title": "一文读懂Faster RCNN",
    "og:url": "https://zhuanlan.zhihu.com/p/31426458",
    "og:description": "经过R-CNN和Fast RCNN的积淀，Ross B. Girshick在2016年提出了新的Faster RCNN，在结构上，Faster RCNN已经将特征抽取(feature extraction)，proposal提取，bounding box regression(rect refine)，classification…",
    "og:image": "https://pic1.zhimg.com/v2-00e275a8f05f5d3a9f821e40714b9cfb_720w.jpg?source=172ae18b",
    "og:type": "article",
    "og:site_name": "知乎专栏"
  },
  "paywall": {
    "listed_paid": false,
    "detected": false,
    "marker": "",
    "public_only": false,
    "policy": "付费/会员内容只保留页面公开可见部分，不绕过付费墙"
  },
  "crawl": {
    "success": true,
    "status_code": 200,
    "error": ""
  },
  "code_blocks": [
    {
      "language": "txt",
      "file": "attachments/5a31c0905c89/code/block_000.txt",
      "chars": 244
    },
    {
      "language": "txt",
      "file": "attachments/5a31c0905c89/code/block_001.txt",
      "chars": 221
    },
    {
      "language": "txt",
      "file": "attachments/5a31c0905c89/code/block_002.txt",
      "chars": 40
    },
    {
      "language": "txt",
      "file": "attachments/5a31c0905c89/code/block_003.txt",
      "chars": 216
    },
    {
      "language": "txt",
      "file": "attachments/5a31c0905c89/code/block_004.txt",
      "chars": 202
    },
    {
      "language": "txt",
      "file": "attachments/5a31c0905c89/code/block_005.txt",
      "chars": 255
    },
    {
      "language": "txt",
      "file": "attachments/5a31c0905c89/code/block_006.txt",
      "chars": 194
    }
  ],
  "images": [
    {
      "status": "http_403",
      "url": "https://zhuanlan.zhihu.com/p/31426458",
      "src": "https://zhuanlan.zhihu.com/p/31426458",
      "alt": "",
      "downloaded": false,
      "discovery": "saved_markdown",
      "retried_at": "2026-10-20T17:39:26Z"
    }
  ],
  "audio": [],
  "videos": [],
  "links": [
    {
      "type": "internal",
      "href": "https://www.zhihu.com"
    },
    {
      "type": "internal",
      "href": "https://www.zhihu.com/signin?next=%2Ffollow"
    },
    {
      "type": "internal",
      "href": "https://www.zhihu.com/signin?next=%2F"
    },
    {
      "type": "internal",
      "href": "https://www.zhihu.com/signin?next=%2Fhot"
    },
    {
      "type": "internal",
      "href": "https://www.zhihu.com/signin?next=%2Fcolumn-square"
    },
    {
      "type": "internal",
      "href": "https://www.zhihu.com/signin?next=%2Fring-feeds"
    },
    {
      "type": "internal",
      "href": "https://www.zhihu.com/project-square"
    },
    {
      "type": "internal",
      "href": "https://www.zhihu.com/fiore/h5/vip-web"
    },
    {
      "type": "internal",
      "href": "https://zhida.zhihu.com/"
    },
    {
      "type": "internal",
      "href": "https://www.zhihu.com/column/ML-Algorithm"
    },
    {
      "type": "internal",
      "href": "https://www.zhihu.com/people/george-zhang-84"
    },
    {
      "type": "internal",
      "href": "https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=R-CNN&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJSLUNOTiIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjQ3NTkyMDYsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MSwiemRfdG9rZW4iOm51bGx9.obi07IaC9IKn2clzDxpULts4XP-tCRw9-gPzvTvl_U0&zhida_source=entity"
    },
    {
      "type": "internal",
      "href": "https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E7%89%B9%E5%BE%81%E6%8A%BD%E5%8F%96&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLnibnlvoHmir3lj5YiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ._EN4IDuZGHFXBcPaeT0frA2iM0FGqxBbLK8DZKCSEtw&zhida_source=entity"
    },
    {
      "type": "internal",
      "href": "https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E7%BD%91%E7%BB%9C%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLnvZHnu5znm67moIfmo4DmtYvmlrnms5UiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ._hP-CJ5yAl3dmcpTR1KBHgw9uQN0ujalUG9g9EOUbI0&zhida_source=entity"
    },
    {
      "type": "internal",
      "href": "https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=2&q=Conv+layers&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJDb252IGxheWVycyIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjQ3NTkyMDYsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MiwiemRfdG9rZW4iOm51bGx9.j4Yo_OGrtBFN_wJ3PDwj3tHwvFEGvz9FDodoFL-vS6o&zhida_source=entity"
    },
    {
      "type": "internal",
      "href": "https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=conv%E5%B1%82&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJjb2525bGCIiwiemhpZGFfc291cmNlIjoiZW50aXR5IiwiY29udGVudF9pZCI6NDc1OTIwNiwiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjoxLCJ6ZF90b2tlbiI6bnVsbH0.2KB4KFZTBqdC9C-h1QOKftAXVWIuJDUgT6fo7jx_XEE&zhida_source=entity"
    },
    {
      "type": "internal",
      "href": "https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=relu%E5%B1%82&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJyZWx15bGCIiwiemhpZGFfc291cmNlIjoiZW50aXR5IiwiY29udGVudF9pZCI6NDc1OTIwNiwiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjoxLCJ6ZF90b2tlbiI6bnVsbH0.gJcl3slp2-rfdXf3EY_3ld5okr4PzIQxJDjk6Jk-6ik&zhida_source=entity"
    },
    {
      "type": "internal",
      "href": "https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E7%AE%97%E6%B3%95&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLnrpfms5UiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.YVLLNEhmAukxBKGkIYi2PpWbTAfp6uRtIRI2bHR1vlA&zhida_source=entity"
    },
    {
      "type": "internal",
      "href": "https://zhuanlan.zhihu.com/p/145842317"
    },
    {
      "type": "internal",
      "href": "https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=kernel_size%3D3&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJrZXJuZWxfc2l6ZT0zIiwiemhpZGFfc291cmNlIjoiZW50aXR5IiwiY29udGVudF9pZCI6NDc1OTIwNiwiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjoxLCJ6ZF90b2tlbiI6bnVsbH0.99UtSQ_XrRm8P2qFzT67xAlrF-sDBDbESby91kJHdEQ&zhida_source=entity"
    },
    {
      "type": "external",
      "href": "javascript:void(0)"
    }
  ],
  "repair_version": 2,
  "repaired_at": "2026-10-20T17:24:44Z",
  "source_url": "https://zhuanlan.zhihu.com/p/31426458",
  "delivery_status": "unverified",
  "discovery_status": "http_403",
  "missing_reason": "源页面未重新核验:http_403；已按保留正文补采图片",
  "repair_error": "",
  "actual_video_files": [],
  "expected_saved_body_images": 1,
  "image_discovery": "saved_markdown",
  "source_body_markdown": "[![](https://zhuanlan.zhihu.com/p/31426458)](javascript:void\\(0\\))\n![ZhiHu logo](https://static.zhihu.com/heifetz/assets/wechat-share-logo.39ea9ecd.png)\n[](https://www.zhihu.com)\n[关注](https://www.zhihu.com/signin?next=%2Ffollow)[推荐](https://www.zhihu.com/signin?next=%2F)[热榜](https://www.zhihu.com/signin?next=%2Fhot)[专栏](https://www.zhihu.com/signin?next=%2Fcolumn-square)[圈子](https://www.zhihu.com/signin?next=%2Fring-feeds)[AI WorksBeta ](https://www.zhihu.com/project-square)[故事](https://www.zhihu.com/fiore/h5/vip-web)\n​\n[直答](https://zhida.zhihu.com/)\n切换模式\n登录/注册\n一文读懂Faster RCNN\n首发于[工作随笔](https://www.zhihu.com/column/ML-Algorithm)\n切换模式\n![一文读懂Faster RCNN](https://pic1.zhimg.com/70/v2-00e275a8f05f5d3a9f821e40714b9cfb_1440w.image?source=172ae18b&biz_tag=Post)\n# 一文读懂Faster RCNN\n[![你再好好想想](https://pic1.zhimg.com/v2-b67ffd371f45f759a0dc0ccf8536b19e_l.jpg?source=32738c0c&needBackground=1)](https://www.zhihu.com/people/george-zhang-84)\n[你再好好想想](https://www.zhihu.com/people/george-zhang-84)\n[收录于 · 工作随笔](https://www.zhihu.com/column/ML-Algorithm)\n1.1 万人赞同了该文章\n​\n目录\n经过[R-CNN](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=R-CNN&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJSLUNOTiIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjQ3NTkyMDYsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MSwiemRfdG9rZW4iOm51bGx9.obi07IaC9IKn2clzDxpULts4XP-tCRw9-gPzvTvl_U0&zhida_source=entity)和Fast RCNN的积淀，Ross B. Girshick在2016年提出了新的Faster RCNN，在结构上，Faster RCNN已经将[特征抽取](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E7%89%B9%E5%BE%81%E6%8A%BD%E5%8F%96&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLnibnlvoHmir3lj5YiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ._EN4IDuZGHFXBcPaeT0frA2iM0FGqxBbLK8DZKCSEtw&zhida_source=entity)(feature extraction)，proposal提取，bounding box regression(rect refine)，classification都整合在了一个网络中，使得综合性能有较大提高，在检测速度方面尤为明显。\n![](https://pic1.zhimg.com/v2-c0172be282021a1029f7b72b51079ffe_1440w.jpg)\n图1 Faster RCNN基本结构（来自原论文）\n依作者看来，如图1，Faster RCNN其实可以分为4个主要内容：\n  1. Conv layers。作为一种CNN[网络目标检测方法](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E7%BD%91%E7%BB%9C%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B%E6%96%B9%E6%B3%95&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLnvZHnu5znm67moIfmo4DmtYvmlrnms5UiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ._hP-CJ5yAl3dmcpTR1KBHgw9uQN0ujalUG9g9EOUbI0&zhida_source=entity)，Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。\n  2. Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative，再利用bounding box regression修正anchors获得精确的proposals。\n  3. Roi Pooling。该层收集输入的feature maps和proposals，综合这些信息后提取proposal feature maps，送入后续全连接层判定目标类别。\n  4. Classification。利用proposal feature maps计算proposal的类别，同时再次bounding box regression获得检测框最终的精确位置。\n\n\n所以本文以上述4个内容作为切入点介绍Faster R-CNN网络。\n图2展示了python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构，可以清晰的看到该网络对于一副任意大小PxQ的图像：\n  * 首先缩放至固定大小MxN，然后将MxN图像送入网络；\n  * 而[Conv layers](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=2&q=Conv+layers&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJDb252IGxheWVycyIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjQ3NTkyMDYsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MiwiemRfdG9rZW4iOm51bGx9.j4Yo_OGrtBFN_wJ3PDwj3tHwvFEGvz9FDodoFL-vS6o&zhida_source=entity)中包含了13个[conv层](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=conv%E5%B1%82&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJjb2525bGCIiwiemhpZGFfc291cmNlIjoiZW50aXR5IiwiY29udGVudF9pZCI6NDc1OTIwNiwiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjoxLCJ6ZF90b2tlbiI6bnVsbH0.2KB4KFZTBqdC9C-h1QOKftAXVWIuJDUgT6fo7jx_XEE&zhida_source=entity)+13个[relu层](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=relu%E5%B1%82&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJyZWx15bGCIiwiemhpZGFfc291cmNlIjoiZW50aXR5IiwiY29udGVudF9pZCI6NDc1OTIwNiwiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjoxLCJ6ZF90b2tlbiI6bnVsbH0.gJcl3slp2-rfdXf3EY_3ld5okr4PzIQxJDjk6Jk-6ik&zhida_source=entity)+4个pooling层；\n  * RPN网络首先经过3x3卷积，再分别生成positive anchors和对应bounding box regression偏移量，然后计算出proposals；\n  * 而Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification（即分类proposal到底是什么object）。\n\n\n![](https://pic4.zhimg.com/v2-e64a99b38f411c337f538eb5f093bdf3_1440w.jpg)\n图2 faster_rcnn_test.pt网络结构 （pascal_voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt）\n _本文不会讨论任何关于R-CNN家族的历史，分析清楚最新的Faster R-CNN就够了，并不需要追溯到那么久。实话说我也不了解R-CNN，更不关心。有空不如看看新[算法](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E7%AE%97%E6%B3%95&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLnrpfms5UiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.YVLLNEhmAukxBKGkIYi2PpWbTAfp6uRtIRI2bHR1vlA&zhida_source=entity)。_\n新出炉的pytorch官方Faster RCNN代码导读：\n[](https://zhuanlan.zhihu.com/p/145842317)\n## 1 Conv layers\nConv layers包含了conv，pooling，relu三种层。以python版本中的VGG16模型中的faster_rcnn_test.pt的网络结构为例，如图2，Conv layers部分共有13个conv层，13个relu层，4个pooling层。这里有一个非常容易被忽略但是又无比重要的信息，在Conv layers中：\n  1. 所有的conv层都是：[kernel_size=3](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=kernel_size%3D3&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJrZXJuZWxfc2l6ZT0zIiwiemhpZGFfc291cmNlIjoiZW50aXR5IiwiY29udGVudF9pZCI6NDc1OTIwNiwiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjoxLCJ6ZF90b2tlbiI6bnVsbH0.99UtSQ_XrRm8P2qFzT67xAlrF-sDBDbESby91kJHdEQ&zhida_source=entity)，pad=1，stride=1\n  2. 所有的[pooling层](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=4&q=pooling%E5%B1%82&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJwb29saW5n5bGCIiwiemhpZGFfc291cmNlIjoiZW50aXR5IiwiY29udGVudF9pZCI6NDc1OTIwNiwiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjo0LCJ6ZF90b2tlbiI6bnVsbH0.rECqNFw5DSPGP-FatZmdGzrS1I2yqQqmjyB3G65VDJw&zhida_source=entity)都是：[kernel_size=2](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=kernel_size%3D2&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJrZXJuZWxfc2l6ZT0yIiwiemhpZGFfc291cmNlIjoiZW50aXR5IiwiY29udGVudF9pZCI6NDc1OTIwNiwiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjoxLCJ6ZF90b2tlbiI6bnVsbH0.UmD5fJtEXsm5JqgSuyhFokNSFSUKhzbEo2zEAHkTrhA&zhida_source=entity)，pad=0，stride=2\n\n\n为何重要？在Faster RCNN Conv layers中对所有的卷积都做了扩边处理（ pad=1，即填充一圈0），导致原图变为 (M+2)x(N+2)大小，再做3x3卷积后输出MxN 。正是这种设置，导致Conv layers中的conv层不改变输入和输出[矩阵](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E7%9F%A9%E9%98%B5&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLnn6npmLUiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.MSwWF_lGGOUAtwjNExbngMivo1UtSUpLvLKBkBEaOCw&zhida_source=entity)大小。如图3：\n![](https://picx.zhimg.com/v2-3c772e9ed555eb86a97ef9c08bf563c9_1440w.jpg)\n图3 卷积示意图\n类似的是，Conv layers中的pooling层kernel_size=2，stride=2。这样每个经过pooling层的[MxN矩阵](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=MxN%E7%9F%A9%E9%98%B5&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJNeE7nn6npmLUiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.3ZOX4pCwotRuGoMvFxgB2m6Dwxf2hPMeuvO3e3ky_UE&zhida_source=entity)，都会变为(M/2)x(N/2)大小。综上所述，在整个Conv layers中，conv和relu层不改变输入输出大小，只有pooling层使输出长宽都变为输入的1/2。\n那么，一个MxN大小的矩阵经过Conv layers固定变为(M/16)x(N/16)！这样Conv layers生成的feature map中都可以和原图对应起来。\n## 2 Region Proposal Networks(RPN)\n经典的检测方法生成检测框都非常耗时，如OpenCV adaboost使用[滑动窗口](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLmu5Hliqjnqpflj6MiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.P97hz7FSPSjpibI11Xbo90g6LHK8dfi4llselE_IZSU&zhida_source=entity)+图像金字塔生成检测框；或如R-CNN使用SS(Selective Search)方法生成[检测框](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=4&q=%E6%A3%80%E6%B5%8B%E6%A1%86&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLmo4DmtYvmoYYiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjQsInpkX3Rva2VuIjpudWxsfQ.E2dgwXFmjyU-x1BSB4oBYFLnUho7aKHnJJmoYrvIgRY&zhida_source=entity)。而Faster RCNN则抛弃了传统的滑动窗口和SS方法，直接使用RPN生成检测框，这也是Faster R-CNN的巨大优势，能极大提升检测框的生成速度。\n![](https://pica.zhimg.com/v2-1908feeaba591d28bee3c4a754cca282_1440w.jpg)\n图4 RPN网络结构\n上图4展示了RPN网络的具体结构。可以看到RPN网络实际分为2条线，上面一条通过softmax分类anchors获得positive和negative分类，下面一条用于计算对于anchors的bounding box regression偏移量，以获得精确的proposal。而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals，同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里，就完成了相当于目标定位的功能。\n### 2.1 [多通道图像](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E5%A4%9A%E9%80%9A%E9%81%93%E5%9B%BE%E5%83%8F&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLlpJrpgJrpgZPlm77lg48iLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.Qay0Iea9cXB1QqPEPSOsoVeNIrz7pyclJD-xrOeEIfM&zhida_source=entity)卷积基础知识介绍\n在介绍RPN前，还要多解释几句基础知识，已经懂的看官老爷跳过就好。\n  1. 对于单通道图像+单卷积核做卷积，第一章中的图3已经展示了；\n  2. 对于多通道图像+多[卷积核](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=2&q=%E5%8D%B7%E7%A7%AF%E6%A0%B8&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLljbfnp6_moLgiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjIsInpkX3Rva2VuIjpudWxsfQ.oQNLCbWz6zSu3aTm25vKu4A62nbvRD-svmQ_Mysx1z8&zhida_source=entity)做卷积，计算方式如下：\n\n\n![](https://pica.zhimg.com/v2-8d72777321cbf1336b79d839b6c7f9fc_1440w.jpg)\n图5 多通道卷积计算方式\n如图5，输入有3个通道，同时有2个卷积核。对于每个卷积核，先在输入3个通道分别作卷积，再将3个通道结果加起来得到卷积输出。所以对于某个[卷积层](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E5%8D%B7%E7%A7%AF%E5%B1%82&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLljbfnp6_lsYIiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.AnvGSF4m-8q_dxWMWEYCQZlm1YfzFACK0mBCSMjA0IY&zhida_source=entity)，无论输入图像有多少个通道，输出[图像通道](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E5%9B%BE%E5%83%8F%E9%80%9A%E9%81%93&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLlm77lg4_pgJrpgZMiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.Hd28OG-r71jEVTpzWKZV-hcBm_Bwsc392xxuQJZj5rQ&zhida_source=entity)数总是等于卷积核数量！\n对多通道图像做1x1卷积，其实就是将输入图像于每个通道乘以[卷积系数](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E5%8D%B7%E7%A7%AF%E7%B3%BB%E6%95%B0&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLljbfnp6_ns7vmlbAiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.k-bo7pKUxZDpWcvs5-BCvj5Ha7JR_MWgMuvaN_WiiiY&zhida_source=entity)后加在一起，即相当于把原图像中本来各个独立的通道“联通”在了一起。\n### 2.2 anchors\n提到RPN网络，就不能不说anchors。所谓anchors，实际上就是一组由rpn/generate_anchors.py生成的矩形。直接运行作者demo中的generate_anchors.py可以得到以下输出：\n\n```\n[[ -84.  -40.   99.   55.]\n [-176.  -88.  191.  103.]\n [-360. -184.  375.  199.]\n [ -56.  -56.   71.   71.]\n [-120. -120.  135.  135.]\n [-248. -248.  263.  263.]\n [ -36.  -80.   51.   95.]\n [ -80. -168.   95.  183.]\n [-168. -344.  183.  359.]]\n```\n\n其中每行的4个值 (x_1, y_1, x_2, y_2) 表矩形左上和右下角点坐标。9个矩形共有3种形状，长宽比为大约为 \\text{width:height}\\in\\\\{1:1, 1:2, 2:1\\\\} 三种，如图6。实际上通过anchors就引入了检测中常用到的[多尺度](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E5%A4%9A%E5%B0%BA%E5%BA%A6&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLlpJrlsLrluqYiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.KrvlFS0oQinETmSugRwo2m-jN6oE2aD5CRC8ahnbL5c&zhida_source=entity)方法。\n![](https://picx.zhimg.com/v2-7abead97efcc46a3ee5b030a2151643f_1440w.jpg)\n图6 anchors示意图\n注：关于上面的anchors size，其实是根据检测图像设置的。在python demo中，会把任意大小的输入图像reshape成800x600（即图2中的M=800，N=600）。再回头来看anchors的大小，anchors中长宽1:2中最大为352x704，长宽2:1中最大736x384，基本是cover了800x600的各个尺度和形状。\n那么这9个anchors是做什么的呢？借用Faster RCNN论文中的原图，如图7，遍历Conv layers计算获得的feature maps，为每一个点都配备这9种anchors作为初始的检测框。这样做获得检测框很不准确，不用担心，后面还有2次[bounding box regression](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=7&q=bounding+box+regression&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJib3VuZGluZyBib3ggcmVncmVzc2lvbiIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjQ3NTkyMDYsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6NywiemRfdG9rZW4iOm51bGx9.Ftn7S33n3hw6gRr4MkTLR68eKb-gW7WPp6KFBb06L_s&zhida_source=entity)可以修正检测框位置。\n![](https://pica.zhimg.com/v2-c93db71cc8f4f4fd8cfb4ef2e2cef4f4_1440w.jpg)\n图7\n解释一下上面这张图的数字。\n  1. 在原文中使用的是ZF model中，其Conv Layers中最后的conv5层num_output=256，对应生成256张[特征图](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E7%89%B9%E5%BE%81%E5%9B%BE&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLnibnlvoHlm74iLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.Z70HUM1Sqda4V-s8u_glLpsa5qWWNJnvqSGX1z-ZHAc&zhida_source=entity)，所以相当于feature map每个点都是256-dimensions\n  2. 在conv5之后，做了rpn_conv/3x3卷积且num_output=256，相当于每个点又融合了周围3x3的空间信息（猜测这样做也许更鲁棒？反正我没测试），同时256-d不变（如图4和图7中的红框）\n  3. 假设在conv5 feature map中每个点上有k个anchor（默认k=9），而每个anhcor要分positive和negative，所以每个点由256d feature转化为cls=2•k scores；而每个anchor都有(x, y, w, h)对应4个[偏移量](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=4&q=%E5%81%8F%E7%A7%BB%E9%87%8F&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLlgY_np7vph48iLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjQsInpkX3Rva2VuIjpudWxsfQ.DoRYkkwjRkTZUus1U_ug7juu8V_pC9Wh4fvoy_7x9q8&zhida_source=entity)，所以reg=4•k coordinates\n  4. 补充一点，全部anchors拿去训练太多了，训练程序会在合适的anchors中**随机** 选取128个postive anchors+128个negative anchors进行训练（什么是合适的anchors下文5.1有解释）\n\n\n注意，在本文讲解中使用的VGG conv5 num_output=512，所以是512d，其他类似。\n**其实RPN最终就是在原图尺度上，设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的positive anchor，哪些是没目标的negative anchor。所以，仅仅是个二分类而已！**\n那么Anchor一共有多少个？原图800x600，VGG[下采样](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E4%B8%8B%E9%87%87%E6%A0%B7&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLkuIvph4fmoLciLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.kMz612eV3ArVC_IOsPmyO6JcJewToqZ0SFYl3vEGzi8&zhida_source=entity)16倍，[feature map](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=11&q=feature+map&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJmZWF0dXJlIG1hcCIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjQ3NTkyMDYsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MTEsInpkX3Rva2VuIjpudWxsfQ.76UyaPqidxRo_H29y5iJeJ0cYpYjPRKA8lowyGdZkjo&zhida_source=entity)每个点设置9个Anchor，所以：\n\\text{ceil}(800/16) \\times \\text{ceil}(600/16) \\times 9=50\\times38 \\times9=17100 \\tag{1}\n其中ceil()表示向上取整，是因为VGG输出的feature map size= 50*38。\n![](https://pic2.zhimg.com/v2-4b15828dfee19be726835b671748cc4d_1440w.jpg)\n图8 Gernerate Anchors\n### 2.3 softmax判定positive与negative\n一副MxN大小的矩阵送入Faster RCNN网络后，到RPN网络变为(M/16)x(N/16)，不妨设 W=M/16，H=N/16。在进入reshape与softmax之前，先做了1x1卷积，如图9：\n![](https://pic4.zhimg.com/v2-1ab4b6c3dd607a5035b5203c76b078f3_1440w.jpg)\n图9 RPN中判定positive/negative网络结构\n该1x1卷积的caffe prototxt定义如下：\n\n```\nlayer {\n  name: \"rpn_cls_score\"\n  type: \"Convolution\"\n  bottom: \"rpn/output\"\n  top: \"rpn_cls_score\"\n  convolution_param {\n    num_output: 18   # 2(positive/negative) * 9(anchors)\n    kernel_size: 1 pad: 0 stride: 1\n  }\n}\n```\n\n可以看到其num_output=18，也就是经过该卷积的输出图像为WxHx18大小（注意第二章开头提到的卷积计算方式）。这也就刚好对应了feature maps每一个点都有9个anchors，同时每个anchors又有可能是positive和negative，所有这些信息都保存WxHx(9*2)大小的矩阵。为何这样做？后面接softmax分类获得positive anchors，也就相当于初步提取了检测目标候选区域box（一般认为目标在positive anchors中）。\n那么为何要在softmax前后都接一个reshape layer？其实只是为了便于softmax分类，至于具体原因这就要从caffe的实现形式说起了。在caffe基本数据结构blob中以如下形式保存数据：\n\n```\nblob=[batch_size, channel，height，width]\n```\n\n对应至上面的保存positive/negative anchors的矩阵，其在caffe blob中的存储形式为[1, 2x9, H, W]。而在softmax分类时需要进行positive/negative二分类，所以reshape layer会将其变为[1, 2, 9xH, W]大小，即单独“腾空”出来一个维度以便softmax分类，之后再reshape回复原状。贴一段caffe softmax_loss_layer.cpp的reshape函数的解释，非常精辟：\n\n```\n\"Number of labels must match number of predictions; \"\n\"e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), \"\n\"label count (number of labels) must be N*H*W, \"\n\"with integer values in {0, 1, ..., C-1}.\";\n\n```\n\n综上所述，RPN网络中利用anchors和softmax初步提取出positive anchors作为候选区域（另外也有实现用[sigmoid](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=sigmoid&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJzaWdtb2lkIiwiemhpZGFfc291cmNlIjoiZW50aXR5IiwiY29udGVudF9pZCI6NDc1OTIwNiwiY29udGVudF90eXBlIjoiQXJ0aWNsZSIsIm1hdGNoX29yZGVyIjoxLCJ6ZF90b2tlbiI6bnVsbH0.BzbHvk97b88dDgaMyaiYKuGSP_agdz5u-PskZX2LvZs&zhida_source=entity)代替softmax，输出[1, 1, 9xH, W]后接sigmoid进行positive/negative二分类，原理一样）。\n### 2.4 bounding box regression原理\n如图9所示绿色框为飞机的Ground Truth(GT)，红色为提取的positive anchors，即便红色的框被分类器识别为飞机，但是由于红色的框定位不准，这张图相当于没有正确的检测出飞机。所以我们希望采用一种方法对红色的框进行微调，使得positive anchors和GT更加接近。\n![](https://pic4.zhimg.com/v2-93021a3c03d66456150efa1da95416d3_1440w.jpg)\n图10\n对于窗口一般使用四维向量  (x, y, w, h) 表示，分别表示窗口的中心点坐标和宽高。对于图 11，红色的框A代表原始的positive Anchors，绿色的框G代表目标的GT，我们的目标是寻找一种关系，使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G'，即：\n  * 给定anchor A=(A_{x}, A_{y}, A_{w}, A_{h}) 和 GT=[G_{x}, G_{y}, G_{w}, G_{h}]\n  * 寻找一种变换**F，** 使得：F(A_{x}, A_{y}, A_{w}, A_{h})=(G_{x}^{'}, G_{y}^{'}, G_{w}^{'}, G_{h}^{'})，其中(G_{x}^{'}, G_{y}^{'}, G_{w}^{'}, G_{h}^{'})≈(G_{x}, G_{y}, G_{w}, G_{h})\n\n\n![](https://picx.zhimg.com/v2-ea7e6e48662bfa68ec73bdf32f36bb85_1440w.jpg)\n图11\n那么经过何种变换**F** 才能从图10中的anchor A变为G'呢？ 比较简单的思路就是:\n  * 先做平移\n\n\nG_x'=A_w\\cdot d_x(A) +A_x\\tag{2}\nG_y'=A_h\\cdot d_y(A) +A_y\\tag{3}\n  * 再做缩放\n\n\nG_w'=A_w\\cdot \\exp(d_w(A)) \\tag{4}\nG_h'=A_h\\cdot \\exp(d_h(A))\\tag{5}\n观察上面4个公式发现，需要学习的是 d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A) 这四个变换。当输入的anchor A与GT相差较小时，可以认为这种变换是一种线性变换， 那么就可以用线性回归来建模对窗口进行微调（注意，只有当anchors A和GT比较接近时，才能使用线性回归模型，否则就是复杂的非线性问题了）。\n接下来的问题就是如何通过线性回归获得 d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A) 了。线性回归就是给定输入的特征向量X, 学习一组参数W, 使得经过线性回归后的值跟真实值Y非常接近，即 Y=WX 。对于该问题，输入X是cnn feature map，定义为Φ；同时还有训练传入A与GT之间的变换量，即(t_{x}, t_{y}, t_{w}, t_{h})。输出是d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)四个变换。那么目标函数可以表示为：\nd_*(A)=W_*^T\\cdot \\phi(A)\\tag{6}\n其中 \\phi(A) 是对应anchor的feature map组成的特征向量， W_* 是需要学习的参数， d_*(A) 是得到的预测值（*表示 x，y，w，h，也就是每一个变换对应一个上述目标函数）。为了让预测值 d_*(A) 与真实值 t_* 差距最小，设计L1损失函数：\n\\text{Loss}=\\sum_{i}^{N}{|t_*^i-W_*^T\\cdot \\phi(A^i)|} \\tag{7}\n函数优化目标为：\n\\hat{W}_*=\\text{argmin}_{W_*}\\sum_{i}^{n}|t_*^i- W_*^T\\cdot \\phi(A^i)|+\\lambda||W_*|| \\tag{8}\n为了方便描述，这里以L1损失为例介绍，而真实情况中一般使用smooth-L1损失。\n需要说明，只有在GT与需要回归框位置比较接近时，才可近似认为上述线性变换成立。  \n说完原理，对应于Faster RCNN原文，positive anchor与ground truth之间的平移量 (t_x, t_y) 与尺度因子 (t_w, t_h) 如下：\nt_x=(x-x_a)/w_a\\ \\ \\ \\ t_y=(y-y_a)/h_a \\tag{9}\nt_w=\\log(w/w_a)\\ \\ \\ \\ t_h=\\log(h/h_a) \\tag{10}\n对于训练bouding box regression网络回归分支，输入是cnn feature Φ，监督信号是Anchor与GT的差距 (t_x, t_y, t_w, t_h)，即训练目标是：输入 Φ的情况下使网络输出与监督信号尽可能接近。那么当bouding box regression工作时，再输入Φ时，回归网络分支的输出就是每个Anchor的平移量和变换尺度 (t_x, t_y, t_w, t_h)，显然即可用来修正Anchor位置了。\n### 2.5 对proposals进行bounding box regression\n在了解bounding box regression后，再回头来看RPN网络第二条线路，如图12。\n![](https://pic3.zhimg.com/v2-8241c8076d60156248916fe2f1a5674a_1440w.jpg)\n图12 RPN中的bbox reg\n先来看一看上图11中1x1卷积的caffe prototxt定义：\n\n```\nlayer {\n  name: \"rpn_bbox_pred\"\n  type: \"Convolution\"\n  bottom: \"rpn/output\"\n  top: \"rpn_bbox_pred\"\n  convolution_param {\n    num_output: 36   # 4 * 9(anchors)\n    kernel_size: 1 pad: 0 stride: 1\n  }\n}\n```\n\n可以看到其 num_output=36，即经过该卷积输出图像为WxHx36，在caffe blob存储为[1, 4x9, H, W]，这里相当于feature maps每个点都有9个anchors，每个anchors又都有4个用于回归的变换量。\n[d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)] \\tag{11}\n回到图8，VGG输出 50x38x512 的特征，对应设置 50x38xk anchors，而RPN输出：\n  1. 大小为 50x38x2k 的positive/negative softmax分类特征矩阵\n  2. 大小为 50x38x4k 的regression坐标回归特征矩阵\n\n\n恰好满足RPN完成positive/negative分类+bounding box regression坐标回归.\n### 2.6 Proposal Layer\nProposal Layer负责综合所有 [d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)] 变换量和positive anchors，计算出精准的proposal，送入后续[RoI Pooling](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=RoI+Pooling&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJSb0kgUG9vbGluZyIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjQ3NTkyMDYsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MSwiemRfdG9rZW4iOm51bGx9.HauoBvKE26DnYPHTebW94YcvYuHTIxWujbxuJL3arFs&zhida_source=entity) Layer。还是先来看看Proposal Layer的caffe prototxt定义：\n\n```\nlayer {\n  name: 'proposal'\n  type: 'Python'\n  bottom: 'rpn_cls_prob_reshape'\n  bottom: 'rpn_bbox_pred'\n  bottom: 'im_info'\n  top: 'rois'\n  python_param {\n    module: 'rpn.proposal_layer'\n    layer: 'ProposalLayer'\n    param_str: \"'feat_stride': 16\"\n  }\n}\n```\n\nProposal Layer有3个输入：positive vs negative anchors分类器结果rpn_cls_prob_reshape，对应的bbox reg的 [d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)] 变换量rpn_bbox_pred，以及im_info；另外还有参数feat_stride=16，这和图4是对应的。\n首先解释im_info。对于一副任意大小PxQ图像，传入Faster RCNN前首先reshape到固定MxN，im_info=[M, N, scale_factor]则保存了此次缩放的所有信息。然后经过Conv Layers，经过4次pooling变为WxH=(M/16)x(N/16)大小，其中feature_stride=16则保存了该信息，用于计算anchor偏移量。\n![](https://pic2.zhimg.com/v2-1e43500c7cc9a9de211d737bc347ced9_1440w.jpg)\n图13\nProposal Layer forward（caffe layer的前传函数）按照以下顺序依次处理：\n  1. 生成anchors，利用[d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)]对所有的anchors做bbox regression回归（这里的anchors生成和训练时完全一致）\n  2. 按照输入的positive softmax scores由大到小排序anchors，提取前pre_nms_topN(e.g. 6000)个anchors，即提取修正位置后的positive anchors\n  3. 限定超出图像边界的positive anchors为图像边界，防止后续roi pooling时proposal超出图像边界（见文章底部QA部分图21）\n  4. 剔除尺寸非常小的positive anchors\n  5. 对剩余的positive anchors进行NMS（nonmaximum suppression）\n  6. Proposal Layer有3个输入：positive和negative anchors分类器结果rpn_cls_prob_reshape，对应的bbox reg的(e.g. 300)结果作为proposal输出\n\n\n之后输出proposal=[x1, y1, x2, y2]，注意，由于在第三步中将anchors映射回原图判断是否超出边界，所以这里输出的proposal是对应MxN输入图像尺度的，这点在后续网络中有用。另外我认为，严格意义上的检测应该到此就结束了，后续部分应该属于识别了。\nRPN网络结构就介绍到这里，总结起来就是：  \n**生成anchors - > softmax分类器提取positvie anchors -> bbox reg回归positive anchors -> Proposal Layer生成proposals**\n## 3 RoI pooling\n而RoI Pooling层则负责收集proposal，并计算出proposal feature maps，送入后续网络。从图2中可以看到Rol pooling层有2个输入：\n  1. 原始的feature maps\n  2. RPN输出的proposal boxes（大小各不相同）\n\n\n### 3.1 为何需要RoI Pooling\n先来看一个问题：对于传统的CNN（如AlexNet和VGG），当[网络训练](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E7%BD%91%E7%BB%9C%E8%AE%AD%E7%BB%83&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLnvZHnu5zorq3nu4MiLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.CTudhPrvOH84coMjGXaan4yoPzIJwwwm-36fbIFBk84&zhida_source=entity)好后输入的图像尺寸必须是固定值，同时网络输出也是固定大小的vector or matrix。如果输入图像大小不定，这个问题就变得比较麻烦。有2种解决办法：\n  1. 从图像中crop一部分传入网络\n  2. 将图像warp成需要的大小后传入网络\n\n\n![](https://pica.zhimg.com/v2-e525342cbde476a11c48a6be393f226c_1440w.jpg)\n图14 crop与warp破坏图像原有结构信息\n两种办法的示意图如图14，可以看到无论采取那种办法都不好，要么crop后破坏了图像的完整结构，要么warp破坏了图像原始形状信息。\n回忆RPN网络生成的proposals的方法：对positive anchors进行bounding box regression，那么这样获得的proposals也是大小形状各不相同，即也存在上述问题。所以Faster R-CNN中提出了RoI Pooling解决这个问题。不过RoI Pooling确实是从[Spatial Pyramid Pooling](https://link.zhihu.com/?target=https%3A//arxiv.org/abs/1406.4729)发展而来，但是限于篇幅这里略去不讲，有兴趣的读者可以自行查阅相关论文。\n### 3.2 RoI Pooling原理\n分析之前先来看看RoI Pooling Layer的caffe prototxt的定义：\n\n```\nlayer {\n  name: \"roi_pool5\"\n  type: \"ROIPooling\"\n  bottom: \"conv5_3\"\n  bottom: \"rois\"\n  top: \"pool5\"\n  roi_pooling_param {\n    pooled_w: 7\n    pooled_h: 7\n    spatial_scale: 0.0625 # 1/16\n  }\n}\n```\n\n其中有新参数pooled_w和pooled_h，另外一个参数spatial_scale认真阅读的读者肯定已经知道知道用途。RoI Pooling layer forward过程：\n  * 由于proposal是对应MxN尺度的，所以首先使用spatial_scale参数将其映射回(M/16)x(N/16)大小的feature map尺度；\n  * 再将每个proposal对应的feature map区域水平分为 pool_w*pool_h 的网格；\n  * 对网格的每一份都进行max pooling处理。\n\n\n这样处理后，即使大小不同的proposal输出结果都是 pool_w*pool_h 固定大小，实现了固定长度输出。\n![](https://pic3.zhimg.com/v2-e3108dc5cdd76b871e21a4cb64001b5c_1440w.jpg)\n图15 proposal示意图\n## 4 Classification\nClassification部分利用已经获得的proposal feature maps，通过full connect层与softmax计算每个proposal具体属于那个类别（如人，车，电视等），输出cls_prob[概率向量](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=%E6%A6%82%E7%8E%87%E5%90%91%E9%87%8F&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiLmpoLnjoflkJHph48iLCJ6aGlkYV9zb3VyY2UiOiJlbnRpdHkiLCJjb250ZW50X2lkIjo0NzU5MjA2LCJjb250ZW50X3R5cGUiOiJBcnRpY2xlIiwibWF0Y2hfb3JkZXIiOjEsInpkX3Rva2VuIjpudWxsfQ.u3ibGgw4wZUWqJRava2oDSziYP832flCBMZlribx3ig&zhida_source=entity)；同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred，用于回归更加精确的目标检测框。Classification部分网络结构如图16。\n![](https://pic4.zhimg.com/v2-9377a45dc8393d546b7b52a491414ded_1440w.jpg)\n图16 Classification部分网络结构图\n从RoI Pooling获取到7x7=49大小的proposal feature maps后，送入后续网络，可以看到做了如下2件事：\n  1. 通过全连接和softmax对proposals进行分类，这实际上已经是识别的范畴了\n  2. 再次对proposals进行bounding box regression，获取更高精度的rect box\n\n\n这里来看看全连接层InnerProduct layers，简单的示意图如图17，\n![](https://picx.zhimg.com/v2-38594a97f33ff56fc72542a20a78116d_1440w.jpg)\n图17 全连接层示意图\n其计算公式如下：\n![](https://pic2.zhimg.com/v2-f56d3209f9a7d5f27d77ead7489ab70f_1440w.jpg)\n其中W和bias B都是预先训练好的，即大小是固定的，当然输入X和输出Y也就是固定大小。所以，这也就印证了之前Roi Pooling的必要性。到这里，我想其他内容已经很容易理解，不在赘述了。\n## 5 Faster RCNN训练\nFaster R-CNN的训练，是在已经训练好的model（如VGG_CNN_M_1024，VGG，ZF）的基础上继续进行训练。实际中训练过程分为6个步骤：\n  1. 在已经训练好的model上，训练RPN网络，对应stage1_rpn_train.pt\n  2. 利用步骤1中训练好的RPN网络，收集proposals，对应rpn_test.pt\n  3. 第一次训练Fast RCNN网络，对应stage1_fast_rcnn_train.pt\n  4. 第二训练RPN网络，对应stage2_rpn_train.pt\n  5. 再次利用步骤4中训练好的RPN网络，收集proposals，对应rpn_test.pt\n  6. 第二次训练Fast RCNN网络，对应stage2_fast_rcnn_train.pt\n\n\n可以看到训练过程类似于一种“迭代”的过程，不过只循环了2次。至于只循环了2次的原因是应为作者提到：\"A similar alternating training can be run for more iterations, but we have observed negligible improvements\"，即循环更多次没有提升了。接下来本章以上述6个步骤讲解训练过程。\n下面是一张训练过程流程图，应该更加清晰：\n![](https://pic4.zhimg.com/v2-ddfcf3dc29976e384b047418aec9002d_1440w.jpg)\n### 5.1 训练RPN网络\n在该步骤中，首先读取RBG提供的预训练好的model（本文使用VGG），开始迭代训练。来看看stage1_rpn_train.pt网络结构，如图19。\n![](https://pic4.zhimg.com/v2-c39aef1d06e08e4e0cec96b10f50a779_1440w.jpg)\n图19 stage1_rpn_train.pt（考虑图片大小，Conv Layers中所有的层都画在一起了，如红圈所示，后续图都如此处理）\n与检测网络类似的是，依然使用Conv Layers提取feature maps。整个网络使用的Loss如下：\n\\text{L}(\\\\{p_i\\\\},\\\\{t_i\\\\})=\\frac{1}{N_{\\text{cls}}}\\sum_{i}\\text{L}_\\text{cls}(p_i,p_i^*)+\\lambda\\frac{1}{N_{\\text{reg}}}\\sum_{i}p_i^*\\text{L}_\\text{reg}(t_i,t_i^*) \\tag{12}\n上述公式中 i 表示anchors index， p_{i} 表示positive softmax [probability](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=probability&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJwcm9iYWJpbGl0eSIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjQ3NTkyMDYsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MSwiemRfdG9rZW4iOm51bGx9.B1A4BbYy_CpUpOog_BcJL0eOVVB40lwgw41lVqhSGak&zhida_source=entity)，p_{i}^{*}代表对应的GT predict概率（即当第i个anchor与GT间IoU>0.7，认为是该anchor是positive，p_{i}^{*}=1；反之IoU<0.3时，认为是该anchor是negative，p_{i}^{*}=0；至于那些0.3<IoU<0.7的anchor则不参与训练）；t代表predict bounding box，t^{*}代表对应positive anchor对应的GT box。可以看到，整个Loss分为2部分：\n  1. cls loss，即rpn_cls_loss层计算的softmax loss，用于分类anchors为positive与negative的网络训练\n  2. reg loss，即rpn_loss_bbox层计算的soomth L1 loss，用于bounding box regression网络训练。注意在该loss中乘了 p_{i}^{*} ，相当于只关心positive anchors的回归（其实在回归中也完全没必要去关心negative）。\n\n\n由于在实际过程中，N_\\text{cls}和N_\\text{reg}差距过大，用参数λ平衡二者（如N_\\text{cls}=256，N_\\text{reg}=2400时设置 λ=\\frac{N_\\text{reg}}{N_\\text{cls}}\\approx10 ），使总的网络Loss计算过程中能够均匀考虑2种Loss。这里比较重要是 \\text{L}_\\text{reg} 使用的soomth L1 loss，计算公式如下：\n\\text{L}_\\text{reg}(t_i,t_i^*)=\\sum_{i\\in\\\\{x,y,w,h\\\\}}^{}\\text{smooth}_{\\text{L1}}(t_i-t_i^*) \\tag{13}\n\\text{soomth}_\\text{L1}(x) = \\begin{cases} 0.5x^2 & \\text{if |x|<1 } \\\\\\ |x|-0.5 & \\text{otherwise} \\end{cases} \\tag{14}\n了解数学原理后，反过来看图18：\n  1. 在RPN训练阶段，rpn-data（python AnchorTargetLayer）层会按照和test阶段Proposal层完全一样的方式生成Anchors用于训练\n  2. 对于rpn_loss_cls，输入的rpn_cls_scors_reshape和rpn_labels分别对应 p 与 p^{*} ， N_\\text{cls} 参数隐含在p与p^{*}的caffe blob的大小中\n  3. 对于rpn_loss_bbox，输入的rpn_bbox_pred和rpn_bbox_targets分别对应 t 与 t^{*} ，rpn_bbox_inside_weigths对应 p^{*}，rpn_bbox_outside_weigths未用到（从smooth_L1_Loss layer代码中可以看到），而 N_\\text{reg} 同样隐含在caffe blob大小中\n\n\n这样，公式与代码就完全对应了。特别需要注意的是，在训练和检测阶段生成和存储anchors的顺序完全一样，这样训练结果才能被用于检测！\n### 5.2 通过训练好的RPN网络收集proposals\n在该步骤中，利用之前的RPN网络，获取proposal rois，同时获取positive softmax probability，如图20，然后将获取的信息保存在python pickle文件中。该网络本质上和检测中的RPN网络一样，没有什么区别。\n![](https://pic3.zhimg.com/v2-1ac5f8a2899ee413464ecf7866f8f840_1440w.jpg)\n图20 rpn_test.pt\n### 5.3 训练Faster RCNN网络\n读取之前保存的pickle文件，获取proposals与positive probability。从data层输入网络。然后：\n  1. 将提取的proposals作为rois传入网络，如图21蓝框\n  2. 计算bbox_inside_weights+bbox_outside_weights，作用与RPN一样，传入soomth_L1_loss layer，如图21绿框\n\n\n这样就可以训练最后的识别softmax与最终的bounding box regression了。\n![](https://pic3.zhimg.com/v2-fbece817952865689187e68f0af86792_1440w.jpg)\n图21 stage1_fast_rcnn_train.pt\n之后的stage2训练都是大同小异，不再赘述了。Faster R-CNN还有一种end-to-end的训练方式，可以一次完成train，有兴趣请自己看作者GitHub吧。\n[](https://link.zhihu.com/?target=https%3A//github.com/rbgirshick/py-faster-rcnn)\n## QA\n此篇文章初次成文于2016年内部学习分享，再后来经多次修正和完善成为现在的样子。感谢大家一直以来的支持，现在总结常见疑问回答如下：\n  * 为什么Anchor坐标中有负数\n\n\n回顾anchor生成步骤：首先生成9个base anchor，然后通过坐标偏移在 50*38 大小的 \\frac{1}{16} 下采样FeatureMap每个点都放上这9个base anchor，就形成了 50*38*k 个anhcors。至于这9个base anchor坐标是什么其实并不重要，不同代码实现也许不同。\n显然这里面有一部分边缘anchors会超出图像边界，而真实中不会有超出图像的目标，所以会有clip anchor步骤。\n![](https://pic3.zhimg.com/v2-9d67146e0cb10397d8c2170794412608_1440w.jpg)\n图21 clip anchor\n  * Anchor到底与网络输出如何对应\n\n\nVGG输出 50*38*512 的特征，对应设置 50*38*k 个anchors，而RPN输出 50*38*2k 的分类特征矩阵和 50*38*4k 的坐标回归特征矩阵。\n![](https://pica.zhimg.com/v2-82196feb7b528d76411feb90bfec2af4_1440w.jpg)\n图22 anchor与网络输出如何对应方式\n其实在实现过程中，每个点的 2k 个分类特征与 4k 回归特征，与 k 个anchor逐个对应即可，这实际是一种“人为设置的逻辑映射”。当然，也可以不这样设置，但是无论如何都需要保证**在训练和测试过程中映射方式必须一致** 。\n  * 为何有ROI Pooling还要把输入图片resize到固定大小的MxN\n\n\n由于引入ROI Pooling，从原理上说Faster R-CNN确实能够检测任意大小的图片。但是由于在训练的时候需要使用大batch训练网络，而不同大小输入拼batch在实现的时候代码较为复杂，而且当时以[Caffe](https://zhida.zhihu.com/search?content_id=4759206&content_type=Article&match_order=1&q=Caffe&zd_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ6aGlkYV9zZXJ2ZXIiLCJleHAiOjE3OTExMzkzNTcsInEiOiJDYWZmZSIsInpoaWRhX3NvdXJjZSI6ImVudGl0eSIsImNvbnRlbnRfaWQiOjQ3NTkyMDYsImNvbnRlbnRfdHlwZSI6IkFydGljbGUiLCJtYXRjaF9vcmRlciI6MSwiemRfdG9rZW4iOm51bGx9.wWO5zzwQ6vZjECE9S9NKuaWm4suPbgCQUn1kMPLDHvI&zhida_source=entity)为代表的第一代深度学习框架也不如Tensorflow和PyTorch灵活，所以作者选择了把输入图片resize到固定大小的800x600。这应该算是历史遗留问题。\n另外很多问题，都是属于具体实现问题，真诚的建议读者阅读代码自行理解。\n  * 为什么这篇文章中的faster rcnn训练还要分步骤，这么复杂？\n\n\n因为faster rcnn发表于2015年，在那个年代只有caffe。当时会把数据送入caffe训练已经是高手了，网络能收敛都已经是高手中的高手。到后来出现tensorflow1.0，再到后面出现pytorch，框架优化做的越来越好，加入越来越多的trick进去，基本不存在大的收敛问题了。所以你看到的文章和现有代码的差异，这应该算是历史问题吧。考虑到和原文的对应问题，我就保留内容以供参考。\n## 拓展\n关于torchvision中的FasterRCNN代码：\n[](https://zhuanlan.zhihu.com/p/145842317)\nFaster RCNN在文字检测中的应用：CTPN\n[](https://zhuanlan.zhihu.com/p/34757009)\nFaster RCNN在高德导航中的应用：\n[](https://link.zhihu.com/?target=https%3A//mp.weixin.qq.com/s/IJUMCOBhgXHv7VC1YT4q_g)\n  \n\n**本文章只是介绍和分析原论文的思路，原文和代码怎么说我就怎么写，所以不涉及改进等内容。如对FasterRCNN论文和原代码有意见，建议向原作者询问，谢谢。**\n**创作不易，不想被白嫖，求点赞、关注、收藏三连。**\n编辑于 2024-07-16 02:52・四川\n[卷积神经网络（CNN）](https://www.zhihu.com/topic/20043586)\n[深度学习（Deep Learning）](https://www.zhihu.com/topic/19813032)\n[目标检测](https://www.zhihu.com/topic/19596960)\n​赞同 1.1 万​​463 条评论​1.4 万​1597 \n​分享\n​申请转载​\n​\n![](https://pic1.zhimg.com/v2-d41c2ceaed8f51999522f903672a521f_l.jpeg)\n未登录用户\n  \n\n463 条评论\n默认\n最新\n评论内容由作者筛选后展示\n[![Qjtbs](https://picx.zhimg.com/v2-f22e98503ecce4e77a0f08c17e02d2df_l.jpg?source=06d4cd63)](https://www.zhihu.com/people/c53e472f5daa5b82ec880365dba3214a)\n[Qjtbs](https://www.zhihu.com/people/c53e472f5daa5b82ec880365dba3214a)\n之前做过检测一段时间，后来也一直在关注新方法。这fasterrcnn虽然被说烂了，但是很多''科普文''讲到关键部分大都刻意回避技术细节，很大可能是作者根本没看懂。这篇文章则非常详尽，几乎涵盖到所有细节。  \n  \nbtw，提一句，渗透到技术细节，只看论文是不够的，还得看代码。\n2017-12-01 · 热评\n​回复​455\n查看全部 7 条回复​\n[![毛熊](https://pic1.zhimg.com/v2-abed1a8c04700ba7d72b45195223e0ff_l.jpg?source=06d4cd63)](https://www.zhihu.com/people/dc6cf7a8305b3f30f6497aef02f10c9c)\n[毛熊](https://www.zhihu.com/people/dc6cf7a8305b3f30f6497aef02f10c9c)\n最近正在看Fast Faster Mask系列的代码，作者这篇文章从具体的实现原理和细节讲述了box的实现细节，帮助非常大。望作者大大啥时候能把Mask的实现也能具体的讲讲就好了。\n2017-12-22\n​回复​33\n[![狂热的小妖猴](https://pic1.zhimg.com/8587f89b1b5da83d86905df3b42ab32b_l.jpg?source=06d4cd63)](https://www.zhihu.com/people/cfe7969c9cb24a3bf5fd8f361cbbfb6e)\n[狂热的小妖猴](https://www.zhihu.com/people/cfe7969c9cb24a3bf5fd8f361cbbfb6e)\n看了之后都怀疑你看的跟我是不是同一篇论文，为什么能如此精辟，让我瞬间明白了许多\n2018-05-08\n​回复​28\n展开其他 1 条回复​\n[![红红火火](https://pica.zhimg.com/v2-79c2229e5f0fa01b62761328b033e297_l.jpg?source=06d4cd63)](https://www.zhihu.com/people/1279e903a01bac2db05a2239579ca086)\n[红红火火](https://www.zhihu.com/people/1279e903a01bac2db05a2239579ca086)\n22年依旧是知乎上讲的最好的FasterRCNN\n2022-02-28\n​回复​22\n查看全部 11 条回复​\n[![Fantasy](https://pica.zhimg.com/79af5f4cf3198e2118cbe60b06a5242c_l.jpg?source=06d4cd63)](https://www.zhihu.com/people/280e5a04ac8058d3c0c16367eff2245a)\n[Fantasy](https://www.zhihu.com/people/280e5a04ac8058d3c0c16367eff2245a)\n距离看10次的目标还差6次，还是想要问关于Anchor的问题！\n文章中说“如图7，遍历Conv layers计算获得的feature maps，为每一个点都配备这9种anchors作为初始的检测框。”，又说“**其实RPN最终就是在原图尺度上，设置了密密麻麻的候选Anchor。** ”\n  \n\n那么我的问题是，Anchor到底是基于feature map的呢？还是在feature map上得到17100个anchor后乘以16映射回原图？ \n2019-02-20\n​回复​14\n[![谢小虫](https://pic1.zhimg.com/v2-7122038123fc93994aadb3355f43de0a_l.jpg?source=06d4cd63)](https://www.zhihu.com/people/a5a1dd390f7606322b3f4cf108d493f6)\n[谢小虫](https://www.zhihu.com/people/a5a1dd390f7606322b3f4cf108d493f6)\nanchors都是在原图上的，每个resize后的原图比如是600x600，经过resnet50后变成38x38,映射回原图上是38X38个区域，这些区域中心是原图的archor中心，每个archor中心可以产生出9个不同尺寸的archors,每张原图都能产生38x38x9=12996个archors,然后这些archors和这张图的k个的真实框box求iou，就可以得到12996个archors相对于k个真实框的(tx,ty,tw,th)和对应的label(-1为过渡地带，要忽略，1表示这个archor为前景，0表示这个archor为背景)，就可以和rpn的输出计算loss了\n2022-06-02\n​回复​24\n查看全部 14 条回复​\n[![强化学徒](https://picx.zhimg.com/v2-946e5a0e0bcdf92f66ff425f746ea53e_l.jpg?source=06d4cd63)](https://www.zhihu.com/people/de8a8d88a5a13996c98658c5a2daab9e)\n[强化学徒](https://www.zhihu.com/people/de8a8d88a5a13996c98658c5a2daab9e)\n整体思路真是非常适合新手，多谢张老板\n2018-01-14\n​回复​10\n展开其他 4 条回复​\n[![linhahhh](https://pic1.zhimg.com/v2-4fbb2d3dbc9afcc40d558075afc288ff_l.jpg?source=06d4cd63)](https://www.zhihu.com/people/7daf0a6c984641b0d6b65f28483ebd25)\n[linhahhh](https://www.zhihu.com/people/7daf0a6c984641b0d6b65f28483ebd25)\n谢谢作者！有2个问题想请教一下，RPN的softmax那里18通道，按照reshape操作的意图，应该是18维前9维对应9个anchor属于foreground的概率，后9维对应9个anchor属于background的概率，为什么要这样排列分开，而不是fg1, bg1; fg2, bg2; ... ; fg9, bg9这样排列的呢？还有，每个anchor属于foreground的概率等于1减属于background的概率，为什么两个都要算呢，直接9通道不是更好吗？\n2018-07-22\n​回复​9\n查看全部 12 条回复​\n[![夏雨](https://pic1.zhimg.com/v2-83555015810c601c7ac9235d1a89e597_l.jpg?source=06d4cd63)](https://www.zhihu.com/people/c9939ce5555588bc8893dc747110caab)\n[夏雨](https://www.zhihu.com/people/c9939ce5555588bc8893dc747110caab)\n真的是一篇非常赞的文章，但是依然给作者提建议：\nFaster rcnn是为了end-to-end，那么在原始像素空间每个像素都有可能是anchor box的中心，这个空间太大了，所以背后的真正原因是：利用CNN抽取特征在（映射到低维度），在低维（也就是featuremaps）每个“像素点”上画不同尺寸的anchor boxes。\n2. 对featuremaps中每个”像素“点对应的anchor boxes进行赛选，微雕（回归）+分类（featuremaps每个像素点对应的anchor boxes可以映射回原始输入的像素空间）。\n2020-12-04\n​回复​8\n展开其他 1 条回复​\n[![aven](https://picx.zhimg.com/f55bddd22a7f4e0fb4416b6d032de14d_l.jpg?source=06d4cd63)](https://www.zhihu.com/people/35a9592568328358f85c956d1e3f63b1)\n[aven](https://www.zhihu.com/people/35a9592568328358f85c956d1e3f63b1)\n为啥你们这边都写的是缩放到800*600，代码里面不是1000*600吗\n2018-04-09\n​回复​8\n[![恐成最大赢家](https://picx.zhimg.com/v2-242fb3882ea30e32085330baa91f30e0_l.jpg?source=06d4cd63)](https://www.zhihu.com/people/d16b23c773aff0a013a4e70027495e6b)\n[恐成最大赢家](https://www.zhihu.com/people/d16b23c773aff0a013a4e70027495e6b)\n从CSDN追过来\n2018-01-18\n​回复​7\n点击查看全部评论\n![](https://pic1.zhimg.com/v2-d41c2ceaed8f51999522f903672a521f_l.jpeg)\n未登录用户\n  \n\n关于作者\n[![你再好好想想](https://pic1.zhimg.com/v2-b67ffd371f45f759a0dc0ccf8536b19e_l.jpg?source=32738c0c&needBackground=1)](https://www.zhihu.com/people/george-zhang-84)\n[你再好好想想](https://www.zhihu.com/people/george-zhang-84)\n[ 回答 **33** ](https://www.zhihu.com/people/george-zhang-84/answers)[ 文章 **16** ](https://www.zhihu.com/people/george-zhang-84/posts)[ 关注者 **26,178** ](https://www.zhihu.com/people/george-zhang-84/followers)\n​关注他​发私信\n大家都在搜\n换一换\n[江歌妈妈发长文尘埃终将落定704 万](https://www.zhihu.com/search?q=%E6%B1%9F%E6%AD%8C%E5%A6%88%E5%A6%88%E5%8F%91%E9%95%BF%E6%96%87%E5%B0%98%E5%9F%83%E7%BB%88%E5%B0%86%E8%90%BD%E5%AE%9A&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)热\n[中国男足 0-5 巴勒斯坦562 万](https://www.zhihu.com/search?q=%E4%B8%AD%E5%9B%BD%E7%94%B7%E8%B6%B3+0-5+%E5%B7%B4%E5%8B%92%E6%96%AF%E5%9D%A6&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)热\n[原央视主持人阿丘回应被通报419 万](https://www.zhihu.com/search?q=%E5%8E%9F%E5%A4%AE%E8%A7%86%E4%B8%BB%E6%8C%81%E4%BA%BA%E9%98%BF%E4%B8%98%E5%9B%9E%E5%BA%94%E8%A2%AB%E9%80%9A%E6%8A%A5&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)热\n[华为与赛力斯达成新五年合作409 万](https://www.zhihu.com/search?q=%E5%8D%8E%E4%B8%BA%E4%B8%8E%E8%B5%9B%E5%8A%9B%E6%96%AF%E8%BE%BE%E6%88%90%E6%96%B0%E4%BA%94%E5%B9%B4%E5%90%88%E4%BD%9C&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)热\n[迪拜航空确认航班发生事故398 万](https://www.zhihu.com/search?q=%E8%BF%AA%E6%8B%9C%E8%88%AA%E7%A9%BA%E7%A1%AE%E8%AE%A4%E8%88%AA%E7%8F%AD%E5%8F%91%E7%94%9F%E4%BA%8B%E6%95%85&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)热\n[东航回应网传空姐跪地道歉326 万](https://www.zhihu.com/search?q=%E4%B8%9C%E8%88%AA%E5%9B%9E%E5%BA%94%E7%BD%91%E4%BC%A0%E7%A9%BA%E5%A7%90%E8%B7%AA%E5%9C%B0%E9%81%93%E6%AD%89&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)\n[王楚钦：不知道为什么就是感觉累320 万](https://www.zhihu.com/search?q=%E7%8E%8B%E6%A5%9A%E9%92%A6%EF%BC%9A%E4%B8%8D%E7%9F%A5%E9%81%93%E4%B8%BA%E4%BB%80%E4%B9%88%E5%B0%B1%E6%98%AF%E6%84%9F%E8%A7%89%E7%B4%AF&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)热\n[江苏高考作文《衬衫的价格为 9 磅 15 便士》爆火268 万](https://www.zhihu.com/search?q=%E6%B1%9F%E8%8B%8F%E9%AB%98%E8%80%83%E4%BD%9C%E6%96%87%E3%80%8A%E8%A1%AC%E8%A1%AB%E7%9A%84%E4%BB%B7%E6%A0%BC%E4%B8%BA+9+%E7%A3%85+15+%E4%BE%BF%E5%A3%AB%E3%80%8B%E7%88%86%E7%81%AB&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)\n[女装网店开始用防拆带了265 万](https://www.zhihu.com/search?q=%E5%A5%B3%E8%A3%85%E7%BD%91%E5%BA%97%E5%BC%80%E5%A7%8B%E7%94%A8%E9%98%B2%E6%8B%86%E5%B8%A6%E4%BA%86&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)\n[孕妇骑车别车被司机踹翻257 万](https://www.zhihu.com/search?q=%E5%AD%95%E5%A6%87%E9%AA%91%E8%BD%A6%E5%88%AB%E8%BD%A6%E8%A2%AB%E5%8F%B8%E6%9C%BA%E8%B8%B9%E7%BF%BB&search_source=Trending&utm_content=search_hot&utm_medium=organic&utm_source=zhihu&type=content&request_click_id=256de17b-c1b8-4f14-bd12-6e7e9b05fdce)\n### 推荐阅读\n[ ![目标检测 Faster RCNN全面解读复现](https://pica.zhimg.com/v2-ab01d6237ba40562cb059597b0582075_250x0.jpg?source=172ae18b)目标检测 Faster RCNN全面解读复现 小酒馆燃着灯 ](https://zhuanlan.zhihu.com/p/667819268)# [Faster R-CNN Faster R-CNN { 说一下faster-rcnn的整个从输入到输出的框架流程 Faster-RCNN如何进行一次计算 如果有很长，很小，或者很宽的目标，应该如何处理 RPN哪里也可以提升小目标检出率 Faster-RCN… Cloud...发表于深度学习 ... ](https://zhuanlan.zhihu.com/p/89004308)# [【论文解读】精读Faster RCNN Faster R-CNN论文链接： Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks推荐代码： https://github.com/facebookresearch/Detectron （首推！Faster RCN… Alger...发表于Neura... ](https://zhuanlan.zhihu.com/p/82185598)# [【计算机视觉】faster R-CNN文章框架总结 写在前面：这是自己的学习笔记。 论文： Towards Real-Time Object Detection with Region Proposal Networkscode:matlab ShaoqingRen/faster_rcnn，python AssetionError: training py-fas… IronMan ](https://zhuanlan.zhihu.com/p/32905770) \n\n_想来知乎工作？请发送邮件到 jobs@zhihu.com_\n打开知乎App\n在「我的页」右上角打开扫一扫\n![](https://picx.zhimg.com/v2-9e41ea16bdfbe9cf4896617ecad5b4ca.png)\n其他扫码方式：微信\n下载知乎App\n无障碍模式\n验证码登录\n密码登录\n[开通机构号](https://zhuanlan.zhihu.com/org/signup)\n中国 +86\n获取短信验证码\n忘记密码\n登录/注册\n其他方式登录\n未注册手机验证后自动登录，注册即代表同意[《知乎协议》](https://www.zhihu.com/term/zhihu-terms)[《隐私保护指引》](https://www.zhihu.com/term/privacy)\n扫码下载知乎 App\n关闭二维码\n",
  "body_base_path": "attachments/5a31c0905c89/pages/",
  "body_markdown_path": "attachments/5a31c0905c89/pages/archived-body.md",
  "local_html": "attachments/5a31c0905c89/pages/archived-body.html",
  "body_source": "prior_capture"
}