详解yolov1理论 代码

目标检测要解决的3大问题:

1、有没有?

图片中是否有要检测的物体?(检测物体,判定前景背景)

2、是什么?

这些物体分别是什么?(检测到的物体是什么)

3、在哪里?

这些物体在哪里?(画框,描边,变色都行)

yolov1模型图

在这里插入图片描述

一.预测阶段

1.2 预测阶段后处理

在这里插入图片描述
把7x7x2=98个预测框进行筛选过滤,重复的预测框只保留一个。最终得到预测结果。
包括:

1.过滤掉置信度低的框
2.非极大值抑制

在这里插入图片描述
选出一个grid cell,它有30个值。每个grid cell预测两个预测框,用10个值表示。后面20个值是条件概率,即在该grid中存在目标的情况下,是某一个类的概率。

在这里插入图片描述

  用置信度与后面20个类的条件概率相乘得到每一个类的概率。
将全概率p() 拆分成 p(该 grid cell 存在目标的概率) x p(| 该grid cell 存在目标的概率)。
这样本来需要40个维度才能表示的概率,变成两个置信度和一个20维的条件概率即可。

在这里插入图片描述

将置信度 x 条件概率后,每个框生成两个20维的向量,表示每一个类的概率。
一共生成 7x7x2 = 9820维度的向量。

在这里插入图片描述

7x7x30的信息,可视化获得了中间图的结果。

1.2 后处理

在这里插入图片描述

把7x7x30的张量,变成目标检测结果。

在这里插入图片描述

假如第一行是dog类
1.设置dog类的概率如果<0.2,则置为0.
2.将dog类按照值进行排序。概率高的放在前面。
3.对排序之后的结果进行NMS。

1.3 NMS

取置信度值最大的框,bb47,它的框是黄色的部分。
在这里插入图片描述

