理解 HED 网络与 MobileNet 网络

  • 2023-04-06
  • 406
  • 0

HED (Holistically-nested edge detection) 是用于边缘检测的网络,功能与 Canny 算法一致,效果比 Canny 算法好。HED 网络是基于 VGG 网络改进而来的,关于 VGG 网络的介绍可以参考我的上篇文章:《深入理解 VGG 卷积神经网络》 ,以下网络部分代码参考:hed-tutorial-for-document-scanning

下面是 VGG 网络的结构图:

vgg 网络

HED 网络在 VGG 网络的基础上去除了后5层,后面的全连接层与 softmax 层主要用于分类,HED 网络只需要提取图片的特征,保留了前面的卷积层和池化层(注意:去掉最后一层池化层)。下面是 HED 网络的示意图:

hed 网络

分别提取出 VGG 网络的 conv1_2, conv2_2, conv3_3, conv4_3, conv5_3 层,这些输出层的大小分别为 [224, 224, 64],[112, 112, 128],[56, 56, 256],[28, 28, 512],[14, 14, 512],由于需要将这些层的数据和成一张图片,首先需要将深度降维到1,然后再按比例放大 1,2,4,8,16 倍使得每一层的数据大小都为 [224, 224],最终相加就可以得到尺寸为 [224, 224] 的输出图片了。

首先需要去深度,使用输出深度为 1,卷积核为 1*1 的卷积操作,得到深度为 1 的输出:

def _dsn_1x1_conv2d(inputs):
    kernel_size = [1, 1]
    outputs = tf.layers.conv2d(inputs,
                              filters=1,
                              kernel_size=[1, 1], 
                              padding='same', 
                              activation=None, ## no activation
                              use_bias=True, 
                              kernel_initializer=filter_initializer,
                              kernel_regularizer=weights_regularizer)
    return outputs

然后通过反卷积扩大输入层尺寸,反卷积是常用的上采样方法,也叫转置卷积,是一种特殊的正向卷积,先按照一定的比例通过补0来扩大输入图像的尺寸,接着旋转卷积核,再进行正向卷积。

反卷积

将前面的输出通过以下函数反采样到统一的大小,其中 filters 总为 1, upsample_factor 为相应的扩大倍数:

def _dsn_deconv2d_with_upsample_factor(inputs, filters, upsample_factor):
     kernel_size = [2 * upsample_factor, 2 * upsample_factor]
     outputs = tf.layers.conv2d_transpose(inputs,
                                         filters, 
                                         kernel_size, 
                                         strides=(upsample_factor, upsample_factor), 
                                         padding='same', 
                                         activation=None, ## no activation
                                         use_bias=True, ## use bias
                                         kernel_initializer=filter_initializer,
                                         kernel_regularizer=weights_regularizer)
     return outputs

这样每一层的尺寸均为 [224, 224, 1],实际大小还有 batch_size, 假如 batch_size 为 1,那么每一层的输出为 [1, 224, 224, 1],将 5 层输出合并:

dsn_fuse = tf.concat([dsn1, dsn2, dsn3, dsn4, dsn5], axis=3)

axis 设置为 3,那么输出为 [1, 224, 224, 5],再执行一次 1×1 convolution 得到 [1, 224, 224, 1] 的输出。最终这个输出就是边缘检测的结果了,以上就是 HED 网络正向传播的过程。

至于反向传播需要注意的是,由于一个样本中边缘像素远远小于非边缘像素,所以不能使用普通的交叉熵作为损失函数,需要引入 pos_weight:

def class_balanced_sigmoid_cross_entropy(logits, label):
    with tf.name_scope('class_balanced_sigmoid_cross_entropy'):
        count_neg = tf.reduce_sum(1.0 - label) # 样本中0的数量
        count_pos = tf.reduce_sum(label) # 样本中1的数量(远小于count_neg)
        beta = count_neg / (count_neg + count_pos)  ## e.g.  60000 / (60000 + 800) = 0.9868
        pos_weight = beta / (1.0 - beta)  ## 0.9868 / (1.0 - 0.9868) = 0.9868 / 0.0132 = 74.75
        cost = tf.nn.weighted_cross_entropy_with_logits(logits=logits, targets=label, pos_weight=pos_weight)
        cost = tf.reduce_mean(cost * (1 - beta))
        zero = tf.equal(count_pos, 0.0)
        final_cost = tf.where(zero, 0.0, cost) 
    return final_cost

FengJian 的文章中提出使用 MobileNet 网络改造 HED 网络使得更适应于移动端的运行环境。MobileNet 与 VGG 一样也是一种 CNN(卷积神经网络) 网络,可用于图像分类, MobileNet 是 Google 针对手机等嵌入式设备提出的一种轻量级的神经网络。与 VGG 网络不同的是 MobileNet 使用了一种更轻量级的深度可分离卷积(depthwise separable convolution)代替了原来的普通卷积。

深度可分离卷积分为两个部分:Depthwise 卷积和 Pointwise(1*1 Conv) 卷积。基本结构如下:

首先通过 Depthwise 对每一个通道进行分别卷积,然后通过 Pointwise 对各通道进行结合,最终达到类似普通卷积的效果,但是计算量和参数量大大减少。将以上单元替换 HED 网络的卷积层便可得到一个更加适用于移动端的边缘检测网络。

举个例子说明一下什么是深度可分离卷积,对一张 224*224 的彩色 3 通道图片进行卷积操作,卷积核为 3*3,输出四通道矩阵,普通卷积的过程示意如下:

相同效果的深度可分离卷积将此过程分成了两步,如下图所示:

对比两个卷积过程,直观上来看深度可分离卷积的计算量明显比普通卷积少了很多。深度可分离卷积的计算量为: 3*3*3*224*224 + 3*4*224*224,普通卷积的计算量为:3*3*3*4*224*224,为深度可分离卷积的 2.77 倍,如果输出通道数较大,则最终趋近于 9 倍。

之后 Google 又推出了 MobileNet V2 网络,MobileNet V2 的主要贡献是在MobileNet V1 的基础上提出了线性瓶颈层(Linear Bottlenecks)和反转残差块(Inverted Residuals), block 示意图如下:

在 V1 的基础上主要有如下改变:

  1. 在每个单元的深度可分离卷积之前添加 Pointwise 卷积来扩张通道数。
  2. 第二次 Pointwise 未采用非线性激活,保留线性特征。
  3. 特定的 Block 里加入了残差连接。将输入与输出直接进行相加。使得网络在较深的时候依旧可以进行训练。

残差网络 ResNet 中的 residual block 是先压缩,再特征提取,最后扩张,而MobileNet V2 是先扩张,再特征提取,最后压缩,这样一来可以获取更多的特征,因此也叫做 inverted residuals.

>> 转载请注明来源:理解 HED 网络与 MobileNet 网络

评论

还没有任何评论,你来说两句吧

发表评论