深度学习从入门到精通——yolov3算法介绍

news2024/11/15 13:45:57

YOLO v3

  • 论文地址:https://pjreddie.com/media/files/papers/YOLOv3.pdf
  • 论文:YOLOv3: An Incremental Improvement

img

先验框

(10×13),(16×30),(33×23),(30×61),(62×45),(59× 119), (116 × 90), (156 × 198),(373 × 326) ,顺序为w × h

  1. Yolov3中,只有卷积层,通过调节卷积步长控制输出特征图的尺寸。所以对于输入图片尺寸没 有特别限制。
  2. Yolov3借鉴了金字塔特征图思想,小尺寸特征图用于检测大尺寸物体,而大尺寸特征图检测小 尺寸物体。特征图的输出维度为 N × N × [ 3 × ( 4 + 1 + 80 ) ] , N × N N \times N \times[3 \times(4+1+80)], N \times N N×N×[3×(4+1+80)],N×N 为输出特征 图格点数,一共3个Anchor框,每个框有 4 维预测框数值 t x , t y , t w , t h , 1 t_{x}, t_{y}, t_{w}, t_{h} , 1 tx,ty,tw,th1 维预测框置信度, 80 维物体类别数。所以第一层特征图的输出维度为 8 × 8 × 255 8 \times 8 \times 255 8×8×255
  3. 多尺度输出:Yolov3总共输出3个特征图,第一个特征图下采样32倍,第二个特征图下采样16倍,第三个下 采样8倍。输入图像经过Darknet-53 (无全连接层),再经过Yoloblock生成的特征图被当作两 用,第一用为经过 3 ∗ 3 3^{*} 3 33 卷积层、 1 ∗ 1 1^{*} 1 11 卷积之后生成特征图一,第二用为经过 1 ∗ 1 1^{*} 1 11 卷积层加上采样层,与Darnet-53网络的中间层输出结果进行拼接,产生特征图二。同样的循环之后产生特征图。
  4. concat操作与加和操作的区别:加和操作来源于ResNet思想,将输入的特征图,与输出特征图 对应维度进行相加,即 y = f ( x ) + x y=f(x)+x y=f(x)+x ;而concat操作源于DenseNet网络的设计思路,将 特征图按照通道维度直接进行拼接,例如 8 ∗ 8 ∗ 16 8^{*} 8^{*} 16 8816 的特征图与 8 ∗ 8 ∗ 16 8^{*} 8^{*} 16 8816 的特征图拼接后生成 8 ∗ 8 ∗ 32 8^{*} 8^{*} 32 8832 的特征图。
  5. 上采样层(upsample):作用是将小尺寸特征图通过揷值等方法,生成大尺寸图像。例如使用最 近邻揷值算法,将 8 ∗ 8 8^{*} 8 88 的图像变换为 1 6 ∗ 16 16^{*} 16 1616 。上采样层不改变特征图的通道数。

Yolo的整个网络,吸取了Resnet、Densenet、FPN的精髓,可以说是融合了目标检测当前业界最 有效的全部技巧。

每个框的输出

针对coco:80(类别)+ t x , t y , t w , t h , c o n f t_{x}, t_{y}, t_{w}, t_{h} ,conf tx,ty,tw,thconf(每个框的x,y,w,h,conf) ,一共85,三个框 :85*3 = 255

损失函数

使用交叉熵进行类别计算6.Ground Truth的计算

Ground Truth

既然网络预测的是偏移值,那么在计算损失时,也是按照偏移值计算损失。现在我们有预测的值, 还需要真值Ground Truth的偏移值,用于计算损失的GT按照以下公式得到:
t x = G x − C x t y = G y − C y t w = log ⁡ ( G w / P w ) t h = log ⁡ ( G h / P h ) \begin{aligned} t x &=G x-C x \\ t y &=G y-C y \\ t w &=\log (G w / P w) \\ t h &=\log (G h / P h) \end{aligned} txtytwth=GxCx=GyCy=log(Gw/Pw)=log(Gh/Ph)

为什么在计算Ground Truth的tw,th时需要缩放到对数空间

tw和th是物体所在边框的长宽和anchor box长宽之间的比率。不直接回归bounding box的长 宽,而是为避免训练带来不稳定的梯度,将尺度缩放到对数空间。如果直接预测相对形变tw 和 th,那么要求tw, th > 0 >0 >0 ,因为框的宽高不可能是负数,这样的话是在做一个有不等式条件约束的优 化问题,没法直接用SGD来做,所以先取一个对数变换,将其不等式约束去掉就可以了。

