当前位置: 首页 > 编程日记 > 正文

吴恩达老师深度学习视频课笔记:目标检测

        目标定位:如下图,图像分类任务就是算法遍历图像,判断其中的对象是不是car。图像定位分类(classification with localization)不仅要用算法判断图像中的是不是car,还要在图像中标记出car的位置。图像分类的思路可以帮助学习分类定位,而对象定位的思路又有助于学习对象检测。如果想定位图像中car的位置,除了让神经网络输出softmax类预测分类外,还可以让神经网络多输出几个单元即输出一个边界框(bounding box),标记为bx,by,bh,bw,这四个数字是被检测对象的边界框的参数化表示。


        Landmark detection:利用神经网络进行对象定位,即通过输出四个参数值bx,by,bh,bw,给出图像中对象的边界框。神经网络可以通过输出图像中特征点(landmarks)的坐标来实现对目标特征的识别。如下图,选定人脸的64个landmarks,并生成包含这些landmarks的标签训练集,然后利用神经网络输出脸部关键landmarks的位置。批量添加神经网络的输出单元,用以输出要识别的各个landmarks的坐标值。


        Object detection:如下图,假设你想构建一个car检测算法,步骤是:首先是创建一个标签(label)训练集,X和Y表示适当剪切的car图像样本。在训练集上,你一开始可以使用适当剪切的图像,就是整张图像X几乎都被汽车占据。有了训练集,就可以开始训练卷积网络了。输入这些适当剪切过的图像,卷积网络输出Y,0或1表示图像中有car或没有car。


训练完这个卷积网络,就可以用它来实现滑动窗口目标检测,如下图。具体步骤如下:假设这是一张测试图像,首先选定一个特定大小的窗口,将这个红色小方块输入卷积网络,卷积网络开始进行预测,即判断红色方框内有没有汽车,滑动窗口目标检测算法接下来会继续处理第二个图像,即红色方框稍向右滑动之后的区域,并输入给卷积网络,因此输入给卷积网络的只是红色方框内的区域,再次运行卷积网络,然后处理第三个图像,依次重复操作,直到这个窗口滑过图像的每一个位置,把这些剪切后的小图像输入卷积网络,对每个位置按0或1进行分类,这就是所谓的图像滑动窗口操作。也可以选择一个更大的窗口,截取更大的区域并输入给卷积网络处理。你可以根据卷积网络对输入大小的要求调整这个区域。以上是以固定步幅滑动窗口,遍历整幅图像输出结果。这样做,不论car在图像中的什么位置,总有一个窗口可以检测到它。滑动窗口目标检测算法也有明显的缺点就是计算成本,因为你在图像中剪切出太多小方块,卷积网络要一个个处理。如果你选用的步幅很大,显然会减少输入卷积网络的窗口个数,但是粗粒度可能会影响性能,反之,如果采用小粒度或小步幅,传递给卷积网络的小窗口会特别多,这意味着超高的计算成本。


        Convolutional implementation of sliding windows:为了构建滑动窗口的卷积应用,首先要知道如何将神经网络的全连接层转化成卷积层。如下图,假设对象检测算法输入一个14*14*3的图像,使用16个filter,大小为5*5,在filter处理后输出为10*10*16,然后通过2*2的最大池化(pooling)操作使图像减少到5*5*16,然后添加一个连接400个单元的全连接层,接着再添加一个全连接层,最终通过softmax输出Y,用4个数字来表示Y,这四个分类可以是人、car、背景或其它对象。如何把这些全连接层转化为卷积层?针对第一个全连接层,我们可以用5*5的filter来实现,数量是400个,输出是1*1*400。再添加另外一个卷积层,filter的大小是1*1,数量是400。最后经由1*1的filter的处理得到一个softmax激活值。


