YOLOv3深入解析与实战:实时目标检测的高效多尺度架构网络

参考:
https://arxiv.org/pdf/1804.02767.pdf
https://blog.csdn.net/weixin_43334693/article/details/129143961

网上有很多关于yolo的文章,有些东西没讲清楚,基于自己对论文的理解,也做一个按照自己的想法做的理解。

1. 预测框的改进

1.1 Anchor的引入

Anchor(锚框)的概念最早是在Faster R-CNN中被提出的。引入的目的是更好的预测边界框,也被叫做先验框。为什么叫先验框,我们知道yolov1里面根本没有这个概念,v1里面是直接预测两个边界框,根本没有先验框这个概念。引入先验框一个目的是让模型更容易预测边界框,也就是说提前告诉你一个框,然后去修正这个框,比你直接漫无目的预测就变得容易多了
Anchor怎么设定?先验框的大小该多大,有几个?这些似乎成为了理解的关键。作者用k-means算法选出来9个了,按照大中小尺度分成了三组:
大: (116 × 90), (156 × 198), (373 × 326)
中: (30 × 61), (62 × 45), (59 × 119)
小:(10 × 13), (16 × 30), (33 × 23)
为何分成三组,因为最后作者预测三个尺度矩阵,我们往下接着看。

1.2 预测矩阵

