目标检测学习笔记

看完吴恩达老师的 deeplearning.ai 课程目标检测这节课程的学习笔记。

文章目录

    • 1. 目标定位(object localization)
    • 2. 基于滑动窗口的目标检测算法
      • 滑动窗口的卷积实现
      • Bounding Box预测(Bounding box predictions)
      • 交并比(Intersection over union)
    • 3. 非极大值抑制
    • 4. Anchor Boxes
    • 5. 候选区域
    • 参考

1. 目标定位(object localization)

图像分类、目标定位以及检测的区别如下图所示,前两个是图片中只有 1 个对象的情况,而检测是图片有多个对象的情况。

所以,目标定位实际上是在分类的基础上定位到对象的位置,即找到对象在哪里并且直到这个对象是属于哪一类。

在图像分类中,一般定义的标签 y 的维度和类别是一样的,即假如是有 3 个类别,那么标签 y 的维度也是 3 个,比如令 y=[c1,c2,c3]y=[c_1, c_2, c_3]y=[c1,c2,c3] ,然后输出的时候就判断哪个类别的预测概率大,就将其作为该对象的预测类别。

而在目标定位中,增加了寻找对象的位置的工作,那么标签就需要有坐标信息,所以这里假设是 3 个类别,定义其标签为:
y=[pcbxbybhbwc1c2c3]y = \ \begin{bmatrix}p_c \\ b_x \\ b_y \\ b_h \\ b_w \\ c_1 \\ c_2 \\ c_3 \\\end{bmatrix} y= pcbxbybhbwc1c2c3
其中,pcp_cpc 表示图片是否包含有对象,如果对象属于指定的3 个类别中的一个,那么pc=1p_c=1pc=1, 否则就是 pc=0p_c=0pc=0,然后接下来的 bx,by,bh,bwb_x, b_y, b_h, b_wbx,by,bh,bw 表示的就是坐标,或者说就是边界框参数,一般来说就是左上角的坐标加上边界框的宽和高,然后最后 3 个就是代表类别了,有多少个类别,就有多少个参数,其数值表示的预测概率。

然后神经网络的损失函数,一般就是采用平方误差策略,假设类别 yyy 和网络的输出 y^\hat{y}y^,那么损失函数就是这么计算了,根据上述的标签定义,是有 9 维的:
L(y^,y)=(y1^−y1)2+(y2^−y2)2+⋯+(y8^−y8)2L(\hat{y}, y) = (\hat{y_1}-y_1)^2+(\hat{y_2}-y_2)^2+\dots +(\hat{y_8}-y_8)^2 L(y^,y)=(y1^y1)2+(y2^y2)2++(y8^y8)2
当然了,这里是用平方误差简化了,实际应用中,通常做法是对边界框的坐标应用平方差或者类似方法,对 pcp_cpc 应用逻辑回归函数,或者评分预测误差,而对类别标签应用对数损失函数。

2. 基于滑动窗口的目标检测算法

对于基于滑动窗口的目标检测算法,首先是创建一个标签训练集,也就是将图片进行剪切成多个图片样本,如下图所示,将左图进行剪切,得到中间的 5个样本,然后按照样本是否包含汽车,进行标注标签,然后将这个训练集输入 CNN 中,训练得到一个模型。

当训练好模型后,就可以进行测试,测试的例子如下所示,选择一个特定大小的窗口,然后从图片左上角开始滑动,每次将窗口内的图片送入模型中,判断该图片内是否有汽车,依次重复操作,直到滑动窗口滑过测试图片的每个角落。

上述做法就是滑动窗口目标检测。以某个步幅滑动这些方框窗口遍历整张图片,对这些方形区域进行分类,判断是否包含目标对象。

该算法的一个很明显的缺点,就是计算成本。主要原因是跟滑动窗口的大小有关系,选择太小的,那么就会需要滑动很多次,也就是需要检测多个小窗口,提高了计算成本;而如果窗口过大,那么窗口数量会减少,但是会影响模型的性能。

滑动窗口的卷积实现

上述介绍的实现基于滑动窗口的目标检测的方法,效率是比较低,这里会介绍如何通过卷积实现滑动窗口,首先需要将 CNN 的全连接层转换为卷积层,也就是得到一个全卷积网络(FCN),如下图所示:

这里的输入图片例子是一个 14×14×314\times 14\times 314×14×3 的图片,然后经过一个卷积核大小是 5×55\times 55×5 的卷积层,输出是 14×14×314\times 14\times 314×14×3 ,接着是一个 Max pooling 层,参数是 2×22\times 22×2 ,输出就是 5×5×165\times 5\times 165×5×16 ,原本是接着两个 400×400400\times 400400×400 的全连接层,现在改为用 1×1×4001\times 1\times 4001×1×400 的两个卷积层。

