FasterRCNN(一)网络部分代码分析

2023-10-27

一.定义一个RCNN的类作为基础

1. self.build_network(self,sess,is_training=True) 函数,构建网络框架。

     with tf.variable_scope('RCNN'):

        initializer = tf.truncated_normal_initializer(mean=0.0, stddev=0.01)
        initializer_bbox = tf.truncated_normal_initializer(mean=0.0, stddev=0.001)

        net=self.VGG(is_training)

        rpn_cls_prob,rpn_bbox_pred,rpn_cls_score,rpn_cls_score_reshape=self.RPN(net,is_training)

        rois=self.build_proposals(is_training,rpn_cls_prob,rpn_bbox_pred,rpn_cls_score)

        cls_score,cls_prob,bbox_pred=self.build_predictions(net,rois,is_training,initializer,initializer_bbox)

        return rois, cls_prob, bbox_pred

原始特征提取步骤使用经典的VGG16网络
然后将得到的输出net 传到RPN层里
再将得到的对于proposal的预测是前景还是后景(cls),以及具体位置预测传入生成ROIS的函数里
最后将ROIS放入预测函数。

2. self.VGG(self,is_training) 提取图像特征层

     with tf.variable_scope("VGG"):
        with slim.arg_scope([slim.conv2d],stride=1,padding="SAME",activation_fn=tf.nn.relu):
            with slim.arg_scope([slim.max_pool2d],stride=2,padding="VALID"):
                conv1_1=slim.conv2d(self._image,64,[3,3],scope='conv1_1_3x3')
                conv1_2=slim.conv2d(conv1_1,64,[3,3],scope='conv1_2_3x3')
                self._vgg["conv1_2"]=conv1_2
                pool1=slim.max_pool2d(conv1_2,[2,2],scope='pool1_2x2')

                conv2_1=slim.conv2d(pool1,128,[3,3],scope='conv2_1_3x3')
                conv2_2=slim.conv2d(conv2_1,128,[3,3],scope='conv2_2_3x3')
                self._vgg["conv2_2"]=conv2_2
                pool2=slim.max_pool2d(conv2_2,[2,2],scope='pool2_2x2')

                conv3_1=slim.conv2d(pool2,256,[3,3],scope='conv3_1_3x3')
                conv3_2=slim.conv2d(conv3_1,256,[3,3],scope='conv3_2_3x3')
                conv3_3=slim.conv2d(conv3_2,256,[3,3],scope='conv3_3_3x3')
                self._vgg["conv3_3"]=conv3_3
                pool3=slim.max_pool2d(conv3_3,[2,2],scope='pool3_2x2')

                conv4_1=slim.conv2d(pool3,512,[3,3],scope='conv4_1_3x3')
                conv4_2=slim.conv2d(conv4_1,512,[3,3],scope='conv4_2_3x3')
                conv4_3=slim.conv2d(conv4_2,512,[3,3],scope='conv4_3_3x3')
                self._vgg["conv4_3"]=conv4_3
                pool4=slim.max_pool2d(conv4_3,[2,2],scope='pool4_2x2')

                conv5_1=slim.conv2d(pool4,512,[3,3],scope='conv5_1_3x3')
                conv5_2=slim.conv2d(conv5_1,512,[3,3],scope='conv5_2_3x3')
                conv5_3=slim.conv2d(conv5_2,512,[3,3],scope='conv5_3_3x3')
                self._vgg["conv5_3"]=conv5_3

                return conv5_3
                #obtain a tensor with a channel number of 512 and unfixed long, wide

VGG网络中每一个卷积层都是使用的3*3的卷积核,padding=‘SAME’,步长为1,池化层都是2*2,步长为2,padding=‘VALID’,即卷积层不改变长宽,池化层使之缩小二分之一,最后变成1/16。由于都是重复的卷积层,可以直接使用slim.repeat()函数。

3. self.RPN(tensor,is_training)