在这里插入图片描述
网上很多这样的图,随便找了个。
我们刚才说了作者预测了三个尺度的矩阵,这三个矩阵分别是如下:
13 ∗ 13 ∗ ( 3 ∗ ( 4 + 1 + 80 ) 13*13*(3*(4 + 1 + 80) 1313(3(4+1+80) 对应大: (116 × 90), (156 × 198), (373 × 326)
26 ∗ 26 ∗ ( 3 ∗ ( 4 + 1 + 80 ) 26*26*(3*(4 + 1 + 80) 2626(3(4+1+80) 对应中: (30 × 61), (62 × 45), (59 × 119)
52 ∗ 52 ∗ ( 3 ∗ ( 4 + 1 + 80 ) 52*52*(3*(4 + 1 + 80) 5252(3(4+1+80) 对应小:(10 × 13), (16 × 30), (33 × 23)
3就是我们对应的三个anchor,4是确定边界框的四个值,1就是置信度,80是类别
这样的话,我们可以通过优化anchor的w和h就能得到更加准确的预测框,不会再像v1那样漫无目的预测w和h了,那置信度呢?聪明的你是否已经猜到,直接拿anchor去和真实框做IOU不就得了,事实也如此,而v1是拿预测的框和真实框做IOU。需要注意的是,设置anchor的目的是来更好的预测w和h,不是中心点坐标的。因为不必要,而且anchor的设置本身也没中心点,更难以确定anchor的中心点,一会看预测的值就明白了。

1.3 预测框调整

在这里插入图片描述

上图是论文中的图,加了两个圈为了好描述一点
我们来看这个预测框到底有何神奇之处。首先:

  • 网格是对图片划为一个个grid cell;
  • 虚线框就是其中一个Anchor,宽为Pw,高为Ph;
  • 蓝色框为真实框,蓝点为真实框中心,bw和bh为真实框的宽和高,也同时意味着中间这个grid cell是用来预测的;
  • cx,cy就是当前用来预测的grid cell 的左上角(红色的圈)距离图片右上角(粉色的圈)
  • tx,ty,tw,th是预测值,bx,by,bw,bh为预测边界框对应的中心和宽高,它于预测的边界框的值关系为:
    b x = σ ( t x ) + c x b y = σ ( t y ) + c y b w = p w e t w b h = p w e t h b_x = \sigma{(t_x)} + c_x \\ b_y = \sigma{(t_y)} + c_y \\ b_w =p_we^{t_w}\\ b_h =p_we^{t_h}\\ bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=pweth

2.网络结构的改进

在这里插入图片描述

2.1 FPN

Feature Pyramid Networks,特征金字塔
我们看一下中间那个粉色框就是FPN,我们知道CNN的低层特征富含细节信息但语义信息较弱,而高层特征则相反,拥有丰富的语义信息但空间分辨率较低。通俗一点是,比如一整图,经过一次卷积和经过100次卷积,那个更像一张图的结构,肯定是经过1次卷积的,100次卷积的都已经面部全非了,所以低层特征富含细节信息,那么反过来从感受野的角度考虑,经过100次卷积的每一个值是融合了很多,甚至圈图像素的值计算而来的,因此高层拥有丰富的语义信息,而细节信息少也就是空间分辨低,因为它一个值融合了那么多像素值哪还有什么分辨率。自己揣摩一下。
而FPN的做法,
第一个直接出来的是 13 ∗ 13 ∗ 255 13*13*255 1313255直接是高层信息,那么它自然而然适合预测大目标;
第二个是高层的通过上采样到中层(意思包好了高层信息)在和中层contact,即包含了中层的信息又有高层的信息,但是中层是直接过来的,高层是上采样过来的,自然适合预测中目标;
第三个是中层的通过上采样到高层(意思包含了中层和高层)在和低层contact,即包含了低层和中层和高层的信息,但是低层是直接过来的,中高层是上采样过来的,自然适合预测小目标。

2.2 骨干网络(Backbone Network)

骨干网络用的是Darknet53,也就是多个残差结构,毕竟残差终究是好,其他就是加了一些BN

3 损失函数

经过上面的分析,其实损失函数已经出来了,注意这里我们不按照什么官方代码里面的来写,我们就按照论文里面来写,也不去说什么BCE损失来代替MSE损失,完全没有必要,完全用yolov1的损失即可。
在这里插入图片描述
需要注意的是,

  • 预测x,y,w,h为1.3中的计算结果;
  • C和P的计算可以用交叉熵;
  • C的预测有变化,该anchor为预测框时,和v1不一样,这里是所有的anchor和GT求IOU最大那个是正样本,C的标签为1,该anchor不为预测框,也就是IOU不是最大,但是超过设定的IOU,则不计算任何损失,低于设定的IOU才计算损失,其归类到noobj中。也就是说C的noobj计算不在是判断这个anchor是否为预测框(是否最大IOU),而是通过判断IOU是否超过设定的值。

其实只需要理解C的计算即可,其他不是很重要,因为我们的目标是更高的yolo版本,低版本主要理解思路即可,理解方法,为高版本打下基础。

重新解释一下正负样本:
正样本:所有的anchor,不是GT中心落在那个grid cell 的anchor,而是所有的, ( 13 ∗ 13 + 26 ∗ 26 + 52 ∗ 52 ) ∗ 3 (13*13 + 26*26+52*52)*3 (1313+2626+5252)3个与GT求IOU,最大那个是正样本,正样本只有一个;
负样本:IOU小于某个设定阈值,比如0.2,则为负样本;
忽略样本:其他是忽略样本。

可以看到正负样本严重失衡。
后面版本改进了这一做法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/23626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

神经网络 torch.nn---损失函数与反向传播

torch.nn - PyTorch中文文档 (pytorch-cn.readthedocs.io) torch.nn — PyTorch 2.3 documentation Loss Function的作用 每次训练神经网络的时候都会有一个目标,也会有一个输出。目标和输出之间的误差,就是用Loss Function来衡量的。所以,…

Qt图像处理技术十一:得到QImage图像的马赛克图像

效果图 指数5 指数15 指数40 原理 马赛克的原理很简单,就是取一个值,让这个值作为一个方格子的长宽,如40*40px的格子,取这个区域的平均R G B值,然后这个区域的所有像素点都是这个RGB值即可 源码 QImage applyM…

力扣2968.执行操作使频率分数最大

力扣2968.执行操作使频率分数最大 方法一&#xff1a;滑窗 前缀和 求前缀和数组s 求一个数组补齐到中位数的差值 枚举右端点 class Solution {public:int maxFrequencyScore(vector<int>& nums, long long k) {int res0,n nums.size();sort(nums.begin(),nums…

27-unittest之断言(assert)

在测试方法中需要判断结果是pass还是fail&#xff0c;自动化测试脚本里面一般把这种生成测试结果的方法称为断言&#xff08;assert&#xff09;。 使用unittest测试框架时&#xff0c;有很多的断言方法&#xff0c;下面介绍几种常用的断言方法&#xff1a;assertEqual、assert…

Vue可视化表单设计 FcDesigner v3.1.0 发布,新增 12 个组件,支持事件配置等

FcDesigner 是一款可视化表单设计器组件。可以通过拖拽的方式快速创建表单&#xff0c;提高开发者对表单的开发效率&#xff0c;节省开发者的时间。 本项目采用 Vue 和 ElementPlus 进行页面构建&#xff0c;内置多语言解决方案&#xff0c;支持二次扩展开发&#xff0c;支持自…

【cmake】cmake cache

cmake cache是什么 cmake cache是cmake在配置好后生成的一个CMakeCache.txt的文件&#xff0c;里面存储了一堆变量&#xff0c;这些变量一般都是关于项目的配置和环境的。 比如你用的什么编译器&#xff0c;编译器选项&#xff0c;还有项目目录。 例如&#xff08;在cmakelist…

前端工程化工具系列(九)—— mddir(v1.1.1):自动生成文件目录结构工具

mddir 是一个基于项目目录结构动态生成 Markdown 格式目录结构的工具&#xff0c;方便开发者在文档中展示文件和文件夹的组织结构。 1. 安装 全局安装改工具&#xff0c;方便用于各个项目。 pnpm i -g mddir2. 使用 在想要生成目录接口的项目内打开命令行工具&#xff0c;输…

太阳能航空障碍灯在航空安全发挥什么作用_鼎跃安全

随着我国经济的快速发展&#xff0c;空域已经成为经济发展的重要领域。航空运输、空中旅游、无人机物流、飞行汽车等经济活动为空域经济发展提供了巨大潜力。然而&#xff0c;空域安全作为空域经济发展的关键因素&#xff0c;受到了广泛关注。 随着空域经济活动的多样化和密集…

Waymo视角革新!MoST:编码视觉世界,刷新轨迹预测SOTA!

论文标题&#xff1a; MoST: Multi-modality Scene Tokenization for Motion Prediction 论文作者&#xff1a; Norman Mu, Jingwei Ji, Zhenpei Yang, Nate Harada, Haotian Tang, Kan Chen, Charles R. Qi, Runzhou Ge, Kratarth Goel, Zoey Yang, Scott Ettinger, Rami A…

锁存器(Latch)的产生与特点

Latch 是什么 Latch 其实就是锁存器&#xff0c;是一种在异步电路系统中&#xff0c;对输入信号电平敏感的单元&#xff0c;用来存储信息。锁存器在数据未锁存时&#xff0c;输出端的信号随输入信号变化&#xff0c;就像信号通过一个缓冲器&#xff0c;一旦锁存信号有效&#…

深入解析Java中volatile关键字

前言 我们都听说过volatile关键字&#xff0c;也许大家都知道它在Java多线程编程编程中可以减少很多的线程安全问题&#xff0c;但是会用或者用好volatile关键字的开发者可能少之又少&#xff0c;包括我自己。通常在遇到同步问题时&#xff0c;首先想到的一定是加锁&#xff0…

移动web性能测试工具有哪些呢?

摘要&#xff1a;本文将介绍一系列移动Web性能测试工具&#xff0c;以帮助开发人员评估和优化移动网站和应用程序的性能。我们将从基本概念开始&#xff0c;逐步深入&#xff0c;详细介绍每种工具的特点、用途和使用方法。 1. 概述 1.1 移动Web性能测试的重要性 1.2 测试工具…

微信小程序-wx.showToast超长文字展示不全

wx.showToast超长文字展示不全 问题解决方法1 问题 根据官方文档&#xff0c;iconnone&#xff0c;最多显示两行文字。所以如果提示信息较多&#xff0c;超过两行&#xff0c;就需要用其他方式解决。 解决方法1 使用vant组件里面的tost 根据官方例子使用&#xff1a; 1、在…

【Python报错】已解决ModuleNotFoundError: No module named ‘packaging’

成功解决“ModuleNotFoundError: No module named ‘packaging’”错误的全面指南 在Python编程中&#xff0c;遇到ModuleNotFoundError: No module named packaging这样的错误&#xff0c;通常意味着你的Python环境中缺少名为packaging的模块&#xff0c;或者该模块没有被正确…

YOLOV5 图像分割:利用yolov5进行图像分割

1、介绍 本章将介绍yolov5的分割部分,其他的yolov5分类、检测项目参考之前的博文 分类:YOLOV5 分类:利用yolov5进行图像分类_yolov5 图像分类-CSDN博客 检测:YOLOV5 初体验:简单猫和老鼠数据集模型训练-CSDN博客 yolov5的分割和常规的分割项目有所区别,这里分割的结果…

网络编程(UPD和TCP)

//发送数据 //UDP协议发送数据 package com.example.mysocketnet.a02UDPdemo;import java.io.IOException; import java.net.*;public class SendMessageDemo {public static void main(String[] args) throws IOException {//发送数据//1.创建DatagramSocket对象(快递公司)//…

【Linux】线程安全的艺术:解锁互斥量在并发编程中的应用

文章目录 前言&#xff1a;1. 进程线程间的互斥相关背景概念1.1. 操作共享变量会有问题的售票系统代码&#xff1a; 2. 互斥量的接口2.1. 解决方案2.1.1. 使用全局的锁&#xff1a;2.1.2. 使用局部的锁&#xff1a;2.1.3. 封装为RAII风格的加锁和解锁&#xff1a;2.1.4. C 11 中…

Liunx音频

一. echo -e "\a" echo 通过向控制台喇叭设备发送字符来发声&#xff1a; echo -e "\a"&#xff08;这里的 -e 选项允许解释反斜杠转义的字符&#xff0c;而 \a 是一个响铃(bell)字符&#xff09; 二. beep 下载对应的包 yum -y install beep 发声命令 be…

YashanDB携手宏杉科技助力国产软件生态发展

近日&#xff0c;深圳计算科学研究院崖山数据库系统YashanDB与宏杉科技系列存储、系列服务器与数据库一体机等多款产品顺利完成兼容性互认证。经严格测试&#xff0c;双方产品完全兼容&#xff0c;稳定运行&#xff0c;共同提供高效、稳定、安全的国产软硬件一体化解决方案&…

《精通ChatGPT:从入门到大师的Prompt指南》大纲目录

第一部分&#xff1a;入门指南 第1章&#xff1a;认识ChatGPT 1.1 ChatGPT是什么 1.2 ChatGPT的应用领域 1.3 为什么需要了解Prompt 第2章&#xff1a;Prompt的基本概念 2.1 什么是Prompt 2.2 好Prompt的特征 2.3 常见的Prompt类型 第二部分&#xff1a;Prompt设计技巧 第…