对RCF网络的理解
本文标题:对RCF网络的理解
文章作者:gyro永不抽风
发布时间:2020年08月20日 - 16:08
最后更新:2020年09月22日 - 17:09
原始链接:http://hexo.gyrojeff.moe/2020/08/20/%E5%AF%B9RCF%E7%BD%91%E7%BB%9C%E7%9A%84%E7%90%86%E8%A7%A3/
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 转载请保留原文链接及作者!
原论文
网络架构
下图为RCF网络架构:
其建立在VGG16之上,根据其修改而来。与原来的VGG16相比:
- RCF网络去除了原来所有的全连接层(最后的三个全连接层)以及最后的池化层。这样做是因为与VGG网络的设计初衷——图像分类问题不同,这个网络旨在边缘检测,VGG最后的全连接层得到的$1 \times 1 \times 4096$的输出是没有意义的,所以将其删去。
- 为了进行边缘信息的提取,所以需要对像素值本身进行重新计算,所以在VGG16的每个卷积层后,都添加了一个$1\times 1 - 21$的卷积层,先升维,后通过$1 \times 1 - 1$进行降维。
- 其在每一个stage的最后添加了cross-entropy loss / sigmoid层以计算损失,更新参数。
- 每一层中有deconv层进行上采样,将图像大小映射回原来的大小,最后在fusion部分将每一个stage的输出叠加,在进行一遍$1\times 1 - 1$的卷积将多通道合并,来达到获取多种混合信息的能力。
损失函数
由于数据集通常是由多个标记者 (Annotator) 标记的。虽然每个人的认知不同,但是大家的结果都具有很高的一致性。对于每一张图片,我们将所有人的标记取平均值来生成一个边缘存在的概率图。对于每一个点,$0$代表没有标记者认为这个点是边缘,$1$则代表所有人都认为这个点是边缘。这里定义一个超参数$\eta$:如果一个点是边缘的概率大于$\eta$,则这个点我们认为其是边缘;若这个点的概率是$ 0 $,则其不是边缘;此外,认为那些概率介于$ 0 $和$ \eta $之间的点是属于有争议的点,不计入损失函数。所以,每一个点的损失函数可以记为:
$$l(X_i; W) = \begin{cases} \alpha \cdot \log (1 - P(X_i; W)) & \text {if } y_i = 0 \\ 0 & \text {if } 0 < y_i \leq \eta \\ \beta \cdot \log P(X_i; W) & \text {otherwise}, \end{cases} $$
其中,
$$ \alpha = \lambda \cdot \frac {|Y^+|} {|Y^+| + |Y^-|} $$
$$ \beta = \cdot \frac {|Y^-|} {|Y^+| + |Y^-|} $$
$|Y^+|$表示图中一定是边缘的点的个数,$|Y^-|$表示图中一定不是边缘的点的个数,$\lambda$则是超参数。在像素$i$的特征向量和是否为边缘的事实表示分别为$X_i$和$y_i$,$P(X)$是一个标准的Sigmoid激活函数,$W$则代表网络中的所有学习参数。所以,整个图片的损失函数可以记为:
$$ L(W) = \sum _ {i = 1} ^ {|I|} \Big ( \sum _ {k = 1} ^ K l(X_i ^ {(k)}; W) + l(X_i ^ {\text {fuse}}; W)\Big ) $$
其中,$X_i ^ {(k)}$表示stage k的特征向量,$X_i ^ \text {fuse}$表示stage fusion的特征向量,$|I|$代表像素个数,$|K|$代表阶段数(此处为5)