这篇文章比较早,但是对于因果介绍的比较详细,很值得学习。
代码:https://github.com/Wangt-CN/VC-R-CNN
代码花了挺长时间总算跑通了,在 3080 上调真是错误不断,后来换到 2080 又是一顿调才好。这里跑通的主要环境为 ubuntu,2080,cuda 11.3, torch ‘1.10.1+cu113’ 。一些配置如下

  • 安装 conda 后,conda create --name vc_rcnn python=3.7
  • conda activate vc_rcnn pip install ninja yacs cython matplotlib tqdm opencv-python h5py lmdb -i https://pypi.mirrors.ustc.edu.cn/simple/
  • pip install torch==1.10.1+cu113 torchvision==0.11.2+cu113 torchaudio==0.10.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113 -i https://pypi.mirrors.ustc.edu.cn/simple/ (高于 1.10版本的话安装 vc-r-cnn 会有问题)
  • 参考代码里的 install.md 安装 coco 和 apex 以及 vc-rcnn 即可。

作者大大有个博客对于因果学习和这篇文章介绍的都很详细,见 https://zhuanlan.zhihu.com/p/111306353
因此这里具体的介绍就不多写了,可参考原始文章和博客。只说实现部分。

  • 首先根据数据集构建 confounder Z Z Z 和先验数据分布 P ( z ) P(z) P(z)。 具体而言,confunder 指的是特定类别的固定表征,利用的是 gt 获得的,将特定类别的所有目标加一起取平均,对于coco而言获得 80 × 1024 80 \times 1024 80×1024 的 confounder,每个行都对应一个类别。而先验分布 P ( z ) P(z) P(z) 维度为 1 × 80 1 \times 80 1×80 ,表示特定类别出现的频率(所有值加一起和为1),应该是特定类别出现的频数除以总的目标个数得到。文章定义如下,是预先获得直接加载的。

    self.dic = torch.tensor(np.load(cfg.DIC_FILE)[1:], dtype=torch.float) # [80,1024]
    self.prior = torch.tensor(np.load(cfg.PRIOR_PROB), dtype=torch.float) # [80]

  • 模型使用的是 ResNet+FPN, 也会生成不止一个 proposals。之后就是设计两个分类器。Self Predictor 和一般使用的基本没什么区别,重点关注 Context Predict。公式如下,代码看后边。 80 × 1024 80 \times 1024 80×1024 的 confounder 首先和 ROI 特征 y y y 计算attention,具体先经过全连接,然后点乘,再通过 softmax,获得 4 × 80 4 \times 80 4×80 的attention (4 表示该样本有 4 个 proposals)。按照我们一般的思路,这个 attention 可以直接聚合对应的 80 个特征向量。然而这里再和 confounder 的先验分布 P ( z ) P(z) P(z) 相乘,很有意思,在 attention 中强行加入 confunder(即各个类别)的出现频率(ps,感觉那么像解决长尾分布的问题)。最后对这些特征聚合得到 4 × 1024 4 \times 1024 4×1024 的特征。这些特征和模型获得的 ROI 特征 x x x (公式是 x x x,但是代码中表示的应该就是前面所说的 y y y,是一样的 ROI 特征,不知道是不是表示错误还是我理解错误)进行拼接(公式里是相加,可能也表示拼接)。这样就能获得一个包含真实特征和 confounter 的特征。最后用 Context Predict (它的输入是Self Predictor 输入维度的两倍)进行预测。
    q = W 3 y , K = W 4 Z T E z [ g y ( z ) ] = ∑ z [ Softmax ⁡ ( q T K / σ ) ⊙ Z ] P ( z ) E z [ f y ( x , z ) ] = W 1 x + W 2 ⋅ E z [ g y ( z ) ] \boldsymbol{q}=\boldsymbol{W}_3 \boldsymbol{y}, \boldsymbol{K}=\boldsymbol{W}_4 \boldsymbol{Z}^T \\ \mathbb{E}_{\boldsymbol{z}}\left[g_y(\boldsymbol{z})\right]=\sum_z\left[\operatorname{Softmax}\left(\boldsymbol{q}^T \boldsymbol{K} / \sqrt{\sigma}\right) \odot \boldsymbol{Z}\right] P(\boldsymbol{z}) \\ \mathbb{E}_{\boldsymbol{z}}\left[f_y(\boldsymbol{x}, \boldsymbol{z})\right]=\boldsymbol{W}_1 \boldsymbol{x}+\boldsymbol{W}_2 \cdot \mathbb{E}_{\boldsymbol{z}}\left[g_y(\boldsymbol{z})\right] \\ q=W3y,K=W4ZTEz[gy(z)]=z[Softmax(qTK/σ

    )Z]P(z)Ez[fy(x,z)]=W1x+W2Ez[gy(z)]

  • 最后能让训练整个的特征提取器减少模型受这种这种 bias (共现的bias,位置的bias等)的干扰。

def z_dic(self, y, dic_z, prior):"""Please note that we computer the intervention in the whole batch rather than for one object in the main paper."""length = y.size(0) # proposals 的数量 torch.Size([4, 1024])if length == 1:print('debug')# torch.mm(self.Wy(y), self.Wz(dic_z).t()) --> torch.Size([4, 80])attention = torch.mm(self.Wy(y), self.Wz(dic_z).t()) / (self.embedding_size ** 0.5)attention = F.softmax(attention, 1)z_hat = attention.unsqueeze(2) * dic_z.unsqueeze(0) # torch.Size([4, 80, 1024])z = torch.matmul(prior.unsqueeze(0), z_hat).squeeze(1) # [1, 80], torch.Size([4, 80, 1024]) --> torch.Size([4, 1, 1024]) --> torch.Size([4, 1024]) xz = torch.cat((y.unsqueeze(1).repeat(1, length, 1), z.unsqueeze(0).repeat(length, 1, 1)), 2).view(-1, 2*y.size(1)) # y [4,1024]->[4,4,1024], z [4,1024]->[4,4,1024] => cat [4,4, 2048] ==> [16, 2048]# detect if encounter nanif torch.isnan(xz).sum():print(xz)return xz

