当前位置: 首页 > news >正文

YOLO物体检测-系列教程2:YOLOV2整体解读

🎈🎈🎈YOLO 系列教程 总目录

YOLOV1整体解读
YOLOV2整体解读

YOLOV2提出论文:YOLO9000: Better, Faster, Stronger

1、YOLOV1

  • 优点:快速,简单!
  • 问题1:每个Cell只预测一个类别,如果重叠无法解决
  • 问题2:小物体检测效果一般,长宽比可选的但单一

YOLOV2更快!更强!

YOLOYOLOV2
batch norm
hi-res classifier
convolutional
anchor boxes
new network
dimension priors
location prediction
passthrough
multi-scale
hi-res detecttor
VOC2007 mAP63.465.869.569.269.674.475.476.878.6

V2版本整体上没有太多改变,主要在网络上、实现上的细节上有一些改进,如表格中的mAP值是有明显的上升的。看这个表格,v2版本的mAP值有一个很明显的上升,接下来我会根据表格内容依次介绍v2版本在哪些方面有改进。

2、Batch Normalization

  • V2版本舍弃Dropout,卷积后全部加入Batch Normalization
  • 网络的每一层的输入都做了归一化,收敛相对更容易
  • 经过Batch Normalization处理后的网络会提升2%的mAP
  • 从现在的角度来看,Batch Normalization已经成网络必备处理

Batch Normalization:顾名思义,批量归一化处理,分别对一列特征进行进行归一化操作,具体为当前值减去均值再除以方差。
Dropout:随机杀死一些神经元,即被杀死的神经元部分的特征权重为0,避免过拟合,在全连接层最常使用。

在v2版本,首先就全面剔除Dropout,在每一次卷积后都进行了Batch Normalization,能够避免网络往不好的方向训练,能够使得收敛更快,由于这个地方的改动,YOLOv2的mAP提升了约2%。

3、更大的分辨率

  • V1训练时用的是224224,测试时使用448448
  • 可能导致模型水土不服,V2训练时额外又进行了10次448*448 的微调
  • 使用高分辨率分类器后,YOLOv2的mAP提升了约4%

这个实际上就是V1和V2都是使用(224,224)的图像训练,然后都是用(448,448 )的图像测试。只不过V2版本,在训练的时候加了10个epoch,这10个epoch都是用(448,448 )的图像进行训练,因为10个epoch比较个数比较少,所以实际上是对模型进行微调。

这是因为用(224,224)的图像训练,然后用(448,448 )的图像测试会让模型无法适应,增加了10个epoch用(448,448 )的图像进行训练对模型进行微调有一个适应的过程,就是因为这个适应的过程使得YOLOv2的mAP提升了约4%

4、网络结构

  1. DarkNet,实际输入为416*416
  2. 没有FC层,5次降采样,(13*13)
  3. 1*1卷积节省了很多参数

在这里插入图片描述
YOLOV2借助了ResNet和VGG的一些思想:

  1. 所有的全连接层都不见了,全连接层容易过拟合,收敛慢,参数多,最后的输出是(7,7,30)这个用卷积也同样能够做到
  2. 5次降采样操作,maxpooling,(224,224)变成(112,112),最终输出(7,7)
  3. 输入输出进行了改变,输入改成了(416,416)输出为(13,13)
  4. darknet,具体为darknet19,一共有19个卷积层,每次经过卷积的时候特征图的个数会翻倍,这里用了(1,1)的一维卷积降低了卷积核的个数

5、YOLO-V2聚类提取先验框

  • faster-rcnn系列选择的先验比例都是常规的,但是不一定完全适合数据集
  • K-means聚类中的距离: d ( b o x , c e n t r o i d s ) = 1 − I O U ( b o x , c e n t r o i d s ) d(box,centroids) = 1-IOU(box,centroids) d(box,centroids)=1IOU(box,centroids)

5.1 YOLOV1先验框

在YOLOV1中,有两个预选框可供选择,但是实际中物体可能远不止两种,并且有长的宽的,多个物体重叠在一起或者一个物体有多个标签,可能就会出现问题。

