YOLOv1-darknet 内容解析

目录

  • YOLOv1-darknet 内容解析

    • 1. 核心思想
    • 2. 特点
    • 3. 缺点
    • 4. 算法流程
    • 5. 详细内容
    • 6. 主要参考

YOLOv1-darknet 内容解析

1. 核心思想

目标检测分为二阶段和一阶段的方法,二阶段方法主要有Fast R-CNN系列,Mask R-CNN等,主要方法是用算法生成一些列作为样本的候选框,然后再使用卷积神经网络进行样本的分类;

一阶段方法(End to End方法)主要有SSD系列,YOLO系列,这种方法是将目标边框的定位问题转化为回归问题处理。

由于思想的不同,二阶段检测方法在检测准确率和定位精度有优势,一阶段检测方法在速度上占有优势。

所以YOLO的核心思想是,直接在输出层回归bounding box的位置和bounding box所属的类别(整张图作为网络的输入,把 Object Detection 的问题转化成一个 Regression 问题)。

2. 特点

  1. 速度快,因为没有复杂的检测流程,只需要将图像输入到神经网络就可以得到检测结果,YOLO可以非常快的完成物体检测任务。
  2. YOLO在训练和测试时都能够看到一整张图像的信息,因此YOLO在检测物体时能很好的利用上下文信息,从而不容易在背景上预测出错误的物体信息。
  3. YOLO可以学到物体的泛化特征:当YOLO在自然图像上做训练,在艺术作品上做测试时,YOLO表现的性能比DPM、R-CNN等之前的物体检测系统要好很多。因为YOLO可以学习到高度泛化的特征,从而迁移到其他领域。

3. 缺点

  1. YOLO的物体检测精度低于其他state-of-the-art的物体检测系统。
  2. YOLO容易产生物体的定位错误。
  3. YOLO对小物体的检测效果不好(尤其是密集的小物体,因为一个栅格只能预测2个物体)。

4. 算法流程

  1. Resize成448 \(\times\) 448,图片分割得到7$\times$7网格(cell)
  2. CNN提取特征和预测:卷积部分负责提特征。全链接部分负责预测:
    1. 7 $\times\(7\)\times$ 2 = 98个bounding box的坐标(x,y,w,h,confidence)
    2. 7\(\times\) 7 = 49个cell所属20个物体的概率
  3. 过滤得到的bbox, 使用nms算法

5. 详细内容

网络示意图:

最后reshape层的计算:(5 = x,y,w,h,confidence)
\[
filter = (BboxNum\times5+Class)
\]
这里BboxNum = 2, Class = 20,所以filter是30。

网络结构借鉴了 GoogLeNet 。24个卷积层,2个全链接层。(用1×1 reduction layers 紧跟 3×3 convolutional layers 取代Goolenet的 inception modules )

每个1 \(\times\) 1 \(\times\) 30 对应其中一个cell, 每个cell需要预测两个bounding box的中心坐标(x_c,y_c,w,h),其中x_c,y_c被归一化到0~1之间,w,h通过图像的width和height归一化到0~1之间。 每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。 这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息:
\[
confidence=Pr(Object)\times IOU^{truth}_{pred}
\]
第一项:\[Pr(Object)\]: 代表的是如果人工标注的框(ground truth box)落在一个gird cell中,则取1,否则取0。

第二项: \[IOU^{truth}_{pred}\]: 预测的bounding box和实际的ground truth box之间的IOU值。

这样前10个框来源就清楚了,即:\(BboxNum \times 5\).

剩余的20维度是用来对20个类进行预测,所以总共需要输出是 \[7 \times 7 \times (5 \times 2 + 20)\]。

关键内容:损失函数的设计

说明:每行是一个cell对应的两个bounding Box的相关信息,一共有\(7\times7\)这么多的行

对应类别计算方法,需要与confidence相乘,得到以下矩阵:

按照下图所示步骤进行操作,这只是示意其中一个类,每一行都要进行如下操作:

在所有做完nms之后选择对应的框画出来

得到以下效果:

总图:

损失函数由三个方面组成,一个是定位损失(localization error),一个是置信度损失,一个是分类损失(classification error)。简单的全部采用了sum-squared error loss来做这件事会有以下不足

  1. 8维的localization error和20维的classification error同等重要是不合理的;(真实框的中心x坐标减去yolo实际预测框的中心x尖 )
  2. 如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence逼近到0,相比于较少的有object的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散。

如何解决,重新设计新的loss计算方案:

  1. 更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为\(\lambda_{coord}\),即坐标预测部分内容。(上图蓝色框)
  2. 对没有object的bbox的confidence loss,赋予小的loss weight,记为 \(\lambda_{coord}\),在pascal VOC训练中取0.5。(上图橙色框)
  3. 有object的bbox的confidence loss (上图红色框) 和类别的loss (上图紫色框)的loss weight正常取1。
  4. 对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏一点更不能忍受。而sum-square error loss中对同样的偏移loss是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。 如下图:small bbox的横轴值较小,发生偏移时,反应到y轴上的loss(下图绿色)比big box(下图红色)要大。
  5. 一个网格预测多个bounding box,在训练时我们希望每个object(ground true box)只有一个bounding box专门负责(一个object 一个bbox)。具体做法是与ground true box(object)的IOU最大的bounding box 负责该ground true box(object)的预测。这种做法称作bounding box predictor的specialization(专职化)。每个预测器会对特定(sizes,aspect ratio or classed of object)的ground true box预测的越来越好。(个人理解:IOU最大者偏移会更少一些,可以更快速的学习到正确位置)
  6. 测试阶段,使用nms的时候,按照以下方式进行衡量是否保留改框:
    \[
    Pr(Class_i|Object)\times Pr(Object)\times IOU^{truth}_{pred}=Pr(Class_i)\times IOU^{truth}_{pred}
    \]