rpn层,代替了fastRCNN网络中的selectivesearch,速度上升了很多。

    with tf.variable_scope("RPN"):
        rpn_conv1=slim.conv2d(tensor,512,[3,3],padding="SAME",stride=1,
            trainable=is_training,
            weights_initializer=tf.truncated_normal_initializer(0.01),
            activation_fn=tf.nn.relu,name="rpn_conv1")

        rpn_cls_score=slim.conv2d(rpn_conv1,self._num_anchors*2,[1,1],padding="VALID",stride=1,
            trainable=is_training,
            weights_initializer=tf.truncated_normal_initializer(0.01),
            activation_fn=tf.nn.sigmoid,name="rpn_cls")#Each anchor binary classification

        rpn_cls_score_reshape=self._reshape_layer(rpn_cls_score,2,'rpn_cls_score_reshape')
        rpn_cls_prob_reshape=self._softmax_layer(rpn_cls_score_reshape,"rpn_cls_prob_reshape")
        rpn_cls_prob=self._reshape_layer(rpn_cls_prob_reshape,self._num_anchors*2,"rpn_cls_prob")
        rpn_bbox_pred=slim.conv2d(rpn,self._num_anchors*4,[1,1],trainable=is_training,
            weights_initializer=initializer,padding='VALID',activation_fn=None,scope='rpn_bbox_pred')

        self._rpn["rpn_conv1"]=rpn_conv1
        self._rpn["rpn_cls_prob"]=rpn_cls_prob
        self._rpn["rpn_bbox_pred"]=rpn_bbox_pred
        self._rpn["rpn_cls_score"]=rpn_cls_score
        self._rpn["rpn_cls_score_reshape"]=rpn_cls_score_reshape

        return rpn_cls_prob,rpn_bbox_pred,rpn_cls_score,rpn_cls_score_reshape

RPN层首先对VGG得到的feature map进行3x3的卷积(可能是为了语义空间转换?某乎看到的。。),然后利用两个1x1的卷积分别进行二分类(背景还是目标)和位置回归。进行分类的卷积核通道数为9×2(9个anchor,每个anchor二分类,sigmod作为激活函数),进行位置回归的卷积核通道数为9×4(9个anchor,每个anchor有4个位置参数,没有激活函数)。RPN是一个全卷积网络(fully convolutional network),这样对输入图片的尺寸就没有要求了。
在这段代码里还用到啦self._reshape_layer(self,bottom,num_dim,name) ,这个函数主要是将tensor的通道数修改为num_dim,因为是进行二分类,所以需要将9个anchor都进行softmax的操作,即使用函数self._softmax_layer(self,bottom,name) 。下面是这两个函数。

def _softmax_layer(self,bottom,name):
    if name=='rpn_cls_prob_reshape':
        input_shape=tf.shape(bottom)
        bottom_reshaped=tf.reshape(bottom,[-1,input_shape[-1]])
        reshaped_score=tf.nn.softmax(bottom_reshaped,name=name)

        return tf.reshape(reshaped_score,input_shape)

    return tf.nn.softmax(bottom,name=name)