对于三个框,选取IOU值最大的那个框。

  • 每个GT目标仅与一个anchor相关联,与GT匹配的anchor box计算坐标误差、置信度误差(此时target为1)以及分类误差,而其他anchor box只计算置信度误差(此时target为0)。
  • 对于重叠大于等于0.5的其他先验框(anchor),忽略,不算损失
  • 总的来说,正样本是与GT的IOU最大的框。负样本是与GT的IOU<0.5的框。忽略的样本是与GT的IOU>0.5 但不是最大的框。

代码实现

SPP

class SPP(nn.Module):
    # Spatial Pyramid Pooling (SPP) layer https://arxiv.org/abs/1406.4729
    def __init__(self, c1, c2, k=(5, 9, 13)):
        super().__init__()
        c_ = c1 // 2  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c_ * (len(k) + 1), c2, 1, 1)
        self.m = nn.ModuleList([nn.MaxPool2d(kernel_size=x, stride=1, padding=x // 2) for x in k])

    def forward(self, x):
        x = self.cv1(x)
        with warnings.catch_warnings():
            warnings.simplefilter('ignore')  # suppress torch 1.9.0 max_pool2d() warning
            return self.cv2(torch.cat([x] + [m(x) for m in self.m], 1))

BottleneckCSP

class BottleneckCSP(nn.Module):
    # CSP Bottleneck https://github.com/WongKinYiu/CrossStagePartialNetworks
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = nn.Conv2d(c1, c_, 1, 1, bias=False)
        self.cv3 = nn.Conv2d(c_, c_, 1, 1, bias=False)
        self.cv4 = Conv(2 * c_, c2, 1, 1)
        self.bn = nn.BatchNorm2d(2 * c_)  # applied to cat(cv2, cv3)
        self.act = nn.SiLU()
        self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))

Bottleneck

class Bottleneck(nn.Module):
    # Standard bottleneck
    def __init__(self, c1, c2, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, shortcut, groups, expansion
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c_, c2, 3, 1, g=g)
        self.add = shortcut and c1 == c2

    def forward(self, x):
        return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))

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

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

相关文章

C++代码规范 头文件

1. 头文件 通常每个 .cc 文件应该有一个配套的 .h 文件. 常见的例外情况包括单元测试和仅有 main() 函数的 .cc 文件. 正确使用头文件会大大改善代码的可读性和执行文件的大小、性能. 下面的规则将带你规避头文件的各种误区. 1.1. 自给自足的头文件 Tip 头文件应该自给自…

[某度信息流]SQL164,2021年11月每天新用户的次日留存率

牛客网在线编程 思路&#xff1a; 首先找出用户的注册日期&#xff0c;即date(min(in_time)) 转成date形式 建立两个辅助表&#xff0c;我先放代码&#xff0c;然后进行解释 withuser_reg as (selectuid,date(min(in_time)) as first_datefromtb_user_loggroup by1),…

【路径规划】在二维环境中快速探索随机树和路径规划的示例

摘要 本文介绍了快速探索随机树&#xff08;Rapidly-exploring Random Tree, RRT&#xff09;算法在二维环境中的路径规划应用。RRT是一种随机采样算法&#xff0c;能够快速构建从起点到目标点的路径&#xff0c;特别适用于复杂环境中的机器人路径规划。通过在随机方向上扩展树…

Vue3实时更新时间(年-月-日 时:分:秒)

代码案例 <script lang"ts" setup> import { ref,onMounted } from vue; const timer ref() const date ref("")//年月日 const moreTime ref("")//时分秒 onMounted(()>{//创建定时器1秒执行一次timer.value setInterval(() >…

数学建模强化宝典(10)多元线性回归模型

一、介绍 多元线性回归模型&#xff08;Multiple Linear Regression Model&#xff09;是一种用于分析多个自变量&#xff08;解释变量、预测变量&#xff09;与单个因变量&#xff08;响应变量、被预测变量&#xff09;之间线性关系的统计模型。这种模型假设因变量的变化可以通…

Proxyless的多活流量和微服务治理

1. 引言 1.1 项目的背景及意义 在当今的微服务架构中&#xff0c;应用程序通常被拆分成多个独立的服务&#xff0c;这些服务通过网络进行通信。这种架构的优势在于可以提高系统的可扩展性和灵活性&#xff0c;但也带来了新的挑战&#xff0c;比如&#xff1a; 服务间通信的复…

Excel 将行和列转置的两种方法

