TypechoJoeTheme

半醉残影

统计

图解YOLOV3目标检测算法-源码分析(一 架构)

2021-06-05
/
0 评论
/
1,052 阅读
/
正在检测是否收录...
06/05

图解YOLOV3目标检测算法-源码分析(一 架构)

前言

目标检测算法

Tow Stage

先进行区域生成Region Proposal (RP),再通过卷积神经网络进行样本分类。

任务流程:特征提取 --> 生成RP --> 分类/定位回归。

常见tow stage目标检测算法有:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN、R-FCN、MR-CNN、HyperNet、CRAFT、FPN、Mask R-CNN、、CoupleNet和MegDet等。

One Stage

不用RP,直接在网络中提取特征来预测物体分类和位置。

任务流程:特征提取–> 分类/定位回归。

常见的one stage目标检测算法有:OverFeat、YOLOv1、YOLOv2(YOLO9000)、YOLOv3、YOLOv4、YOLOv5、YOLOF、YOLOS、SSD和RetinaNet等。

YOLO是One Stage最具代表性的算法,集推理速度和准确性于一体,是我工作和学习中最常用的算法。下面将根据Github上开源代码分析YOLO算法系中最具代表的YOLOv3算法。

正文

YOLOv3

参考源码取自Github上一个Yolov3 Tensorflow实现 Github参考源码

为了理清YOLOv3大致框架,我根据源码画了该算法的架构图,

YOLOv3算法大致分为如下四部分

  • Input
  • Backbone
  • Neck
  • Prediction

如下图所示

Input

输入为3通道RGB图,shape为 4164163,当然不是固定的,可以根据情况调整

[-1, 416, 416, 3]

Backbone ( darknet53 )

主干网络, Backbone主要是残差卷积,负责图像的特征提取

Yolov3的主干网络是可以随意替换,但笔者使用最多的还是darknet53。在Yolov3中的darknet53是去掉最终的全连接层的,由一个CBL,5个Res残差模块组成,如下图

1. CBL

CBL:Yolov3网络结构中的最小组件,由Conv+Bn+LeakyRelu激活函数三者组成。

参考源码common.py 第11行,可以根据参数选择是否进行下采样和使用激活函数

def convolutional(input_data, filters_shape, trainable, name, downsample=False, activate=True, bn=True):
    with tf.variable_scope(name):
        if downsample:
            pad_h, pad_w = (filters_shape[0] - 2) // 2 + 1, (filters_shape[1] - 2) // 2 + 1
            paddings = tf.constant([[0, 0], [pad_h, pad_h], [pad_w, pad_w], [0, 0]])
            input_data = tf.pad(input_data, paddings, 'CONSTANT')
            strides = (1, 2, 2, 1)
            padding = 'VALID'
        else:
            strides = (1, 1, 1, 1)
            padding = "SAME"

        weight = tf.get_variable(name='weight', dtype=tf.float32, trainable=True, shape=filters_shape, 
        initializer=tf.random_normal_initializer(stddev=0.01))
        conv = tf.nn.conv2d(input=input_data, filter=weight, strides=strides, padding=padding)

        if bn:
            conv = tf.layers.batch_normalization(conv, beta_initializer=tf.zeros_initializer(), 
                                                 gamma_initializer=tf.ones_initializer(),
                                                 moving_mean_initializer=tf.zeros_initializer(), 
                                                 moving_variance_initializer=tf.ones_initializer(), training=trainable)
        else:
            bias = tf.get_variable(name='bias', shape=filters_shape[-1], 
            trainable=True, dtype=tf.float32, 
            initializer=tf.constant_initializer(0.0))
            conv = tf.nn.bias_add(conv, bias)

        if activate == True: 
            conv = tf.nn.leaky_relu(conv, alpha=0.1)
    return conv

在BackBone中,CBL紧接Input之后第一个单元如源码所示

input_data = common.convolutional(input_data, filters_shape=(3, 3, 3, 32), trainable=trainable, name='conv0') 

2. Res Unit * 1

Res Unit

借鉴Resnet网络中的残差结构,让网络可以构建的更深。

残差单元使用了两个连续的CBL,然后把最初的输入和CBL输出相加构成,如上图。

ResX

由一个CBL和X个残差组件构成,即一个CBL加X个Res Unit单元,它是YOLOv3中的大组件。每个Res模块前面的CBL都起到下采样的作用,经过5次Res模块后,得到的特征图是 416->208->104->52->26->13 大小。

