小武与YOLOv3 ---- 优图代码_阿猫的自拍的博客-程序员ITS203

技术标签: 目标检测与pytorch  

---- YOLOv3文章:

https://blog.csdn.net/qq_34037046/article/details/87393498

----YOLOv3 — Backbone学习:

瞎 m

两个主要的改进,第一个是用了残差网络,第二个是用了FPN。

---- 残差网络

1.网络本身通过卷积层来减少尺寸的大小,没有用maxpooling层,一般目前都是用卷积层来处理,然后maxpooling层来降低维度,但是这里没有,其实我也觉得为何要用pooling 层来呢?感觉pooling,特别是maxpooling也别的果断。

2.残差模块,并没有和其他非残差模块有啥区别,也是之前的数值和残差直接相加,可能有区别就是我们之前做POI的resnet50是用了下面左边的形式,这种的话计算量比较大,优图的话就用了右边的格式,这种的话计算量比较小。
在这里插入图片描述

class StageBlock(nn.Module):
    custom_layers = ()
    def __init__(self, nchannels):
        super().__init__()
        self.features = nn.Sequential(
                    vn_layer.Conv2dBatchLeaky(nchannels, int(nchannels/2), 1, 1),
                    vn_layer.Conv2dBatchLeaky(int(nchannels/2), nchannels, 3, 1)
                )

    def forward(self, data):
        return data + self.features(data)


class Stage(nn.Module):
    custom_layers = (StageBlock, StageBlock.custom_layers)
    def __init__(self, nchannels, nblocks, stride=2):
        super().__init__()
        blocks = []
        blocks.append(vn_layer.Conv2dBatchLeaky(nchannels, 2*nchannels, 3, stride))
        for ii in range(nblocks - 1):
            blocks.append(StageBlock(2*nchannels))
        self.features = nn.Sequential(*blocks)

    def forward(self, data):
        return self.features(data)

通过卷积来减少特征图的尺寸大小:上面的stride = 2 通过这个计算我们可以每次到新的stage前都会减少1/2大小的featuremap。同时深度也在不断的加深,符合YOLOV3的模型。

---- FPN

FPN网络的学习:
https://www.cnblogs.com/majiale/p/9296449.html
https://www.tensorinfinity.com/paper_137.html

作者在自己的网络中加了类似残差网络的同时 也加了FPN网络,这样的做法可以丰富每一层出来的信息,越层次的语义信息加上低层次的空间信息,完美的找到小物体的位置。稍后我们会研究优图下的yolov3看看优图是如何做这方面的。

其实读到FPN个人还是挺兴奋的,首先自下而上,我们不断卷积处理然后featuremap在不断减少,其实这样的featuremap已经很能表达图片的语义信息了,所以FPN 直接取了最后一层,进行上采样,得到的放大版本的语义信息的featuremap,然后通过和一开始的同样大小的那几层的信息进行联合,具体的联合的方式还要看代码来,但是这样的做法一来语义信息增强,而且空间信息都还在。那么拿这样的层来作目标检测,是可以很好看的看到小物体的,因为小物体我们在不断卷积的过程中,空间信息是不断丢失可能是最后没有的。但是写到这里又让我好奇那么语义信息就不会丢失吗?

个人觉得YOLOv3的核心其实就是实验了FPN,其他的并有很大的改变。从这里看到了细粒度的特征融合的一种方法FPN就是了,可以反思下自己的文字特征和全局特征的融合。
在这里插入图片描述
FPN与YOLOv3:

先是基本的darknet53在这里面就已经完成了FPN的部分该上采样的上采样,该concat 的进行concat。