总的来说,实现上很有意思的,不知道是先有了因果的思考才有的实现思路,还是先有实现的方法再有的因果的角度hh。张老师组这几年在因果学习上发表了相当多的文章,很多领域都有涉及,很有启发性,值得学习。

Visual Commonsense R-CNN (CVPR2020)相关推荐

  1. Faster R CNN

    Faster R CNN 3 FASTER R-CNN 我们的Faster R CNN 由两个模块组成,第一个模块是 proposes regions 的全卷积网络,第二个是使用 proposed r ...

  2. Learning Visual Commonsense for Robust Scene Graph Generation论文笔记

    原论文地址:https://link.springer.com/content/pdf/10.1007/978-3-030-58592-1_38.pdf 目录 总体结构: 感知模型GLAT: 融合感知 ...

  3. Multi-Level Knowledge Injecting for Visual Commonsense Reasoning

    摘要--当浏览一幅图像时,人类可以推断出隐藏在图像中的东西,而不是视觉上明显的东西,例如物体的功能.人的意图和精神状态.然而,这种视觉推理范式对计算机来说非常困难,需要了解世界是如何工作的.为了解决这 ...

  4. 视觉理解论文系列(二)Heterogeneous Graph Learning for Visual Commonsense Reasoning

    背景 本篇的工作来自中山大学梁晓丹组,论文被NeurIPS 2019接收.论文介绍到,视觉语言任务(visual-language task)的解决方案粗略地分成两大类型,一种是强大的端到端结构(en ...

  5. 谷歌开源BoTNet | CNN与Transformer结合!Bottleneck Transformers for Visual Recognition!CNN+Transformer!

    新思路! https://arxiv.org/abs/2101.11605 无需任何技巧,基于Mask R-CNNN框架,BoTNet在COCO实例分割任务上取得了44.4%的Mask AP与49.7 ...

  6. 新工具︱微软Microsoft Visual Studio的R语言模块下载试用Ing...(尝鲜)

    笔者:前几天看到了以下的图片,着实一惊.作为R语言入门小菜鸟,还是觉得很好看,于是花了一点时间下载下来试用了一下,觉得还是挺高大上的. 就是英文不好是硬伤.下面贴给小白,我当时的下载步骤与遇见的问题. ...

  7. 大合集!80 篇 CVPR2020 论文分方向整理: 目标检测/图像分割/姿态估计等(附链接&下载)...

    来源:极市平台 本文约2500字,建议阅读5分钟 本文整理和分类80篇CVPR2020论文. 标签:深度学习 CVPR2020在2月24日公布了所有接受论文ID,从论文ID公布以来,我们一直在对CVP ...

  8. CVPR2020最全整理:分方向论文下载,Github源码、论文解读等[计算机视觉][目标检测]

    CVPR2020在2月24日公布了所有接受论文ID,相关报道:1470篇!CVPR2020结果出炉,你中了吗?(附部分论文链接/开源代码/解读).自论文ID公布以来,许多开发者都分享了自己的优秀工作. ...

  9. 重磅 ! CVPR2020最新计算机视觉论文代码分类打包下载

    日前,计算机视觉三大顶会之一CVPR2020接收结果已经公布,一共有1470篇论文被接收,接收率为22%,相比去年降低3个百分点,竞争越来越激烈.这里和大家分享整理的论文和代码资源,文末有资源的打包下 ...

最新文章

  1. 沈向洋官宣离职微软!他是微软级别最高的中国人、微软AI领导者,21年前参与创办MSRA...
  2. 公差基本偏差代号_508/f7:基本偏差怎么查,标准公差又怎么查?
  3. 考研数据结构程序题常见代码【C语言实现】
  4. 深入浅出统计学-第三章
  5. vue+elementui 字体改用思源黑体
  6. CAN FD安全通信
  7. 朴素贝叶斯之邮件分类
  8. flutter插件出现英文
  9. anaconda conda环境管理命令
  10. 查看XBox360的系统版本信息
  11. Hdu2104(主席树)
  12. 鸡啄米编程入门教程代码实现
  13. nvidia驱动程序下载类型怎么选?
  14. 编写一个程序,计算学生的总分和平均成绩(一)
  15. 解析今日头条as,cp,_signiture参数---as,cp
  16. 4g运行内存手机还能用多久_手机4G和6G运行内存有多大区别?看完秒懂
  17. 计算机毕业设计SSM房屋出租管理系统【附源码数据库】
  18. jQuery是一个JavaScript库极大的简化JavaScript编程
  19. 【数据库】MySQL
  20. 过去一年,网易新闻是如何甩开对手的?

热门文章

  1. 什么是自定义函数?精简回答
  2. KB奇遇记(6):搞笑的ERP项目团队
  3. Windows平台使用Bazel编译TensorFlow详细流程
  4. EF-使用EF框架进行分页
  5. 逆行时间的 精神。。。病
  6. 《统计学习方法》算法学习笔记(四)之 决策树(上)
  7. 江西科技学院计算机二级考试,2014年上半年江西科技学院全国计算机二级考试报名通知...
  8. PGP Target Photographer
  9. delphi 自定义popupmenu_Delphi PopupMenu菜单为ListView的每个Items使用[原创]
  10. 关于PagedDataSource