先来看一下yolo3的结构图:

1、主体网络darknet53

最左边的这一部分叫做Darknet-53,

(1)它最重要特点是使用了残差网络Residual,darknet53中的残差卷积就是进行一次3X3、步长为2的卷积,然后保存该卷积layer,再进行一次1X1的卷积和一次3X3的卷积,并把这个结果加上layer作为最后的结果, 残差网络的特点是容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题。

(2)darknet53的每一个卷积部分使用了特有的DarknetConv2D结构,每一次卷积的时候进行l2正则化,完成卷积后进行BatchNormalization标准化与LeakyReLU。普通的ReLU是将所有的负值都设为零,Leaky ReLU则是给所有负值赋予一个非零斜率。以数学的方式我们可以表示为:

2、从特征获取预测结果

(1)在特征利用部分,yolo3提取多特征层进行目标检测,一共提取三个特征层,三个特征层位于主干部分darknet53的不同位置,分别位于中间层,中下层,底层,三个特征层的shape分别为(52,52,256)、(26,26,512)、(13,13,1024)。

(2)三个特征层进行5次卷积处理,处理完后一部分用于输出该特征层对应的预测结果,一部分用于进行反卷积UmSampling2d后与其它特征层进行结合。

(3)图中输出层的shape分别为(13,13,75),(26,26,75),(52,52,75),最后一个维度为75是因为该图是基于voc数据集的,它的类为20种,

我们代码中实际使用的是coco训练集,类则为80种,yolo3针对每一个特征层存在3个先验框,所以最后的维度为255 = 3x85,三个特征层的shape为(13,13,255),(26,26,255),(52,52,255)

其实际情况就是,输入N张416x416的图片,在经过多层的运算后,会输出三个shape分别为(N,13,13,255),(N,26,26,255),(N,52,52,255)的数据,对应每个图分为13x13、26x26、52x52的网格上3个先验框的位置。

3、预测结果的解码

yolo3的3个特征层分别将整幅图分为13x13、26x26、52x52的网格,每个网络点负责一个区域的检测。

我们知道特征层的预测结果对应着三个预测框的位置,我们先将其reshape一下,其结果为(N,13,13,3,85),(N,26,26,3,85),(N,52,52,3,85)。

最后一个维度中的85包含了4+1+80,分别代表x_offset、y_offset、h和w、置信度、分类结果。

yolo3的解码过程就是将每个网格点加上它对应的x_offset和y_offset,加完后的结果就是预测框的中心,然后再利用 先验框和h、w结合 计算出预测框的长和宽。这样就能得到整个预测框的位置了,当然得到最终的预测结构后还要进行得分排序与非极大抑制筛选。

下面我们继续对ModelArts实战营 mission 4 物体检测 1的代码进行解析,在上一篇中,我们在初始化session部分介绍了如何创建模型,下面我们重点分析一下它的逻辑

重要的参数有:

  • input_shape:输入图片的尺寸,默认是(416,416):

  • anchors:默认的9种anchor box,shape是(9,2);

  • num_classes:类别数,类别按0~n排列,输入类别也是索引;

  • weights_path:预训练的权重路径;

代码逻辑如下:

首先将参数进行处理:

h, w = input_shape  #   拆分图片尺寸的宽h和高w;

image_input = Input(shape=(None, None, 3))  # 创建图片的输入格式image_input,隐式如(None,None,3),显示如(416,416,3);

num_anchors = len(anchors)  # 计算anchor的数量#根据anchor的数量,创建真值y_true的输入格式,真值y_true即Groud Truth:

y_true = [Input(shape=(h // {0: 32, 1: 16, 2: 8}[l], w // {0: 32, 1: 16, 2: 8}[l], num_anchors // 3, num_classes + 5))     for l in range(3)]

# 输入格式如下:YOLO的三种尺度(13*13,26*26,52*52),每个尺度的anchor数(=9/3),类别数(80)+边框4个+置信度1

“//”是Python语法中的整除符号,通过循环创建3个Input层,组成列表,作为y_true,格式如下:

其中,第一位是样本数,第2-3位是特征图的尺寸,共有3种尺度(13x13,26x26,52x52),第4位是每个图的anchor数(3),第5为是:类别数(80)+4个边框值(x,y,w,h)+框的置信度(是否含有物体)

通过图片输入Input层image_input、每个尺度的anchor数num_anchors//3、类别数num_classes,创建YOLO v3的网络结构,即:

model_body = yolo_body(image_input, num_anchors // 3, num_classes)

接着,加载预训练模型,如果希望不加载预训练权重,从头开始训练的话,可以将这条语句删掉:

model_body.load_weights(weights_path, by_name=True, skip_mismatch=True)

根据预训练模型的地址weights_path,加载模型,按名称对应by_name,略过不匹配skip_mismatch;

定义yolo 损失函数:

  • Lambda是Keras的自定义层,输入为(*model_body.output , *y_true),输出为output_shape=(1,);

  • 层的名字name为yolo_loss;

  • 参数为anchors锚框、类别数num_classes,ignore_thresh是物体置信度损失(object confidence loss)的IoU(Intersection over Union,重叠度)阈值;

  • yolo_loss是核心的损失函数。

最后构建模型,为训练做准备

model = Model([model_body.input],*y_true], model_loss)

其中,model_body.input是任意(?)个(416,416,3)的图片,即:

Tensor("input_1:0", shape=(?, 416, 416, 3), dtype=float32)

y_true是已标注数据转换的真值结构。

作者:hellfire

【华为云技术分享】物体检测yolo3算法 学习笔记2相关推荐

  1. 【华为云技术分享】物体检测yolo3算法 学习笔记(1)

    [摘要] YOLO作为一个one-stage目标检测算法,在速度和准确度上都有杰出的表现.而YOLO v3是YOLO的第3个版本(即YOLO.YOLO 9000.YOLO v3),检测效果,更准更强. ...

  2. 【华为云技术分享】人脸识别算法的训练之路(下)

    人脸识别算法的训练之路(上) 人脸识别 人脸识别问题本质是一个分类问题,即每一个人作为一类进行分类检测,但实际应用过程中会出现很多问题.第一,人脸类别很多,如果要识别一个城镇的所有人,那么分类类别就将 ...

  3. 【华为云技术分享】【Python算法】分类与预测——Python随机森林

    1.随机森林定义 随机森林是一种多功能的机器学习算法,能够执行回归和分类的任务.同时,它也是一种数据降维手段,在处理缺失值.异常值以及其他数据探索等方面,取得了不错的成效.另外,它还担任了集成学习中的 ...

  4. 【华为云技术分享】【Python算法】分类与预测——支持向量机

    1.支持向量机定义 在机器学习领域,支持向量机 SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类.以及回归分析.给出一个简单的线性分类问题,要用 ...

  5. 【华为云技术分享】【Python算法】分类与预测——决策树

    1.决策树定义 决策树方法在分类.预测.规则提取等领域有着广泛的应用.20 世纪 70 年代后期和 80 年代初期,机器学习研究者 J.Ross Quinlan 提出了 ID3 算法以后,决策树就在机 ...

  6. 【华为云技术分享】三大前端技术(React,Vue,Angular)探密(下)

    [华为云技术分享]三大前端技术(React,Vue,Angular)探密(上) [Angular] Angular(通常被称为 "Angular 2+"或 "Angula ...

  7. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 1

    前言 以互联网为代表的信息技术的迅猛发展对整个经济体系产生了巨大的影响.信息技术的发展一方面使知识的积累和传播更加迅速,知识爆炸性的增长:另一方面,使信息的获取变得越来越容易,信息交流的强度逐渐增加, ...

  8. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 3

    4. 微观层面 4.1 个体动机 在开源软件发展之初, 商业组织的投入很少甚至没有, 完全是靠Richard Stallman 或者 linus Torvalds 这样的个人在努力推动开源软件艰难前行 ...

  9. 【华为云技术分享】直播回顾丨激发数据裂变新动能,HDC.Cloud云数据库前沿技术解读

    3月24日14:00-17:00,HDC.Cloud开发者沙龙系列云数据库专场直播线上开启,此次华为云数据库通过三场直播从NoSQL数据库新技术.数据库迁移.行业解决方案等方面对云端数据库进行深度解读 ...

最新文章

  1. 笔记2011.7.12
  2. CentOS 5升级Python版本(2.42.7)
  3. 暑期应用开发怎么玩?申请蓝牙Mesh网关操控家里的一切
  4. TestNG之注解的生命周期
  5. kafka的简单概述及基本命令
  6. 手机工商银行怎么转账_工商银行信用卡要哪些申请条件?想成功办理你需要了解这些!...
  7. 图嵌入综述 (arxiv 1709.07604) 译文 4.1 ~ 4.2
  8. java keydown_键盘事件keydown、keypress、keyup随笔整理总结
  9. abaqus单位问题
  10. 获取域管理员权限的几种方式
  11. JS05-页面的打断点(检验程序的执行步骤)
  12. android仿iphone日期时间选择器,jquery仿苹果的时间/日期选择效果
  13. 解决 手机能连接上wifi而电脑却却不能连接上wifi的情况
  14. react--1.react环境搭建、JSX语法、注释、样式、列表渲染、定义单个组件、eact Props、react State
  15. 广电网络宽带电视网关简介与优化设置
  16. paypal开发者账户申请步骤(最新最实用)
  17. gpt分区硬盘安装linux,GPT分区表上硬盘安装ubuntu
  18. 知道创宇研发技能列表v3.0
  19. 论文笔记--Quality Prediction of Asymmetrically Distorted Stereoscopic 3D Images
  20. Android adb无线调试

热门文章

  1. vb 解析ini文件_PHP文件及运行(适合PHP初学者)
  2. oracle磁盘提取工具,实战:巧用磁盘管理工具给oracle提速
  3. 人口、人口密度分析项目-条形图
  4. 实现前后端数据交互方法汇总
  5. AIR中用户离开状态和返回状态
  6. 移动web:转盘抽奖(幸运大转盘)
  7. BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )
  8. C# Attribute(中)——Attribute本质论
  9. [FZYZOJ 1202] 金坷垃
  10. 基于phonegap,html5,ratchet,handlebars等技术的微表情APP