# 【目标检测】(8) ASPP改进加强特征提取模块，附Tensorflow完整代码

YOLOV4的主干网络代码可见我上一篇文章：https://blog.csdn.net/dgvv4/article/details/123818580

1. 方法介绍

YOLOv4 中使用 SPP 模块提取不同感受野的信息，但 没有充分体现全局信息和局部信息的语义关系。本文设计的 ASPP 引入不同扩张率的深度可分离卷积+空洞卷积操作 ，实现 SPP 中的池化操作，并将其与全局平均池化并联，组成一个新的特征金字塔模型，以此聚合多尺度上下文信息， 增强模型识别不同尺寸同一物体的能力

2. 空洞卷积

[En]

The following figure shows the hollow convolution on the two-dimensional data. The red dot is the input of the 3’3 convolution kernel, and the green region is the receptive field captured by each input. The receptive field refers to the size of the mapping area of the feature points in the output feature map of each layer on the input image.

3. 代码复现

33深度卷积（DepthwiseConv）只处理特征图的长宽方向的信息，11逐点卷积（PointConv）只处理特征图通道方向的信息

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

# 3*3深度卷积，指定膨胀率
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


#（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


#（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
__________________________________________________________________________________________________


Original: https://blog.csdn.net/dgvv4/article/details/123933184
Author: 立Sir
Title: 【目标检测】(8) ASPP改进加强特征提取模块，附Tensorflow完整代码

(0)

### 大家都在看

• #### 数据科学必备Pandas实操数据各种拼接操作汇总

大家好，我是Mr数据杨。想象一下，三国时期的魏国，郭嘉要整理一份三国各地粮草的统计表，这就需要用到的第一个操作”merge”。这就如同郭嘉整合各路将领报回的…

人工智能 2023年7月8日
0138
• #### PointNeXt: 通过改进的训练以及模型缩放策略重新探究PointNet++

原文链接：作者：Gordon ::: 论文链接：https://arxiv.org/abs/2206.04670代码链接（已开源）：https://github.com/guoch…

人工智能 2023年6月24日
0172
• #### STANet_pytorch代码问题汇总、附上裁剪图片代码(有问留言必答)

STANet_pytorch代码问题汇总、附上裁剪图片代码 * – 一、 STANet – 二、问题汇总与解答（如列不全，请留言） – + 1….

人工智能 2023年7月5日
0253
• #### findfont: Font family [‘Times New Roman‘] not found. Falling back to DejaVu Sans.

问题背景： 远程使用服务器绘图时，设置font_dict中字体格式为’Times New Roman’，如下： font_dict=dict(fontsiz…

人工智能 2023年7月27日
0132
• #### 机器学习（二）——贝叶斯分类器

文章目录 1. 贝叶斯决策论 * 1.1 贝叶斯判定准则 1.2 极大似然估计 2. 朴素贝叶斯分类器 * 2.1 拉普拉斯平滑 2.2 示例 贝叶斯决策论 核心： 将最小化分类错…

人工智能 2023年6月15日
0146
• #### AU类型的fault占比过高，覆盖率低，Debug步骤

More articles You can follow the official account：”IC练习生”IC民工不定期更新 AU为ATPG unt…

人工智能 2023年6月26日
0265
• #### 深度学习笔记—多尺度网络结构归类总结

目录 1.什么是图像金字塔 1.1 高斯金字塔 ( Gaussian pyramid): 1.2 拉普拉斯金字塔（Laplacian pyramid） 1.3 DOG金字塔 2. …

人工智能 2023年7月28日
0127
• #### 神经网络激活函数与求导

文章目录 * – + 神经网络激活函数求导 + * 1、Sigmoid 激活函数 * 2、Tanh 激活函数 * 3、Softmax 激活函数 神经网络激活函数求导 1…

人工智能 2023年7月14日
0195
• #### 【Python实战】使用YOLOV5的一套完整流程

配置环境 目录 配置环境 下载完整yolov5代码 下载官方模型（这就是权重文件） 配套的库 检测环境是否配置成功 训练自己的数据集 ​​​​​​​​​​​​​​在yolov5-m…

人工智能 2023年7月21日
0163
• #### 7.opencv——边缘检测（ 拉普拉斯(Laplacian)，Sobel，Canny边缘检测）

边缘检测 边缘检测 * 拉普拉斯(Laplacian)边缘检测 Sobel边缘检测 Canny边缘检测 拉普拉斯(Laplacian)，Sobel，Canny对比 边缘检测 \qq…

人工智能 2023年7月19日
0115
• #### 什么是物联网？物联网应用可以带来哪些好处

有人物联网线上技术交流会是什么 ——当你还在传统制造思维中禁锢，你的同行已经做了物联网赋能 什么是物联网? 众所周知，物联网是实现物与物相连。总是感觉远在天边，实际上近在眼前。 比…

人工智能 2023年6月6日
0181
• #### 【毕业设计】深度学习动物识别系统 – python 卷积神经网络 机器视觉

文章目录 0 前言 1 背景 2 算法原理 * 2.1 动物识别方法概况 2.2 常用的网络模型 – 2.2.1 B-CNN 2.2.2 SSD 3 SSD动物目标检测…

人工智能 2023年6月29日
0153
• #### pytorch从零搭建神经网络实现多分类(训练自己的数据集)

简介 本文介绍如何使用pytorch搭建基础的神经网络，解决多分类问题。主要介绍了两个模型：①全连接层网络；②VGG11卷积神经网络模型(下次介绍)。为了演示方便，使用了Fashi…

人工智能 2023年7月23日
0284
• #### Python实现的数字图象处理之阴影检测与去除

人工智能 2023年5月28日
0127
• #### 【Tensorflow2.0】Win10下快速安装Tensorflow2.0+keras2.3.1框架*

【Tensorflow2.0】Win10下快速安装Tensorflow2.0+keras2.3.1框架 安装过程踩了很多雷，装了很多遍，此文较方便快捷即可安装，适用于有些基础的读者…

人工智能 2023年5月26日
0152
• #### 图神经网络 基础与前沿,神经系统知识网络图

知识图谱怎样入门 知识图谱作为一门学问，绝不是用个图数据库写几条查询，或者用规则写一个表格的提取，就可以称为成功的运用的。和所有的学科一样，都需要长期的艰苦的努力，在充分了解前人成…

人工智能 2023年6月1日
0202