接着是主要参考论文 OverFeat 来介绍如何通过卷积实现滑动窗口对象检测算法。

具体实现例子如下所示,第一行表示训练时候使用 14×14×314\times 14\times 314×14×3的图片,第二行表示测试时候使用的输入图片大小是 16×16×316\times 16\times 316×16×3。而使用这个图片,在经过卷积层的时候,这里步幅是 2,所以卷积核是移动了四次,得到了输出是 12×12×1612\times 12\times 1612×12×16,最终的输出也是 2×2×42\times 2\times 42×2×4

可以看到,其实在这 4 次卷积操作中有很多计算是重复的,因为有很多区域都是重叠的,具体四次如下所示,不同颜色的框表示四次操作的范围,左边第一个图的红色,然后移动 2 格,是第二个图中绿色框的区域,接着是第三张图里橙色,也就是左下角,然后第四张图里右下角,其实中间区域都是重叠的,也就是四个角落是有所不同。

简单说,通过这个卷积操作,我们就可以不用将测试图片分割成 4 个子图片,分别输入网络中,执行前向操作,进行预测,直接整张图输入网络即可,卷积层就会帮我们完成这个操作,也就是一次前向操作即可,节省了 4 倍的时间。

不过,这种方法虽然提高了算法的效率,但也有一个缺点,就是边界框的位置可能不够准确。

Bounding Box预测(Bounding box predictions)

接下来要介绍如何可以得到精确的边界框,这里介绍的就是著名的 YOLO(You only look once) 算法,目前也是目标检测里很常用的一种算法,以及有了更多的版本,从最初的 YOLO,到目前的 YOLOv5,持续进行改进和提升。

YOLO 算法的做法如下图所示,采用一个 3×33\times 33×3 的网格,将输入图片分成了 9 个区域,然后检测每个区域内是否有目标对象,YOLO 算法会将检测到的对象,根据其中点位置,将其分配到中点所在的格子里,所以下图中编号 4 和 6 包含了汽车,但是编号 5 虽然同时有两辆车的一部分,但因为中心点不在,所以这个格子输出的结果是不包含有汽车。

采用这个算法,网络输出的结果就是 3×3×83\times 3 \times 83×3×8 , 这里表示 3×33\times 33×3 的网格,每个网格的结果是一个 8 维的向量,也是之前定义好的,即 pc,bx,by,bw,bh,c1,c2,c3p_c, b_x, b_y, b_w, b_h, c_1, c_2, c_3pc,bx,by,bw,bh,c1,c2,c3

该算法的优点就是CNN 可以输出精确的边界框,在实践中可以采用更多的网格,比如 19×1919\times 1919×19,即便图片中包含多个对象,但如果网格数量越多,每个格子就越小,一个格子存在多个对象的概率就会很低。

YOLO 算法的另一个优点是它采用卷积实现,速度非常快,这也是它很受欢迎的原因。

交并比(Intersection over union)

交并比(IoU)表示两个边界框交集和并集之比。并集就是如下图中绿色区域部分,即同时包含两个边界框的区域;而交集就是两个边界框重叠部分,下图中橙色区域。所以交并比就是橙色区域面积除以绿色区域的面积。

一般来说,IoU 大于等于 0.5,就可以说检测正确,结果是可以接受的,这也是一般的约定。但IoU 越大,边界框就约精确了。

这也是衡量定位精确到的一种方式,IoU 是衡量了两个边界框重叠的相对大小。

3. 非极大值抑制

目前的检测算法还会存在一个问题,就是对同一个对象作出多次的检测,而非极大值抑制就可以确保算法只对每个对象检测一次。

非极大值抑制算法的执行过程如下图所示,这里是采用 19×1919\times 1919×19 的网格,对每个网格先执行检测算法,得到的输出就是 19×19×819\times 19 \times 819×19×8。当然这里只是预测是否有汽车,那么其实可以暂时不需要分类部分,也就是每个网格输出一个 5 维向量,pcp_cpc 以及边界框的四个坐标参数。

然后开始实现非极大值抑制算法:

  1. 去掉所有预测概率低于阈值的边界框,比如设置阈值是 0.6,那么对于 pc≤0.6p_c \le 0.6pc0.6 的边界框都被抛弃;
  2. 在剩下的边界框里,将预测概率最高的边界框,将其输出作为预测结果;
  3. 然后将还剩下的边界框里,和第一步被抛弃的边界框有高 IoU 的,比如 IoU≥0.5IoU \ge 0.5IoU0.5 的边界框都抛弃掉;
  4. 对所有边界框都进行处理,按照上述 3 个步骤来判断,抛弃还是作为输出结果;

