Context Prior for Scene Segmentation-设计注意力机制模块加入上下文先验信息–关键创新点代码复现-tensorflow2.x、keras。

论文:Context Prior for Scene Segmentation
代码github:暂未开源
最近在研究注意力机制与先验信息,查阅到这篇论文,但是暂未开源代码,便根据对论文内容的理解复现论文方法,使用TensorFlow2.x版本,基于Keras编写代码

论文介绍

摘要

最近的语义分割工作广泛探索了上下文相关性,以实现更准确的细分结果。但是,大多数方法很少区分不同类型的上下文依赖项,这可能会有损场景理解。在这项工作中,我们直接监督特征聚合以清楚地区分类内和类间上下文信息。具体来说,我们在Affinity Loss监督下开发出上下文先验。 给定输入图像和相应的gt,Affinity Loss将构建理想的类似的特征图,以监督上下文先验的学习。 所学习的上下文先验提取属于同一类别的像素,而相反的先验则专注于不同类别的像素。 通过嵌入到传统的深度CNN中,提出的上下文先验层可以选择性地捕获类内和类间上下文相关性,从而实现可靠的特征表示。 为了验证有效性,我们设计了有效的上下文先验网络(CPNet)。大量的定量和定性评估表明,所提出的模型与最新的语义分割方法相比具有良好的表现。 更具体地说,我们的算法在ADE20K上达到46.3%的mIoU,在PASCAL-Context上达到53.9%的mIoU,在Cityscapes上达到81.3%的mIoU【参考博客】

关键点


提出以上模块,说的是通过生成的Ideal Affinity Map向网络中加入像素值的先验信息去监督网络对类内和内间学习(我的理解就是相当于把原标签转为另一种表达方式与网络的某一层输出的特征图求损失,其实相比于其他分割网络最后输入的损失计算,换汤不换药!!!)。该模块可加在任意主干网络后,用于对主干网络生成的特征图进行再一次的特征提取。

开整代码

导入依赖包

from tensorflow import keras
from tensorflow.keras import layers
import tensorflow.keras.backend as K
from CoordConv2 import Coord_Conv2d
import tensorflow as tf

Aggregation模块


把3X3的卷积核分成3X1和1X3两个,效果相似,参数计算大量减少。


def Aggregation(x, num_classes):x = layers.Conv2D(filters=num_classes, kernel_size=3, padding='same')(x)x = layers.BatchNormalization()(x)x = layers.Activation('relu')(x)x1 = layers.DepthwiseConv2D(kernel_size=(1, 3), padding='same')(x)x1 = layers.DepthwiseConv2D(kernel_size=(3, 1), padding='same')(x1)x2 = layers.DepthwiseConv2D(kernel_size=(3, 1), padding='same')(x)x2 = layers.DepthwiseConv2D(kernel_size=(1, 3), padding='same')(x2)x = layers.Add()([x1, x2])x = layers.BatchNormalization()(x)x = layers.Activation('relu')(x)return x

CP过程

def CP(x):B, H, W, C = x.shapex_origon = xx_origon = tf.reshape(x_origon, [-1, H*W, C])x = layers.Conv2D(filters=H*W, kernel_size=1, padding='same')(x)x = layers.BatchNormalization()(x)x = layers.Activation('sigmoid')(x)x = tf.reshape(x, [-1, H*W, H*W], name='out1') #  论文中P,Context Prior Mapx1 = tf.matmul(x, x_origon)x1 = tf.reshape(x1, [-1, H, W, C])x2 = tf.matmul(tf.ones_like(x)-x, x_origon) x2 = tf.reshape(x2, [-1, H, W, C])return x, x1, x2

CPModule

def CPModule(x, num_classes):x1 = Aggregation(x, num_classes)x2, x3, x4 = CP(x1)output = layers.Concatenate()([x, x3, x4])return x2, output

x2用于论文提出的AffinityLoss计算,output用于普通的softmax损失计算

Affinity Loss

loss_1

loss_binary = keras.losses.binary_crossentropy(Ideal_Affinity_Map, Context_Prior_Map)

loss_2

