Yolov3 和 Yolov3-tiny目标检测算法理论与实现(TensorFlow2)-程序员宅基地

技术标签: python  深度学习  目标检测  深度学习入门  


前言

上一篇文章 神奇的目标检测 已经介绍了目标检测的基础啦。目标检测呢,就是在图片中定位出目标的位置,把它“框”出来就好了。本篇文章使用Yolov3 和Yolov3-tiny,以训练VOC2007和口罩检测为例。教大家如何快速的搭建自己的目标检测平台。下面是资源链接:

内容 链接
VOC2007 数据集 链接
戴口罩数据集 链接
权重文件 链接 提取码:y32m
github项目地址 链接
完整项目地址(包含所有文件) 链接 提取码 jmpl

一、Yolov3 和 Yolov3-tiny

2018 年,推出了Yolov3,相比于Yolov2 最主要的改进又一下几点:
1. 加深了网络,使用Darknet53,提升了模型得检测能力。
2.使用了FPN结构(空间金字塔结构),能增强不同大小目标的检测能力。
3.使用了focal loss,解决了样本不均和分类难得问题
对于tiny版本来说,只使用了简单的44层卷积用作普通的特征提取,只有两个输出的yolo head (Yolov3有3个yolo head)每个网格点使用两3个anchor boxes(和Yolov3一样)。所以tiny版本检测速度是很快的哦~。
优点:检测速度快,背景误检率低,泛化性强
缺点:召回率低,定位精度较差,对于靠近或遮挡的目标,小目标检测能力弱,容易出现漏检。

1.网络结构

网络结构中包含了很多基础块,我们先实现这些基本的块,然后像搭积木一样将这些块给组装起来。每个块的用途我已经写在代码注释里了。

 #定义的卷积设置初始化方法和卷积步长和填充方式
@wraps(Conv2D)
def DarknetConv2D(*args, **kwargs):
    """Wrapper to set Darknet parameters for Convolution2D."""
    #定义卷积块
    darknet_conv_kwargs = {
   
    'kernel_regularizer': l2(5e-4)}
    darknet_conv_kwargs['padding'] = 'valid' if kwargs.get('strides')==(2,2) else 'same'
    darknet_conv_kwargs.update(kwargs)
    return Conv2D(*args, **darknet_conv_kwargs)

def DarknetConv2D_BN_Leaky(*args, **kwargs):
    #定义的卷积块包含了BN Leaky 激活函数
    """Darknet Convolution2D followed by BatchNormalization and LeakyReLU."""
    no_bias_kwargs = {
   
    'use_bias': False}
    no_bias_kwargs.update(kwargs)
    return compose(
        DarknetConv2D(*args, **no_bias_kwargs),
        BatchNormalization(),
        LeakyReLU(alpha=0.1))