class Darknet53(nn.Module):
    custom_layers = (bdkn.Stage, bdkn.HeadBody, bdkn.Transition,
                    bdkn.Stage.custom_layers, bdkn.HeadBody.custom_layers, bdkn.Transition.custom_layers)
    def __init__(self):
        super().__init__()

        input_channels = 32
        stage_cfg = {'stage_2': 2, 'stage_3': 3, 'stage_4': 9, 'stage_5': 9, 'stage_6': 5}

        # Network
        layer_list = [
        # layer 0
        # first scale, smallest
        OrderedDict([
            ('stage_1', vn_layer.Conv2dBatchLeaky(3, input_channels, 3, 1, 1)),
            ('stage_2', bdkn.Stage(input_channels, stage_cfg['stage_2'])),
            ('stage_3', bdkn.Stage(input_channels*(2**1), stage_cfg['stage_3'])),
            ('stage_4', bdkn.Stage(input_channels*(2**2), stage_cfg['stage_4'])),
        ]),

        # layer 1
        # second scale
        OrderedDict([
            ('stage_5', bdkn.Stage(input_channels*(2**3), stage_cfg['stage_5'])),
        ]),

        # layer 2
        # third scale, largest
        OrderedDict([
            ('stage_6', bdkn.Stage(input_channels*(2**4), stage_cfg['stage_6'])),
        ]),

        # the following is extra
        # layer 3
        # output third scale, largest
        OrderedDict([
            ('head_body_1', bdkn.HeadBody(input_channels*(2**5), first_head=True)),
        ]),

        # layer 4
        OrderedDict([
            ('trans_1', bdkn.Transition(input_channels*(2**4))),
        ]),

        # layer 5
        # output second scale
        OrderedDict([
            ('head_body_2', bdkn.HeadBody(input_channels*(2**4+2**3))),
        ]),

        # layer 6
        OrderedDict([
            ('trans_2', bdkn.Transition(input_channels*(2**3))),
        ]),

        # layer 7
        # output first scale, smallest
        OrderedDict([
            ('head_body_3', bdkn.HeadBody(input_channels*(2**3+2**2))),
        ]),
    ]

    self.layers = nn.ModuleList([nn.Sequential(layer_dict) for layer_dict in layer_list])

def forward(self, x):
    features = []
    outputs = []

    stage_4 = self.layers[0](x)
    stage_5 = self.layers[1](stage_4) 
    stage_6 = self.layers[2](stage_5) #这里出来的深度是1024
    head_body_1 =  self.layers[3](stage_6) #这里出来是1024 #输出可以拿去做目标检测了
    trans_1 = self.layers[4](head_body_1) #upsample #这里进行降低维度和上采样

    concat_2 = torch.cat([trans_1, stage_5], 1) 进行concat和stage5 stage5是512 所以变成了768
    head_body_2 =  self.layers[5](concat_2) concat在进行一次卷积处理,输出可以拿去做目标检测了
    trans_2 = self.layers[6](head_body_2) #upsample 继续上采样和降低维度

    concat_3 = torch.cat([trans_2, stage_4], 1) 和stage4
    head_body_3 =  self.layers[7](concat_3) #upsample后

    # stage 6, stage 5, stage 4
    features = [head_body_1, head_body_2, head_body_3]

    return features 

1024出来后继续处理的1024

class HeadBody(nn.Module):
    custom_layers = ()
    def __init__(self, nchannels, first_head=False):
        super().__init__()
        if first_head:
            half_nchannels = int(nchannels/2)
        else:
            half_nchannels = int(nchannels/3)
        in_nchannels = 2 * half_nchannels
        layers = [
                vn_layer.Conv2dBatchLeaky(nchannels, half_nchannels, 1, 1),
                vn_layer.Conv2dBatchLeaky(half_nchannels, in_nchannels, 3, 1),
                vn_layer.Conv2dBatchLeaky(in_nchannels, half_nchannels, 1, 1),
                vn_layer.Conv2dBatchLeaky(half_nchannels, in_nchannels, 3, 1),
                vn_layer.Conv2dBatchLeaky(in_nchannels, half_nchannels, 1, 1)
                ]
        self.feature = nn.Sequential(*layers)

    def forward(self, data):
        x = self.feature(data)
        return x

上采样模块

