[ターゲット検出](8)ASPPは、Tensorflowの完全なコードを使用して、特徴抽出モジュールを改善および強化します

クラスメートの皆さん、こんにちは。最近、YOLOV4のSPP拡張特徴抽出モジュールを改善したいと思いました。セマンティックセグメンテーションのASPPモジュールが多くの論文で改善に使用されていることを確認しました。今日は、Tensorflowを使用してコードを再現します。

YOLOV4のバックボーンネットワークコードは、私の前回の記事にあります:https ://blog.csdn.net/dgvv4/article/details/123818580

このセクションでは、元のSPPモジュールコードをASPPコードに置き換えます。


1.メソッドの紹介

YOLOv4では、SPPモジュールを使用してさまざまな受容野の情報を抽出しますが、グローバル情報とローカル情報の意味関係を完全には反映していませんこの論文で設計されたASPPは異なる拡張率で深さ方向に分離可能な畳み込み+穴畳み込み演算を導入し、SPPでのプーリング演算を実現し、それをグローバル平均プーリングと並列化して、複数を集約する新しい機能ピラミッドモデルを形成します。異なるサイズの同じオブジェクトを認識するモデルの機能

ASPPと組み合わせた改良されたYOLOV4フレームワークを次の図に示します。拡張率が1、3、5、畳み込みカーネルサイズが3 * 3の拡張畳み込みを使用し、深さ方向に分離可能な畳み込みを使用してパラメーターの量を減らしています前のレイヤーのローカル機能は、情報転送中に小さなターゲット機能が失われるのを防ぐために、より広い視野に関連付けられています。

バックボーンネットワークの3番目の有効な特徴層の出力特徴マップはASPPモジュールの入力として使用され、入力特徴マップの形状は[13、13、1024]です。最初のブランチは1*1の標準畳み込みであり、目的は元の受容野を維持することです。2番目から4番目のブランチは、異なる拡張率で深さ方向に分離可能な畳み込みです。目的は、特徴を抽出して異なる受容野を取得することです。5番目のブランチは入力グローバル平均をプールしてグローバル特徴を取得します最後に、5つのブランチのフィーチャマップがチャネル次元にスタックされ、さ​​まざまなスケールの情報が1*1の標準畳み込みによって融合されます。


2.激しい畳み込み

従来の深い畳み込みニューラルネットワークが画像タスクを処理する場合、画像は通常、特徴抽出と次元変更のために畳み込まれ、次に画像がプールされてサイズが縮小されます。ネットワーク層の数が増えると、プーリング層によって画像サイズがどんどん小さくなりますアップサンプリング操作によって画像を元のサイズに拡大する必要がある場合、内部データ構造、空間が失われます。階層情報と小さなターゲットの再構築に関する情報。情報の損失やその他の問題により、ネットワークの精度が大幅に向上しなくなる可能性があります

激しい畳み込みの計算の考え方は通常の畳み込みの計算の考え方と同じですがこれは通常の畳み込みの変形であり、「膨張率」として記録される新しいパラメーターが導入されています。名前が示すように、展開率は、畳み込みカーネルの拡張のサイズ、つまり、畳み込みカーネルの各パラメーター間の距離を表します。通常の畳み込み拡張率は1であり、畳み込みカーネルは拡張されません。Atrousコンボリューションは、プーリングレイヤーを使用せずに受容野を増加させるため、各コンボリューション出力にはより広い範囲の情報が含まれるため、ネットワークパフォーマンスが向上します

下の図は、2次元データでの激しい畳み込みを示しています。赤い点は3 * 3畳み込みカーネルの入力であり、緑の領域は各入力によってキャプチャされた受容野であり、受容野はの出力の特徴を示しています。畳み込みの各レイヤーグラフの特徴点は、入力画像の領域のサイズをマップします

図aは、畳み込みカーネルサイズが3 * 3で、膨張係数rが1の畳み込みに対応します。これは、一般的な畳み込みと同じ方法で計算されます。

図bの3*3畳み込みに対応する膨張係数rは2です。これは、2つの畳み込み点ごとに穴が挿入されることを意味します。これは、サイズが7*7の畳み​​込みカーネルと見なすことができます。のみ9ポイントの重みは0ではなく、残りは0です。畳み込みカーネルのサイズはわずか3*3ですが、受容野は7*7に増加しています。

膨張係数が2の前の畳み込み層が、膨張係数が1の畳み込みである場合、つまり、図bの各赤い点は、膨張係数r = 1の畳み込みの出力に対応するため、膨張係数r = 1とr=2一緒に、7*7の受容場を達成することができます

