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

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

由于思想的不同,二阶段检测方法在检测准确率和定位精度有优势,一阶段检测方法在速度上占有优势。
所以YOLO的核心思想是,直接在输出层回归bounding box的位置和bounding box所属的类别(整张图作为网络的输入,把 Object Detection 的问题转化成一个 Regression 问题)。
2. 特点
- 速度快,因为没有复杂的检测流程,只需要将图像输入到神经网络就可以得到检测结果,YOLO可以非常快的完成物体检测任务。
- YOLO在训练和测试时都能够看到一整张图像的信息,因此YOLO在检测物体时能很好的利用上下文信息,从而不容易在背景上预测出错误的物体信息。
- YOLO可以学到物体的泛化特征:当YOLO在自然图像上做训练,在艺术作品上做测试时,YOLO表现的性能比DPM、R-CNN等之前的物体检测系统要好很多。因为YOLO可以学习到高度泛化的特征,从而迁移到其他领域。
3. 缺点
YOLO的物体检测精度低于其他state-of-the-art的物体检测系统。
- YOLO容易产生物体的定位错误。
YOLO对小物体的检测效果不好(尤其是密集的小物体,因为一个栅格只能预测2个物体)。
4. 算法流程

Resize成448 \(\times\) 448,图片分割得到7 \(\times\) 7 网格(cell)
- CNN提取特征和预测:卷积部分负责提特征。全链接部分负责预测:
- 7 \(\times\) 7 \(\times\) 2 = 98个bounding box的坐标(x,y,w,h,confidence)
- 7 \(\times\) 7 = 49个cell所属20个物体的概率
过滤得到的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来做这件事会有以下不足:
- 8维的localization error和20维的classification error同等重要是不合理的;(真实框的中心x坐标减去yolo实际预测框的中心x尖 )
- 如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence逼近到0,相比于较少的有object的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散。
如何解决,重新设计新的loss计算方案:
- 更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为\(\lambda_{coord}\),即坐标预测部分内容。(上图蓝色框)
- 对没有object的bbox的confidence loss,赋予小的loss weight,记为 \(\lambda_{coord}\),在pascal VOC训练中取0.5。(上图橙色框)
- 有object的bbox的confidence loss (上图红色框) 和类别的loss (上图紫色框)的loss weight正常取1。
- 对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏一点更不能忍受。而sum-square error loss中对同样的偏移loss是一样。 为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。 如下图:small bbox的横轴值较小,发生偏移时,反应到y轴上的loss(下图绿色)比big box(下图红色)要大。

一个网格预测多个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最大者偏移会更少一些,可以更快速的学习到正确位置)
测试阶段,使用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
YOLOv1-darknet 内容解析的更多相关文章
- YOLOv2-darknet 内容解析
目录 YOLOv2-darknet 内容解析 1. 改进之处 2. Better 3. Faster 4. Stronger 5. 总结 reference YOLOv2-darknet 内容解析 1 ...
- gradle相关配置内容解析
gradle 项目的构建工具,基于groovy语言.主要用于管理依赖包. as中一般将gradle下载在C:\Documents and Settings<用户名>.gradle\wrap ...
- Android 之内容提供者 内容解析者 内容观察者
contentProvider:ContentProvider在Android中的作用是对外提供数据,除了可以为所在应用提供数据外,还可以共享数据给其他应用,这是Android中解决应用之间数据共享的 ...
- YOLOv3-darknet 内容解析
目录 Yolov3-darknet 内容解析 多标签分类预测 跨尺度预测 网络结构改变 reference Yolov3-darknet 内容解析 YOLOv3是到目前为止,速度和精度最均衡的目标检测 ...
- JVM系列文章(三):Class文件内容解析
作为一个程序猿,只知道怎么用是远远不够的.起码,你须要知道为什么能够这么用.即我们所谓底层的东西. 那究竟什么是底层呢?我认为这不能一概而论.以我如今的知识水平而言:对于Web开发人员,TCP/IP. ...
- Web 前端性能优化相关内容解析
Web 前端性能优化相关内容,来源于<Google官方网页载入速度检测工具PageSpeed Insights 使用教程>一文中PageSpeed Insights 的相关说明.大家可以对 ...
- Web 前端性能优化相关内容解析[转]
Web 前端性能优化相关内容,来源于<Google官方网页载入速度检测工具PageSpeed Insights 使用教程>一文中PageSpeed Insights 的相关说明.大家可以对 ...
- 爬虫实战【6】Ajax内容解析-今日头条图集
Ajax技术 AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). Ajax并不是新的编程语言,而是一种使用现有标准的新方法,当然 ...
- Lua string文件类型判断和内容解析
[1]文件名称类型判断和解析 local fileName = "shanxi201904npsdr1_200000.zip" print("len : " . ...
随机推荐
- 帝国cms栏目别名怎样调用?栏目名称太短了
在用帝国cms创建栏目时一般会填写栏目名称(较短)和栏目别名(为空则与栏目名相同),栏目别名可以设置长一些作为栏目标题,可是如何调用帝国cms栏目别名呢?默认的模板标题调用是<title> ...
- MyEclipse中jquery.js文件报missing semicolon的错误解决
myeclipse的验证问题不影响jquery的应用,如果看着别扭,解决办法如下:选中你想去掉的js文件:右键选择 MyEclipse-->Exclude From Validation :然后 ...
- jquery两稳定版本比较~~
jquery历经了多个版本的更新,版本上的比较貌似没什么必要性,一般来说新的版本会比旧的版本各方面都略有提升,但由于新版中增加了各种新的功能,难免会引起bug的发生.评估一个版本是否适合当前开发场景使 ...
- [LeetCode] 237. Delete Node in a Linked List_Easy tag: Linked List
Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...
- OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解 (转)
cv::Matdepth/dims/channels/step/data/elemSizeThe class Mat represents an n-dimensional dense numeric ...
- [转载]C#深拷贝的方法
首先了解下深拷贝和浅拷贝的定义: 浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用. 深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对 ...
- liferay笑傲江湖-API之参数的工具类(ParamUtil)
public class ParamUtil { 036 037 public static boolean get( 038 HttpServletRequest request, String p ...
- Python: 在序列上执行聚集函数(比如sum() , min() , max() )
在序列上执行聚集函数(比如sum() , min() , max() ) eg1: >>>nums = [1, 2, 3, 4, 5]>>>s = sum(x * ...
- Python 让PIP源使用国内镜像,提升下载速度和安装成功率
对于Python开发用户来讲,PIP安装软件包是家常便饭.但国外的源下载速度实在太慢,浪费时间.而且经常出现下载后安装出错问题.所以把PIP安装源替换成国内镜像,可以大幅提升下载速度,还可以提高安装成 ...
- jquery checkbox相关 prop方法
jquery checkbox相关 prop方法 firefox中 checkbox属性checked="checked"已有,但复选框却不显示打钩的原因复选框绑定了click事件 ...