class Transition(nn.Module):
    custom_layers = ()
    def __init__(self, nchannels):
        super().__init__()
        half_nchannels = int(nchannels/2)
        layers = [
                vn_layer.Conv2dBatchLeaky(nchannels, half_nchannels, 1, 1),
                nn.Upsample(scale_factor=2)
                ]

        self.features = nn.Sequential(*layers)

    def forward(self, data):
        x = self.features(data)
        return x

最终的话就会输出三部分分别对应三部分不同的处理,用来检测不同粒度的大小。然后输出的三层featuremap都会进行各自的卷积处理,然后就可以拿来做loss function 的检测了。损失函数的话就是平行的进入,所以预测框可能从这三种不同的里面找到最好的,这就是FPN的作用,我们结合不同的层,然后通过这些层来检测到不同的大小。损失函数和YOLOv2是一样的也没啥区别了。相同于之前输出1313N,现在就是31313*N这样来做的了。3倍,又多了又多了。而且之前YOLOv2虽然用了但是只是concat进去并没有单独来做。

在这里插入图片描述

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_37721058/article/details/96608409

智能推荐

Android自定义View--用ViewGroup打造一个3D堆叠卡片容器_Dawish_大D的博客-程序员ITS203_android 3d叠层翻页

1. 功能描述目前只能支持三张图片,支持横竖屏模式,手指滑动翻页到下一张卡片,手指点击也可以切换到当前卡片,并且选中的卡片会在整个ViewGroup的最上层,会被放大,可以自定义放大动画的时长。最基本的Android自定义控件,大神就别看了。 来先看效果图吧: 支持竖屏模式 也支持横屏模式: 主要是想熟悉一下自定义控件的基本测量和布局方式,其实使用LinearLayout或者是Frame

PTA 哈夫曼编码 (30 分)_猪猪侠的Laser_Cannon的博客-程序员ITS203