図cの3*3畳み込みに対応する膨張係数は4です。同様に、膨張係数r=1およびr=2を入力として使用した膨張畳み込みを使用すると、15*15の受容野を実現できます。


3.コードの複製

まず、異なる膨張率で深さ方向に分離可能な畳み込みブロックを構築します深さ方向に分離可能な畳み込みの理論について疑問がある場合は、私のMobileNetV3の記事を読むことができます:https ://blog.csdn.net/dgvv4/article/details/123476899

3 * 3の深さ方向の畳み込み(DepthwiseConv)は、特徴マップの長さと幅の方向の情報のみを処理し、1 * 1のポイントごとの畳み込み(PointConv)は、特徴マップのチャネル方向の情報のみを処理します。

#(1)深度可分离卷积+空洞卷积
def block(inputs, filters, rate):
    '''
    filters:1*1卷积下降的通道数
    rate:空洞卷积的膨胀率
    '''

    # 3*3深度卷积,指定膨胀率
    x = layers.DepthwiseConv2D(kernel_size=(3,3), strides=1, padding='same',
                               dilation_rate=rate, use_bias=False)(inputs)

    x = layers.BatchNormalization()(x)  # 标准化
    x = layers.Activation('relu')(x)  # 激活函数

    # 1*1逐点卷积调整通道数
    x = layers.Conv2D(filters, kernel_size=(1,1), strides=1, padding='same', use_bias=False)(x)
    
    x = layers.BatchNormalization()(x)  # 标准化
    x = layers.Activation('relu')(x)  # 激活函数

    return x

次に、バックボーンのASPPモジュールを構築します。入力は、バックボーンネットワークの3番目の効果的な機能レイヤーです。チャネル情報を融合するための1 * 1の標準畳み込みの後、拡張率の異なる3つのブランチの3*3の穴の畳み込みさまざまなスケール情報を取得します。ブランチのグローバル平均プーリングは、グローバル情報を取得します。

#(2)aspp加强特征提取模块,inputs是网络输出的第三个有效特征层[13,13,1024]
def aspp(inputs):

    # 获取输入图像的尺寸
    b,h,w,c = inputs.shape

    # 1*1标准卷积降低通道数[13,13,1024]==>[13,13,512]
    x1 = layers.Conv2D(filters=512, kernel_size=(1,1), strides=1, padding='same', use_bias=False)(inputs)
    x1 = layers.BatchNormalization()(x1)  # 标准化
    x1 = layers.Activation('relu')(x1)  # 激活

    # 膨胀率=1
    x2 = block(inputs, filters=512, rate=1)
    # 膨胀率=3
    x3 = block(inputs, filters=512, rate=3)
    # 膨胀率=5
    x4 = block(inputs, filters=512, rate=5)

    # 全局平均池化[13,13,1024]==>[None,1024]
    x5 = layers.GlobalAveragePooling2D()(inputs)
    # [None,1024]==>[1,1,1024]
    x5 = layers.Reshape(target_shape=[1,1,-1])(x5)
    # 1*1卷积减少通道数[1,1,1024]==>[1,1,512]
    x5 = layers.Conv2D(filters=512, kernel_size=(1,1), strides=1, padding='same', use_bias=False)(x5)
    x5 = layers.BatchNormalization()(x5)
    x5 = layers.Activation('relu')(x5)
    # 调整图像大小[1,1,512]==>[13,13,512]
    x5 = tf.image.resize(x5, size=(h,w))
    
    # 堆叠5个并行操作[13,13,512]==>[13,13,512*5]
    x = layers.concatenate([x1,x2,x3,x4,x5])
    
    # 1*1卷积调整通道
    x = layers.Conv2D(filters=512, kernel_size=(1,1), strides=1, padding='same', use_bias=False)(x)
    x = layers.BatchNormalization()(x)
    x = layers.Activation('relu')(x)
    # 随机杀死神经元
    x = layers.Dropout(rate=0.1)(x)

    return x

ASPPモジュールのアーキテクチャを表示し、入力レイヤーを構築します[13、13、1024]

#(3)查看网络结构
if __name__ == '__main__':

    inputs = keras.Input(shape=[13,13,1024])  # 输入层
    outputs = aspp(inputs)  # 结构aspp模型

    # 构建网络模型
    model = Model(inputs, outputs)
    model.summary()

モデルアーキテクチャは次のとおりです。

Model: "model"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to