4. Anchor Boxes

上述说的检测都是限制于一个格子检测出一个对象,但如果需要一个格子可以检测多个对象,那么就需要用到 anchor box。

如下图所示,假设现在输入图片是左图中的例子,在第三行的第二个格子中是刚好同时存在人和汽车,并且中心点都落在这个格子里,但根据之前的算法,只能检测到其中一个对象。而要解决这个问题,就需要用到 anchor box 了。

这里 anchor box 的思路是预先定义两个不同形状的 anchor box,如上图的两个,当然实际情况里可能会采用更多的 anchor box,比如 5 个甚至更多。不过这里只需要两个即可。

接着就是重新定义标签,不再是开始的 8 维向量,而是 2×82\times 82×8 的向量,前面 8 个和 anchor box1 相关联,而后面 8 个和 anchor box2 相关联。如上图右侧的 yyy 所示。

在实际例子中,还有一些情况:

  • 比如使用两个 anchor box,但一个格子里出现 3 个对象,这种情况算法也处理不好;
  • 同个格子有两个对象,但它们的 anchor box 形状也一样,这种也是算法处理不好的情况;

另外,一般怎么选择 anchor box 呢?通常是手工指定 anchor box 形状,选择 5-10 个不同形状的,尽量覆盖多种不同的形状,覆盖你想要检测对象的各种形状。

另一种做法是在 YOLO 后期论文中介绍的,k-平均算法,用它来选择一组 anchor box,最具有代表性的一组 anchor box。

5. 候选区域

目标检测里另一个比较出名的算法,R-CNN,跟 YOLO 相比,是另一种思路,所以也基于此算法产生了很多检测算法,比如对其持续改进优化的,Fast-RCNN,Faster-RCNN 等。

R-CNN 算法是尝试找到一些区域,在这部分区域里运行 CNN 进行检测。而选择这些候选区域的方法是运行图像分割算法,分割的结果如下图所示。根据分割算法得到的结果,在不同的区域运行分类器,判断该区域是否有目标对象,比如图中标注号码的几个区域。

这种做法相比滑动窗口,可能是不需要图片的每个地方都去检测一遍,只需要对分割算法得到的色块,加上边界框,然后对边界框内的区域运行分类器,虽然是工作量会减少一些,但实际上速度还是很慢,但优点是精度会很不错,这个就和 YOLO 算法刚好相反。

因为速度太慢的问题,后续也有很多改进的算法

  • Fast-RCNN:同样的方法进行候选区域的筛选,但通过卷积实现滑动窗口,对候选区域进行分类;
  • Faster-RCNN:采用 CNN 来生成候选区域

参考

  1. deeplearning.ai 04 课程第三周–目标检测

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

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

相关文章

win8中完成进度

