吴恩达《深度学习》第四门课(3)目标检测(Object detection)
3.1目标定位
(1)案例1:在构建自动驾驶时,需要定位出照片中的行人、汽车、摩托车和背景,即四个类别。可以设置这样的输出,首先第一个元素pc=1表示有要定位的物体,那么用另外四个输出元素表示定位框的中心坐标和宽高,再用3个输出元素one-hot表示是三个类别中的哪一类。当第一个元素pc=0时表示是背景,然后就不需要考虑其他输出了,如下图所示(需要注意的是是根据图片的标签y来决定使用几个元素的):

(2)损失函数:上图中左下角是使用了平方误差损失函数这是为了方便解释方便而使用的。实际使用中pc使用逻辑回归,c1,c2,c3是用softmax激活然后然后用对数损失函数,位置信息是使用平方误差损失函数,然后将这些损失函数相加起来得到最终的代价函数。当标签y=0时,只考虑pc即可。
3.2特征点检测
(1)特征点检测就是第一个单元输出1,表示有这个对象(如人脸),然后如果在人脸上定义了64个特征点(如下图所示),每个特征点用(x,y)表示,那么网络将会有1+2*68=129个单元输出。需要注意的一点是在标注样本时,所有标签在所有图片中务必保持一致,比如说,第5个特征点表示左眼的外眼角,那么所有图片的第五个特征点都应该是这个。

3.3目标检测
(1)案例是检测图片中的汽车,首先是有裁剪合适的照片(裁剪合适是指照片中如果有汽车那么汽车将占满整张图),进行训练一个可以分类汽车的网络,即输出是否有汽车。如下图所示:

(2)滑动窗口目标检测是用一个滑动窗口从图片的最左上角从做到右(设定一定步长)从上到下去滑动,分别将窗口内的图片裁剪下来送入到之间训练好的网络中,判断有无汽车,然后改变窗口大小,以及步长等,重复上面步骤,如下图所示:


(3)滑动窗口的问题就是计算量非常的大,因为要保证精确度化不能用太大的步长,这样滑动窗口很多,而且很多地方是属于重复计算了。
3.4卷积的滑动窗口实现
(1)将全连接层转换为卷积层,如下图所示5*5*16与400个单元进行全连接可以转换为用400个5*5*16的卷积核来卷积5*5*16,这样每一个卷积核其实就相当与都是全连接的结果,唯一的区别就是之前全连接输出是400个单元,现在输出是1*1*400,维度不同,下一层全连接转卷积同样操作,最后一层原来是输出4个单元,现在变成了1*1*4,维度不同,仅此而已。

(2)上一节中一个一个滑动框输入网络中,有许多计算是重叠的,即多次计算,所以可以将原图直接输入到网络中,这样避免了重复计算。之所以将前面的全连接层变成卷积层,是因为只有都是卷积层的时候才可以输入任意尺寸的图片,更具体的说是参数不随图片尺寸变化,而全连接层参数w时固定的意味着图片输入尺寸要固定。

(3)该方法还存在的一个问题就是边界框位置不够准确。
3.5Bounding Box预测(YOLO算法)
(1)将一张图3*3共9个单元(在论文中是分成19*19,论文默认前提是一个单元里只有一个对象),每个单元都有上面提到的1+4+3=8个输出(还是用上面无人驾驶的例子,3个类别加一个背景)所以整个网络输出为3*3*8。换言之就是输入一张图片,然后网络最终输出的维度为3*3*8,3*3是指有图片分成这么多格子,然后每个格子需要用到8个参数。如下图所示:

(2)YOLO中将对象(即识别的物体)的中心点落在哪一个网格中就,它就属于哪个网格,一个对象只能属于一个网络,即使这个目标可能横跨了好多个网格。
(3)bx,by,bw,bh一种表示方法:将网格(注意不是整张图)的左上角记做(0,0),网格右下角为(1,1),所以bx,by的值都在0到1之间,反证法如果超过1说明它不应该划分到这个网格中。bw,bh也是相对于网格的比例,所以其值可能大于1.如下图所示:

3.6交并比
(1)IoU=(A∩B)/(A∪B),一般将交并比的值大于0.5看成是检测正确的,当然这个值可以根据实际情况来定。