在源码中使用如下,参考 backbone.py第18行

input_data = common.convolutional(input_data, filters_shape=(3, 3, 32, 64), trainable=trainable, name='conv1', downsample=True) # 208*208*64

        for i in range(1):
            input_data = common.residual_block(input_data, 64, 32, 64, trainable=trainable, name='residual%d' % (i + 0))

同理,下面的Res2、Res8、Res8、Res5

3. Res Unit *2

input_data = common.convolutional(input_data, filters_shape=(3, 3, 64, 128), trainable=trainable, name='conv4', downsample=True)
        for i in range(2):
            input_data = common.residual_block(input_data, 128, 64, 128, trainable=trainable, name='residual%d' % (i + 1))

4. Res Unit *8

input_data = common.convolutional(input_data, filters_shape=(3, 3, 128, 256), trainable=trainable, name='conv9', downsample=True)
        for i in range(8):
            input_data = common.residual_block(input_data, 256, 128, 256, trainable=trainable, name='residual%d' % (i + 3))

5. Res Unit *8

input_data = common.convolutional(input_data, filters_shape=(3, 3, 256, 512), trainable=trainable, name='conv26', downsample=True)

        for i in range(8):
            input_data = common.residual_block(input_data, 512, 256, 512, trainable=trainable, name='residual%d' % (i + 11))

6. Res Unit *4

input_data = common.convolutional(input_data, filters_shape=(3, 3, 512, 1024), trainable=trainable, name='conv43', downsample=True)

        for i in range(4):
            input_data = common.residual_block(input_data, 1024, 512, 1024, trainable=trainable, name='residual%d' % (i + 19))

Neck

BackBone 五次下采样后输出 13131024*80向量,然后作为Neck网络的输入(当然,中间还有些取样)

Y1

对于第一层输出, 见 yolov3.py第50行,这里连续五层CBL

input_data = common.convolutional(input_data, (1, 1, 1024, 512), self.trainable, 'conv52')
input_data = common.convolutional(input_data, (3, 3, 512, 1024), self.trainable, 'conv53')
input_data = common.convolutional(input_data, (1, 1, 1024, 512), self.trainable, 'conv54')
input_data = common.convolutional(input_data, (3, 3, 512, 1024), self.trainable, 'conv55')
input_data = common.convolutional(input_data, (1, 1, 1024, 512), self.trainable, 'conv56')

五层CBL处理后直接接上CBL+Conv,这里有些小伙帮可能会说,这不是两层CBL,其实并不是,看参数,第二个函数没有激活函数activate=False, bn=False,说明没有BN和activate,只是简单的Conv。

conv_lobj_branch = common.convolutional(input_data, (3, 3, 512, 1024), self.trainable, name='conv_lobj_branch')
conv_lbbox = common.convolutional(conv_lobj_branch, (1, 1, 1024, 3 * (self.num_class + 5)),
                                  trainable=self.trainable, name='conv_lbbox', activate=False, bn=False)

Y2

接着把刚刚最上层五层CBL的输出作为下一层的输入,CBL + 上采样 输出的结果和主干网络的C4输入Concat,最后接上个CBL*5 如图

这个结构的输出便可以直接到预测节点了,经过上采样,输入的向量的大小已经变成 26*26了

Y3

对于第三层,采样上面同样的方法,见结构图 5252255

Prediction

最后Prediction为多次度融合特征,如下图

结尾

到此,Yolov3的基础架构就讲完了。后面的Decode和Loss留到下一篇再讲

图解YOLOV3目标检测算法-源码分析(二 预测框)
图解YOLOV3目标检测算法-源码分析(三 Loss)

参考

TensorFlow深度学习yoloyolov3目标检测机器视觉
朗读
赞(0)
赞赏
感谢您的支持,我会继续努力哒!

三合一收款

下面三种方式都支持哦

微信
QQ
支付宝
打开支付宝/微信/QQ扫一扫,即可进行扫码打赏哦
版权属于:

半醉残影

本文链接:

https://blog.dengyb.com/archives/90/(转载时请注明本文出处及文章链接)

评论 (0)

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月