Tp = K.log(K.sum(tf.multiply(Ideal_Affinity_Map, Context_Prior_Map), axis=1) / (K.sum(Context_Prior_Map, axis=1)+K.epsilon())+K.epsilon())
Tr = K.log(K.sum(tf.multiply(Ideal_Affinity_Map, Context_Prior_Map), axis=1) / (K.sum(Ideal_Affinity_Map,axis=1)+K.epsilon()) + K.epsilon())
Tj = K.log((K.sum((1.0-Ideal_Affinity_Map)*(1.0-Context_Prior_Map), axis=1)+K.epsilon())/(K.sum(1.0-Ideal_Affinity_Map, axis=1)+K.epsilon())+K.epsilon())
loss = -K.mean(T1+T2+T3)

总损失

loss+loss_binary

代码汇总


Ideal Affinity Map的生成论文中是这样描述的

对于DownSample操作并没有清除的说明用的是什么方法,因此我这儿采用的是多次最大值池化,由于我的标签本就是ONE-HOT标签,所以就不存在论文中提及的one-hot encoding操作。具体标签制作详见我的另一篇博客。
由于我的主干网络输出的特征图是32X32大小,直接将标签降到特征图大小会丢掉很多目标特征(所以对原论文说的把标签图下采样到特征图尺寸是否保留目标的特征信息持怀疑态度,或者作者使用了巧妙的下采样方式就另说了),经试验证明,在我使用的标签图中,下采样到128X128大小,目标的特征信息不会损失。但是实验使用cpu做的,[128X128, 128X128]与[128X128, 128X128]的矩阵运算算不了,所以实验采用的是把标签下采样到64X64大小。原标签尺寸为512X512
使用tf.image中的resize函数下采样可避免特征丢失问题!!

def Affinity_loss(y_true, y_pred):y_true_down = tf.image.resize(y_true, (256, 256), methord=tf.image.ResizeMethord.NEAREST_NEIGHBOR)y_true_down = y_true_down = tf.image.resize(y_true_down , (128, 128), methord=tf.image.ResizeMethord.NEAREST_NEIGHBOR)y_true_down = y_true_down = tf.image.resize(y_true_down , (64, 64), methord=tf.image.ResizeMethord.NEAREST_NEIGHBOR)y_true_down = y_true_down = tf.image.resize(y_true_down , (32, 32), methord=tf.image.ResizeMethord.NEAREST_NEIGHBOR)B_down, H_down, W_down, C_down = y_true_down.shapey_true_down = tf.reshape(y_true_down, [-1, H_down*W_down, C_down])Ideal_Affinity_Map = tf.matmul(y_true_down, tf.transpose(y_true_down, [0, 2, 1]))Ideal_Affinity_Map = tf.cast(Ideal_Affinity_Map, dtype=tf.float32)Context_Prior_Map = tf.cast(y_pred, dtype=tf.float32)loss_binary = keras.losses.binary_crossentropy(Ideal_Affinity_Map, Context_Prior_Map)T1 = K.log(K.sum(tf.multiply(Ideal_Affinity_Map, Context_Prior_Map), axis=1) / (K.sum(Context_Prior_Map, axis=1)+K.epsilon())+K.epsilon())T2 = K.log(K.sum(tf.multiply(Ideal_Affinity_Map, Context_Prior_Map), axis=1) / (K.sum(Ideal_Affinity_Map,axis=1)+K.epsilon()) + K.epsilon())T3 = K.log((K.sum((1.0-Ideal_Affinity_Map)*(1.0-Context_Prior_Map), axis=1)+K.epsilon())/(K.sum(1.0-Ideal_Affinity_Map, axis=1)+K.epsilon())+K.epsilon())loss = -K.mean(T1+T2+T3)return loss+loss_binary

Context_Prior_Map 和 Ideal_Affinity_Map

Context_Prior_Map

Ideal_Affinity_Map

总结

总的来说,对上下文先验矩阵Ideal_Affinity_Map的预测还是比较接近论文贴出的结果