3.7非极大值抑制
(1)需要理解的一点是,我们做的样本标签中一个对象只会属于一个网格(中心点落在该网格上),但是当我们开始对网络进行预测时,很多网格都会觉得这个对象是属于自己的,如下图所示:

(2)用只有一个类别(如汽车)来说明非极大值抑制的过程。首先将预测到有汽车的网格中概率小于阈值的都去掉(比如说0.6),然后将剩下预测到有汽车的都进行排序,去其中可能性最大的,它将成为一个预测结果,然后与它的交并比大于某个阈值的都去掉,然后再在剩下中取最大可能性的,重复以上步骤,直到处理完全部。
如下图所示(下图中的pc其实是之前的pc乘上类别概率c1、c2或c3):

(3)当有多个类别时,按类别分开进行非极大值抑制。
3.8Anchor Box
(1)上面都是假设一个网格里面只有一个对象,如果有两个对象,如下图所示,人和汽车的中心点几乎重合,这时可以提出一种新概念,即在一个网格框中设置多个不同形状的anchor box,比如说两个,一个瘦高的,一个挨胖的,如下图所示:

(2)其实实质就是每个网格的第三维度增加输出,把之前的3*3*8变成3*3*16(如下图所示),有时候会变成四个维度如3*3*2*8。

(3)有一点需要注意的是,在给样本打标签时要做到统一,比如说瘦高型的,那么将对应到前八个输出,如果是矮胖型的对应到后面的八个输出。
(4)当超过两个对象在同一个网格(其实概率特别小),暂时没有什么好的办法;如果两个对象都是与同一种类型(比如说瘦高型的),也没什么特别好的办法。
3.9YOLO算法
(1)将上面提到的各个模块组合在一起其实就是YOLO算法了,每个网格多个anchor box,最后再做非极大值抑制。

3.10候选区域(Region proposals)
(1)RCNN:首先使用传统图像分割的方法,对图像进行分割,然后提取出2000个可能有对象的候选框,这样相对于最开始提到的滑动框的方式减少了非常多的框,其他二者其实是一回事,然后送入网络,如下图所示:

(2)Fast RCNN:即先将整个图像进行卷积,然后再将候选框映射到卷积之后的输出做分类,其实就是上面提到的卷积整幅图减少重复计算。
(3)Faster RCNN:由于使用传统的图像分割选出候选框需要非常多的时间,所以使用卷积神经网络来选出候选框。三个算法特点如下图:

吴恩达《深度学习》第四门课(3)目标检测(Object detection)的更多相关文章
- 吴恩达深度学习第4课第3周编程作业 + PIL + Python3 + Anaconda环境 + Ubuntu + 导入PIL报错的解决
问题描述: 做吴恩达深度学习第4课第3周编程作业时导入PIL包报错. 我的环境: 已经安装了Tensorflow GPU 版本 Python3 Anaconda 解决办法: 安装pillow模块,而不 ...
- 吴恩达深度学习第2课第2周编程作业 的坑(Optimization Methods)
我python2.7, 做吴恩达深度学习第2课第2周编程作业 Optimization Methods 时有2个坑: 第一坑 需将辅助文件 opt_utils.py 的 nitialize_param ...
- 吴恩达深度学习第1课第4周-任意层人工神经网络(Artificial Neural Network,即ANN)(向量化)手写推导过程(我觉得已经很详细了)
学习了吴恩达老师深度学习工程师第一门课,受益匪浅,尤其是吴老师所用的符号系统,准确且易区分. 遵循吴老师的符号系统,我对任意层神经网络模型进行了详细的推导,形成笔记. 有人说推导任意层MLP很容易,我 ...
- 吴恩达深度学习第2课第3周编程作业 的坑(Tensorflow+Tutorial)
可能因为Andrew Ng用的是python3,而我是python2.7的缘故,我发现了坑.如下: 在辅助文件tf_utils.py中的random_mini_batches(X, Y, mini_b ...
- 吴恩达深度学习第1课第3周编程作业记录(2分类1隐层nn)
2分类1隐层nn, 作业默认设置: 1个输出单元, sigmoid激活函数. (因为二分类); 4个隐层单元, tanh激活函数. (除作为输出单元且为二分类任务外, 几乎不选用 sigmoid 做激 ...
- 【Deeplearning.ai 】吴恩达深度学习笔记及课后作业目录
吴恩达深度学习课程的课堂笔记以及课后作业 代码下载:https://github.com/douzujun/Deep-Learning-Coursera 吴恩达推荐笔记:https://mp.weix ...
- 吴恩达深度学习 反向传播(Back Propagation)公式推导技巧
由于之前看的深度学习的知识都比较零散,补一下吴老师的课程希望能对这块有一个比较完整的认识.课程分为5个部分(粗体部分为已经看过的): 神经网络和深度学习 改善深层神经网络:超参数调试.正则化以及优化 ...
- 深度学习 吴恩达深度学习课程2第三周 tensorflow实践 参数初始化的影响
博主 撸的 该节 代码 地址 :https://github.com/LemonTree1994/machine-learning/blob/master/%E5%90%B4%E6%81%A9%E8 ...
- Coursera 吴恩达 深度学习 学习笔记
神经网络和深度学习 Week 1-2 神经网络基础 Week 3 浅层神经网络 Week 4 深层神经网络 改善深层神经网络 Week 1 深度学习的实用层面 Week 2 优化算法 Week 3 超 ...
- cousera 吴恩达 深度学习 第一课 第二周 作业 过拟合的表现
上图是课上的编程作业运行10000次迭代后,输出每一百次迭代 训练准确度和测试准确度的走势图,可以看到在600代左右测试准确度为最大的,74%左右, 然后掉到70%左右,再掉到68%左右,然后升到70 ...
随机推荐
- solr特点三: 基于Solr实现排序定制化参考
排序实现有N种形式,最低成本.最快响应时间是目标 一份索引,支持N种排序策略并且在线互不干扰是要考虑的每一种实现,处理的场景是不同的,不要千篇一律 020排序,从索引到效果,有不少坑,这篇文章没有细说 ...
- shell相关文件
站在用户登录的角度来说,SHELL的类型: 登录式shell: 正常通常某终端登录 su - USERNAME su -l USERNAME 非登录式shell: su USERNAME 图形终端下 ...
- Lambda 表达式浅谈- 01
已经有一段时间没有发布博文了... 今天就写一写lambda的一些简单的使用方法 Lambda 在Msdn 上的描述: Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 ...
- indows 2008 r2/做了SPS2007---2013后,发现添加原来域中的域组添加不上
根据上次的网络包的分析, 我们在AD中找到了wtc-beijing-it的组, 不过在SharePoint日志中我们没有发现搜索成功的记录. - SearchResultEntry: CN=WTC-B ...
- 浅谈由管理者角色引出的B端产品设计思考点
本文来自网易云社区 作者:任琼瑶 最近一直都在持续跟进云课堂B端的交互设计,在此期间,多多少少遇到了一些不曾遇到过的问题,虽然同是做产品设计,但B端和C端产品的确存在很多不同之处. 首先,当我们在做C ...
- iOS 内嵌 View 的响应
遇到一个问题就是我有一个 UITextField,点击后不能编辑而是会显示一个自定义的 dialog. 但发现问题是,UITextField 的对点击事件的反应非常吃顿,有时候好使有时候不好使. 后来 ...
- kolla-ansible 重新部署 ceph-mon 组件
1.备份数据 [root@controller ~]# mv /var/lib/docker/volumes/ceph_mon /var/lib/docker/volumes/ceph_backup/ ...
- java使用Redis2--保存对象
Redis中并没有提供set(String key, Object obj)的方法,但提供了set(final byte[] key, final byte[] value) 的方法,可以通过把对象转 ...
- 线性表中顺序表的的理解和实现(java)
线性表的顺序表示指的是用一组地址连续的存储单元以此存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像.通常,称这种存储结构的线性表为顺序表.特点是:逻辑上相邻的数据元素,其物理次序上也 ...
- jQuery 动画用法
jQuery动画: <head> <meta charset="UTF-8"> <title>Title</title> <s ...