def _reshape_layer(self,bottom,num_
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FasterRCNN(一)网络部分代码分析 的相关文章

随机推荐

  • C++中deque的用法(超详细,入门必看)

    博主简介 Hello大家好呀 我是陈童学 一个与你一样正在慢慢前行的人 博主主页 陈童学哦 所属专栏 C STL 如果本文对你有所帮助的话 希望可以点赞 收藏 支持一下哦 期待你的关注 一起成长哟 前言 Hello各位小伙伴们好 欢迎来到本
  • Spring事务源码详解-spring原码(二)

    上篇文章介绍了事务开启 前面介绍了解析adviors spring事务源码详解 spring原码 一 https blog csdn net ke1ying article details 131360060 事务源码 先从缓存里获取 主要
  • django view.py error 'function' object has no attribute 'objects' 解决办法

    view py中函数和app的名字重复了 请def一个和app名字不一样的函数名 问题就解决了 参考 http stackoverflow com questions 28471404 attributeerror function obj
  • Qt 编译一直死循环问题

    Qt 编译一直死循环问题 有时候Qt编译项目时 一直编不过 查看一下编译窗口 发现一直在循环 输出如下 C soft Qt5 11 5 11 1 mingw53 32 bin qmake exe o Makefile PalmQtLib P
  • 数据分析利器Python——爬虫(含爬取过程、Scrapy框架介绍)

    文章目录 一 基础知识 1 定义 2 基本架构 二 URL管理模块 三 网页下载模块 Python中的requests模块 四 网页解析模块 1 结构化网页解析 2 BeautifulSoup使用步骤 2 1 创建BeautifulSoup
  • Kubernetes服务访问-Nodeport、Loadbalancer和Ingress

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 本文翻译自 https medium com google cloud kubernetes nodeport vs loadbalancer vs ingress whe
  • stm32低功耗休眠模式下使用看门狗wdt

    最近一个项目在用stm32f103 发现stm32一旦开启看门狗 就关不了 进入低功耗模式后 看门狗也重启 不使用看门狗非常危险 网上看了好多资料也查不到解决方案 后来自己想到一个可以进入低功耗又可以使用看门狗的方案 在这里给大家分享 我自
  • android之媒体硬解OMX的实现

    转自 http blog csdn net vincent blog article details 7578112 android的多媒体部分采用的编解码标准是OMX 当然这个标准是用于硬件编解码的 软件编解码在这里我就不说了 直接从st
  • layui调用php接口,layui三级联动【PHP版】

    前言 今天在写城市三级联动的时候发现 当选择某个选项为空的时候 无法清空选项信息 所以特此做个记录 也好给需要这个功能的小伙伴一些启示和参考 重点描述前端如何操作 JS请求可写公共方法调用 第一准备工作 准备城市信息SQL 第二前端页面 L
  • ipmitool工具安装教程

    1 下载ipmitool 1 8 18 tar gz或ipmitool 1 8 18 tar bz2的安装包至本地 2 解压安装包 tar jxvf ipmitool 1 8 18 tar bz2 或 tar zxvf ipmitool 1
  • 《2020年AI新基建发展白皮书》重磅发布,展示百度智能云多个落地案例

    随着实体经济尤其是传统行业智能化转型升级需求的扩大 AI 在生产生活各领域的规模化部署与渗透正在加速 AI 新基建 带来的时代机遇受到广泛关注 1月20日 国家工业信息安全发展研究中心发布了 2020年 AI 新基建发展白皮书 这是国内首个
  • html mailto 乱码,终极解决sendmail & mutt 邮件乱码问题[sh]

    时间 2018 11 25 阅读 3 230 次 标签 分享 配置 问题 自从上次把所有站点https后 一直没怎么看服务器 这两天突然发现所有从服务器自动发出来的邮件全部乱码 实在让我强迫症发作 今天终于得空赶紧研究一翻 系统 Cento
  • PHY- PHY芯片概述

    1 PHY概述 关于Internet Protocal的分层模型可以参考文章 Internet Protocal OSI模型中的网络分层模型 下面我们讲讲底层以太网控制器和收发器的知识 其主要是处理OSI模型中的物理层和链路层的事情 在CA
  • 学习要按部就班进行,不功利,当做乐趣进行就行了。

    这段时间 回老家工作了 有点浮躁 急于求成了 也有点摆烂了 不过在老家就业 也不代表将来不失业 也不是自己家开的公司 哈哈 所以 还是要按部就班进行 不功利 最优化进行就行了 学习时长能完成就是成功 当做乐趣就可以了
  • 字符串01--替换空格

    字符串01 替换空格 jz02 题目概述 解析 参考答案 注意事项 说明 题目概述 算法说明 请实现一个函数 将一个字符串中的每个空格替换成 20 例如 当字符串为We Are Happy 则经过替换之后的字符串为We 20Are 20Ha
  • makefile的一些技巧总结

    1 运行目录存在相同名称文件或文件目录 比如log 则make log报错 在makefile开头加入 PHONY log 2 默认命令 需要遵循Makefile语法 bin sh语法 2 1 bin sh语法 需要反斜杠 保证一行执行完成
  • 【es数据库】python 使用Elasticsearch数据库

    es 数据库 Elasticsearch是一个开源的高扩展性搜索引擎 它可以快速地存储 搜索和分析大量的数据 使用Python语言和Elasticsearch 可以轻松地创建和操作 数据库 和 数据库表 而且具备分布式和高扩展性的特点 适用
  • 磁珠反谐振案例

    转载文章 原作者 一博科技 高速先生 PCB设计会存在各种大大小小的误区 有的误区很容易用简单的理论进行解释 有的却显得神秘而难懂 高速先生最近和粉丝们的互动中惊讶的发现 磁珠对电源纹波可能会存在反面影响这个误区原来一直都是谜一样的存在 高
  • EasyX基本概念

    一 EasyX颜色的表示方法 1 使用预定义常量和16进制表示颜色 比如setlinecolor oxffoooo setlinecolor BLUE 使用教程里有常见颜色的预定义常量值 2 用RGB宏合成颜色 比如setlinecolor
  • FasterRCNN(一)网络部分代码分析

    一 定义一个RCNN的类作为基础 1 self build network self sess is training True 函数 构建网络框架 with tf variable scope RCNN initializer tf tr