Resnet-Tensorflow 在Mask-Rcnn 中的结构
来源:互联网 发布:tomcat nginx 哪个快 编辑:程序博客网 时间:2024/04/30 15:02
阅读Mask-Rcnn代码时,观察resnet结构。
其中重要的有identity_block和conv_block。
Identity Block:
1*1,3*3,1*1的三层stride=(1,1)卷积,最后直接输出x+input作为输出。
def identity_block(input_tensor, kernel_size, filters, stage, block, use_bias=True): """The identity_block is the block that has no conv layer at shortcut # Arguments input_tensor: input tensor kernel_size: defualt 3, the kernel size of middle conv layer at main path filters: list of integers, the nb_filters of 3 conv layer at main path stage: integer, current stage label, used for generating layer names block: 'a','b'..., current block label, used for generating layer names """ nb_filter1, nb_filter2, nb_filter3 = filters conv_name_base = 'res' + str(stage) + block + '_branch' bn_name_base = 'bn' + str(stage) + block + '_branch' x = KL.Conv2D(nb_filter1, (1, 1), name=conv_name_base + '2a', use_bias=use_bias)(input_tensor) x = BatchNorm(axis=3, name=bn_name_base + '2a')(x) x = KL.Activation('relu')(x) x = KL.Conv2D(nb_filter2, (kernel_size, kernel_size), padding='same', name=conv_name_base + '2b', use_bias=use_bias)(x) x = BatchNorm(axis=3, name=bn_name_base + '2b')(x) x = KL.Activation('relu')(x) x = KL.Conv2D(nb_filter3, (1, 1), name=conv_name_base + '2c', use_bias=use_bias)(x) x = BatchNorm(axis=3, name=bn_name_base + '2c')(x) x = KL.Add()([x, input_tensor]) x = KL.Activation('relu', name='res' + str(stage) + block + '_out')(x) return x
Conv Block
1*1 3*3 1*1 的三层卷积模块,stride=(2*2),与identity block不同的是,conv block创建了shortcut = bn(conv(input) )+ 输出x,作为输出。而indentity block直接加上input,没有再次conv和bn的过程。
def conv_block(input_tensor, kernel_size, filters, stage, block, strides=(2, 2), use_bias=True): """conv_block is the block that has a conv layer at shortcut # Arguments input_tensor: input tensor kernel_size: defualt 3, the kernel size of middle conv layer at main path filters: list of integers, the nb_filters of 3 conv layer at main path stage: integer, current stage label, used for generating layer names block: 'a','b'..., current block label, used for generating layer names Note that from stage 3, the first conv layer at main path is with subsample=(2,2) And the shortcut should have subsample=(2,2) as well """ nb_filter1, nb_filter2, nb_filter3 = filters conv_name_base = 'res' + str(stage) + block + '_branch' bn_name_base = 'bn' + str(stage) + block + '_branch' x = KL.Conv2D(nb_filter1, (1, 1), strides=strides, name=conv_name_base + '2a', use_bias=use_bias)(input_tensor) x = BatchNorm(axis=3, name=bn_name_base + '2a')(x) x = KL.Activation('relu')(x) x = KL.Conv2D(nb_filter2, (kernel_size, kernel_size), padding='same', name=conv_name_base + '2b', use_bias=use_bias)(x) x = BatchNorm(axis=3, name=bn_name_base + '2b')(x) x = KL.Activation('relu')(x) x = KL.Conv2D(nb_filter3, (1, 1), name=conv_name_base + '2c', use_bias=use_bias)(x) x = BatchNorm(axis=3, name=bn_name_base + '2c')(x) shortcut = KL.Conv2D(nb_filter3, (1, 1), strides=strides, name=conv_name_base + '1', use_bias=use_bias)(input_tensor) shortcut = BatchNorm(axis=3, name=bn_name_base + '1')(shortcut) x = KL.Add()([x, shortcut]) x = KL.Activation('relu', name='res' + str(stage) + block + '_out')(x) return x
identityblock = 3层
convblock = 3层
stage1 :padding(3,3) + conv(7,7) + bn + relu + pool
stage2 : convblock + identityblock * 2
stage3 : convblock + identityblock * 3
stage4 : convblock + identity_block * 5 or 22 (resnet50 or resnet 101)
stage5 : if ture: convblock + identityblock * 2
if stage5, padding+conv + convblock * 4 + identityblock * 12=resnet 50
def resnet_graph(input_image, architecture, stage5=False): assert architecture in ["resnet50", "resnet101"] # Stage 1 x = KL.ZeroPadding2D((3, 3))(input_image) x = KL.Conv2D(64, (7, 7), strides=(2, 2), name='conv1', use_bias=True)(x) x = BatchNorm(axis=3, name='bn_conv1')(x) x = KL.Activation('relu')(x) C1 = x = KL.MaxPooling2D((3, 3), strides=(2, 2), padding="same")(x) # Stage 2 x = conv_block(x, 3, [64, 64, 256], stage=2, block='a', strides=(1, 1)) x = identity_block(x, 3, [64, 64, 256], stage=2, block='b') C2 = x = identity_block(x, 3, [64, 64, 256], stage=2, block='c') # Stage 3 x = conv_block(x, 3, [128, 128, 512], stage=3, block='a') x = identity_block(x, 3, [128, 128, 512], stage=3, block='b') x = identity_block(x, 3, [128, 128, 512], stage=3, block='c') C3 = x = identity_block(x, 3, [128, 128, 512], stage=3, block='d') # Stage 4 x = conv_block(x, 3, [256, 256, 1024], stage=4, block='a') block_count = {"resnet50": 5, "resnet101": 22}[architecture] for i in range(block_count): x = identity_block(x, 3, [256, 256, 1024], stage=4, block=chr(98 + i)) C4 = x # Stage 5 if stage5: x = conv_block(x, 3, [512, 512, 2048], stage=5, block='a') x = identity_block(x, 3, [512, 512, 2048], stage=5, block='b') C5 = x = identity_block(x, 3, [512, 512, 2048], stage=5, block='c') else: C5 = None return [C1, C2, C3, C4, C5]
阅读全文
0 0
- Resnet-Tensorflow 在Mask-Rcnn 中的结构
- 网络结构---从alexnet到resnet, rcnn 到mask rcnn
- Mask RCNN in TensorFlow
- Tensorflow-Mask RCNN
- 计算机视觉识别简史:从 AlexNet、ResNet 到 Mask RCNN
- 计算机视觉识别简史:从 AlexNet、ResNet 到 Mask RCNN
- 计算机视觉识别简史:从 AlexNet、ResNet 到 Mask RCNN
- Mask-RCNN中的损失函数
- mask-rcnn的可视化网络结构
- Mask RCNN
- Mask RCNN
- 理解ResNet结构与TensorFlow代码分析
- 理解ResNet结构与TensorFlow代码分析
- 理解ResNet结构与TensorFlow代码分析
- 【一图看懂】计算机视觉识别简史:从 AlexNet、ResNet 到 Mask RCNN
- CNN-CV识别简史2012-2017:从 AlexNet、ResNet 到 Mask RCNN
- rcnn, fast-rcnn, faster-rcnn, mask-rcnn
- RCNN, fast RCNN, faster RCNN, mask RCNN
- AutoCad 设置绘图环境
- PyCharm 如何安装python第三方库及插件(mongodb)
- 手动将本地jar上传本地maven仓库
- 【回味C】函数
- bootstrap-table load 数据出不来
- Resnet-Tensorflow 在Mask-Rcnn 中的结构
- c语言之操作符
- css——遮罩层
- jmeter如何创建数据库(MySQL)测试
- Codeforces 902 A.Visiting a Friend 贪心
- ddd
- 如何在CentOS 7上安装Nginx
- TabLayout +ViewPager+Fragment + RecycleView + webView加载本地html
- SQL FULL OUTER JOIN