Tensorflow2.0实现roi-Align和FPN

在网上看了很多关于roi-Align的博客,只有一些理论概念。没有一些代码,看着也是很懵。就自己在Faster-RCNN把roi-Align和FPN的代码提取了出来来理解。代码在对下面。
roi-Align是在Mask RCNN中使用以便使生成的候选框region proposal映射产生固定大小的feature map时提出的。

先贴出一张图,接着通过这图解释RoiAlign的工作原理

同样,针对上图,有着类似的映射

1)Conv layers使用的是VGG16,feat_stride=32(即表示,经过网络层后图片缩小为原图的1/32),原图800800,最后一层特征图feature map大小:2525

2)假定原图中有一region proposal,大小为665665,这样,映射到特征图中的大小:665/32=20.78,即20.7820.78,此时,没有像RoiPooling那样就行取整操作,保留浮点数

3)假定pooled_w=7,pooled_h=7,即pooling后固定成77大小的特征图,所以,将在 feature map上映射的20.7820.78的region proposal 划分成49个同等大小的小区域,每个小区域的大小20.78/7=2.97,即2.97*2.97

4)假定采样点数为4,即表示,对于每个2.97*2.97的小区域,平分四份,每一份取其中心点位置,而中心点位置的像素,采用双线性插值法进行计算,这样,就会得到四个点的像素值,如下图

上图中,四个红色叉叉‘×’的像素值是通过双线性插值算法计算得到的

最后,取四个像素值中最大值作为这个小区域(即:2.972.97大小的区域)的像素值,如此类推,同样是49个小区域得到49个像素值,组成77大小的feature map

因为要单独计算roi-Align需要anchors,跟FPN的输出结果,我就自己生成了2000个anchor,也把FPN单独写了出来。tensorflow≥2.0。

roi-Align.py