PTA 哈夫曼编码 (30 分)有一段时间没写博客了,不能停止更新,发几个数据结构练习题的题解哈夫曼编码给定一段文字,如果我们统计出字母出现的频率,是可以根据哈夫曼算法给出一套编码,使得用此编码压缩原文可以得到最短的编码总长。然而哈夫曼编码并不是唯一的。例如对字符串"aaaxuaxz",容易得到字母’a’、‘x’、‘u’、‘z’ 的出现频率对应为 4、2、1、1。我们可以设计编码 {‘a’...

ETL的过程原理和数据仓库建设_augrush的博客-程序员ITS203

原文出处:http://home.dwway.com/home-space-uid-50388-do-blog-id-7366.html1.引言  数据仓库建设中的ETL(Extract, Transform, Load)是数据抽取、转换和装载到模型的过程,整个过程基本是通过控制用SQL语句编写的存储过程和函数的方式来实现对数据的直接操作,SQL语句的效率将直接影响到数据仓库后台的性能。

Visual Studio Code:以十六进制格式显示文件内容_weixin_30532837的博客-程序员ITS203

造冰箱的大熊猫@cnblogs 2019/9/4发现Visual Studio Code很好用,无论是作为源代码编辑器还是文本编辑器在Win平台下用的都很不错。但有时候需要以十六进制格式查看数据文件的内容,使用VSCode打开这种文件时,提示“is binary or use an unsupported text encoding”。怎样以十六进制格式显示文件呢,有开发者在V...

VertexShader入门_linuxheik的博客-程序员ITS203

VertexShader入门Shader与固定管线顶点着色(Vertex Shader)是一段执行在GPU上的程序(一般用HLSL来编写),用来取代fixed pipeline中的transformation和lighting,Vertex Shader主要操作顶点。有图则一目了然。Vertex Shader做了什么工作由上图知,Vertex Shader对输入

Deeper Insights into Graph Convolutional Networks for Semi-Supervised Learning 深入了解半监督学习的图卷积网络GCN_不务正业的土豆的博客-程序员ITS203

文章目录1 简介2 相关工作2.1 Graph-Based Semi-Supervised Learning 基于图的半监督学习2.2 Graph Convolutional Networks 图卷积网络2.3 Semi-Supervised Classification with GCNs 用GCN进行半监督节点分类3 分析3.1 Why GCNs Work ?Laplacian Smoothi...

随便推点

node.js 和 express 框架学习笔记(3)_WindsChaser的博客-程序员ITS203

三. 一些常用/必备模块的使用1. node自带的http、fs、path模块这三个模块大概是用的最多的,分别提供了http请求的收发、文件读写、路径解析的功能,具体说明参见http://www.runoob.com/nodejs/nodejs-tutorial.html2. 数据库模块fs模块显然是不能满足我们需要的,得有一个数据库模块来完成数据库CRUD。选择什么数据库好呢?

10.操作系统实战——二级引导器探查收集信息(检查CPU,获取内存布局,初始化内核栈,放置内核文件和字库文件,建立MMU页表,设置图形模式,显示LOGO)_Strive for the best!的博客-程序员ITS203

该课程来自极客时间《操作系统实战45讲》,踩坑笔记,具体操作步骤见“显示logo”目录。在二级引导器中,我们要检查 CPU 是否支持 64 位的工作模式、收集内存布局信息,看看是不是合乎我们操作系统的最低运行要求,还要设置操作系统需要的 MMU 页表、设置显卡模式、释放中文字体文件。检查与收集机器信息我们需要一个函数,来检查CPU的模式,收集内存信息,设置内核栈,设置内核字体,建立内核MMU页表数据。//初始化machbstart_t结构体,清0,并设置一个标志void machbstart.

Apache设置多个监听端口与架设多个网站的方法_mgsky1的博客-程序员ITS203_apache 监听多个端口

现在想实现这样一种效果,在一个Apache服务器中设置多个监听端口,每一个端口都对应着一个网站  打开Apache的httpf.conf文件,我使用的Apache版本是2.2.31  找到,大概129行附近  #LoadModule vhost_alias_module modules/mod_vhost_alias.so去掉前面的#号,这句话的意思是开启虚拟服务器的模式再找到,我

计算机辅助设计绘图员四级,计算机辅助设计绘图员-标准及考试大纲.pdf_weixin_39587407的博客-程序员ITS203

计算机辅助设计绘图员(三、四级)鉴定标准一、机械中级(四级)鉴定标准(一)知识要求:1.掌握微机绘图系统的基本组成及操作系统的一般使用知识;2. 掌握基本图形的生成及编辑的基本方法和知识;3. 掌握复杂图形(如块的定义与插入、图案填充等) 、尺寸、复杂文本等的生成及编辑的方法和知识;4. 掌握图形的输出及相关设备的使用方法和知识。(二)技能要...

iOS 一键打包上传蒲公英_一只眼睛的猫的博客-程序员ITS203

端午闲来无事,搞了下 iOS 的持续集成,技术都是现成的,纯粹记录下整个过程,以作备忘,也希望能帮到别人.废话不多说,直接上~技能:熟悉iOS打包基本流程熟悉苹果开发证书操作熟悉命令行基本使用了解 Dash shell 命令能看懂 python 基本语法能看懂 html js 基本语法工具:苹果开发帐号macOS 电脑终端工具Py

varchar && bigint 执行效率及区别_心心念念的小鼠标的博客-程序员ITS203_bigint varchar 索引效率

在数据库表设计的过程中,总会遇到某个字段到底使用何种类型的困惑?比如身份证11位,我如果使用int类型的话,肯定不行,个数都超额了;所以一般采用的办法就是使用varchar,自定义使用长度,很好的办法。不过最近发了bigInt的使用,下边通过测试来对比一下两者的性能使用情况: 第一种情况:idcardno为varchar类型的时候 查询整体使用的耗时: 如图:执行时间0.001sec

推荐文章

热门文章

相关标签