5.2 Fast-RCNN先验框

在当时Fast-RCNN用了9种先验框,但是它的做法是有三种scale不同大小,每种大小三种比例的先验框有1:1、1:2、2:1这3种比例,但是这种做法对实际的数据集可能无法完全适配。

5.3 YOLO-V2聚类提取先验框

比如在coco数据集中,有很多标注数据,假如说在标注的数据中标注了100万个框,对这100万个框使用kmeans进行聚类,加入k=5,就会将先验框的大小、长宽比例、中心坐标点等特征分成5类,而这5类也是专门针对当前数据集的个性化分类。那先验框就会有5种确定的大小比例,这就会和最终的实际任务会比较接近。
而kmeans的距离计算公式用LOU来实现。
作者通过实验发现,k=5可以获得比较好的IOU值。

YOLOV1 = 772 = 98
YOLOV2 = 13135 = 845
YOLOV2在先验框的数量上大幅度提升,V1是98个,V2则为845个

6、偏移量计算方法

6.1 anchor boxes

  • 通过引入anchor boxes(锚框,即先验框),使得预测的box数量更多(1313n)
  • 跟faster-rcnn系列不同的是先验框并不是直接按照长宽固定比给定
without anchor69.5mAP81%recall
with anchor69.2mAP88%recall

在第5节提到增加了先验框,但是如表格所示,并没有增加mAP值,但是recall是明显增加的,recall描述了被标记物体全部被检测的可能性。

YOLOV1:使用全连接层来预测边界框的坐标
Faster R-CNN:使用手工挑选的先验因素来预测边界框,Faster R-CNN中的区域生成网络(RPN)只使用卷积层来预测锚框的偏移量和置信度。由于预测层是卷积,RPN预测了特征图中每个位置的偏移量。

Anchor Box的构成:

  • 使用CNN提取的Feature Map的点,来定位目标的位置
  • 使用Anchor Box的Scale来表示目标的大小
  • 使用Anchor Box的Aspect Ratio来表示目标的形状。

6.2 YOLO-V2-Directed Location Prediction

直接的位置预测改为相对位置预测策略

  1. bbox:中心为 ( x p , y p ) (x_p,y_p) (xp,yp),宽和高为 ( w p , h p ) (w_p,h_p) (wp,hp),则: x = x p + w p ∗ t x x = x_p+w_p*t_x x=xp+wptx y = y p + h p ∗ t y y = y_p+h_p*t_y y=yp+hpty
  2. t x t_x tx=1,则将bbox在x轴向右移动 w p w_p wp t x t_x tx=−1则将其向左移动 w p w_p wp
  3. 这样会导致收敛问题,模型不稳定,尤其是刚开始进行训练的时候
  4. V2中并没有直接使用偏移量,而是选择相对grid cell的偏移量

解析:

  1. 得到先验框有4个参数 ( x p , y p , h p , w p ) (x_p,y_p,h_p,w_p) xpyphpwp,这是kmeans聚类预测出来的
  2. 预测出4个偏移量 ( t x , t y , t w , t h ) (t_x,t_y,t_w,t_h) txtytwth,新的框为 ( x , y , h , w ) (x,y,h,w) xyhw,其中 x = x p + t x x = x_p+t_x x=xp+tx,y、h、w同理
  3. 但是这样存在一个问题,网络初期的时候效果不好(网络啥也不会),预测出的offset偏移量可能导致得到的框会错误的很离谱,V2对此做出改进
  4. 具体改进为中心点x、y的偏移量的预测结果,加上sigmoid的,这样保证了中心点不会离开原来的grid cell格子,还要加上单元格与图像左上角的偏移量为 ( c x , c y ) (cx,cy) cxcy,h和w的预测策略不变。

具体公式为:
b x = σ ( t x ) + c x b_x = σ(t_x)+c_x bx=σ(tx)+cx
b y = σ ( t y ) + c y b_y = σ(t_y)+c_y by=σ(ty)+cy
b w = p w e t w b_w = p_we^{t_w} bw=pwetw
b h = p h e t h b_h = p_he^{t_h} bh=pheth

