yolov2原理到代码

2024-01-25 02:30
文章标签 代码 原理 yolov2

本文主要是介绍yolov2原理到代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

yolov2原理到代码

    • yolov2较yolov1改进的地方
    • 对图片真实框的处理
    • 真实框与anchor box的IOU计算方法
    • yolov2流程

yolov2较yolov1改进的地方

从输入图片角度:

  • 用高分辨率图片对识别网络进行了微调
  • 采用多尺度训练

从网络设计角度:

  • 增加了Batchnorm层
  • 设计了新的网络(Darknet19)
  • 增加了细粒度分类

从损失函数角度:

  • 采用anchors box
  • 利用维度聚类得出anchors box的宽高和最佳个数(5个)
  • 采用直接坐标预测法进行预测

对图片真实框的处理

  • yolov1:计算出目标在 S ∗ S S*S SS 网格中的位置,将该网格对应的B个bounding box 均设为有目标,且具体目标信息(包括置信度、box坐标、类别概率)均一致,不涉及到IOU的计算。
  • yolov2:分别计算一张图片中每个目标在 S ∗ S S*S SS 网格中的位置,再计算目标与每个anchor box的IOU,选择IOU最大的anchor box,将该位置设置为有目标,其他位置均设置为无目标。若最大的IOU为零,则所有anchor box位置均为无目标。
    tips:其实不会出现完全没有交集,即IOU=0的情况。可根据计算iou的过程得出结论。

真实框与anchor box的IOU计算方法

由于anchor box提供的是宽和高,计算IOU时假定anchor box的中心与目标所在中心位置一致,因此计算IOU其实用不到目标中心坐标,只利用anchor box和真实框的宽和高就可算出。具体如下:
在这里插入图片描述

yolov2流程

  • 对于输入图片image,设宽和高分别为 ( w i d t h , h e i g h t ) (width, height) (width,height),将true boxes的坐上坐标和右下坐标转化为中心坐标和宽高 ( x , y , w , h ) (x,y,w,h) (x,y,w,h),再 ( x , y , w , h ) / ( w i d t h , h e i g h t , w i t h , h e i g h t ) (x,y,w,h)/(width,height,with,height) (x,y,w,h)/(width,height,with,height)将true boxes归一化到 ( 0 , 1 ) (0,1) (0,1) 区间内。

  • 根据处理后的true boxes、anchors以及resize的图片大小,将true boxes转化为 ( 13 ? , 13 ? , n u m a n c h o r s , 5 ) (13?,13?,num_{anchors},5) (13?,13?,numanchors,5)的形式,再输出一个 ( 13 ? , 13 ? , n u m a n c h o r s , 1 ) (13?,13?,num_{anchors},1) (13?,13?,numanchors,1)的向量,表示某个anchors与其中一个true box最匹配,匹配位置记为1,其他位置记为0。具体:
    x , y , w , h x,y,w,h x,y,w,h乘上输出特征图大小(例如 13 ∗ 13 13*13 1313)对每个true box都做该处理,然后与anchor box进行匹配,计算出最匹配的anchor box,最终输出的 x , y x,y x,y ( x , y ) ∗ ( 13 , 13 ) − f l o o r ( ( x , y ) ∗ ( 13 , 13 ) ) (x,y)*(13,13)-floor((x,y)*(13,13)) (x,y)(13,13)floor((x,y)(13,13)),输出的 w , h w,h w,h l o g ( ( ( w , h ) ∗ ( 13 , 13 ) ) / a n c h o r s [ b e s t a n c h o r ] ) log(((w,h)*(13,13))/anchors[best_{anchor}]) log(((w,h)(13,13))/anchors[bestanchor]),最后一个是类别。

  • 构建模型

  • 构建损失函数
    损失函数计算:
    1)首先将网络出书输出转化为与true boxes相同的格式:
    网络输出为 ( 13 ? , 13 ? , n u m a n c h o r s , 5 + n u m c l a s s e s ) (13?,13?,num_{anchors},5+num_{classes}) (13?,13?,numanchors,5+numclasses) 5 + n u m c l a s s e s 5+num_{classes} 5+numclasses中的前两个分别为中心坐标 x , y x,y x,y,接下来两个人分别为宽高 w , h w,h w,h,再接下来一个是置信度,最后 n u m c l a s s e s num_{classes} numclasses个为类别概率。
    x , y , c o n f i d e n c e x,y,confidence x,y,confidence分别用 s i g m o i d sigmoid sigmoid函数激活, w , h w,h w,h取指数,类别概率用 s o f t m a x softmax softmax函数激活。
    x , y x,y x,y分别转化为相对于 13 ∗ 13 13*13 1313大小的图片的位置,范围还是 ( 0 , 1 ) (0,1) (0,1),将 w , h w,h w,h分别转化为相对于anchor box与 13 ∗ 13 13*13 1313的相对位置
    对应代码段如下
    box_xy = (box_xy + conv_index) / conv_dims
    box_wh = box_wh * anchors_tensor / conv_dims
    2)将pred box与true box的坐标形式 ( x , y , w , h ) (x,y,w,h) (x,y,w,h) 均转化为 ( x 1 , y 1 , x 2 , y 2 ) (x_1,y_1,x_2,y_2) (x1,y1,x2,y2) 的形式,计算IOU,根据最大的IOU是否超过设定阈值,判断该anchor box是否有目标,再计算损失函数(损失函数用的true box是根据第二项计算的 ( x , y , w , h ) (x,y,w,h) (x,y,w,h)算,用的pred box是根据下面的方式计算:
    直接对输出 ( 13 ? , 13 ? , n u m a n c h o r s , 5 + n u m c l a s s e s ) (13?,13?,num_{anchors},5+num_{classes}) (13?,13?,numanchors,5+numclasses) 5 + n u m c l a s s e s 5+num{classes} 5+numclasses 的前两个
    取sigmoid作为中心坐标,后两个直接作为宽高,将这个作为pred box,与true box对应位置相减计算定位损失,对于分类损失和置信度损失用的是第1)步计算出的置信度和类别概率)

  • 预测时,输出的前四个为相对于anchors的 ( x , y , w , h ) (x,y,w,h) (x,y,w,h),先转化为相对于整张图片的 ( x , y , w , h ) (x,y,w,h) (x,y,w,h),再将其转化为 ( x 1 , y 1 , x 2 , y 2 ) (x_1,y_1,x_2,y_2) (x1,y1,x2,y2),计算得分,选择超过门限的anchors box,最后做非极大值抑制。
    乘以原始图片的 ( w i d t h , h e i g h t , w i d t h , h e i g h t ) (width,height,width,height) (width,height,width,height)得出真实的坐标位置。

这篇关于yolov2原理到代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/641810

相关文章

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

java之Objects.nonNull用法代码解读

《java之Objects.nonNull用法代码解读》:本文主要介绍java之Objects.nonNull用法代码,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录Java之Objects.nonwww.chinasem.cnNull用法代码Objects.nonN

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

Java强制转化示例代码详解

《Java强制转化示例代码详解》:本文主要介绍Java编程语言中的类型转换,包括基本类型之间的强制类型转换和引用类型的强制类型转换,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录引入基本类型强制转换1.数字之间2.数字字符之间引入引用类型的强制转换总结引入在Java编程语言中,类型转换(无论