import tensorflow as tf
import numpy as np
import random
from tensorflow.keras import layersclass FPN(tf.keras.Model):def __init__(self, out_channels=256, **kwargs):super(FPN, self).__init__(**kwargs)self.out_channels = out_channelsself.fpn_c2p2 = layers.Conv2D(out_channels, (1,1),kernel_initializer='he_normal',name='rpn_c2p2')self.fpn_c3p3 = layers.Conv2D(out_channels,(1,1),kernel_initializer='he_normal',name='fpn_c3p3')self.fpn_c4p4 = layers.Conv2D(out_channels,(1,1),kernel_initializer='he_normal',name='fpn_c4p4')self.fpn_c5p5 = layers.Conv2D(out_channels,(1,1),kernel_initializer='he_normal',name='fpn_c5p5')self.fpn_p3upsampled = layers.UpSampling2D(size=(2,2),name='fpn_p3upsampled')self.fpn_p4upsampled = layers.UpSampling2D(size=(2,2),name='fpn_p4upsampled')self.fpn_p5upsampled = layers.UpSampling2D(size=(2,2),name='fpn_p5upsampled')self.fpn_p2 = layers.Conv2D(out_channels,(3,3), padding='SAME',kernel_initializer='he_normal',name='fpn_p2')self.fpn_p3 = layers.Conv2D(out_channels,(3,3),padding='SAME',kernel_initializer='he_normal',name='fpn_p3')self.fpn_p4 = layers.Conv2D(out_channels,(3,3),padding='SAME',kernel_initializer='he_normal',name='fpn_p4')self.fpn_p5 = layers.Conv2D(out_channels,(3,3),padding='SAME',kernel_initializer='he_normal',name='fpn_p5')self.fpn_p6 = layers.MaxPooling2D(pool_size=(1,1),strides=2,name='fpn_p6')def call(self, inputs, training = True):C2,C3,C4,C5 = inputsP5 = self.fpn_c5p5(C5)P4 = self.fpn_c4p4(C4) + self.fpn_p5upsampled(P5)P3 = self.fpn_c3p3(C3) + self.fpn_p4upsampled(P4)P2 = self.fpn_c2p2(C2) + self.fpn_p3upsampled(P3)P2 = self.fpn_p2(P2)P3 = self.fpn_p3(P3)P4 = self.fpn_p4(P4)P5 = self.fpn_p5(P5)P6 = self.fpn_p6(P5)return [P2,P3,P4,P5,P6]def compute_output_shape(self, input_shape):C2_shape,C3_shape,C4_shape,C5_shape=input_shapeC2_shape,C3_shape,C4_shape,C5_shape = \C2_shape.as_list(),C3_shape.as_list(),C4_shape.as_list(),C5_shape.as_list()C6_shape = [C5_shape[0],(C5_shape[1] + 1) //2, (C5_shape[2] + 1) //2, self.out_channels]C2_shape[-1] = self.out_channelsC3_shape[-1] = self.out_channelsC4_shape[-1] = self.out_channelsC5_shape[-1] = self.out_channelsreturn [tf.TensorShape(C2_shape),tf.TensorShape(C3_shape),tf.TensorShape(C4_shape),tf.TensorShape(C5_shape),tf.TensorShape(C6_shape)]def roi_align(inputs, training = True, pool_shape = (7,7)):rois_list, feature_map_list, img_meta = inputspad_shapes = img_meta[:,6:8]pad_areas = pad_shapes[:,0] * pad_shapes[:,1]num_rois_list = [rois.shape.as_list()[0] for rois in rois_list]roi_indices = tf.constant([i for i in range(len(rois_list)) for _ in range(rois_list[i].shape.as_list()[0])],dtype=tf.int32)areas = tf.constant([pad_areas[i] for i in range(pad_areas.shape[0]) for _ in range(num_rois_list[i])],dtype=tf.float32)rois = tf.concat(rois_list, axis=0)y1,x1,y2,x2 = tf.split(rois, 4, axis=1)# print(y1)h = y2 - y1w = x2 - x1roi_level = tf.math.log(tf.sqrt(tf.squeeze(w * h, 1)) / tf.cast((224.0 / tf.sqrt(areas * 1.0)),tf.float32)) / tf.math.log(2.0)roi_level = tf.minimum(5,tf.maximum(2, 4 + tf.cast(tf.round(roi_level), tf.int32)))pooled_rois = []roi_to_level = []for i, level in enumerate(range(2,6)):ix = tf.where(tf.equal(roi_level,level))level_rois = tf.gather_nd(rois,ix)level_roi_indices = tf.gather_nd(roi_indices,ix)roi_to_level.append(ix)level_rois = tf.stop_gradient(level_rois)level_roi_indices = tf.stop_gradient(level_roi_indices)pooled_rois.append(tf.image.crop_and_resize(feature_map_list[i],level_rois,level_roi_indices, pool_shape, method='bilinear'))pooled_rois = tf.concat(pooled_rois, axis=0)roi_to_level = tf.concat(roi_to_level,axis=0)roi_range = tf.expand_dims(tf.range(tf.shape(roi_to_level)[0]),1)roi_to_level = tf.concat([tf.cast(roi_to_level,tf.int32),roi_range],axis=1)sorting_tensor = roi_to_level[:,0] * 100000 + roi_to_level[:,1]ix = tf.nn.top_k(sorting_tensor, k = tf.shape(roi_to_level)[0]).indices[::-1]ix = tf.gather(roi_to_level[:,1],ix)pooled_rois = tf.gather(pooled_rois,ix)pooled_rois_list = tf.split(pooled_rois,num_rois_list, axis=0)return pooled_rois_listif __name__ == '__main__':a = []b = []c = []d = []for i in range(2000):a.append([])b.append([])c.append([])d.append([])for j in range(1):a[i].append(random.uniform(1,100))b[i].append(random.uniform(1,100))c[i].append(random.uniform(100,200))d[i].append(random.uniform(100,200))a = tf.convert_to_tensor(a)b = tf.convert_to_tensor(b)c = tf.convert_to_tensor(c)d = tf.convert_to_tensor(d)roi_list = tf.concat([a,b,c,d],1)rois_list = []rois_list.append(roi_list)C2 = tf.random.normal((2, 304, 304,  256))C3 = tf.random.normal((2, 152, 152,  512))C4 = tf.random.normal((2,  76,  76, 1024))C5 = tf.random.normal((2,  38,  38, 2048))fpn = FPN()P2,P3,P4,P5,P6 = fpn([C2,C3,C4,C5])feature_map_list = [P2,P3,P4,P5,P6]img_meta = np.array([[480,640,3,800,1067,3,1216,1216,3,1.6666666,0]],dtype=np.float32)pooled_rois_list = roi_align((rois_list, feature_map_list,img_meta),training=False,pool_shape=(7,7))print(pooled_rois_list)

使用Tensorflow2.0实现roi-Align和FPN相关推荐

  1. 小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN

    目标检测小技术 Focal loss 1.概念 2.损失函数形式 Deformable Convlolutional Networks 1.背景问题 2.原理与结构 3.Deformable RoI ...

  2. 目标检测特殊层:ROI Align层详解

    ROI Align 是在Mask-RCNN这篇论文里提出的一种区域特征聚集方式, 很好地解决了ROI Pooling操作中两次量化造成的区域不匹配(mis-alignment)的问题.实验显示,在检测 ...

  3. 【深度学习小知识】ROI到ROI pooling 再到ROI Align

    ROI!RoI Pooling! ROI详解 RoI Pooling详解 Pooling操作 ROI pooling ROI Align详解 ROI详解 Region of interest(ROI) ...

  4. Tensorflow2.0:Faster RCNN 代码详解(一)

    第一部分给出Fater RCNN文件的代码解析,主要是模型主体的执行过程,在此文件 引入下述几个文件的函数引用,对于backbones,necks和test_mixins文件来说,主要是用来构建模型结 ...

  5. 第1章【深度学习简介】--动手学深度学习【Tensorflow2.0版本】

    项目地址:https://github.com/TrickyGo/Dive-into-DL-TensorFlow2.0 UC 伯克利李沐的<动手学深度学习>开源书一经推出便广受好评.很多开 ...

  6. ROI pooling 和 ROI Align详解

    ROI Align 是在Mask-RCNN这篇论文里提出的一种区域特征聚集方式, 很好地解决了ROI Pooling操作中两次量化造成的区域不匹配(mis-alignment)的问题.实验显示,在检测 ...

  7. rpn产生proposals_一文读懂RPN和ROI Align

    rpn和roi align是two-stage detector中比较关键的两个操作,这两个操作将two-stage detector中的两个stage连接起来,变成end-to-end(端到端)的网 ...

  8. 【深度学习】ROI Pooling 和 ROI Align 计算机视觉 目标检测

    文章目录 ROI Pooling和ROI Align: 一篇好的文章 ROI Pooling 如何计算? AdaptiveMaxPool2d 在做啥 Fast RCNN或者Faster RCNN中都使 ...

  9. 【深度学习】(6) tensorflow2.0使用keras高层API

    各位同学好,今天和大家分享一下TensorFlow2.0深度学习中借助keras的接口减少神经网络代码量.主要内容有: 1. metrics指标:2. compile 模型配置:3. fit 模型训练 ...

  10. 【TensorFlow2.0】(7) 张量排序、填充、复制、限幅、坐标选择

    各位同学好,今天和大家分享一下TensorFlow2.0中的一些操作.内容有: (1)排序 tf.sort().tf.argsort().top_k():(2)填充 tf.pad():(3)复制 tf ...

最新文章

  1. HTML5 —— 视频/音频
  2. idea可以使用flash框架吗_这个框架厉害了,使用它几分钟就可以编写一个微信插件...
  3. docker 限制cpu使用率
  4. Android-FixBug热修复框架的使用及源码分析(不发版修复bug)
  5. poj 2390 Bank Interest(计算本利和)
  6. 浏览器跨域访问解决方案
  7. input框自动填充内容背景颜色为黄色解决方法
  8. CheckStyle使用手册(一)
  9. python3字典菜鸟教程_Python3 字典(map)
  10. 雇员类(JAVA实现简单的类)
  11. java的流套接_Java是什么原因导致网络套接字的流结束?
  12. TrueCrypt加密:TrueCrypt Mount卸载加密卷(3)
  13. STM32——串口通信原理
  14. 用WPF实现打印及打印预览
  15. 北京2020积分落户名单
  16. 深度可分离卷积(Depthwise separable convolution)
  17. python局域网文件互传
  18. [每日一氵]笔记本电脑充电后卡得一批
  19. eos源码赏析(七):EOS智能合约入门之共识机制初探
  20. MATLAB数值分析学习笔记:线性代数方程组的求解和高斯消元法

热门文章

  1. 电脑技巧:Win10电脑卡顿解决小技巧,非常实用
  2. 淘宝关于用户行为的数据分析
  3. 光明顶短信支付:BASE64编码
  4. win7局域网共享教程
  5. USB总线-Linux内核USB3.0控制器初始化代码分析(三)
  6. SpringCloud (五) ——Feign远程调用
  7. Linux学习笔记(三) -- Visual Studio Code 的安装与卸载
  8. 线性代数的本质-基向量部分理解
  9. capslock键英语怎么读_capslock怎么读
  10. PLC基础知识(PLC入门必看)