SSD浅层网络_语义分割网络 - FPN 结构及代码

2023-10-13 01:10

本文主要是介绍SSD浅层网络_语义分割网络 - FPN 结构及代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

初识 FPN

FPN 全称 Feature Pyramid Network,翻译过来就是特征金字塔网络。何为特征金字塔,深度卷积神经网络(DCNN)提取的不同尺度特征组成的金字塔形状。本文提出了一种新型的特征融合方式,虽然距离论文提出的时间比较久了,但直到现在该结构仍较常用,尤其是在检测小目标时值得一试。

本篇论文的目的是为了合理利用特征金字塔中不同尺度的语义信息。实际上在本篇文章之前,已经有很多特征融合的方式,本文开篇就介绍了各种多尺度特征的融合方式:

9b24a3574666290bad1df756cd61b021.png
  • (a) Featurized image pyramid,为了获取不同尺度的特征,这种方式需要将同一张图片的不同尺寸分别输入网络,分别计算对应的 feature map 并预测结果,这种方式虽然可以提升预测精度但计算资源消耗太大,在实际工业应用中不太现实。
  • (b) Single feature map,分类任务常用的网络结构,深层特征包含了丰富的语义信息适用于分类任务,由于分类任务对目标的位置信息并不敏感所以富含位置信息的浅层特征没用被再次使用,而这种结构也导致了分类网络对小目标的检测精度并不高。
  • (c) Pyramid feature hierarchy,SSD 的多尺度特征应用方式,在不同尺度的特征上进行预测。关于这种方式作者在文中专门说了一段儿,意思是 SSD 中应用的浅层特征还不够"浅",而作者发现更浅层的特征对检测小目标来说非常重要。
  • (d) Feature Pyramid Network,本篇的主角,一种新的特征融合方式,在兼顾速度的同时提高了准确率,下面会介绍细节。
  • (e) U-net 所采用的结构,与 (d) 的整体结构类似,但只在最后一层进行预测。

FPN 结构细节

FPN 的结构较为简单,可以概括为:特征提取,上采样,特征融合,多尺度特征输出。FPN 的输入为任意大小的图片,输出为各尺度的 feature map。与 U-net 类似, FPN 的整个网络结构分为自底向上 (Bottom-Up) 和自顶向下 (Top-Down) 两个部分,Bottom-Up 是特征提取过程,对应 Unet 中的 Encoder 部分,文中以 Resnet 作为 backbone,其中使用的 bottleneck 结构:

bea6fd7d6f826900f2a1dd586bb4aa21.png

Top-Down 将最深层的特征通过层层的上采样,采样至与 Bottom-Up 输出对应的分辨率大小,与之融合后输出 feature map,融合方式为对应位置相加,而 Unet 采用的融合方式为对应位置拼接,关于两者的差异我之前在 Unet 这篇文章中提过,这里就不再赘述。在下图中放大的部分中,包含了 3 个步骤:1. 对上层输出进行 2 倍的上采样,2. 对 Bottom-Up 中与之对应的 feature map 的进行 1x1 卷积,以保证特征 channels 相同,3. 将上面两步的结果相加。

3c79a30a8affc26f39e896eabe6c73e4.png

以上就是 FPN 的基本结构了,简单且有效,这也符合何凯明大神一贯的作风,下面介绍代码实现过程。

代码实现

FPN 结构比较简单且文中说明的很清楚,大家有空可以自己实现一下。下面是文章中对网络结构的叙述以及 Pytorch 版本的实现,欢迎留言讨论。

  • Bottom-Up

This process is independent of the backbone convolutional architectures, and in this paper we present results using ResNets.

文中选择 Resnet 作为 Bottom-Up,直接把 torchvision 中的 Resnet 拿来用:

self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False)self.bn1 = nn.BatchNorm2d(64)self.relu = nn.ReLU(inplace=True)self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)# Bottom-up stagesself.layer1 = self._make_layer(block, 64, layers[0], stride=1) self.layer2 = self._make_layer(block, 128, layers[1], stride=2)self.layer3 = self._make_layer(block, 256, layers[2], stride=2)self.layer4 = self._make_layer(block, 512, layers[3], stride=2)
  • Top layer

To start the iteration, we simply attach a 1×1 convolutional layer on C5 to produce the coarsest resolution map.

We set d = 256 in this paper and thus all extra convolutional layers have 256-channel outputs.

对 C5(layer4 的输出) 进行 1x1 的卷积确保特征金字塔的每一层都是 256 个 channels。

self.toplayer = conv1x1(2048, 256)
  • Top-Down

With a coarser-resolution feature map, we upsample the spatial resolution by a factor of 2 (using nearest neighbor upsampling for simplicity).

每次上采样的倍数为 2,且使用 nearest 插值。

F.upsample(x, size=(H,W), mode='nearest')

The upsam3 pled map is then merged with the corresponding bottom-up map (which undergoes a 1×1 convolutional layer to reduce channel dimensions) by element-wise addition.

Bottom-Up 输出的 C2,C3,C4 都需要进行 1x1 的卷积确保特征金字塔的每一层都是 256 个 channels。

self.laterallayer1 = conv1x1(1024, 256)self.laterallayer2 = conv1x1( 512, 256)self.laterallayer3 = conv1x1( 256, 256)

Finally, we append a 3×3 convolution on each merged map to generate the final feature map, which is to reduce the aliasing effect of upsampling.

最终还需要一个 3x3 的卷积才能得到最后的 feature map,此举是为了减小上采样的影响。

# Final conv layersself.finalconv1 = conv3x3(256, 256)self.finalconv2 = conv3x3(256, 256)self.finalconv3 = conv3x3(256, 256)

至此,要用的基本模块都有了,那么整个前向传播的过程:

def forward(self, x): # Bottom-Up c1 = self.relu(self.bn1(self.conv1(x))) c1 = self.maxpool(c1) c2 = self.layer1(c1) c3 = self.layer2(c2) c4 = self.layer3(c3) c5 = self.layer4(c4) # Top layer && Top-Down p5 = self.toplayer(c5) p4 = self._upsample_add(p5, self.laterallayer1(c4)) p3 = self._upsample_add(p4, self.laterallayer2(c3)) p2 = self._upsample_add(p3, self.laterallayer3(c2)) # Final conv layers p4 = self.finalconv1(p4) p3 = self.finalconv2(p3) p2 = self.finalconv3(p2) return p2, p3, p4, p5

论文中是将 FPN 作为一个结构嵌入到 Fast R-CNN 等网络中来提升网络的表现,那么可否将 FPN 直接用于语义分割任务?答案是可以,一个思路是将 FPN 输出的所有 feature map 相加为 1 层,上采样至原图分辨率可得输出,也有不错的效果。

以上代码已经放在我的 github,欢迎 star:https://github.com/FroyoZzz/CV-Papers-Codes

最后,欢迎关注我的个人微信公众号 [MachineLearning学习之路],CV 方向的童鞋不要错过!

这篇关于SSD浅层网络_语义分割网络 - FPN 结构及代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/199708

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