==================================================================================================
input_1 (InputLayer)            [(None, 13, 13, 1024 0

__________________________________________________________________________________________________
depthwise_conv2d (DepthwiseConv (None, 13, 13, 1024) 9216        input_1[0][0]

__________________________________________________________________________________________________
depthwise_conv2d_1 (DepthwiseCo (None, 13, 13, 1024) 9216        input_1[0][0]

__________________________________________________________________________________________________
depthwise_conv2d_2 (DepthwiseCo (None, 13, 13, 1024) 9216        input_1[0][0]

__________________________________________________________________________________________________
global_average_pooling2d (Globa (None, 1024)         0           input_1[0][0]

__________________________________________________________________________________________________
batch_normalization_1 (BatchNor (None, 13, 13, 1024) 4096        depthwise_conv2d[0][0]        

__________________________________________________________________________________________________
batch_normalization_3 (BatchNor (None, 13, 13, 1024) 4096        depthwise_conv2d_1[0][0]      

__________________________________________________________________________________________________
batch_normalization_5 (BatchNor (None, 13, 13, 1024) 4096        depthwise_conv2d_2[0][0]      

__________________________________________________________________________________________________
reshape (Reshape)               (None, 1, 1, 1024)   0           global_average_pooling2d[0][0]
__________________________________________________________________________________________________
activation_1 (Activation)       (None, 13, 13, 1024) 0           batch_normalization_1[0][0]   

__________________________________________________________________________________________________
activation_3 (Activation)       (None, 13, 13, 1024) 0           batch_normalization_3[0][0]   

__________________________________________________________________________________________________
activation_5 (Activation)       (None, 13, 13, 1024) 0           batch_normalization_5[0][0]   

__________________________________________________________________________________________________
conv2d_4 (Conv2D)               (None, 1, 1, 512)    524288      reshape[0][0]

__________________________________________________________________________________________________
conv2d (Conv2D)                 (None, 13, 13, 512)  524288      input_1[0][0]

__________________________________________________________________________________________________
conv2d_1 (Conv2D)               (None, 13, 13, 512)  524288      activation_1[0][0]

__________________________________________________________________________________________________
conv2d_2 (Conv2D)               (None, 13, 13, 512)  524288      activation_3[0][0]

__________________________________________________________________________________________________
conv2d_3 (Conv2D)               (None, 13, 13, 512)  524288      activation_5[0][0]

__________________________________________________________________________________________________
batch_normalization_7 (BatchNor (None, 1, 1, 512)    2048        conv2d_4[0][0]

__________________________________________________________________________________________________
batch_normalization (BatchNorma (None, 13, 13, 512)  2048        conv2d[0][0]

__________________________________________________________________________________________________
batch_normalization_2 (BatchNor (None, 13, 13, 512)  2048        conv2d_1[0][0]

__________________________________________________________________________________________________
batch_normalization_4 (BatchNor (None, 13, 13, 512)  2048        conv2d_2[0][0]

__________________________________________________________________________________________________
batch_normalization_6 (BatchNor (None, 13, 13, 512)  2048        conv2d_3[0][0]

__________________________________________________________________________________________________
activation_7 (Activation)       (None, 1, 1, 512)    0           batch_normalization_7[0][0]   

__________________________________________________________________________________________________
activation (Activation)         (None, 13, 13, 512)  0           batch_normalization[0][0]     

__________________________________________________________________________________________________
activation_2 (Activation)       (None, 13, 13, 512)  0           batch_normalization_2[0][0]   

__________________________________________________________________________________________________
activation_4 (Activation)       (None, 13, 13, 512)  0           batch_normalization_4[0][0]   

__________________________________________________________________________________________________
activation_6 (Activation)       (None, 13, 13, 512)  0           batch_normalization_6[0][0]   

__________________________________________________________________________________________________
tf.image.resize (TFOpLambda)    (None, 13, 13, 512)  0           activation_7[0][0]

__________________________________________________________________________________________________
concatenate (Concatenate)       (None, 13, 13, 2560) 0           activation[0][0]

                                                                 activation_2[0][0]

                                                                 activation_4[0][0]

                                                                 activation_6[0][0]

                                                                 tf.image.resize[0][0]

__________________________________________________________________________________________________
conv2d_5 (Conv2D)               (None, 13, 13, 512)  1310720     concatenate[0][0]

__________________________________________________________________________________________________
batch_normalization_8 (BatchNor (None, 13, 13, 512)  2048        conv2d_5[0][0]

__________________________________________________________________________________________________
activation_8 (Activation)       (None, 13, 13, 512)  0           batch_normalization_8[0][0]
__________________________________________________________________________________________________
dropout (Dropout)               (None, 13, 13, 512)  0           activation_8[0][0]
==================================================================================================
Total params: 3,984,384
Trainable params: 3,972,096
Non-trainable params: 12,288
__________________________________________________________________________________________________

おすすめ

転載: blog.csdn.net/dgvv4/article/details/123933184
おすすめ