6. 主要参考

https://zhuanlan.zhihu.com/p/24916786

https://docs.google.com/presentation/d/1aeRvtKG21KHdD5lg6Hgyhx5rPq_ZOsGjG5rJ1HP7BbA/pub?start=false&loop=false&delayms=3000&slide=id.g137784ab86_4_1738

原文地址:https://www.cnblogs.com/pprp/p/10124370.html

时间: 2024-10-05 09:52:53

YOLOv1-darknet 内容解析的相关文章

文件内容解析

下面是我的第一个React Native程序,也是自己对该程序的文件内容解析一些理解,注释很清楚哟,相信你一看就懂!!!! /** * Sample React Native App * https://github.com/facebook/react-native * @flow */ // 1.引入组件 import React, { Component } from 'react'; import { AppRegistry, // 注册 StyleSheet, // 样式 Text,

SSDP协议内容解析

SSDP(Simple Service Discovery Protocol),简单服务发现协议,用于发现局域网里面的设备和服务. SSDP消息分为设备查询消息.设备通知消息两种,通常情况下,使用更多地是设备查询消息. 1.设备查询消息: 格式例子如下: M-SEARCH * HTTP/1.1 HOST: 239.255.255.250:1900 MAN: "ssdp:discover" MX: 5 ST: ssdp:all 其中第一行是消息头,固定:HOST对应的是广播地址和端口,2

php将某一模板内容解析过后,并获取其返回值

在PHP中,将一个模板文件(.php)文件定义过后,如果要将参数传入,并且将该文件解析过后的内容作为返回值,可以php操作缓冲区来获取该模板文件的结果 //打开缓冲区 ob_start(); //引入所需要的模板文件 include('file_name.tpl.php');          //获取缓冲区中的内容,并且将该内容赋值给一个变量 $return_info = ob_get_contents(); //清空(擦除)缓冲区并关闭输出缓冲                     ob_

内容提供者ContentProvider和内容解析者ContentResolver

简介 ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查.关于数据共享,以前我们学习过文件操作模式,知道通过指定文件的操作模式为Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE同样也可以对外共享数据.那么,这里为何要使用ContentProvider 对

把界面内容解析成XML(用DOM模式)

第一步,修改AndroidManifest.xml,添加sdcara写入权限 1 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 2 3 <application 4 android:allowBackup="true" 5 android:icon="@drawable/ic_launcher" 6 android:labe

Web 前端性能优化相关内容解析

Web 前端性能优化相关内容,来源于<Google官方网页载入速度检测工具PageSpeed Insights 使用教程>一文中PageSpeed Insights 的相关说明.大家可以对照着去优化自己的网站或者相关项目.本文由Jeff 整理. 0.提高服务器的响应速度 砸钱的东西,但却最根本:搞好这一项,甚比下面任何一项. 1.优化样式表和脚本的排列顺序 正确地排列外部样式表与外部和内嵌脚本的顺序,可增加下载时同时加载的数据量,并提高浏览器显示网页的速度. 将样式表放在顶部,将脚本放在底部

Python 之 文件内容解析(1)

说明: 有一个文件joke.txt,其内容如下: 老师:波涛汹涌的偏旁都是三点水.小明来举个相似的例子吧:小明:馅饼馄饨?老师:换一个吧.小明:玩玻璃球.老师:不好.小明:...没法洗澡?老师:有本事来一个六个字的?小明:哦吗咪吗咪哄.老师:来个一百字的!小明:哈哈哈哈哈哈哈哈...老师:滚出去!!! 将其以如下方式输出: 老师 说: 波涛汹涌的偏旁都是三点水.小明来举个相似的例子吧:小明 说: 馅饼馄饨?老师 说: 换一个吧.小明 说: 玩玻璃球.老师 说: 不好.小明 说: ...没法洗澡?

JVM系列文章(三):Class文件内容解析

作为一个程序员,仅仅知道怎么用是远远不够的.起码,你需要知道为什么可以这么用,即我们所谓底层的东西. 那到底什么是底层呢?我觉得这不能一概而论.以我现在的知识水平而言:对于Web开发者,TCP/IP.HTTP等等协议可能就是底层:对于C.C++程序员,内存.指针等等可能就是底层的东西.那对于Java开发者,你的Java代码运行所在的JVM可能就是你所需要去了解.理解的东西. 我会在接下来的一段时间,和读者您一起去学习JVM,所有内容均参考自<深入理解Java虚拟机:JVM高级特性与最佳实践>(

Web 前端性能优化相关内容解析[转]

Web 前端性能优化相关内容,来源于<Google官方网页载入速度检测工具PageSpeed Insights 使用教程>一文中PageSpeed Insights 的相关说明.大家可以对照着去优化自己的网站或者相关项目.本文由Jeff 整理. 0.提高服务器的响应速度 砸钱的东西,但却最根本:搞好这一项,甚比下面任何一项. 1.优化样式表和脚本的排列顺序 正确地排列外部样式表与外部和内嵌脚本的顺序,可增加下载时同时加载的数据量,并提高浏览器显示网页的速度. 将样式表放在顶部,将脚本放在底部