D2C-Net: A Dual-branch, Dual-guidance and Cross-refine Network for Camouflaged Object Detection阅读笔记

IEEE Transactions on Industrial Electronics 2021
Kang Wang; Hongbo Bi; Yi Zhang; Cong Zhang; Ziqi Liu; Shuang Zheng
论文地址

一、简介

提出了一个COD模型,主要由DFE模块和GRCF模块组成。

从人类视觉机制角度来看,当我们看到一个场景时,有两个阶段。第一阶段中产生的特征来提取双向引导信息,然后进行第二级预测。

从对等特征中受益可以提供一些关于目标对象区域的位置的提示,我们采用了一个自我优化的关注单元和交叉细化单元来进行更准确的伪装地图。

二、方法

2.1 动机

对于COD任务,主要目的是检测类似于背景的对象。从人类视觉机制角度来看,当我们看到一个场景时,通常难以找到第一阶段中的完整伪装物体。为了捕获更详细的伪装maps,我们根据第一阶段的全面分析进行第二阶段。在观察的两个阶段之后,我们可以获得相对准确的伪装maps。

2.2 整体框架

在这里插入图片描述

如图Fig1所示,网络主要由两个部件组成,一个是双分支特征提取模块(DFE),另一个是逐渐精制交叉融合模块(GRCF)。粉色部分表示观察的第一个阶段,黄色部分表示观察的第二阶段。

RF结构提供更准确的信息和更大的感受野。PDF组件并行地聚合不同级别地特征,以产生第一阶段的伪装maps。HAREW模块来优化检测结果。

2.3 DFE模块

第一阶段:

在第一阶段,伪装物体的位置和形状被大致检测出来。为了改进第一阶段的结果,我们在第二阶段引入了注意力机制和指导信息。

在第一阶段,采用特征拼接的方式来聚合特征并送入RF模块中。然后将得到的R3、R4和R5送入PDC模块来聚合特征,最终输出粗略的伪装的maps(S1)。

在这里插入图片描述

其中,RF模块参考SINet。PDC模块参考CPD模型。PDC使用乘法进行特征融合。

第二阶段:

第二阶段,HAREW模块从第一阶段使用信息来对第二阶段进行指导预测。通过这种方式,我们可以获得比第一阶段更准确的伪装地图。其中指导信息包括前瞻性关注指导和逆转注意力指导。

HAREW模块包含两个输入(来自S1和来自当前卷积层的特征指导信息)和两个输出(一个用于下一级别的卷积层,一个用于串联操作进入RF结构)。HAREW含有三个部分,整体注意力,残差注意力和加法。

在这里插入图片描述

首先,我们使用Holistic Attention扩展初始伪装地图的覆盖区域,以提高初始伪装地图的有效性。其公式如下:

在这里插入图片描述

对S1进行下采样,并使用sigmoid函数,后经过高斯卷积和归一化,将其结果的每个通道取最大值,从而得到EGout。然后EGout与Fi相乘得到HAout。这个过程称为前向指导预测。

接下来,反向关注机制通过擦除当前预测的伪装区域以优化前向伪装对象检测。公式如下:

在这里插入图片描述

在预测过程中,我们无法保证正确预测所有像素,以便最小化这种现象的影响,我们使用加权补充来完全集成前向导过程和反向关注引导过程。

在这里插入图片描述

其中,PCS表示Pooling -> Conv -> Softmax。

2.4 GRCF模块

通过SRA模块优化maps,通过CR模块进一步优化对等层特征。这两个部分被称为SRA-CR。

在这里插入图片描述

RBConv是3×3的卷积将通道数变为256。

SRA部分的元素相乘是为了捕获更完整的信息,最大关注是考虑到在每个通道中,不是每一个像素是有意义的。SRA的表达公式如下:

在这里插入图片描述

CR部分公式如下:

在这里插入图片描述

其中,RBConv表示Conv -> BN -> ReLU。

2.5 损失函数

二进制交叉熵损失(BCE)被广泛用于测量预测和标签之间的差异,这将更多地关注像素级错误,并且不考虑每个像素之间的相关性。 iou丢失通常用于分割任务,旨在优化全局结构。

在这里插入图片描述

在这里插入图片描述

三、实验

