吴恩达《深度学习》第四门课(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 ...
随机推荐
- datetime.date(2014, 4, 25) is not JSON serializable
# 背景 接口期望返回json格式数据,但数据存储在mysql中,先将mysql的数据转为dict,然后将dict转为json格式,然后就报这个错误了的,原因就是时间格式转换问题 # 解决方法 1. ...
- Linux下.Net Core+Nginx环境搭建小白教程
前言 对于接触.Net Core的我们来说之前从未接触过Linux,出于资源和性能及成本的考虑我们可能要将我们的环境搬到Linux下,这对于我们从未接触过Linux的童鞋们来说很棘手,那么我今天将带你 ...
- php留言系统(9)
1.参照之前的(mvc框架总结)将整体框架定下来之后,那么请求默认参数将变为: //默认请求首页: //P=front //C=fIndex //A=show 1.1 找到控制器fIndexC ...
- 如何给LOJ补全special judge
首先你要会写一个叫$data.yml$的东西, 这里面记录了这道题的$subtask$计分策略 也告诉了评测姬这道题是提交答案还是$spj$还是交互题 那么,$YAML$语言是啥啊? 别问我,我也不会 ...
- django 模型中 class Meta 内 各种属性的用法
Django 模型类的Meta是一个内部类,它用于定义一些Django模型类的行为特性.下面对此作一总结: abstract 这个属性是定义当前的模型类是不是一个抽象类.所谓抽象类是不会相应数据库表的 ...
- day 14 自定义模块,常用模块 time .datetime ,time 模块
内容大纲 一:Import 模块 1,创建一个以tbjx命名的名称空间 2,执行此模块的代码,并将所有内容加载到内存 3,调用此模块的代码要通过tbjx.的方式 二:from 包 import 模块 ...
- 自适应大邻域搜索代码系列之(1) - 使用ALNS代码框架求解TSP问题
前言 上次出了邻域搜索的各种概念科普,尤其是LNS和ALNS的具体过程更是描述得一清二楚.不知道你萌都懂了吗?小编相信大家早就get到啦.不过有个别不愿意透露姓名的热心网友表示上次没有代码,遂不过瘾啊 ...
- Python库大全
网络 urllib -网络库(stdlib). requests -网络库. grab – 网络库(基于pycurl). pycurl – 网络库(绑定libcurl). urllib3 – Pyth ...
- LOJ2229. 「BJOI2014」想法(随机化)
题目链接 https://loj.ac/problem/2229 题解 评分标准提示我们可以使用随机化算法. 首先,我们为每一道编号在 \([1, m]\) 以内的题目(这些题目也对应了 \(m\) ...
- [JZOJ6089]【CodeChef 2014 April Challenge】Final Battle of Chef【数据结构】【整体二分】
Description \(n,q,V\leq 100000,w_i\leq 10^9\) Solution 又是一道大数据结构 由于有一个下取整,这就导致了不同时间的修改值是不能简单的直接加在一起的 ...