加入预测值为 ( σ t x , σ t y , t w , t h ) (σt_x,σt_y,t_w,t_h) σtxσtytwth = (0.2,0.1,0.2,0.32)
anchor框为: p w = 3.19275 , p h = 4.00944 p_w = 3.19275,p_h = 4.00944 pw=3.19275ph=4.00944
在特征图位置:
b x = 0.2 + 1 = 1.2 b_x = 0.2+1 = 1.2 bx=0.2+1=1.2
b y = 0.1 + 1 = 1.1 b_y = 0.1+1 = 1.1 by=0.1+1=1.1
b w = 3.19275 ∗ e 0.2 = 3.89963 b_w = 3.19275*e^{0.2} = 3.89963 bw=3.19275e0.2=3.89963
b h = 4.00944 ∗ e 0.32 = 5.52153 b_h = 4.00944*e^{0.32} = 5.52153 bh=4.00944e0.32=5.52153
在原位置:
b x = 1.2 ∗ 32 = 38.4 b_x = 1.2*32=38.4 bx=1.232=38.4
b y = 1.1 ∗ 32 = 35.2 b_y = 1.1*32=35.2 by=1.132=35.2
b w = 3.89963 ∗ 32 = 124.78 b_w = 3.89963*32=124.78 bw=3.8996332=124.78
b h = 5.52153 ∗ 32 = 176.68 b_h = 5.52153*32=176.68 bh=5.5215332=176.68

7、YOLO-V2的感受野

7.1 感受野

在这里插入图片描述
从原始图像数据中,经过特征提取,得到一个Feature Map特征图,特征图的一个点可能代表原始图像中一个区域,这个区域就是这个点的感受野。越大的感受野越能感受一个整体。

7.2 卷积核对应参数

在这里插入图片描述
如图有一个(5,5)的图像数据(或者特征图),经过一个(3,3)的卷积核,步长为1,得到的输出就是一个(3,3)的特征图,再经过一个一次卷积就能得到(1,1)的输出,如果直接用5*5的卷积核就能得到一个(1,1)的输出,一步能得到的结果为什么要用两步呢?但是实际中却都是在用小的卷积核没有用大的。实际上用多步小的卷积核,用到的参数更少。

假设输入大小都是(H,W,C),并且都使用c个卷积核(得到c个特征图),可以计算一下各自所需参数:
1个(7,7)卷积核所需参数:
= C • ( 7 • 7 • c ) = 49 c 2 =C • (7 • 7 • c) = 49c^2 =C(7•7•c)=49c2
3个(3,3)卷积核所需参数:
= 3 • c • ( 3 • 3 • c ) = 27 c 2 =3•c•(3•3•c) = 27c^2 =3•c(3•3•c)=27c2

7.3 Fine-Grained Features

  • 最后一层时感受野太大了,小目标可能丢失了,需融合之前的特征

在这里插入图片描述
yolo算法,在一次次的卷积过程中,越往后的感受野越大,(224,224)的图像经过处理最后得到的Feature Map特征图是(7,7),实际上这个感受野太大了,容易忽视一下小物体,比较容易检测到大的物体。

yolov2在最后得到的特征图是(13,13,1024)将其拆分为(1,13,13,1024),倒数第二个特征图为(26,26,512)拆分为(4,13,13,512),再拆分为(2,13,13,1024),将其拼接为(3,13,13,1024),reshape成(13,13,3072)

8、多尺度检测

  • YOLO-V2-Multi-Scale
  • 都是卷积操作可没人能限制我了!一定iterations之后改变输入图片大小

实际中得到的图像大小是不一样的的,全部resize成相同大小,会影响检测效果。
不同输入大小能不能做,肯定能的,卷积和输入大小没有关系啊。
最小的尺寸为(320,320),最大的为(608,608)
原始的YOLO使用448×448的输入分辨率。通过添加锚框,我们将分辨率改为416×416。然而,由于我们的模型只使用卷积层和池化层,因此可以实时调整大小。我们希望YOLOv2能够鲁棒地运行在不同尺寸的图像上,所以我们将多尺度训练应用到模型中。