def resblock_body(x, num_filters, num_blocks):
    '''A series of resblocks starting with a downsampling Convolution2D'''
    #定义 yolo 主干使用的残差快
    # Darknet uses left and top padding instead of 'same' mode
    x = ZeroPadding2D(((1,0),(1,0)))(x)
    x = DarknetConv2D_BN_Leaky(num_filters, (3,3), strides=(2,2))(x)
    for i in range(num_blocks):
        y = compose(
                DarknetConv2D_BN_Leaky(num_filters//2, (1,1)),
                DarknetConv2D_BN_Leaky(num_filters, (3,3)))(x)
        x = Add()([x,y])
    return x

def darknet_body(x):
    '''Darknent body having 52 Convolution2D layers'''
    #darknet 53
    #卷积核大小3x3 32 个卷积核
    x = DarknetConv2D_BN_Leaky(32, (3,3))(x)
    x = resblock_body(x, 64, 1)
    x = resblock_body(x, 128, 2)
    x = resblock_body(x, 256, 8)
    x = resblock_body(x, 512, 8)
    x = resblock_body(x, 1024, 4)
    return x

def make_last_layers(x, num_filters, out_filters):
    '''6 Conv2D_BN_Leaky layers followed by a Conv2D_linear layer'''
    # 这里是输入yolo,制造最后一层的代码 也就是yolo head
    x = compose(
            DarknetConv2D_BN_Leaky(num_filters, (1,1)),
            DarknetConv2D_BN_Leaky(num_filters*2, (3,3)),
            DarknetConv2D_BN_Leaky(num_filters, (1,1)),
            DarknetConv2D_BN_Leaky(num_filters*2, (3,3)),
            DarknetConv2D_BN_Leaky(num_filters, (1,1)))(x)
    y = compose(
            DarknetConv2D_BN_Leaky(num_filters*2, (3,3)),
            DarknetConv2D(out_filters, (1,1)))(x)
    return x, y

yolov3-tiny

tiny 版本网络结构比较简单,我们先来看一个图:
在这里插入图片描述
网络中就是普通的卷积核和池化,且网络很浅,网络的计算过程如箭头所示。是不是网络很简单呀~~~~~。
我们接下来看代码如何实现。

def tiny_yolo_body(inputs, num_anchors, num_classes):
	#-------------------------------------------------------------------
	# inputs 输入向量  num_anchors anchor boxes的数量 num_classes 类别数
	#------------------------------------------------------------------
    '''Create Tiny YOLO_v3 model CNN body in keras.'''
    x1 = compose(
            DarknetConv2D_BN_Leaky(16, (3,3)),
            MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='same'),
            DarknetConv2D_BN_Leaky(32, (3,3)),
            MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='same'),
            DarknetConv2D_BN_Leaky(64, (3,3)),
            MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='same'),
            DarknetConv2D_BN_Leaky(128, (3,3)),
            MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='same'),
            DarknetConv2D_BN_Leaky(256, (3,3)))(inputs)
    x2 = compose(
            MaxPooling2D(pool_size=(2,2), strides=(2,2), padding='same'),
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38676487/article/details/120443059

智能推荐

计算机毕设ssm失物招领管理系统ee6sp9【附源码】_ssm失物招领平台源码-程序员宅基地

文章浏览阅读127次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:ssm + mybatis + Maven +mysql5.7或8.0等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_ssm失物招领平台源码

Python TypeError: ‘NoneType‘ object is not subscriptable_nonetype object is not subscriptable-程序员宅基地

文章浏览阅读1.5w次,点赞6次,收藏3次。Python TypeError: ‘NoneType’ object is not subscriptable分析现有一变量 li ,list 类型,通过索引去获取获取value是可以取到value,但是如果 li = None ,再通过索引获取value就会报错同理,如果变量是dict类型也会出现一样的报错总结对一个值为None的变量,进行索引取值或通过key取值,都会报 'NoneType' object is not subscriptable 错。..._nonetype object is not subscriptable

PCIe bar空间理解与调试_fpga读写pcie bar空间-程序员宅基地

文章浏览阅读5.2k次,点赞4次,收藏35次。验证环境window 10系统vivado 2017.4KC705开发板bar空间相关知识具体可以学习下面的文章bar空间说明bar空间测试以下实验,是在PIO example 验证基础上做的。xilinx官方给出的PIOexample工程,默认仅使能了BAR0空间,空间大小为2Kbyte ,读写位宽32bit(未使能64bit)其实这里..._fpga读写pcie bar空间

字符串函数讲解(C语言笔记,建议收藏!!!)_strlwr函数的用法-程序员宅基地

文章浏览阅读10w+次,点赞1.1k次,收藏8.4k次。1、gets函数2、puts函数3、strcat函数4、s't'r'c'p'y_strlwr函数的用法

ASP.NET收藏-程序员宅基地

文章浏览阅读166次。http://blog.csdn.net/mengyao/archive/2007/02/17/1511356.aspx使用SqlBulkCopy类加载其他源数据到SQL表 在数据回发时,维护ASP.NET Tree控件的位置 vagerent的vs2005网站开发技巧 ASP.NET2.0小技巧--内部控件权限的实现 图片滚动代码。 css——之三...

pyqt按钮关闭窗口_PyQt5按钮单击事件,退出程序-程序员宅基地

文章浏览阅读3.3k次。1.注意项:当使用QPushButton.clicked.connect(lambda:self.信号槽方法)。connect方法传参数时,需要加上“lambda:”2.步骤:添加一个按钮 self.button1 = QPushButton('按钮上的文本')。创建水平布局对象QHBoxLayout,并使用setWidget方法,将button1添加进去。layout = QHBoxLayout..._pyqt5界面无边界后添加打开关闭按钮

随便推点

基于Java的旅社客房收费管理系统的设计与实现(源码+lw+部署文档+讲解等)-程序员宅基地

文章浏览阅读811次,点赞20次,收藏23次。博主介绍:全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战精彩专栏 推荐订阅2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐2023-2024年最值得选的Java毕业设计选题大全:500个热门选题推荐Java精品实战案例《500套》微信小程序项目精品案例《500套》文末获取源码+数据库。

OKR考核系统是怎么制定的?一文带你学会OKR制定标准流程_售前工程师okr模板-程序员宅基地

文章浏览阅读2.2k次。为什么英特尔、谷歌等美国高科技企业热衷于应用OKR管理系统,而不是传统的KPI(关键绩效指标)和BSC(平衡记分卡)等绩效管理方法呢?本文带您了解OKR目标管理法的施行周期、OKR制定流程、OKR管理和执行流程,拥有5大优势的OKR目标管理法将是企业数字化转型期的一大利器。_售前工程师okr模板

大屏如何打造智慧城市?30张大屏模板送你,零代码基础也会用_城市大屏使用指南-程序员宅基地

文章浏览阅读432次。近年来,许多互联网企业已经纷纷涉足智慧城市的研发和推广部门,绝大部分政府规划也包含了未来智慧城市发展明细,有的也宣布已建成了“城市大脑”,但很多人对智慧城市是什么只停留在门外汉阶段,以为城市加大数据就等于智慧城市。宋梁称,凭经验看,新一代网络建设是五年至十年,五年是一个时间节点,会有一些大的变化,像当年智能手机改变你的生活一样,十年之后可能是另外一个东西,改变所有人的生活,这是会发生的事情。数字城市的重点在城市信息的数字化,智慧城市的重点是信息的分析、知识的生成、事件的预测与决策。_城市大屏使用指南

“*** error 65: access violation at 0x0000000C : no 'read' permission”错误的解决_*** error 65: access violation at 0x00000000 : no -程序员宅基地

文章浏览阅读2.3w次,点赞16次,收藏73次。摘要:STM32F407VG工程进入软件仿真时,出现*** error 65: access violation at 0x0000000C : no 'read' permission错误。当点击RUN按钮时会重复提示*** error 65: access violation at 0x00000000 : no 'execute/read' permission的错误。解决步骤: 1. Op_*** error 65: access violation at 0x00000000 : no 'execute/read' permission

在Linux上安装Chef工作站-程序员宅基地

文章浏览阅读73次。导读 Chef是一个IT基础设施自动化软件,它可以管理你组织中所有的服务器和网络设备。当我们想与Chef服务器、任何物理节点(服务器、网络设备等)的基础设施进行交互时,我们需要一个Chef工作站。本教程解释如何安装和配置Linux服务器上Chef工作站。 ..._linux 安装chef

软件安装管家-程序员宅基地

文章浏览阅读9.4k次。软件安装管家资源整理(2022年7月15更新)_软件安装管家

推荐文章

热门文章

相关标签