通过卷积实现滑动窗口对象检测算法,如下图,假设向滑动窗口卷积网络输入14*14*3的图像。测试集图像是16*16*3,在最初的滑动窗口算法中,你会把这片蓝色区域输入卷积网络,生成1或0分类,接着滑动窗口,步幅为2个像素,向右滑动2个像素,将这个绿框区域输入给卷积网络,运行整个卷积网络,得到另外一个标签0或1,依次将其它框输入卷积网络。我们在这个16*16*3的图像上滑动窗口,卷积网络运行了4次,于是输出了4个标签(labels)。结果发现,这4次卷积操作中的很多计算都是重复的。滑动窗口的卷积应用,使得卷积网络在这4次操作过程中很多计算都是重复的。如果直接将这个16*16*3的图像输入网络,输出是2*2*4,而不是1*1*4。所以该卷积操作的原理是我们不需要把输入图像分割成4个子集分别执行前向操作,而是把它们作为一张图像输入给卷积网络进行计算,其中的公有区域可以共享很多计算。假如对一个28*28*3的图像应用滑动窗口操作,如果以同样的方式运行前向操作(forward prop),最后得到8*8*4的结果。我们可以对大小为28*28*3的整张图像进行卷积操作,一次得到所有预测值,如果足够幸运,神经网络便可以识别出car的位置。这个算法存在一个缺点就是边界框的位置可能不够准确。


        Bounding box predictions:在滑动窗口中,你取离散的位置集合,然后在它们上面跑分类器,在这种情况下,这些边界框,没有一个能完美匹配car位置。其中一个能得到更精准的边界框的算法是YOLO算法。YOLO意思是你只看一次。如下图,大体描述为:比如你的输入图像是100*100的,然后再图像上放一个网格,假如用3*3的网格,将图像分类和定位算法应用到9个格子上,需要这样定义训练标签,对于9个格子中的每一个指定一个标签y,每个格子都有一个这样的向量[pc,bx,by,bh,bw,c1,c2,c3],YOLO算法的做法是取car的中点,然后将这个car分配给包含对象中点的格子。目标输出是3*3*8,因为这里有3*3格子,然后对于每个格子,你都有一个8维向量y。把car分配到一个格子的过程是观察car的中点,然后将这个car分配到其中点所在的格子,所以即使car可以横跨多个格子,也只会被分配到9个格子其中之一。LOYO算法可以达到实时识别。


        Intersection over union(交并比):如何判断对象检测算法是working well,可以通过交并比函数(intersection over union, IoU),如下图,如果实际边界框是红色框,你的算法给出的是紫色的边界框,交并比函数做的是计算两个边界框交集和并集之比。一般约定,在计算机检测任务中,如果IoU大于或等于0.5就说检测正确,一般约定0.5是阈值,但是也可以根据实际需求定义更大的阈值。


        Non-max suppression(非极大值抑制):你的算法可能对同一个对象作出多次检测,非最大值抑制可以确保你的算法对每个对象只检测一次。如下图,假如是一个19*19的格子,因为要在361个格子上都跑一次图像检测和定位算法,那么很多格子有车的概率都会很高,非最大值抑制就是清理这些检测结果。这个算法做的是,首先看看每次每个检测结果的概率pc,首先找概率最大的那个,如0.9,非最大值抑制就会逐一审视剩下的矩形,即和这个最大的边界框有很高交并比,高度重叠的其它边界框,那么这些输出就会被抑制,如0.6,0.7,变暗。接下来逐一审视剩下的矩形,找出概率最高的一个0.8,我们认为,这里也检测出一辆车,然后非最大值抑制算法就会去掉其它IoU值很高的矩形。所以,现在每个矩形都会被高亮显示或者变暗,如果你直接抛弃那些变暗的矩形,那就剩下高亮显示的那些,这就是最后得到的两个检测结果。非最大值意味着你只输出概率最大的分类结果。执行过程:首先这个19*19的网格上跑一遍算法,加入只有car检测,你会得到19*19*5的输出尺寸,[ pc,bx,by,bh,bw],接下来为了应用最大值抑制算法,我们对所有的边界框进行预测,需要先去掉比如pc<0.6的边界框,即算法认为这里存在car的概率至少为0.6,否则就抛弃。这就抛弃了所有概率比较低的输出边界框。接下来剩下的边界框,一直选择概率pc最高的边界框,然后把它输出成预测结果。接下来,抛弃所有剩下的边界框和这个边界框有很高交并比的边界框。接下来重复以上操作,把没处理的边界框都处理完。



        Anchor boxes:如果你想让一个格子检测出多个对象,你可以使用Anchorboxes。如下图,3*3的格子,其中行人的中点和car的中点几乎在同一个地方,两者都落入到同一个格子中。Anchor boxes思路:预先定义两个不同形状的anchor box,把预测结果和这两个anchor box关联起来。一般来说,你可能会用更多的anchor box。接下来,你需要定义cost label,不是之前的向量的8个输出,而是16个输出,即3*3*16。如果一个格子中有三个对象或者两个对象都分配到一个格子中,算法对这两种情况处理不好,需要引入一些默认手段专门处理这种情况。


        YOLO算法:如下图,首先构造训练集:训练一个算法去检测三种对象,行人、car和摩托,还需要显示指定完整的背景类别(backgroundclass),有三个类别标签,用两个anchorboxes,输出y是3*3*16(或3*3*2*8),然后训练一个卷积网络,输入是图像,卷积网络最后输出尺寸是3*3*16。