先把第一个框跟第二框比较。如果他们的IOU>一个阈值,那么认为他们两个重复识别了一个目标。(可能一个图像上有多只猫,7x7个gred cell 每个都对猫预测了两个框,共有98个预测框,这98个预测框,可能有好些个预测的不是图像上的同一个猫)
就把低置信度的框过滤掉。 (即将它设置为0

在这里插入图片描述

用bb47与其它框做IOU计算,过滤掉一些框之后,从第二个值非0的框,开始让它与其它非0的框再做一个IOU计算。

对每个类重复上面的结果。

最后得到一个稀疏的矩阵。
把不为0的索引找出来,表示类别。把分数值也取出来,可视化。

在这里插入图片描述

二.训练阶段

训练阶段没有NMS,
如下:训练阶段有个Ground True ,是人工标注的真实框。

我们的算法是为了拟合这个框,让损失函数最小化。
真实的框在哪个grid cell,就让这个grid cell预测的一个bodding box去拟合这个框。
两个预测框具体让哪一个框预测要看这两个预测框与真实框的IOU。
另一个框和其它Grid cell 预测的框只需要让他们置信度越来越小即可。

在这里插入图片描述

在这里插入图片描述

https://www.bilibili.com/video/BV15w411Z7LG?p=5&vd_source=ebc47f36e62b223817b8e0edff181613

每个预测框对应 维度为2x5 + 20 = 30的向量。 
20代表:yolov1用的数据有20个类别。这20个类别用独热编码表示,是哪个类别就让该类别标记为1.
5代表 : 4个坐标和一个置信度。
置信度计算的是预测边框 与 真实边框的 IOU,IOU用来选择哪个边框作为预测边框。

损失函数的设计:
要让与预测框 与 真实框的Loss变的很小。

负责预测物体的框,要与真实框Ground truth从坐标和宽高上都尽量一致。

在这里插入图片描述

1.计算预测中心点与真实中心点的损失。
2.计算预测的宽高与真实宽高的损失。用根号,是使得小框对误差更敏感。

第三项负责计算置信度的误差

标签值是预测框真实框的IOU,作为标签值。

第四项是不负责检测目标的框,让它们的Loss值越小越好。让他们的权重小一些,因为他们比较多。

第五项:负责检测物体那个框的分类误差。比如真实框类别标注是狗,那么预测的类别是狗的概率让它越来越接近1。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

预测结果

在这里插入图片描述

当物体中心落到某个网格中,该网格就负责预测这个物体。
每个网络会生成两个预测框,所以yolov1共有 7x7x2=98个预测框,相对于fast-rcnn成百上千个预测框,yolov1少了很多。

参考:https://zhuanlan.zhihu.com/p/595221376

损失函数

在这里插入图片描述

1.对坐标进行预测,坐标损失

预测第i个网格,的第j个bbox是否有该object。 方法是计算每个网格的两个bbox与真实框的IOU,IOU最大bbox对应的网格中包含这个object。

在这里插入图片描述
在这里插入图片描述
如果不用根号,则是个线性关系 w越大,该物体与小物体的loss就越大。模型的学习会收到它的影响,主要去满足大物体去了。

超参数 λ_coord 默认是5,是为了平衡非物体(背景)的bbox过多的影响。因为目标对于背景来说是很小的,损失函数占比的权重就很小。

置信度损失

在这里插入图片描述
此时加入了一个非物体的置信度和权重 λnoobj=0.5,如果 让一个网络去学习n个类别的分类,那么必须让网络学习n+1个类别的分类。1是背景。背景占比比较多,所以调小它的权重。

对类别进行预测

判断是否有object的中心落入网格中,网格中包含有object的中心,就负责预测该object的类别概率。
在这里插入图片描述
直接预测类别-真实类别,这个方法不好,后面Yolo对它改进。

在这里插入图片描述
拥挤物体的中心,会跑到一个网格中去,那么一个网络就会预测两个物体。很不好。
对小物体检测也不好,小物体权重小。
对不规则物体(长宽比不正常)

voc数据集

以PASCAL VOC2017为例,它包含如下5个文件夹:

Annotations
JPEGImages
ImageSets
SegmentationClass
SegmentationObject

JPEGImages

PASCAL VOC提供的所有的图片,其中包括训练图片,测试图片。

Annotations

xml格式的标签文件,每个xml对应JPEGImage中的一张图片。各个目标的位置和类别。以(x,y)的格式不保存坐标点。
<annotation>  <folder>VOC2012</folder>                             <filename>2007_000392.jpg</filename> //文件名  <source>                             //图像来源(不重要)  <database>The VOC2007 Database</database>  <annotation>PASCAL VOC2007</annotation>  <image>flickr</image>  </source>  <size>                              //图像尺寸(长宽以及通道数)                        <width>500</width>  <height>332</height>  <depth>3</depth>  </size>  <segmented>1</segmented>            //是否用于分割(在图像物体识别中01无所谓)  <object>                            //检测到的物体  <name>horse</name>              //物体类别  <pose>Right</pose>              //拍摄角度  <truncated>0</truncated>        //是否被截断(0表示完整)  <difficult>0</difficult>        //目标是否难以识别(0表示容易识别)  <bndbox>                        //bounding-box(包含左下角和右上角xy坐标)  <xmin>100</xmin>  <ymin>96</ymin>  <xmax>355</xmax>  <ymax>324</ymax>  </bndbox>  </object>  <object>              //检测到多个物体  <name>person</name>  <pose>Unspecified</pose>  <truncated>0</truncated>  <difficult>0</difficult>  <bndbox>  <xmin>198</xmin>  <ymin>58</ymin>  <xmax>286</xmax>  <ymax>197</ymax>  </bndbox>  </object>  
</annotation> 

ImageSets

训练要用到的:

1.train.txt:训练集 (注意,均为图片名,没有后缀。以train.txt为例,分为两列,第一列为图像名如00012;第二列为-11-1表示目标在对应的图像没有出现,1则表示出现。)
2.val.txt:验证集
3.trainval.txt:训练和验证集
# 训练用不到的其它内容
Action:人的动作
Layout:人体的具体部位
Main: 图像物体识别的数据,总共20, 需要保证train val没有交集。
Segmentation:用于分割的数据
验证集(val)与测试集(test)是有区别的。
验证集:val是validation的简称,验证是否过拟合、以及用来调节训练参数等。
测试集:当模型训练完成后,用于检测模型的准确性。

https://blog.csdn.net/weixin_43570470/article/details/123659793

write_txt.py

'''读取XML文件信息
'''import xml.etree.ElementTree as ET
import os
import randomVOC_CLASSES = (  # 定义所有的类名'aeroplane', 'bicycle', 'bird', 'boat','bottle', 'bus', 'car', 'cat', 'chair','cow', 'diningtable', 'dog', 'horse','motorbike', 'person', 'pottedplant','sheep', 'sofa', 'train', 'tvmonitor')   # 使用其他训练集需要更改
# 创建两个文件用于存放
train_set = open('voctrain.txt', 'w')
test_set = open('voctest.txt', 'w')
Annotations = 'VOCdevkit/VOC2017/Annotations'
# 返回Annotations文件下的所有文件名 (里面是所有xml文件,一个图片对应一个xml文件,是对图片的标注)
xml_files = os.listdir(Annotations)
# 打乱数据集
random.shuffle(xml_files)train_num = int(len(xml_files) * 0.7) # 设置训练集个数
train_lists= xml_files[:train_num] # 训练集列表
test_lists= xml_files[train_num:] # 测试集列表def parse_rec(filename): # 输入xml文件名tree = ET.parse(filename)objects = []# 读取xml文件中的 <object></object>下的内容'''<object>                            //检测到的物体  <name>horse</name>              //物体类别  <pose>Right</pose>              //拍摄角度  <truncated>0</truncated>        //是否被截断(0表示完整)  <difficult>0</difficult>        //目标是否难以识别(0表示容易识别)  <bndbox>                        //bounding-box(包含左下角和右上角xy坐标)  <xmin>100</xmin>  <ymin>96</ymin>  <xmax>355</xmax>  <ymax>324</ymax>  </bndbox>  </object>  '''for obj in tree.findall('object'):# 创建一个结构体obj_struct = {}# 获取到 difficult元素,如果值为1,表示目标难以识别,则跳过difficult = int(obj.findall('difficult').text)if difficult ==1:continueobj_struct['name'] = obj.find('name').textbbox = obj.find('bndbox')obj_struct['bbox'] = [int(float(bbox.find('xmin').text)),int(float(bbox.find('ymin').text)),int(float(bbox.find('xmax').text)),int(float(bbox.find('ymax').text))]objects.append(obj_struct)return objectsdef write_txt():count = 0for train_list in train_lists: # 生成训练集txtcount += 1image_name = train_list.split('.')[0] + '.jpg'  # 图片文件名results = parse_rec(Annotations + train_list)if len(results) == 0:print(train_list)continuetrain_set.write(image_name)for result in results:class_name = result['name']bbox = result['bbox']class_name = VOC_CLASSES.index(class_name)train_set.write(' ' + str(bbox[0]) +' ' + str(bbox[1]) +' ' + str(bbox[2]) +' ' + str(bbox[3]) +' ' + str(class_name))train_set.write('\n')train_set.close()for test_list in test_lists:   # 生成测试集txtcount += 1image_name = test_list.split('.')[0] + '.jpg'  # 图片文件名results = parse_rec(Annotations + test_list)if len(results) == 0:print(test_list)continuetest_set.write(image_name)for result in results:class_name = result['name']bbox = result['bbox']class_name = VOC_CLASSES.index(class_name)test_set.write(' ' + str(bbox[0]) +' ' + str(bbox[1]) +' ' + str(bbox[2]) +' ' + str(bbox[3]) +' ' + str(class_name))test_set.write('\n')test_set.close()if __name__ == '__main__':write_txt()

最终生成的训练集和数据集标签如下:
红框中前四个数是左上和右下角坐标,第五个数是类别。
一个图片可能否有多个目标,所有可能会有多个红框。
在这里插入图片描述

yoloData.py

encoder结果是7x7x30 = 7x7x(20+5+5)
20是这个数据集有20类,两个5是因为让这7x7个格子,每个格式产生两个候选框。

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

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

相关文章

【RV1103】RTL8723bs (SD卡形状模块)驱动开发

文章目录 前言硬件分析Luckfox Pico的SD卡接口硬件原理图LicheePi zero WiFiBT模块总结 正文Kernel WiFi驱动支持Kernel 设备树支持修改一&#xff1a;修改二&#xff1a; SDK全局配置支持 wifi全局编译脚本支持编译逻辑拷贝rtl8723bs的固件到文件系统的固定目录里面去 上电后手…

Learn Prompt- Midjourney案例:Logo设计

Logo设计是一个充满挑战的任务&#xff0c;因为Logo是品牌重要价值的浓缩。 快速开始​ 直接使用logo design for...来获取灵感。 备注 图像中生成文字在Midjourney中的效果还不是很好&#xff0c;但你可以用Canva编辑图片并替换自己的文字。 在提示中使用那些擅长你所寻找的…

Spring整合RabbitMQ——生产者(利用配置类)

1.生产者配置步骤 2.引入依赖 3.编写配置 配置RabbitMQ的基本信息&#xff0c;用来创建连接工厂的 编写启动类 编写配置类 4. 编写测试类

idea没有maven工具栏解决方法

背景&#xff1a;接手的一些旧项目&#xff0c;有pom文件&#xff0c;但是用idea打开的时候&#xff0c;没有认为是maven文件&#xff0c;所以没有maven工具栏&#xff0c;不能进行重新加载pom文件中的依赖。 解决方法&#xff1a;选中pom.xml文件&#xff0c;右键 选择添加为…

Stm32_标准库_呼吸灯_按键控制

Stm32按键和输出差不多 PA1为LED供给正电&#xff0c;PB5放置按键&#xff0c;按键一端接PB5,另一端接负极 void Key_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //APB2总线连接着GPIOBGPIO_InitStructur.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructur.…

24. 图论 - 图的表示种类

Hi,你好。我是茶桁。 之前的一节课中,我们了解了图的来由和构成,简单的理解了一下图的一些相关概念。那么这节课,我们要了解一下图的表示,种类。相应的,我们中间需要穿插一些新的知识点用于更好的去理解图,比如说邻接矩阵。 图的表示 我们一般用什么样的形式来表示图…

http基础教程(超详细)

HTTP HTTP 一 、基础概念 请求和响应报文URL 二、HTTP 方法 GETHEADPOSTPUTPATCHDELETEOPTIONSCONNECTTRACE 三、HTTP 状态码 1XX 信息2XX 成功3XX 重定向4XX 客户端错误5XX 服务器错误 四、HTTP 首部 通用首部字段请求首部字段响应首部字段实体首部字段 五、具体应用 连接管理…

使用 Python 函数callable和isinstance的意义

一、说明 在这篇博客中&#xff0c;我们将探讨两个python函数&#xff1a;1 callable 中的函数及其有趣的应用程序。该callable函数用于检查对象是否可调用&#xff0c;这意味着它可以作为函数调用。2 isinstance这个内置函数允许我们比较两种不同的数据类型并确定它们是否相…

Flink--6、输出算子(连接到外部系统、文件、kafka、MySQL、自定义Sink)

星光下的赶路人star的个人主页 世间真正温煦的春色&#xff0c;都熨帖着大地&#xff0c;潜伏在深谷 文章目录 1、输出算子&#xff08;Sink&#xff09;1.1 连接到外部系统1.2 输出到文件1.3 输出到Kafka1.4 输出到MySQL&#xff08;JDBC&#xff09;1.4 自定义Sink输出 1、输…

[密码学入门]仿射密码(Affine)

加密算法y(axb)mod N 解密算法x*(y-b)mod N(此处的为a关于N的乘法逆元&#xff0c;不是幂的概念&#xff09; 如何求&#xff0c;涉及的知识挺多&#xff0c;还没想好怎么写&#xff0c;丢番图方程&#xff0c;贝祖定理&#xff08;又译裴蜀定理&#xff09;&#xff0c;扩展欧…

IO流————

一、字符流 前面我们学习了字节流,使用字节流可以读取文件中的字节数据。但是如果文件中有中文,使用字节流来读取,就有可能读到半个汉字的情况,这样会导致乱码。虽然使用读取全部字节的方法不会出现乱码,但是如果文件过大又不太合适。 所以Java专门为我们提供了另外一种…

opencv: 解决保存视频失败的问题

摘要&#xff1a;opencv能读取视频&#xff0c;但保存视频时报错。 一、首先要确保已经下载了openh264.dll文件&#xff0c;否则保存的视频无法打开&#xff0c;详细可以浏览这个&#xff1a;opencv&#xff1a;保存视频。 二、保存视频时出现一下问题&#xff1a; OpenCV:…

vue_Delete `␍`eslint(prettier/prettier)

Delete ␍eslint(prettier/prettier) 错误的解决方案 问题背景 在Windows笔记本上新拉完代码&#xff0c;在执行pre-commit时&#xff0c;出现如下错误&#xff1a; Delete ␍eslint(prettier/prettier)问题根源 罪魁祸首是git的一个配置属性&#xff1a;core.autocrlf 由于…

【空间-光谱联合注意网络:多时相遥感图像】

A Spatial–Spectral Joint Attention Network for Change Detection in Multispectral Imagery &#xff08;一种用于多光谱图像变化检测的空间-光谱联合注意网络&#xff09; 变化检测是通过比较双时相图像来确定和评估变化&#xff0c;这是遥感领域的一项具有挑战性的任务…

Oracle VM VirtualBox安装并下载安装CentOS7

Oracle VM VirtualBox安装并下载安装CentOS7 Oracle VM VirtualBox下载CentOS创建虚拟机 Oracle VM VirtualBox VM下载链接 https://www.oracle.com/cn/virtualization/virtualbox/ 点击链接直接下载就行&#xff0c;下载完默认安装或者更改一下安装目录。 下载CentOS http://…

快速排序与冒泡排序以及代码

快速排序 快速排序&#xff08;Quicksort&#xff09;是一种常用的排序算法&#xff0c;它基于分治的思想。 时间复杂度&#xff1a;O&#xff08;nlogn&#xff09; 空间复杂度&#xff1a;O&#xff08;logn&#xff09; 快速排序的基本思想如下&#xff1a; 选择一个元素…

vue3 + mark.js | 实现文字标注功能

页面效果 具体实现 新增 1、监听鼠标抬起事件&#xff0c;通过window.getSelection()方法获取鼠标用户选择的文本范围或光标的当前位置。2、通过 选中的文字长度是否大于0或window.getSelection().isCollapsed (返回一个布尔值用于描述选区的起始点和终止点是否位于一个位置&…

设计模式 - 代理模式

目录 一. 前言 二. 实现 三. 静态代理和动态代理 一. 前言 代理模式&#xff08;Proxy Pattern&#xff09;&#xff0c;为某个对象提供一种代理以控制对对象的访问。即客户端可通过代理对象间接访问目标对象&#xff0c;同时可限制、增强、修改目标对象的一些特性。访问者不…

KF32A学习笔记(一):工程导入、编译烧录方法(KF32 IDE+ KF32 PRO)

目录 概述KF32 IDE打开现有项目工程1.工程导入2.编译工程3.下载程序 KF32 PRO 概述 本文主要是对KF32A150芯片程序的编译、烧录方法进行说明。针对开发过程中的编译烧录和无代码情况下的烧录两种场景&#xff0c;需要安装ChipON PRO KF32和ChipON IDE KF32两个上位机工具&…

华为云智能化组装式交付方案 ——金融级PaaS业务洞察及Web3实践的卓越贡献

伴随信息技术与金融业务加速的融合&#xff0c;企业应用服务平台&#xff08;PaaS&#xff09;已从幕后走向台前&#xff0c;成为推动行业数字化转型的关键力量。此背景下&#xff0c;华为云PaaS智能化组装式交付方案闪耀全场&#xff0c;在近日结束的华为全联接大会 2023上倍受…