方法一&#xff1a; 方法二&#xff1a;使用transpose公式

构造+模拟,CF 873D - Merge Sort

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 873D - Merge Sort 二、解题报告 1、思路分析 考虑初始会调用一次&#…

Opencv中的直方图(3)直方图比较函数compareHist()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 比较两个直方图。 函数 cv::compareHist 使用指定的方法比较两个密集或两个稀疏直方图。 该函数返回 d ( H 1 , H 2 ) d(H_1, H_2) d(H1​,H2​…

虚幻引擎VR游戏开发01 | VR设备和术语

四款Unreal Engine默认配套按键映射的VR设备 IMC按键映射 Oculus Touch (R) Grip Axis: 代表Oculus Rift或Quest设备的右手控制器的抓握轴输入。Valve Index (R) Grip Axis: 代表Valve Index设备的右手控制器的抓握轴输入。Vive (R) Grip: 代表HTC Vive设备的右手控制器的抓握…

[物理专题]经典浮力题目的Fh图像绘制

这段代码用于绘制物体在液体中受到的浮力变化的图像&#xff0c;它有多个好处&#xff1a; 直观展示数据&#xff1a;通过图形化展示&#xff0c;可以直观地看到物体在液体中浸入深度与受到的浮力之间的关系。 教育和学习工具&#xff1a;这种类型的图像常用于教育目的&#x…

不小心删除了 Android 手机上的短信?3 步流程恢复误删除的短信以及图片、视频、联系人

不小心删除了 Android 手机上的短信&#xff1f;别担心&#xff0c;Android 版奇客数据恢复工具可以帮助您通过简单的 3 步流程恢复已删除的短信以及图片、视频、联系人等。 如何在 Android 上恢复已删除的短信 不小心删除了 Android 手机上的短信&#xff1f;Android 版奇客数…

u盘格式化数据还能恢复吗?点击了解实用教程

U盘是电子数据存储设备&#xff0c;我们主要用它来转移数据、随身携带数据等。同时U盘在使用过程中常会遇到问题&#xff0c;比如U盘中毒&#xff0c;U盘中毒会导致里面保存的数据文件无法读取&#xff0c;我们需要进行U盘格式化。格式化之后的U盘才可以继续使用&#xff0c;那…

611.有效三角形的个数

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;双指针&#xff09; 如何构成一个三角形呢&#xff1f; 只需要两边之和大于第三边&#xff1b; 但是&#xff0c;如果已知三条边的大小关系&#xff0c;只需要两条较小边的和大于第三条边即可。 所以&#xff0c;我…

云计算实训41——部署project_exam_system项目(续)

# 创建脚本&#xff0c;可以在java环境中运行任何的jar包或者war包#!/bin/bash/usr/local/jdk/bin/java -jar /java/src/*.?ar一、思路分析 &#xff08;1&#xff09;nginx 1、下载镜像&#xff0c;将本地的dist项目的目录挂载在容器的/usr/share/nginx/html/ 2、启动容器 …

哈希:哈希函数 | 哈希概念 | 哈希冲突 | 闭散列 | 开散列

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

在线式环氧乙烷检测仪:现代工业生产中的环氧乙烷安全监测

在现代工业生产的广阔领域中&#xff0c;环氧乙烷&#xff08;C2H4O&#xff09;作为一种不可或缺的化工原料&#xff0c;其应用范围广泛且深远&#xff0c;涵盖了涂料、树脂、塑料、印染、纺织品等多个关键行业。然而&#xff0c;环氧乙烷的化学性质极为活泼&#xff0c;不仅易…

小阿轩yx-云原生存储Rook部署Ceph

小阿轩yx-云原生存储Rook部署Ceph 前言 Rook 一款云原生存储编排服务工具由云原生计算基金会&#xff08;CNCF&#xff09;孵化&#xff0c;且于2020年10月正式进入毕业阶段。并不直接提供数据存储方案&#xff0c;而是集成了各种存储解决方案&#xff0c;并通过一种自管理、…

SprinBoot+Vue图书馆预约与占座微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

“Flash闪存”介绍 及 “SD NAND Flash”产品的测试含例程

文章目录 前言一、“FLASH闪存”是什么&#xff1f;1. 简介2. 特点3. 未来发展 二、SD NAND Flash1. 概述2. 特点3. 引脚分配4. 数据传输模式5. SD NAND寄存器6. 通电图7. 参考设计 三、STM32测试例程1. 初始化2. 但数据块测试3. 多数据块测试4. 状态缓冲 前言 本篇除了对flas…