给出预测后,需要运行下非最大值抑制,如下图,因为使用2个anchor boxes,那么对于9个格子中任何一个都会有2个预测的边界框,它们中的一些概率pc会很低,注意有些边界框(boundingboxes)可以超出所在格子的高度和宽度。接下来,抛弃概率低的预测,最后你希望检测行人、car和摩托,那么你要做的是对于每个类别单独运行非最大值抑制产生最终的预测结果。


        Region proposals(候选区域):R-CNN(带区域的卷积网络,regionswith convolutional networks),如下图,这个算法尝试选出一些区域,在这些区域上运行卷积网络分类器是有意义的,此算法不再针对每个滑动窗执行检测算法,而是只选择一些窗口。选出候选区域的方法是运行图像分割算法,先找出可能的2000多个色块,然后在这个2000多个色块上放置边界框,然后在这2000多个色块上运行分类器,这样需要处理的位置可能要比滑动窗口少的多,可以减少卷积网络分类器的运行时间。


R-CNN算法的改进:如下图,基本的R-CNN算法是使用某种算法求出候选区域,然后对每个候选区域执行一次分类器,每个区域会输出一个标签并输出一个边界框。R-CNN算法不会直接信任输入的边界框,它也会输出一个边界框,这样得到的边界框比较精确,比单纯使用图像分割算法给出的色块边界要好。现在R-CNN的一个缺点是太慢了。近些年,有了一些对R-CNN算法的改进工作,如FastR-CNN算法,用卷积实现滑动窗法,不过得到候选区域的聚类步骤仍然非常缓慢;FasterR-CNN算法,使用的是卷积神经网络而不是更传统的分割算法来获得候选区域色块。


GitHub:https://github.com/fengbingchun/NN_Test  

相关文章:

国际顶级学界业界大咖云集,9 场技术论坛布道,2019 嵌入式智能国际大会强势来袭!...

2019 嵌入式智能国际大会即将来袭&#xff01;购票官网&#xff1a;https://dwz.cn/z1jHouwE2019年12月6日-8日&#xff0c;2019嵌入式智能国际大会将在深圳华侨城洲际大酒店举行。本次大会由哈尔滨工业大学&#xff08;深圳&#xff09;、清华大学国际研究生院、CSDN、嵌入式视…

Linux简介总结

1. Linux 就是Unix, 但是Unix 并不一定是Linux.2. 三种软件模式&#xff1a;商业软件&#xff0c;共享软件&#xff0c;自由软件。3. 为什么使用Linux? 它是一个自由软件。第一&#xff1a;可免费提供给任何用户使用。第二&#xff1a;它的源代码公开和可自…

Swift中编写单例的正确方式

本文由CocoaChina译者leon(社区ID)翻译自krakendev 原文&#xff1a;THE RIGHT WAY TO WRITE A SINGLETON 转载请保持所有内容和链接的完整性。 在之前的帖子里聊过状态管理有多痛苦&#xff0c;有时这是不可避免的。一个状态管理的例子大家都很熟悉&#xff0c;那就是单例。使…

C语言中的弱符号与强符号介绍