我们不需要修改输入图像的大小,而是每隔几个迭代就改变网络。每10个批次,我们的网络就会随机选择一个新的图像尺寸。由于我们的模型缩减了32倍,我们从以下32的倍数中抽取:{320, 352, …, 608}。因此,最小的选项是320 × 320,最大的是608 × 608。我们将调整网络的尺寸,然后继续训练。

这种制度迫使网络学会在各种输入维度上进行良好的预测。这意味着同一个网络可以预测不同分辨率下的检测结果。网络在较小的尺寸下运行得更快,因此YOLOv2在速度和准确性之间提供了一个简单的权衡。

在低分辨率下,YOLOv2作为一个廉价、相当准确的检测器运行。在288×288时,它以超过90 FPS的速度运行,其mAP几乎与Faster R-CNN一样好。这使它成为较小的GPU、高帧率视频或多个视频流的理想选择。

在高分辨率下,YOLOv2是一个最先进的检测器,在VOC 2007上的mAP为78.6,而运行速度仍高于实时速度。

YOLOV1整体解读
YOLOV2整体解读

相关文章:

YOLO物体检测-系列教程2:YOLOV2整体解读

🎈🎈🎈YOLO 系列教程 总目录 YOLOV1整体解读 YOLOV2整体解读 YOLOV2提出论文:YOLO9000: Better, Faster, Stronger 1、YOLOV1 优点:快速,简单!问题1:每个Cell只预测一个类别&…...

u盘传输数据的时候拔出会怎么样?小心这些危害

U盘是我们日常生活和工作中常使用的一种便携式存储设备。然而,在使用U盘传输数据时,有时我们会不小心将它拔出,而这个看似微不足道的行为实际上可能会带来严重的后果。本文将向您介绍U盘在传输数据时突然拔出可能导致的各种危害,其…...

【踩坑纪实】URL 特殊字符 400 异常

URL 特殊字符 400 异常 笔者之前在写后端或者前端时,在处理表单时,经常有对特殊字符的检验处理,但自己也不清楚为什么要这么做,浅浅地以为可能是特殊字符不好看或者存取可能会造成异常?不过一直没遇到过问题&#xff…...

Contents:帮助公司为营销目的创建内容

【产品介绍】 名称 Contents上线时间 2017年5月 具体描述 Contents是一家提供基于人工智能的内容生成平台的企业,可以帮助用户在各种网站和工具中使用最先进的机器学习模型,实现视频编辑、图像生成、3D建模等内容创作。【团队介绍…...

1397: 图的遍历——广度优先搜索

题目描述 广度优先搜索遍历类似于树的按层次遍历的过程。其过程为:假设从图中的某顶点v出发,在访问了v之后依次访问v的各个未曾被访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使“先被访问的顶点的邻接点”先…...

Java 华为真题-选修课

需求: 现有两门选修课,每门选修课都有一部分学生选修,每个学生都有选修课的成绩,需要你找出同时选修了两门选修课的学生,先按照班级进行划分,班级编号小的先输出,每个班级按照两门选修课成绩和的…...

Invalid access token: Invalid header string: ‘utf-8‘ codec can‘t decode byte

报错:在运行一个txt文档时报Invalid access token: Invalid header string: ‘utf-8’ codec can’t decode byte 原因:文档编码方式的原因,电脑默认的是UFT-8格式的编码 解决方法:用notepad改一下文档编码就好...

Java 中将多个 PDF 文件合并为一个 PDF

一.前言 我们将从以下两个方面向您展示如何将多个PDF文件合并为一个PDF: 1. 将文件中的多个 PDF 合并为单个 PDF 2. 将流中的多个 PDF 合并为单个 PDF 1. 了解 Spire.PDF 库 要在 Java 中合并 PDF 文件,我们将使用Spire.PDF 库。Spire.PDF for Java 是…...

python经典百题之水仙花数

题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个“水仙花数”,因为1531的三次方+5的三次方+3的三次方。 方法一:暴…...

jvm的调优工具

