上一篇文章 神奇的目标检测 已经介绍了目标检测的基础啦。目标检测呢,就是在图片中定位出目标的位置,把它“框”出来就好了。本篇文章使用Yolov3 和Yolov3-tiny,以训练VOC2007和口罩检测为例。教大家如何快速的搭建自己的目标检测平台。下面是资源链接:
内容 | 链接 |
---|---|
VOC2007 数据集 | 链接 |
戴口罩数据集 | 链接 |
权重文件 | 链接 提取码:y32m |
github项目地址 | 链接 |
完整项目地址(包含所有文件) | 链接 提取码 jmpl |
2018 年,推出了Yolov3,相比于Yolov2 最主要的改进又一下几点:
1. 加深了网络,使用Darknet53,提升了模型得检测能力。
2.使用了FPN结构(空间金字塔结构),能增强不同大小目标的检测能力。
3.使用了focal loss,解决了样本不均和分类难得问题。
对于tiny版本来说,只使用了简单的44层卷积用作普通的特征提取,只有两个输出的yolo head (Yolov3有3个yolo head)每个网格点使用两3个anchor boxes(和Yolov3一样)。所以tiny版本检测速度是很快的哦~。
优点:检测速度快,背景误检率低,泛化性强
缺点:召回率低,定位精度较差,对于靠近或遮挡的目标,小目标检测能力弱,容易出现漏检。
网络结构中包含了很多基础块,我们先实现这些基本的块,然后像搭积木一样将这些块给组装起来。每个块的用途我已经写在代码注释里了。
#定义的卷积设置初始化方法和卷积步长和填充方式
@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
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'),
文章浏览阅读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失物招领平台源码
文章浏览阅读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
文章浏览阅读5.2k次,点赞4次,收藏35次。验证环境window 10系统vivado 2017.4KC705开发板bar空间相关知识具体可以学习下面的文章bar空间说明bar空间测试以下实验,是在PIO example 验证基础上做的。xilinx官方给出的PIOexample工程,默认仅使能了BAR0空间,空间大小为2Kbyte ,读写位宽32bit(未使能64bit)其实这里..._fpga读写pcie bar空间
文章浏览阅读10w+次,点赞1.1k次,收藏8.4k次。1、gets函数2、puts函数3、strcat函数4、s't'r'c'p'y_strlwr函数的用法
文章浏览阅读166次。http://blog.csdn.net/mengyao/archive/2007/02/17/1511356.aspx使用SqlBulkCopy类加载其他源数据到SQL表 在数据回发时,维护ASP.NET Tree控件的位置 vagerent的vs2005网站开发技巧 ASP.NET2.0小技巧--内部控件权限的实现 图片滚动代码。 css——之三...
文章浏览阅读3.3k次。1.注意项:当使用QPushButton.clicked.connect(lambda:self.信号槽方法)。connect方法传参数时,需要加上“lambda:”2.步骤:添加一个按钮 self.button1 = QPushButton('按钮上的文本')。创建水平布局对象QHBoxLayout,并使用setWidget方法,将button1添加进去。layout = QHBoxLayout..._pyqt5界面无边界后添加打开关闭按钮
文章浏览阅读811次,点赞20次,收藏23次。博主介绍:全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战精彩专栏 推荐订阅2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐2023-2024年最值得选的Java毕业设计选题大全:500个热门选题推荐Java精品实战案例《500套》微信小程序项目精品案例《500套》文末获取源码+数据库。
文章浏览阅读2.2k次。为什么英特尔、谷歌等美国高科技企业热衷于应用OKR管理系统,而不是传统的KPI(关键绩效指标)和BSC(平衡记分卡)等绩效管理方法呢?本文带您了解OKR目标管理法的施行周期、OKR制定流程、OKR管理和执行流程,拥有5大优势的OKR目标管理法将是企业数字化转型期的一大利器。_售前工程师okr模板
文章浏览阅读432次。近年来,许多互联网企业已经纷纷涉足智慧城市的研发和推广部门,绝大部分政府规划也包含了未来智慧城市发展明细,有的也宣布已建成了“城市大脑”,但很多人对智慧城市是什么只停留在门外汉阶段,以为城市加大数据就等于智慧城市。宋梁称,凭经验看,新一代网络建设是五年至十年,五年是一个时间节点,会有一些大的变化,像当年智能手机改变你的生活一样,十年之后可能是另外一个东西,改变所有人的生活,这是会发生的事情。数字城市的重点在城市信息的数字化,智慧城市的重点是信息的分析、知识的生成、事件的预测与决策。_城市大屏使用指南
文章浏览阅读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
文章浏览阅读73次。导读 Chef是一个IT基础设施自动化软件,它可以管理你组织中所有的服务器和网络设备。当我们想与Chef服务器、任何物理节点(服务器、网络设备等)的基础设施进行交互时,我们需要一个Chef工作站。本教程解释如何安装和配置Linux服务器上Chef工作站。 ..._linux 安装chef
文章浏览阅读9.4k次。软件安装管家资源整理(2022年7月15更新)_软件安装管家