人工智能学习07--pytorch22--目标检测:YOLO V3 SPP

news2024/12/23 8:33:14

视频链接:
https://www.bilibili.com/video/BV1t54y1C7ra/?vd_source=b425cf6a88c74ab02b3939ca66be1c0d

yolov3 spp

spp:空间金字塔池化

trick:实现的小技巧,方法。(
up:Bag of Freebies里有很多trick,还有mix up
弹幕:也列举了许多有用的适合yolo的tricks
Bag of freebies YOLOv4论文里的2.2章节

在这里插入图片描述

Mosaic图像增强

yolov4中也用的mosaic在这里插入图片描述
之前遇到的图像增强:图像水平翻转、随机裁剪、亮度色度饱和度的调整……

Mosaic图像增强:将多张图片拼接在一起,对网络进行训练。默认使用4张图片进行拼接。

如果要使用BN层的话,batch size尽可能设置的大一些。BN层主要去求每一个特征层的均值和方差,batch size越大,求得的均值和方差就越接近于整个数据集的均值和方差,效果就会越好。
但是由于训练设备受限,GPU无法一次性训练这么多图片。如果将多张图片拼接在一起输给网络,则可以变相增加网络的batch size,一张(由四张图像拼接而成的)图像包含这四张图像的均值和方差信息。

SPP模块

YOLOV3 SPP网络结构跟YOLOV3基本上相同。
唯一不同之处在于,YOLOV3 SPP在Darknet-53与第一个预测特征层前加上了一个SPP模块。
(spp最开始是用在分类模型的)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
图上的输入是512x512的RGB图像

在这里插入图片描述
YOLO v3网络中的SPP结构只是借鉴于SPPnet中的SPP结构,二者不同。

第1个分支:由输入直接接到输出。
第2个分支:池化核大小为5x5的最大池化下采样
第3个分支:池化核大小为9x9的最大池化下采样
第4个分支:池化核大小为13x13的最大池化下采样
在这里插入图片描述
池化步距=1
在做池化之前都对特征矩阵进行padding填充,填充后进行最大池化下采样后特征图的高度宽度深度没有发生变化,都是一模一样的。
(不是步长为1的都不变 是因为采用了填充 最终池化后的特征图大小没变)
此时对它们进行特征拼接,就实现了不同尺度的特征融合。
这个看似简单的结构对算法造成了很大的提升。
在这里插入图片描述
为什么只在第一个预测特征层前加了SPP结构,其他的地方不加呢?
可以但是没必要。

spp1只加了一个SPP层,
spp3在每个预测特征层前都加了一个SPP层。
在这里插入图片描述
可发现在输入图像尺度比较小的时候,spp1的优势比spp3大,随着输入网络的尺度增大……
mAP提升不大,推理速度变慢。

CIoU Loss

yolov3定位损失:差值平方(L2损失,MSE损失)
IoU:交并比
在这里插入图片描述
右上角的图展示了三种矩形框重合的实例。绿色为gt。
可以发现最右矩形框的预测效果较好,但是L2损失一样,而IoU不同。说明L2损失不能很好地反应目标边界框的重合程度。
在这里插入图片描述
在这里插入图片描述
尺度不变性:无论重叠的两个均方大小,重合程度与均方无关
在这里插入图片描述
边框不相交的话,无法通过这种方法计算loss。(感觉图里算错了,好像是无穷大,不是0)

在这里插入图片描述
绿:真实目标边界框,
红:网络预测的边界框,
蓝:将上面两个边界框用最小的矩形框柱。

Ac:蓝框面积
u:红绿边界框并集面积
当红绿边界框完美重合在一起,GIoU=IoU-0=1
红绿相距无穷远时,IoU=0,GIoU=0-1=-1
在这里插入图片描述
在这里插入图片描述
缺点:
当两个目标边界框高度宽度一样的、处于水平或者垂直相交时候
在这里插入图片描述
两个问题:收敛慢、回归的不准确
在这里插入图片描述
在这里插入图片描述
第一行:使用GIoU训练网络,让目标边界框尽可能回归到真实边界框上(蓝色和绿色重合在一起)。
黑色:anchor (或default box)
绿色:真实框
蓝色:预测的框
第二行:DIoU。更快,更好。
重合位置不一样,不同Loss的值:
在这里插入图片描述
DIoU,重合位置√
在这里插入图片描述
ρ:b个bgt之间的欧氏距离(距离的平方),也就是d
b:预测边界框的中心坐标。
bgt:真实目标边界框中间点的坐标。
c:这两个目标边界框的最小外接矩形的对角线的长度
当两个目标边界框完美重合在一起时,d=0
在这里插入图片描述
在这里插入图片描述
将IoU换成DIoU比较合理,因为IoU无法评价两个目标边界框的重合关系。
现在有很多都用DIoU替换IoU进行评价。

在这里插入图片描述

弹幕:总之改进的损失就是让预测框尽可能接近标注框

对于G、D、CIoU的具体损失效果如何,需要在训练过程中自己尝试实现。

Focal Loss

有人说有用,有人说没用。
在这里插入图片描述
在这里插入图片描述
主要针对One-stage模型,但是这些模型都会面临正负样本不平衡的情况。
红:没有匹配到目标。
黄:匹配到目标。

那为什么two-stage的目标检测网络就没听过什么不平衡的问题?
因为它分两步走,第一阶段肯定存在类别分布不均衡的情况,但最终结果是通过第二阶段的检测来确定目标的最终坐标和是否为目标。
在这里插入图片描述
degenerate models:假设匹配到50个正样本,贡献的损失为3,总贡献150。负样本每个损失0.1,但由于数量太多,总贡献10000的损失,远远多于正样本的损失。所以直接使用所有样本训练网络的话,模型效果会变差。

hard negative mining:之前讲的网络中:筛选正负样本。并不会使用所有的负样本,而是使用损失比较大的负样本来训练网络。
在这里插入图片描述
可以看到Focal Loss的提升效果较为明显。

在这里插入图片描述
α:用来平衡正负样本的权重。
在这里插入图片描述
但是α没法区分哪些是容易的样本,哪些是困难的样本。所以提出一个损失函数,降低简单样本的权重,可以聚焦于训练难以区分的负样本。
在这里插入图片描述
引入(1-pt)的γ次方。
右图横坐标:pt。
正样本:=p,希望这个p越大,预测的越准确;
负样本=1-pt,希望这个1-p越小越好(p越大越好)。
则不管正负样本,都希望pt越大越好。

在这里插入图片描述
很容易分类的样本,没有必要在它们上面放置很大的权重。
γ变大 → 曲线下降快 → 采取相同pt概率的时候,采用Focal Loss,γ越大,易分样本的权重就越来越小。但也不是γ越大越好(γ=5时,pt=0.4时的权重也很小,这样不对)。
Focal Loss核心:在这里插入图片描述
在这里插入图片描述
对于这里的α:
在这里插入图片描述
在这里插入图片描述
p:预测的目标概率。(不是pt)
y:所对应的真实标签。1:正样本;0:负样本。
CE:针对二分类的交叉熵损失。
FL:Focal loss。
rate:采用CE计算的损失与采用FL计算的损失的比值。


弹幕:
绿色样本少量,红蓝样本较多,值乘数量求和后,绿色样本的损失会更大,能起到均衡作用;
弹幕:
实际上训练时负样本预测0.9是非常少的,而正样本预测0.1会很多,Focal Loss是聚焦于学习困难样本,正样本就属于困难样本,所以可以达到自动平衡正负样本的效果;
弹幕:
实际上训练时负样本预测0.9的是非常少的,而正样本预测0.1会很多,所以也可以达到平衡正负样本的效果,不能单看这个数值,也要看数量;
弹幕:
对于容易分的 就使劲降低,难分的 就降少点,总体来讲难分降低的低于易分降低的,最终达到重视难分样本到效果;

使用的时候可能要花功夫调参,调的不好的话,效果可能确实没有直接使用传统的CE、hard negative mining好。

Focal loss易受噪声干扰,所以训练集中尽可能标注正确。fl可能会根据标注错误的样本疯狂学习,导致模型效果越来越差。

yolov3 spp 代码

使用简介

up在yolo3代码的基础上进行修改,并简化了训练过程(移除了一些效果不大的trick)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
原作者文档中写了如何去训练自己的数据集:
1.首先将数据标注成Darknet format(yolo格式)
在这里插入图片描述
每个txt文件就对应一张图片的信息,每一行表示一个目标。
第一个数字:目标索引(如0:人类)
后四个数字:目标边界框的相对坐标

2.创建txt文件:train.txt文件和test.txt文件。
txt文件中存储的是所有训练/验证时使用到的图片的路径。
在这里插入图片描述
3.以.names结尾的标签文件。
存储所有类别的信息,一个类别对应一行。
在这里插入图片描述
4.创建.data文件。
包含类别个数,训练集所对应的txt文件、验证集所对应的txt文件(步骤2里面的那个)
在这里插入图片描述
5.更新yolov3-spp.cfg文件
修改预测器的卷积核的个数(根据数据集类别个数计算)
在这里插入图片描述
6.更新超参数
建议保持默认

trans_voc2yolo.py

up已经写好了:trans_voc2yolo.py
在这里插入图片描述
PASCOL VOC --> YOLO格式

voc_root:voc文件目录
save_file_root:转换后把相应的标注文件保存在哪里
在这里插入图片描述
在这里插入图片描述

改一下这些就可以运行了
(弹幕:注意这个代码默认所有的图片中都有标注信息,但实际上有的图片并没有标注目标)
在这里插入图片描述
运行之后:
转化标签文件到指定的目录下、生成.names文件
在这里插入图片描述
在这里插入图片描述

calculate_dataset.py

在这里插入图片描述
在这里插入图片描述
运行后:
注意路径问题,我觉得最好改成绝对路径
在这里插入图片描述
7 把下载好的预训练权重放在weights文件夹下
在这里插入图片描述

train .py

在这里插入图片描述
在这里插入图片描述
有时间再补上

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

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

相关文章

【C++学习笔记】C++中的异常概念异常的使用注意事项异常的优缺点

异常 1 C语言传统的处理异常的方式2 C异常的概念3 异常的使用以及注意事项3.1 异常的简单使用3.2 使用异常的注意事项3.3 异常的重新抛出3.4 异常规范3.5 异常安全 4 C标准库的异常体系5 异常的优缺点6 总结 1 C语言传统的处理异常的方式 C语言传统的错误处理机制:…

https安全传输原理:

内容来自思学堂: 信息裸奔——>对称加密——>非对称加密——>非对称和对称加密——>权威第三方机构CA数字签名

C++图形开发(5):逐渐变大(小)的小球

文章目录 1.逐渐变大的小球2.逐渐变小的小球 今天所讲的逐渐变大(小)的小球实际上就是基于上次的缓慢下落的小球的基础上的(下落的小球详见:C图形开发(4):下落的小球) 1.逐渐变大的…

蓝桥杯专题-试题版含答案-【数数小木块】【精挑细选】【国王的魔镜】【字符串逆序输出】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

每日浅读SLAM论文——简析Cartographer

文章目录 二维激光SLAM简单框架前端scan matchingSubmaps构建 后端分支定界优化csm(CorrelativeScanMatch) 代码实现框架 Cartographer(论文名:Real-Time Loop Closure in 2D LIDAR SLAM)是目前二维激光SLAM中应用最广…

postman不能进行并发测试

1.按照网上文档的配置 2.在登录接口里睡眠5s,如果是并发的话,所有的请求都会一起睡眠5s 3.测试结果:请求是每隔5s串行执行的

Linux定时任务-定时执行Shell脚本

主要是使用Linux的crontab工具来实现的,有两个方法,一个放在contab 列表里面,另一个是放在contab文件里面(其实原理是一致的)。 crontab 列表 cd /tmp # 创建一个shell脚本 vim hello.sh #!/bin/bash echo "hel…

钳形表校准装置单匝法校准钳形电流表

交流大电流源输出标准电流信号到直径为1 m的单匝半圆铜环,电流输出铜环分为大小铜环,适配于校准不同钳口大小的钳形电流表。 方案优势:完全符合《JJF 1075-2015 钳形电流表校准规范》中主要推荐的单匝法校准钳形电流表的要求,操控…

全景感知—让视图上云更便捷,存储更安全

6月15日,由腾讯云主办的“数实共进产业行浙江站”在杭州圆满开展,活动中腾讯云存储高级产品经理张泽南进行了“全景感知,让视图上云更便捷,存储更安全”主题演讲,与行业伙伴深度交流新一代视图计算解决方案&#xff0c…

Redis中的介绍和安装教程(配置文件)

1.Redis简单的介绍 redis是一种键值对的NoSql数据库,这里有两个关键字: 键值对 Nosql 其中键值型,是指Redis中存储的数据都是以key.value对的形式多种多样,可以实字符串、数值、甚至json,可以参考HashMap 然后NoSq…

TiDB(5):TiDB-读取历史数据

接下来介绍 TiDB 如何读取历史版本数据,包括具体的操作流程以及历史数据的保存策略。 1 功能说明 TiDB 实现了通过标准 SQL 接口读取历史数据功能,无需特殊的 client 或者 driver。当数据被更新、删除后,依然可以通过 SQL 接口将更新/删除前…

MySQL容器无法输入或显示中文异常解决

如果使用docker创建了MySQL容器,但是进入容器后发现无法输入中文,也就是在插入数据的时候中文直接显示为空,数据表里的中文也显示为空,解决方法是: 1,临时方法 该方法只在每一次进入容器的命令上添加参数&a…

Web服务器群集:使用Haproxy搭建Web集群

目录 一、理论 1.Haproxy集群 2.常见的web集群调度器 3.三种web集群调度器的区别 4.下载安装 二、部署Haproxy集群 1.部署 2.重新定义Haproxy集群的日志 三、实验 1.部署Haproxy集群 四、问题 1.nginx编译安装与yum安装的网页配置路径 五、总结 一、理论 1.Hapro…

【2022吴恩达机器学习课程视频翻译笔记】3.1线性回归模型-part-1

3.1线性回归模型-part-1 In this video, we’ll look at what the overall process of supervised learning is like. Specifically, you see the first model of this course, Linear Regression Model. That just means fitting a straight line to your data. It’s probab…

Github-提交PR指南

1. Fork你将要提交PR的repo 2. 将你fork下来的repo克隆到你的本地 git clone your_repo.git Cloning into ultralytics... remote: Enumerating objects: 8834, done. remote: Counting objects: 100% (177/177), done. remote: Compressing objects: 100% (112/112), done. …

交易所行情基础相关知识

目录 一、行情基本概念 二、简单交易模型 三、行情系统结构 四、各种行情协议 1.FIX 2.STEP 3.FAST 4.Binary 一、行情基本概念 行情是描述市场繁荣状态的数据,比较笼统,例如买卖交易量。准确一些的描述是,揭示交易所标的交易与买卖…

http升级https图文,免费证书ssl下载安装

1.先登录阿里云(搜索ssl证书) 2.点击免费SSL证书概述 3.搜索安装PFX格式证书(搜索ssl证书) 4.下载SSL证书 5. 在tomcat服务器安装证书 6. 验证SSL证书是否安装成功 7.阿里云连接 ***注意 **** 1.先登录阿里云官网 2.再访问该网址…

Python Websocket 控制大屏显示

场景描述: 在做大屏展示时,有这样一个需求:在不刷新页面的情况下,动态改变大屏展示内容,如:执行某个函数,把相关数据醒目展示,轮换数据显示顺序等等。比如有领导参观时,马…

技术分享| 融合通讯的架构介绍

在融合通讯中,我们经常听到如下一些术语:MCU服务,SFU架构,MESH架构,星形网络等等。很多客户听到这些数据都是一脸雾水,经常说我们就是要一个可以把多种设备拉到同一个会议中,怎么搞这么复杂。今…

《动手学深度学习》(PyTorch版)-第一章

TOC 第一章 1.1、一般编程要解决的问题 例如,如果我们要为一台微波炉编写一个用户界面 假设我们要编写一个电子邮件客户端。 1.2、深度学习要解决的问题 例如,假设我们想要编写一个判定一张图像中有没有猫的程序。这件事听起来好像很简单&#xff0…