1. jps 查看进程信息 2. jstack 查看进程的线程 59560为进程id 产生了死锁就可以jstack查看了 详细用途可以看用途 3. jmap 如何使用dump文件看下 查看 4.jstat 空间占用和次数 5. jconsole可视化工具 各种使用情况,以及死锁检测 6. visualvm可视化工具…...

C语言--字符串旋转笔试题

C语言–字符串旋转笔试题 文章目录 C语言--字符串旋转笔试题一、字符串左旋1.1 思路11.2 思路1代码1.3 思路21.4 思路2代码 二、字符串旋转结果判断2.1 思路12.2 思路2 一、字符串左旋 实现一个函数,可以左旋字符串中的k个字符。 例如: ABCD左旋一个字…...

IntelliJ IDEA使用_常规设置

文章目录 版本说明主题设置取消检查更新依赖自动导入禁止import xxx.*、允许import内部类显示行号、方法分割线、空格代码提示(匹配所有字母)自定义注释颜色添加头部注释自定义字体设置字符编码关联本地GitJDK编译版本Maven配置Tomcat配置代码注释设置头…...

ResponseBodyAdvice 获取参数

废话不多说,简练,一针见血,解决问题,才是最好的。 首先肯定是重写了这个beforeBodyWrite方法 重点来了,获取请求参数: request.getBody()返回一个inputStream流,这里你可以 使用很多方法把这个…...

人力资源服务升级正当时,法大大助力佩信集团加速数字化

人力资源服务业是现代服务业的一个重要门类,在促进就业创业、提供人才服务方面发挥重要作用。同时面对产业转型升级、平台经济快速发展、企业用工成本提高等新形势,发展人力资源服务业对于促进社会化就业、更好发挥我国人力资源优势、服务经济社会发展具…...

UG\NX二次开发 二维向量相加

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 简介: UG\NX二次开发 二维向量相加 效果: 代码: #include "me.hpp"void doIt() {const double vec1[2] = { 1.0,2.0 };const double vec2[2] = { 2.0,2.…...

RabbitMQ深入 —— 持久化和发布确认

前言 前面的文章荔枝梳理了如何去配置RabbitMQ环境并且也介绍了两种比较简单的运行模式,在这篇文章中荔枝将会继续梳理有关RabbitMQ的持久化机制以及发布确认模式的相关知识,希望能够帮助到大家~~~ 文章目录 前言 一、持久化 1.1 队列持久化 1.2 消息…...

人脸识别三部曲

人脸识别三部曲 首先看目录结构图像信息采集 采集图片.py模型训练 训练模型.py人脸识别 人脸识别.py效果 首先看目录结构 引用文121本 opencv │ 采集图片.py │ 训练模型.py │ 人脸识别.py │ └───trainer │ │ trainer.yml │ └───data │ └──…...

【Linux网络编程】Socket-TCP实例

netstat -nltp 无法用read函数读取UDP套接字的数据&#xff0c;因为UDP是面向数据报&#xff0c;而TCP是面向数据流。 客户端不需要 bind&#xff0c;listen&#xff0c;accept&#xff0c;但是客户端需要connect&#xff0c;connect会自动做bind工作。 #include <sys/sock…...

<OpenCV> 边缘填充

OpenCV边缘填充 1、边缘填充类型 enum cv::BorderTypes ORDER_CONSTANT iiiiii|abcdefgh|iiiiiii with some specified i -常量法&#xff0c;常熟值填充&#xff1b; BORDER_REPLICATE aaaaaa|abcdefgh|hhhhhhh -复制法&#xff0c;复制边缘像素&#xff1b; BORDER_R…...

【视觉SLAM入门】7.3.后端优化 基于KF/EKF和基于BA图优化的后端,推导及举例分析

"时间倾诉我的故事" 1. 理论推导2. 主流解法3. 用EKF估计状态3.1. 基于EKF代表解法的感悟 4. 用BA法估计状态4.1 构建最小二乘问题4.2 求解BA推导4.3 H的稀疏结构4.4 根据H稀疏性求解4.5 鲁棒核函数4.6 编程注意 5.总结 引入&#xff1a; 前端里程计能给出一个短时间…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...