最新回复

  1. 搭建自用导航网站 R11; JKblog
    2022-03-10
  2. JK
    2022-01-13

    {!{data:image/webp;base64,UklGRhwNAABXRUJQVlA4WAoAAAAwAAAAAQMAKwEASUNDUBgCAAAAAAIYAAAAAAQwAABtbnRyUkdCIFhZWiAAAAAAAAAAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAAHRyWFlaAAABZAAAABRnWFlaAAABeAAAABRiWFlaAAABjAAAABRyVFJDAAABoAAAAChnVFJDAAABoAAAAChiVFJDAAABoAAAACh3dHB0AAAByAAAABRjcHJ0AAAB3AAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAFgAAAAcAHMAUgBHAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z3BhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABYWVogAAAAAAAA9tYAAQAAAADTLW1sdWMAAAAAAAAAAQAAAAxlblVTAAAAIAAAABwARwBvAG8AZwBsAGUAIABJAG4AYwAuACAAMgAwADEANkFMUEgDCQAADbBG///6tNUbKWwk9S3VXZn76LUaHey4L5y71NsURplkbkGqa08JVFOXlBW6YjlbJXMNlTl31VyvnVWAtjPoSpA8+P0j5MH/wffKPyImAMP/hv8N/xv+N/xv+N/wv+F/w/+G/w3/Gy3s/+Gwd6efkH3r4N5Jk0Xf5cMQ/7MAGkWfLU2plXw2G0DomsF+sWe/HzWhZHjWR5MbZZ6bCO/YMK9cljy316+LXibii1c2FwiSMgfp5sU1egucfQvEiAvgDzdU6J/LUb+4vE8iiYkAzsNeIeJC8/cN+meWcnzc4R+6GOMzAdSZcxolyIRfaXnRvbY05TnU+rUeE8C9KxaUC5DFaD+ZPblR39jvB+j6RANfldsCYHZT1Cg9Lif8HWsXlOsaN+pOwvqW1FpQc52jzsqOocsjwOx+z6tjPKhNc8MRcMzOSAbovf/XoiP3ZSKvO/qKbrH1UlofINKAI2m7CcA0Za3gsN2DGmrulZSUCDB9g16ZkI3qIMr6l8vGJAFrTswXG3OuR7N+7E+dGTUWoI/lHzplMerBhmgIODo+vAiY9/ucRplxtQ21Y/dcoH7OJwnAyqf0yeWoZxzE8POtZQD3rp5XLjJWojZN7EQNBNOBO28v0CWlyo8PEdMV91wFcPHK5gKB4UI9+whh5z92KeA8v0J/mD2os4ixdXNPVOdhr7hYjtr0OOHf3LoZ4NVZumPEh6ihTbEK5LoykgHqzk8TFnPQnEqk73/qAvosytMbfjT3EfOAI2m7CcBeMPqcpLjaplFA5KU5FuDR89X6ogjNE0/FDurXui0A1+4pWicoVqIeeCcKxtUCLH5RX8zSKF1Bt/qW1FpQ1/5QICZcqC15ROu/5EZg0MWHdcSiJ1BfoLsDc5YMVXAe9gqJ5ahNOUQ/rjIVmPWqjpiG2rSl26ifPLlEoc7rFRG2gRpTiWFgUxlgv65AP/TXGEc8uv66Jg2g7nCBgHBdjlpATF+zJwLO/q/ohRTUf30XF1S+s9wC4OxbIB5sl6MeeCc2P397K4C9Qi8Ef+4PbU8Rp74lK28AcB72CocHpqKeeJEYO8pMgKVJLzArZ+DpFcRtYM5KC0Cd1ysbalGbJhPrwLxqAFeBXli96DTxHFjiNgHUHS6QDI+jNhURe999SYCzb4FOiHtfldsC4OxbIBcevkc5+wjdWZ8J4Oz/ii7Dt2TlDQDOMeNbpEI5wIU8urXykTSA/PX6jMCclRaA+2u8uTLBg/oK3Vvx7kYT0LuwQJ8RWOI2oU6sEgm2Xsq5Ld2Er6oawNm3QJ/hq/KYlNRQUCC4Lkf9M93uswwHcA54QZ/hq/KYgDMIRBeaB890H2vsaQDPX/2EPsP3Xv4NnNwoEFxonnEQhxXvbjQB5Lym06hYegiJaB+o0WQjLn1VHhOQGgrqNKnoRm19ljj1VW1OhlOI8o2orXnErc87e/DpLaJsUUgJ2onj6pknkeXTUPOR/P2VUKXkS0H9Gskf/Lk/tL0p+piVM/D0CmT/6kWnMfxv+N/wv+F/0W8ecqJF+DlKGFy4SvbNgITi+aIvpR8w8FxQ8gUPDYNvkf1PWi8/vE34fTH7MP/N2jzkRIvwc5QwuHCV7JsBCcXzRV9KP2DguaDkCx4aBt8i+5+0Xn54m/D7YvZhDP8b/jf8rxuf2+sXfh+PIN28uEbwVWcD/OGGCrFndaH9+waxl0lYL2LfqtW+6Eq558kDQrsrEfx7jmX0+rzu38j2rHRIPbm1JVb+Dbt/Qqybswe3ceK5UaiDs725MRLt6yZCKkMIP7FKyfJrmLMHty2Tb5OINjUUZPy4Pj/U1jDgrWshNafyGchK35u+1y/UUnpEdQZYBNZrXbuvRO09Ya21FNJJH/2+v3MvkL5MlgXPDgoT6iKBrpMbKXsa4JZ9o9Du0Z6JZo+7s5LSAXI+2tdW0SjGmP+oJbGrIxj8qnwrIQAXmp1mwpvv0Iqw9x23pNqPjBRjq+c3dRFpVj7a9aT20Aq11uRFozn8SzEW5aOLCHuhDveTPQgl0PEme45l9Gs3JSdGkWBqEWkL0O7aswVedrdDCMC/Yfc5Wk0vT+6X9F1L+y0pGh0XEOdZw3vfgXbrpHPE8sfS1891AulT05Muom0t0txaSoS/5ALmol3vRhO+wrO38wICPZPwLbt2AB8NZ8wNzprYiHVruIMjAYZeDfzqtooostKXiTZPntYv0wCmP4v6+4aIrGWQ4w/8mNJW0SjT9hy7t09CqOMvm1AXoukl4kygd9b1vUm1Hxkp0vwb3v0hRFgbmse/jMxKhMO/FGmR2+/X2L2ByD15ESSYWqSbG3V3IVHu+evUlDAdFxDuHtQz24jWvyVh6u9TEkkIta1FuG9Cbb2PGFZ4GoJdhJDuZU+j6UDqZ81A+2CD0LOWEvaMA6GfSdhz2Uh9q1bXnq2IfU+e8suEc8j9Pcfu6BXavwnJ79/w0U8Y/jf8b/jf8L/h///amIVf+FlnQNZHO3fhjzdz9tYWKZYJcMetY8ja8mJjPHnGke3NFWJWRXPSvM2z48cFMLFKiHnywpH20oRXfHHiQk0NBWXYnl3jhyZrwbVld3/gXxwHLjRPIcT979cML74i8XzvJNSUu7JyitZ11yo0g4VSDHhj7r+7+O22oQrQb0Fa/oXuMHvQbLUjzfc+OLlEC6YsLdn4Q8xGfIhmax4C3XVqyg2piQqmuQ9Wlp+KkR/NCzmI9OWbD1302JxUVMszue8VNsbCg+aJJxDrP66pWzIyFc2c4gXl0dl6aZSuQLIHHEft+YMVzO73vNG4Lkd9Ael+ar3vgRd7otZ5vZG50Dz4oXiDU+ur1mUkA9SlzW6IwHa5xhkHIv7UxKQqC8D9c3/Y6zqjUfYb1CYbUr5+zsobUG9Pf9q9VLGjtj6LnA/MWX2JAqZ5n3sBi9L0LJI+8MSqGzWgzrxhK5q3IesD43pNmNBf4d7pGTs0AsIOPquuzi82oV76kNKJxC/Z+pZF0a4XeQQcszOSw5x5R+YRcAwovkkrE7H/xtzXb9Y4Lvfg2bl9gK7zks9fnz+Ijq2I/mVlpzD8b/jf8L/hf8P/hv8N/xv+/6/7AFZQOCDSAQAAUDUAnQEqAgMsAT9xuNlltK8rpyAIApAuCWlu4XdhG0AJ7APfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJyHvtk5D32ych77ZOQ99snIe+2TkPfbJwoAAP7/rR4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==}!}

  3. 搭建自用导航网站 R11; JKblog
    2022-01-12
  4. 搭建自用导航网站 R11; JKblog
    2022-01-12
  5. MrGao
    2019-09-03

标签云