弱符号(Weak symbol)是链接器(ld)在生成ELF(Executable and Linkable Format,缩写为ELF&#xff0c;可执行和可链接格式&#xff0c;是一种用于可执行文件、目标文件、共享库和核心转储的标准文件格式。ELF文件有两种索引&#xff1a;程序标头中记载了运行时所需的段&#xff0…

Simple Transformer:用BERT、RoBERTa、XLNet、XLM和DistilBERT进行多类文本分类

作者 | Thilina Rajapakse译者 | Raku编辑 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】本文将介绍一个简单易操作的Transformers库——Simple Transformers库。它是AI创业公司Hugging Face在Transformers库的基础上构建的。Hugging Face Transfor…

StarUML中时序图添加小人

转载于 http://blog.csdn.net/longyuhome/article/details/9011629 在看时序图的例子的时候&#xff0c;发现有些的时序图上有小人的图标&#xff0c;可是一些UML工具却没有找到小人的图标&#xff0c;这让我很闹心&#xff0c;一直没解决&#xff0c;今天终于将该问题给解…

Swift学习: 从Objective-C到Swift

作者&#xff1a;方秋枋&#xff08;GitHub&#xff09; 这篇文章是自己学习Swift的笔记与深化。希望这篇文章能够帮助已经有Objective-C经验的开发者更快地学习Swift。同时也品味到Swift的精妙之处。 结论放在开头:我认为Swift比Objective-C更优雅,更安全同时也更现代,更性感…

C/C++中static关键字用法汇总

1. 函数内static局部变量&#xff1a;变量在程序初始化时被分配&#xff0c;直到程序退出前才被释放&#xff0c;也就是static是按照程序的生命周期来分配释放变量的&#xff0c;而不是变量自己的生命周期。多次调用&#xff0c;仅需一次初始化。2. cpp内的static全局变量&…

CornerNet: 成对关键点物体检测 | CSDN博文精选

作者 | 贾小树来源 | CSDN博客文章目录1、论文总述2、使用锚定框的两个缺点3、角点检测比边界框中心或 proposals效果好的两个原因4、corner pooling5、用于Grouping Corners的 embedding vector的工作原理6、正负样本的分配方式&#xff08;改进的focal loss&#xff09;7、角…

PHP创建日志记录(已封装)

1 <?php2 3 class Logs{4 private $_filepath; //文件路径5 private $_filename; //文件名6 private $_filehandle; //文件引擎7 8 9 public function Logs($dir null,$filename null){ 10 11 $this->_filepath empty($dir) ? : $d…

如何用Swift实现一个好玩的弹性动画

本文由CocoaChina译者浅夏旧时光翻译自Raywenderlich 原文&#xff1a;How To Create an Elastic Animation with Swift 每个像样的iOS应用程序一定会有自定义元素、自定义UI以及自定义动画等等很多自定义的东西。 假如你想让你的应用脱颖而出&#xff0c;你必须花费一些时间为…

深入探讨Python的import机制:实现远程导入模块 | CSDN博文精选

来源 | Python编程时光&#xff08;ID:Python-Time&#xff09;所谓的模块导入&#xff0c;是指在一个模块中使用另一个模块的代码的操作&#xff0c;它有利于代码的复用。也许你看到这个标题&#xff0c;会说我怎么会发这么基础的文章&#xff1f;与此相反。恰恰我觉得这篇文章…

吴恩达老师深度学习视频课笔记:人脸识别

什么是人脸识别&#xff1a;人脸验证和人脸识别的区别&#xff0c;如下图&#xff1a;One-shot learning&#xff1a;人脸识别所面临的挑战就是需要解决一次学习(one-shot learning)问题。这意味着在绝大多数人脸识别应用中你需要通过单单一张图像或者单单一个人脸图像就能去识…

用小白鼠喝毒药

题设&#xff1a;有N瓶水&#xff0c;其中有一瓶水有剧毒&#xff0c;如果小白鼠喝了会在24小时的时候死亡。 问&#xff1a;用多少只小白鼠能够检测出哪瓶水有剧毒&#xff1f; 要求&#xff1a;用的小白鼠数量少并且用时要短&#xff0c;并给出合理的过程与结论。 我的解题思…

怎样在swift中创建CocoaPods

本文由yake_099&#xff08;博客&#xff09;翻译自raywenderlich&#xff0c;作者&#xff1a;Joshua Greene 原文&#xff1a;How to Create CocoaPods with Swift 你可能对一些比较著名的开源的CocoaPods框架比较熟悉&#xff0c;比如Alamofire、MBProgressHUD。但是有时你…

吴恩达老师深度学习视频课笔记:神经风格迁移(neural style transfer)

什么是神经风格迁移(neural style transfer)&#xff1a;如下图&#xff0c;Content为原始拍摄的图像&#xff0c;Style为一种风格图像。如果用Style来重新创造Content照片&#xff0c;神经风格迁移可以帮你生成Generated图像。深度卷积网络在学什么&#xff1a;如下图&#xf…

“Jupyter的杀手”:Netflix发布新开发工具Polynote

作者 | Michael Li 译者 | Rosie 编辑 | Jane 出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】10 月 29 日&#xff0c;Netflix 公开了他们内部开发的 Polynote。现如今&#xff0c;大型高科技公司公开其内部的工具或服务&#xff0c;然后受到业界…

System Center 2012 r2优点

System Center 2012System Center2012 是一个全面的管理平台&#xff0c;可帮助你轻松、高效地管理数据中心、客户端设备和混合云 IT 环境。为您提供了针对私有云、托管云和公有云基础结构和应用程序服务的通用管理工具集。可按照您的需求&#xff0c;为生产基础架构、可预期应…

Swift 闭包表达式

闭包是功能性自包含模块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C 中的 blocks 以及其他一些编程语言中的 lambdas 比较相似。 闭包的形式主要有三种&#xff1a; 1. 全局函数是一个有名字但不会捕获任何值的闭包 2. 嵌套函数是一个有名字并可以捕获其封…

GNU AWK中BEGIN/END使用举例

以下是使用gnu awk将test.cpp文件拆分成两个文件a.cpp和b.cpp&#xff0c;其中b.cpp仅存放test.cpp中的数据&#xff0c;其它内容存放在a.cpp文件中。test.cpp内容如下&#xff1a; #include <stdio.h> #include <iostream> #include <string>int main() {//…

目标检测的渐进域自适应,优于最新SOTA方法

作者 | Han-Kai Hsu、Chun-Han Yao、Yi-Hsuan Tsai、Wei-Chih Hung、Hung-Yu Tseng、Maneesh Singh、Ming-Hsuan Yang译者 | 刘畅编辑 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】目标检测的最新深度学习方法依赖于大量的边界框标注信息…

讨论下IDS的绕过

自从知道dedecms自带了80sec的内置Mysqlids后&#xff0c;一直以来也没有想到绕过的办法。或者是自己mysql的根底太差了吧。于是分析dedecms源码时&#xff0c;只找模板执行&#xff0c;本地包含&#xff0c;上传等&#xff0c;完全没有想到注入存在的可能性了。 可以看看某牛的…

GCC编译选项参数介绍

gcc和g分别是gnu的c和c编译器&#xff0c;下面是整理的常用编译选项参数&#xff1a; #(1). -x: 设定文件所使用的语言&#xff0c;使文件后缀名无效&#xff0c;如下&#xff0c;执行完后生成test.o gcc -c -x c test.jpg #(2). -c: 只编译生成目标文件即*.o,只编译不链接生成…

程序员自学到底有没有用?网友们吵翻了...

最近就有个程序员吐槽说&#xff0c;自己大学没怎么听老师讲课&#xff0c;老师讲的知识要么太旧&#xff0c;要么老师不会讲&#xff0c;自己大部分时间是在网上看视频学的。引发了以下激烈的讨论。很多网友觉得&#xff0c;学校老师的代码能力不行&#xff0c;现在技术更新又…

更新 FrameWork

这里把想要改变的东西封装到FrameWork以便实现热更新&#xff0c;提一下关于BundiD 一定要一致&#xff0c;在打包的时候一定在Edit scheme —— >Run 选择Release如图&#xff1a; 因为你要跑在真机上&#xff0c;所以这个要选择Release 另外将包含你想要放出的方法类添加…

把Illustrator矢量图转化为代码:Drawscript

2019独角兽企业重金招聘Python工程师标准>>> DrawScript是一款Illustrator插件&#xff0c;可以将Illustrator的矢量图片转换成代码&#xff0c;目前免费&#xff0c;支持转换的语言有 OBJ-CCJAVASCRIPTCREATEJS/EASELJSPROCESSINGACTIONSCRIPT 3JSONRAW BEZIER PO…

必读:ICLR 2020 的50篇推荐阅读论文

来源 | 香侬科技本文整理了ICLR2020的相关论文&#xff0c;此次分享的是从Openreview中选取的部分论文&#xff0c;共50篇&#xff0c;其中大部分为NLP相关。文中涉及的相关论文推荐指数与推荐理由仅为个人观点&#xff0c;利益无关&#xff0c;亦不代表香侬科技立场。希望大家…

14个Xcode中常用的快捷键操作

在Xcode 6中有许多快捷键的设定可以使得你的编程工作更为高效&#xff0c;对于在代码文件中快速导航、定位Bug以及新增应用特性都是极有效的。 当然&#xff0c;你戳进这篇文章的目的也在于想要快速的对代码文件进行操作&#xff0c;或者是让Xcode的各面板更为适应你小本子的屏…

C++中标准模板库std::pair的实现

以下用C实现了标准模板库中的std::pair实现&#xff0c;参考了 cplusplus 和 vs2013中的utility文件。关于std::pair的介绍和用法可以参考&#xff1a; https://blog.csdn.net/fengbingchun/article/details/52205149 实现代码pair.hpp如下&#xff1a; #ifndef FBC_STL_PAIR_H…

【人在职场】能力与价值

原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://yunli.blog.51cto.com/831344/1547051 最近给团队&#xff08;指#UC浏览器电脑版#开发团队&#xff09;分享了我的《基层技术管理原则》。…