在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Logit-Log3P算法是一种用于物品响应模型的参数估计方法。它基于物品的响应情况,使用最大化似然估计来推断参数。以下是用C语言实现Logit-Log3P算法参数估计的一个示例代码: ```c #include <stdio.h> #include <math.h> #define MAX_ITER 1000 #define TOL 1e-6 double logit_log3p(double a, double b, double c, double theta) { double p = c + (1.0 - c) / (1.0 + exp(-a * (theta - b))); return log(p / (1.0 - p)); } void logit_log3p_fit(double *responses, double *thetas, int n, double *a, double *b, double *c) { int i, j, iter; double eta, diff, sum, ll, ll_old, p, q, r, s, t, u, v, w, y; double da, db, dc, d2a, d2b, d2c, d3a, d3b, d3c, h11, h12, h13, h22, h23, h33, det, eps; double **hessian, *gradient, *params, *params_old; // Allocate memory for the Hessian matrix and gradient vector hessian = (double **)malloc(3 * sizeof(double *)); for (i = 0; i < 3; i++) { hessian[i] = (double *)malloc(3 * sizeof(double)); } gradient = (double *)malloc(3 * sizeof(double)); // Allocate memory for the parameter vectors params = (double *)malloc(3 * sizeof(double)); params_old = (double *)malloc(3 * sizeof(double)); // Initialize the parameters *a = 1.0; *b = 0.0; *c = 0.1; // Loop until convergence or maximum iterations reached for (iter = 0; iter < MAX_ITER; iter++) { // Compute the gradient and Hessian matrix for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { hessian[i][j] = 0.0; } gradient[i] = 0.0; } ll = 0.0; for (i = 0; i < n; i++) { p = c + (1.0 - c) / (1.0 + exp(-(*a) * (thetas[i] - (*b)))); q = exp(log(p / (1.0 - p))); r = responses[i] - p; s = q * (1.0 - p); t = 1.0 / (1.0 - p); u = t * t * exp(-(*a) * (thetas[i] - (*b))); v = responses[i] * t + (1.0 - responses[i]) * u; w = 1.0 - c; y = log(p / w) + log((1.0 - c) / (1.0 - p)); ll += y; gradient[0] -= v * (thetas[i] - (*b)); gradient[1] += v * (*a); gradient[2] += r / (p * (1.0 - p)); hessian[0][0] += v * (thetas[i] - (*b)) * (thetas[i] - (*b)); hessian[0][1] -= v * (thetas[i] - (*b)) * (*a); hessian[0][2] -= r * (1.0 - 2.0 * p) / (p * p * w); hessian[1][1] += v * (*a) * (*a); hessian[1][2] += r * (*a) / (p * (1.0 - p)); hessian[2][2] -= r * (1.0 - 2.0 * p) / (p * p); } // Check for convergence if (iter > 0) { diff = 0.0; for (i = 0; i < 3; i++) { diff += fabs(params[i] - params_old[i]); } if (diff < TOL) { break; } } // Update the parameters da = hessian[0][0] * gradient[0] + hessian[0][1] * gradient[1] + hessian[0][2] * gradient[2]; db = hessian[0][1] * gradient[0] + hessian[1][1] * gradient[1] + hessian[1][2] * gradient[2]; dc = hessian[0][2] * gradient[0] + hessian[1][2] * gradient[1] + hessian[2][2] * gradient[2]; d2a = hessian[0][0]; d2b = hessian[1][1]; d2c = hessian[2][2]; d3a = hessian[0][0] * hessian[1][1] - hessian[0][1] * hessian[1][0]; d3b = hessian[0][1] * hessian[1][2] - hessian[0][2] * hessian[1][1]; d3c = hessian[0][2] * hessian[1][0] - hessian[0][0] * hessian[1][2]; det = d2a * d2b * d2c + 2.0 * d3a * dc * db + 2.0 * d3b * da * dc + 2.0 * d3c * da * db; eps = 1e-10 * (fabs(ll) + 1.0); if (det < eps) { break; } params_old[0] = *a; params_old[1] = *b; params_old[2] = *c; eta = (d2b * d2c * gradient[0] + d2a * d2c * gradient[1] + d2a * d2b * gradient[2] - d3a * dc * gradient[2] - d3b * da * gradient[2] - d3c * da * gradient[1]) / det; *a -= eta; *b += eta * db / d2b; *c += eta * dc / d2c; // Save the parameters for checking convergence params[0] = *a; params[1] = *b; params[2] = *c; // Print the current iteration and log-likelihood printf("iter=%d, ll=%g\n", iter, ll); } // Free memory for (i = 0; i < 3; i++) { free(hessian[i]); } free(hessian); free(gradient); free(params); free(params_old); } int main() { int i, n; double responses[100], thetas[100], a, b, c; // Load the response data from a file FILE *fp = fopen("responses.txt", "r"); if (fp == NULL) { printf("Error: could not open response file.\n"); return 1; } n = 0; while (fscanf(fp, "%lf", &responses[n]) != EOF) { n++; } fclose(fp); // Load the theta data from a file fp = fopen("thetas.txt", "r"); if (fp == NULL) { printf("Error: could not open theta file.\n"); return 1; } for (i = 0; i < n; i++) { if (fscanf(fp, "%lf", &thetas[i]) == EOF) { printf("Error: theta file has too few lines.\n"); return 1; } } fclose(fp); // Fit the Logit-Log3P model logit_log3p_fit(responses, thetas, n, &a, &b, &c); printf("a=%g, b=%g, c=%g\n", a, b, c); return 0; } ``` 这段代码的主要函数是`logit_log3p_fit`,它使用最大化似然估计方法来估计Logit-Log3P模型的参数。该函数的输入是一个包含物品响应数据和对应物品的theta值的数组,以及数组的大小。输出是Logit-Log3P模型的三个参数a、b和c。 算法求值公式可以用以下公式表示: $$p_i=c+(1-c)\frac{1}{1+\exp(-a(\theta_i-b))}$$ $$\ln L=\sum_{i=1}^{n}\ln\left(\frac{p_i}{1-p_i}\right)^{r_i}(1-p_i)^{1-r_i}$$ 其中,$p_i$表示第i个物品的响应概率,$\theta_i$表示第i个物品的theta值,$r_i$表示第i个物品的响应(0或1),$c$表示一个常数项,$a$、$b$是需要估计的参数。最大化$\ln L$来估计$a$、$b$和$c$的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ma lidong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值