图像语义分割-CVPR2020-CPNet:结合不同类别的上下文信息先验--场景语义分割--注意力机制--Context Prior for Scene Segmentation--关键创新点代码复现相关推荐

  1. CVPR2020论文翻译 Context Prior for Scene Segmentation

    CVPR2020: Context Prior for Scene Segmentation 题目:场景分割的上下文先验 论文地址:https://arxiv.org/pdf/2004.01547.p ...

  2. 直播 | WWW 2021:用先验知识指导BERT注意力机制的语义文本匹配

    「AI Drive」是由 PaperWeekly 和 biendata 共同发起的学术直播间,旨在帮助更多的青年学者宣传其最新科研成果.我们一直认为,单向地输出知识并不是一个最好的方式,而有效地反馈和 ...

  3. RTFNet:基于可见光/红外图像的城市自动驾驶道路场景语义分割

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 论文下载:https://yuxiangsun.github.io/pub/RAL2019_rtfne ...

  4. 自动驾驶领域:一种实时高精度的城市道路场景语义分割方法

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 论文下载:https://arxiv.org/pdf/2003.08736.pdf 简介: 近年来,深 ...

  5. 以及其任何超类对此上下文都是未知的_ECCV'20 |OCRNet化解语义分割上下文信息缺失难题...

    编者按:图像语义分割一直都是场景理解的一个核心问题.针对语义分割中如何构建上下文信息,微软亚洲研究院和中科院计算所的研究员们提出了一种新的物体上下文信息--在构建上下文信息时显式地增强了来自于同一类物 ...

  6. 语义分割双料冠军!微软 OCRNet化解语义分割上下文信息缺失难题|ECCV 2020

    编者按:图像语义分割一直都是场景理解的一个核心问题.针对语义分割中如何构建上下文信息,微软亚洲研究院和中科院计算所的研究员们提出了一种新的物体上下文信息--在构建上下文信息时显式地增强了来自于同一类物 ...

  7. CVPR 2022 | 腾讯优图实验室30篇论文入选,含场景文本语义识别、3D人脸重建、目标检测、视频场景分割和视频插帧等领域...

    关注公众号,发现CV技术之美 本文转载自腾讯优图 近日,CVPR 2022官方公布了接收论文列表(CVPR 2022 接收论文公布! 总计2067篇!),来自腾讯优图实验室共计30篇论文被CVPR收录 ...

  8. 多尺度注意力机制的语义分割

    多尺度注意力机制的语义分割 Using Multi-Scale Attention for Semantic Segmentation 在自动驾驶.医学成像甚至变焦虚拟背景中,有一项重要的技术是常用的 ...

  9. 道路场景语义分割算法

    道路场景语义分割算法 输入输出接口 Input: (1)左右两个摄像头采集的实时图像视频分辨率(整型int) (2)左右两个摄像头采集的实时图像视频格式 (RGB,YUV,MP4等) (3)摄像头标定 ...

  10. 语义分割算法性能比较_AAAI 2020 | 商汤:新视频语义分割和光流联合学习算法

    作者 | 商汤科技 编辑 | 贾伟 本文介绍商汤科技在AAAI 2020 上的论文<Every Frame Counts: Joint Learning of VideoSegmentation ...

最新文章

  1. 读Lodash源码——chunk.js
  2. hdu 1251 统计难题
  3. python3 报错 ‘builtin_function_or_method‘ object has no attribute 解决方法
  4. ELF Format 笔记(十三)—— 段权限
  5. 源码安装sippyqt4 for ubuntu,anconda3,python3
  6. 响应式框架Bootstrap栅格系统
  7. 【转】ABP源码分析四十:ZERO的Application和Tenant
  8. jeecg集成实现websocket
  9. Mapillary发布世界最大交通标志数据集,用于自动驾驶研究
  10. 在线最大公因数计算器
  11. Nginx测试实验--rest服务端负载均衡应用
  12. 从技术到求职,强烈推荐一下这9个牛逼的公众号,技术人必备
  13. webpack4打包vue前端多页面项目
  14. 阿里云王伟民:数据库的策略与思考
  15. Linux驱动——设备树
  16. C语言实现约瑟夫环代码
  17. python基础教程:Python实现动态给类和对象添加属性和方法操作示例
  18. Android Jni OpenCV-绘制朱利亚(Julia)集合图形
  19. 互联网如何再定义古老的眼镜行业?
  20. 【以太网硬件十七】什么!?网线边传数据还能边供电?

热门文章

  1. startActivityForResult用法
  2. 影响力最大化 CELF 成本效益延迟转发算法
  3. word中安装Zotero插件
  4. 从街舞导师王一博.fans机舱生日趴,看“线上应援”新形式
  5. 获取小猪民宿(短租)数据
  6. LaTeX新手半小时速成手册(不速成你打我
  7. android 4.2 dropbox,android 下用脚本备份文档到dropbox的实现
  8. QQ聊天记录删除了怎么恢复
  9. 计算机公式mode,强大的 Org mode(3): 表格的基本操作及公式、绘图 · ZMonster's Blog...
  10. 研究生做实验时被炸伤致残!法院判决:驳回高校上诉,赔偿162万!