public sealed partial class WorkItem : Page{private IAsyncAction _threadPoolWorkItem;private ManualResetEvent _sleep new ManualResetEvent(false);public WorkItem(){this.InitializeComponent();}// 在线程池中找一个线程去执行指定的方法,并指定其优先级…

中小企业的软件需求问题

近年来,做为我国经济发展新兴动力的中小企业同时也成为了IT行业的热点市场。IT领域的顶级厂商在高端市场日趋饱和的情况下,正逐渐将眼光投向中小企业市场。而大多数IT厂商由于自身的资源和规模限制无法涉足高端用户,中小企业市场为这些厂商提…

数学学习笔记--线性代数

开始复习 AI 算法的基础–数学部分,主要是三方面的内容: 线性代数概率论微积分 参考内容如下: 《深度学习》https://github.com/scutan90/DeepLearning-500-questionshttps://github.com/sladesha/Reflection_Summary 本文是第一篇&#…

诺基亚S40手机联系人导入安卓手机

电话号码较少的话比较简单,拷贝到SIM卡中通过SIM卡中转,只是一般SIM卡只能存储200个左右,联系人比较多的情况就麻烦一点,今天帮导师把诺基亚5220中的800个电话转到三星S4中,综合下来还是使用了这种方法: 诺…

科技馆游记(精华)-------- double篇

科技馆之流水帐乱弹 时间: 公元2005年5月3日 人物: 饭团 (男主角), double (女主角), 路人甲乙丙丁… 地点: 繁华的大都市上海 天气不错, 挺风和日丽的, 饭团和double都没有课。顺便一说,居然交大连国定的五一假期中都要补课,所以饭团这次百忙之中抽空跟…

远程桌面不能连接,提示awgina.dll取代错误的解决办法

远程桌面不能连接,错误提示:您不能初始化一个远程桌面连接,因为在远程计算机上的windows登录软件被不兼容的软件c:\windows\system32\awgina.dll取代,如下图所示: 原因:如果计算机中装有SymantecpcAnywhere…

数学学习笔记--概率论

2. 概率论 2.1 概率分布与随机变量 2.1.1 机器学习为什么要使用概率 事件的概率是衡量该事件发生的可能性的量度。虽然在一次随机试验中某个事件的发生是带有偶然性的,但那些可在相同条件下大量重复的随机试验却往往呈现出明显的数量规律。 机器学习通常必须处理…

官方文档很强大!!!学会阅读技术文档的能力(vuex)

我是歌谣 放弃很容易 但是坚持一定很酷 在我们的日常 我们在学习一个新的知识点 的时候 不免就需要我们有阅读文档的能力 了解vuex的产生 比如我们在学习Vuex的时候 最近开始接触新项目了 需要学习一个新项目 了解一个新的知识点 最近主要攻关Vuex这一部分的内容 看看别人封装…

读《.NET本质论》样章有感

这两天抽空看了一下《.NET本质论》,确实是一本经典的好书。如果说《Thinking in Java》是Java中从入门到精通的经典书籍的话,那么《.NET本质论》将是一本深入研究.NET技术的不可多得的佳作。我实在是不知道该如何评价这样一本好书,所以将多次…

PHPmysqli的 预处理执行查询语句

1 header( Content-Type:text/html;charsetutf-8 ); 2 require prepareSrarment.php;3 $mysqlinew mysqli("localhost", "root", "password, "user1", 3306);4 $mysqli->set_charset("utf8");5 //使用预编译从数据库中查询6 /…

vue一步一步带你封装一个按钮组件

# 前言 本文主要对子组件的封装做一个了解 首先我们直接看一下代码显示 首先是今天有一个学妹 过来问我如何封装子组件 # 实现效果 首先这个组件是基于eleemnt-ui进行封装的 我们看一眼实现效果 有了实现效果 之后 我们一起来看看他的父子组件 有了实现效果 之后 我们一起来看…

机器学习基础--一些基本的概念

前言 开始重新巩固一下机器学习的内容,先从基本的一些概念和定义开始。 本文介绍的内容如下所示: 机器学习的基本定义局部最优和全局最优机器学习、深度学习、数据挖掘、大数据之间的关系为什么要使用机器学习 1. 机器学习的基本定义 机器学习算法是…

COM组件简介

面向对象的思想难以适应这种分布式软件模型,于是组件化程序设计思想得到了迅速的发展。 按照组件化的程序设计的思想,复杂的应用程序被设计成一些小的,功能单一的组件模块,这些组件模块可以运行在同一台机器上,也可以运…

域名与国家对应表

本文转自 CBuilder 研究 - http://www.ccrun.com/other/go.asp?i240&d6dx0tl.ac – Ascension Island.ad – Andorra.ae – United Arab Emirates.af – Afghanistan.ag – Antigua and Barbuda.ai – Anguilla.al – Albania.am – Armenia.an – Neth…

[论文笔记]基于 CNN+双向LSTM 实现服饰搭配的生成

论文:《Learning Fashion Compatibility with Bidirectional LSTMs》 论文地址:https://arxiv.org/abs/1707.05691 代码地址:https://github.com/xthan/polyvore 1. 简介 时尚搭配推荐的需求越来越大,本文是基于两个方面的时尚…

WangEdit富文本编辑器增加上传视频功能

乘着今天中午的时间 对以前项目的一个需求进行一定的处理 前天去了甲方公司 接到了了一个新的需求 就是可以把项目的一个富文本的编辑器可以设置为能够上传视频 于是乎 就要对vue里面的这个组件进行操作了 首先我们可以看一眼官网的文档 需要用到的就直接到官网文档进行查询即可…

大学生应当趁早谋划未来

最近,有几个CSDN网友,主要是在校大学生,遇到了一些困惑,寻求我的“解惑”。我的表弟,大四即将毕业,也是如此。上大学的时候,我也经常遇到困惑,非常迷茫,我非常能理解他们…

[论文笔记]Outfit Compatibility Prediction and Diagnosis with Multi-Layered Comparison Network

Outfit Compatibility Prediction and Diagnosis with Multi-Layered Comparison Network 论文题目:Outfit Compatibility Prediction and Diagnosis with Multi-Layered Comparison Network 论文地址:https://arxiv.org/abs/1907.11496 代码&#xf…

介绍一种Web上打印技术

一、 介绍ScriptX控件对于B/S架构的项目中,Web打印最是让程序员头痛的技术,在这次项目中运用了第三方控件ScriptX解决了此技术包括各种汇总表,详细清单等等,但最大弊端就是打印的格式是死的,你要打印出怎样的格式必…