一文读懂深度学习框架下的目标检测(附数据集)

从简单的图像分类到3D位置估算,在机器视觉领域里从来都不乏有趣的问题。其中我们最感兴趣的问题之一就是目标检测


如同其他的机器视觉问题一样,目标检测目前为止还没有公认最好的解决方法。在了解目标检测之前,让我们先快速地了解一下这个领域里普遍存在的一些问题。


目标检测 vs 其他计算机视觉问题图像分类


在计算机视觉领域中,最为人所知的问题便是图像分类问题。


图像分类是把一幅图片分成多种类别中的一类。 


ImageNet是在学术界使用的最受欢迎的数据集之一,它由数百万个已分类图像组成,部分数据用于ImageNet大规模视觉识别挑战赛(ILSVRC)。 最近几年来,解决分类问题的模型已经有了超越人类的识别能力,所以分类问题实际上已经被解决了。


然而,图像分类问题有许多挑战,相伴随着的是许多如何解决这些问题的文献以及对还未被解决的问题的探讨。 


35aec72ca2125d7cd47ccbe03a42bb2bfe2897e6图像分类实例


1. 目标定位


同图像分类类似,目标定位要找到单个目标在图像中的位置。


e9691b7c1f4bbf823231d166e629eb9334a6c79f目标定位实例


目标定位在实际生活中的应用很广泛,比如,智能剪切(通过定位目标所在的位置,识别需要图片从哪里剪切) ,或者进行常规的目标提取以便进一步处理。结合图像分类技术,它不仅仅可以定位目标,还能对该物体分类。


2. 实例分割


从目标检测更进一步,我们不仅仅要找到图片中的对象,更是要发现该检测对象对应的像素码。我们把这个问题称为实例分割,或者是对象分割。


3. 目标检测


在迭代处理定位和图片分类问题时,我们最终还是需要对多个目标进行同时检测和分类。目标检测是在图片中对可变数量的目标进行查找和分类。其中重要的区别是“可变”这一部分。


和图像分类问题不同的是,由于每一张图片待检测目标的数量不一,目标检测的输出长度是可变的。在这篇文章中,我们将详细地介绍一些实际应用,讨论目标检测作为机器学习问题的主要困难,以及在过去的几年里如何应用深度学习处理目标检测。


f79c5da3dfc2199f48f5406e32162c685595b4f4目标检测实例


实际案例


在Tryolabs 中,我们专注于使用现有的机器学习方法解决商务问题,所以即使我们热衷于机器学习的科研问题,但最终我们还是要回归实际应用中。


虽然目标检测从某种程度上在工业界还是一个很新的工具,但它已经有了很多实用和有趣的应用。


1. 人脸检测


自20世纪中期以来,傻瓜相机开始通过更为高效的自动对焦来检测人面。 虽然这是一种比较浅显的目标检测应用,但是这种方法同样适用于其他类型的目标检测,我们稍后将会介绍。


2. 计数


计数是一个简单但是经常被忽略的目标检测问题。统计人,车,花甚至是微生物数量是现实世界的需求,在大部分基于图像的系统中都要使用。近几年伴随着监控视频设备的不断涌现,使用机器视觉将原图像转化为结构化数据的需求也越来越多。


3. 视觉搜索引擎


最后,我们比较喜欢的一个实例是Pinterest(图片社交平台)的视觉搜索引擎。 


他们将目标检测作为索引图像内容的处理流程之一。比如,你可以在不同的背景下找到某个特定的钱包。 这比Google Image的反向搜索引擎只是找到类似的图像更强大。

a49b4468b72c9de0a04d642bec2954dc31cdd8e7相似查找:我们应用目标检测方法定位包或鞋子这些产品。在这张图片中, 用户可以点击图片中的目标对象便可以查找类似的产品


4. 空中影像分析


在这个廉价无人机和卫星兴起的年代,我们能在空中获取空前多的关于地球的数据。 如今已经有越来越多的公司开始使用planet 或者descartes labs 公司提供的卫星图片,应用目标检测来计算汽车,树,船的数量。这些举措都为我们带来了高质量的数据,这在从前是不可能实现的。


一些公司正在应用无人机摄像对人难以到达的地方进行自动监测(例如BetterView)或者使用物体检测方法进行整体分析(例如TensorFlight)。 除此之外,一些公司实现了不需人为干预下的场景自动检测和位置识别。


0e61416e7d8c3cd3947016f04c82f119b17a4be7使用TensorFlight实现汽车、树和行人的识别


目标检测存在的问题和挑战


现在,让我们开始深入了解目标检测中的主要问题。


1. 对象数量不确定


我们在前面提到过对象数量可变,但是并没有解释为什么是个问题。当训练机器学习模型的时候,你经常需要把数据表示成固定长度的向量。如果在训练之前图片中的对象数量是未知的,模型的输出数量也就是未知的了。因此,一些增加模型复杂性的预处理是必要的。


在传统的方法中,输出的数量可以使用滑动窗函数来计算,给不同位置产生一个固定大小的特征窗。在做完了预测之后,有些预测会被丢弃,有些会被合并到最终结果里面。


a98be4bd74256cd867fc6fe35470698cb44f727d

滑动窗示例


2. 对象大小不同


另外一个挑战是处理不同大小对象的问题。面对一个简单的分类问题,你期望是尽可能将覆盖图片大部分面积的对象进行分类。而在有些情境中,你想识别的对象可能只有几十个像素点大小(或者说是原图片中占比很小的一部分)。以往人们通过使用不同大小的滑动窗来解决这个问题,这种方法虽然简单,却效率低下。


3. 建模


第三个挑战是同时解决目标定位和图像分类这两个问题。 我们如何将这两种不同类型的需求组合到一个模型里呢?


在进入深度学习和如何应对这些挑战之前,让我们先快速了解一些经典的检测方法。


检测方法


1. 传统方法


在这里我们将集中介绍其中两个最流行且目前依然被广泛使用的模型。


第一个是2001年由Paul Viola和Michael Jones在论文《Robust Real-time Object Detection》里提出 的Viola-Jones框架。这个方法快速且相对简单,使得低处理能力的傻瓜相机得以进行实时的面部识别。


我们不打算深入介绍它是如何工作和训练的,但是总体来说,该算法是通过使用哈尔特征(Haar features)生成许多(可能几千个)简单的二元分类器来实现的。这些分类器通过一个多尺度级联滑动窗进行评估,一旦遇到错误的分类结果则提前结束。


另一个传统方法是使用方向梯度直方图(HOG)特征和支持向量机来分类。这个方法依然需要一个多尺度滑动窗,尽管它比Viola-Jones表现优异,但速度却慢了很多。


2. 深度学习方法


在机器学习领域,深度学习一直是个大boss,尤其在计算机视觉方面。在图像分类的任务上,深度学习已经彻底击败了其他的传统模型。同样,在目标检测方面,深度学习也代表了目前的最先进水平。


读到这里,你应该对我们面临的挑战和对解决它们的办法有了一定的了解,接下来我们将概述一下在过去的几年深度学习方法的发展历程。


  • OverFeat


2013年由NYU(纽约大学) 提出的OverFeat 是最早将深度学习用于目标检测的方法之一。他们提出了一个使用卷积神经网络(CNNs)来处理多尺度滑窗的算法。


  • R-CNN


OverFeat提出后不久,加州大学伯克利分校的Ross Girshick及其同事就发表了Regins with CNN features,简称R-CNN的方法,该方法在物体识别挑战中有50%的效果提升。


他们提出了目标检测分三步走的方法:

  • 使用候选区域方法(最流行的一个是’Selective Search’)提取可能的物体

  • 使用CNN从每一个区域提取特征

  • 使用支持向量机(SVM)分类每一个区域


9c130adf289893017e761b0a14bb08fa89dcd965R-CNN架构

Girshick, Ross, et al. "Rich feature hierarchies for accurate object detection and semantic segmentation." 2014.


尽管R-CNN能达到很好的识别效果,但是它在训练中有很多的问题。


为了训练模型,你首先要对训练数据集产生候选区域,然后把CNN特征提取应用于每一个区域(对于Pascal 2012数据集通常需要处理200GB的数据),最后再训练支持向量机分类器。


  • Fast R-CNN


R-CNN被提出不久后,它又延伸出了一个完全使用深度学习的版本——就在一年后,Ross Girshick(目前在微软研究中心)发表了Fast R-CNN。 


和R-CNN类似,Fast R-CNN依然采用Selective Search生成候选区域,但是和之前的分别提取出所有的候选区域然后使用支持向量机分类器不同,Fast R-CNN 在完整的图片上使用CNN然后使用集中了特征映射的兴趣区域(Region of Interest, RoI),以及前向传播网络进行分类和回归。这个方法不仅更快,而且有Rol集中层和全连接层,使得模型从头到尾可求导,更容易训练。


Fast R-CNN最大的不足是,这个模型依然依赖Selective Search(或者其他的区域候选算法),当用该方法进行推论时,这块就成了一个瓶颈。


415cfbaa612771d82dac1712df097da74da427b2Fast R-CNN

Girshick, Ross. "Fast R-CNN" 2015.


  • YOLO


在Fast R-CNN被提出过后不久,Joseph Redmon(与Girshick等人合著)发表了You Only Look Once:Unified, Real-Time Object Detection(YOLO)这篇论文。


YOLO提出了一个兼具准确性和速度性的简单的卷积神经网络,首次实现了实时物体检测。


f8af046075df620f6f8892e5ea523c5ba0ef7f00YOLO架构


Redmon, Joseph, et al. "You only look once: Unified, real-time object detection." 2016.


  • Faster R-CNN


接着,Shaoqing Ren(依然与Girshick合著,目前在Fackbook研究中心)发表了Faster R-CNN,这是R-CNN的第三次迭代。


Faster R-CNN添加了候选区域网络(Region Proposal Network, RPN),试图取消对Selective Search 算法的依赖,这使得模型可以完全实现端到端训练。


我们暂时不会详细深入地介绍RPNs的运行原理,但抽象地说,它基于一个叫“物体性”(objectness)的分数输出对象。这些物体被用在Rol集中层和全连接层,从而实现分类的目标。

a2747bf6869576acd535c2eb863802f26b6c2be8Faster R-CNN架构


Ren, Shaoqing, et al. "Faster R-CNN: Towards real-time object detection with region proposal networks." 2015.


  • SSD和R-FCN


最后,还有两篇论文不得不提:Single Shot Detector(SSD) 和 Region-based Fully Convolutional Networks(R-FCN)。 前者在YOLO的基础上使用多尺寸的卷积特征图使得在结果和速度上都有提升。后者基于Faster R-CNN的架构,但是只使用了卷积网络。


数据集的重要性


在研究中,数据集扮演了十分重要的角色,其重要性经常被低估。每一次新的数据集发布,都会有论文被发表,新的模型在此基础上进行比对和提升,把不可能变成可能。


很可惜,对于目标检测,我们还没有足够的数据集。数据很难产生,而且成本很高,具备优秀数据库的公司一般不愿意公开他们的数据,而学校则无法接触到优质的数据集。


话虽如此,我们还是有一些不错的公开数据可以使用,下面的列表就是目前可用的主要数据集。


Name

# Images (trainval)

# Classes

Last updated

ImageNet

450k

200

2015

COCO

120K

80

2014

Pascal VOC

12k

20

2012

Oxford-IIIT Pet

7K

37

2012

KITTI Vision

7K

3

2014


结论


最后,在目标检测领域,还有很多未知的领域值得我们探索,不论是业界应用还是新型算法。尽管这篇文章只对目标检测作了简单的概述,我们依然希望它能帮助你初步了解目标检测这一领域,并为你更进一步的学习打下基础。



原文发布时间为:2017-09-29

本文作者:及子龙,张礼俊,余志文,钱天培

本文来自云栖社区合作伙伴“数据派THU”,了解相关信息可以关注“数据派THU”微信公众号


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

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

相关文章

[转载] Python-Strings

参考链接: Python成员资格和身份运算符 | in, not in, is, is not Strings 介绍 String是Python中最常用的类型。仅仅用引号括起字符就可以创建string变量。字符串使用单引号或双引号对Python来说是一样的。 var1 Hello World! var2 "Pyth…

aes-128算法加密_加密算法问题-人工智能中的一种约束满意问题

aes-128算法加密The Crypt-Arithmetic problem in Artificial Intelligence is a type of encryption problem in which the written message in an alphabetical form which is easily readable and understandable is converted into a numeric form which is neither easily…

读书笔记《集体智慧编程》Chapter 2 : Make Recommendations

本章概要本章主要介绍了两种协同过滤(Collaborative Filtering)算法,用于个性化推荐:基于用户的协同过滤(User-Based Collaborative Filtering,又称 K-Nearest Neighbor Collaborative Filtering&#xff0…

[转载] python中的for循环对象和循环退出

参考链接: Python中循环 流程控制-if条件 判断条件,1位true,0是flesh,成立时true,不成立flesh,not取反 if 1; print hello python print true not取反,匹配取反,表示取非1…

设计一个应用程序,以在C#中的按钮单击事件上在MessageBox中显示TextBox中的文本...

Here, we took two controls on windows form that are TextBox and Button, named txtInput and btnShow respectively. We have to write C# code to display TextBox’s text in the MessageBox on Button Click. 在这里,我们在Windows窗体上使用了两个控件&…

Oracle优化器:星型转换(Star Query Transformation )

Oracle优化器:星型转换(Star Query Transformation )Star query是一个事实表(fact table)和一些维度表(dimension)的join。每个维度表都跟事实表通过主外键join,且每个维度表之间不j…

[转载] python循环中break、continue 、exit() 、pass的区别

参考链接: Python中的循环和控制语句(continue, break and pass) 1、break:跳出循环,不再执行 用在while和for循环中 用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句 如果…

JavaScript | 声明数组并使用数组索引分配元素的代码

Declare an array, assign elements by indexes and print all elements in JavaScript. 声明一个数组&#xff0c;通过索引分配元素&#xff0c;并打印JavaScript中的所有元素。 Code: 码&#xff1a; <html><head><script>var fruits [];fruits[0]"…

[转载] Python入门(输入/输出、数据类型、条件/循环语句)

参考链接&#xff1a; Python中的循环技术 在介绍之前我们先来看看计算机的三个根本性基础&#xff1a; 1.计算机是执行输入、运算、输出的机器 2.程序是指令和数据的集合 3.计算机的处理方式有时与人们的思维习惯不同 &#xff08;以上是引自《计算机是怎样跑起来的》…

第5章 函数与函数式编程

第5章 函数与函数式编程 凡此变数中函彼变数者&#xff0c;则此为彼之函数。 ( 李善兰《代数学》) 函数式编程语言最重要的基础是λ演算&#xff08;lambda calculus&#xff09;&#xff0c;而且λ演算的函数可以传入函数参数&#xff0c;也可以返回一个函数。函数式编程 (简称…

mcq 队列_人工智能能力问答中的人工智能概率推理(MCQ)

mcq 队列1) Which of the following correctly defines the use of probabilistic reasoning in AI systems? In situations of uncertainty, probabilistic theory can help us give an estimate of how much an event is likely to occur or happen.It helps to find the pr…

[转载] Python中的xrange和range的区别

参考链接&#xff1a; Python中的range()和xrange() 在python2 中 range(start,end,step)返回一个列表&#xff0c;返回的结果是可迭代对象&#xff0c;但不是迭代器。iter()转化为列表迭代器。xrange()返回的是一个序列&#xff0c;他也是可迭代对象&#xff0c;但不是迭代…

Kubernetes基础组件概述

本文讲的是Kubernetes基础组件概述【编者的话】最近总有同学问Kubernetes中的各个组件的相关问题&#xff0c;其实这些概念内容在官方文档中都有&#xff0c;奈何我们有些同学可能英文不好&#xff0c;又或者懒得去看&#xff0c;又或者没有找到&#xff0c;今天有时间就专门写…

c语言将链表写入二进制文件_通过逐级遍历将二进制树转换为单链表的C程序

c语言将链表写入二进制文件Problem statement: Write a C program to convert a binary tree into a single linked list by traversing level-wise. 问题陈述&#xff1a;编写一个C程序&#xff0c;通过逐级遍历将二进制树转换为单个链表 。 Example: 例&#xff1a; The ab…

[转载] C Primer Plus 第6章 C控制语句 6.16 编程练习及答案

参考链接&#xff1a; 用Python打印金字塔图案的程序 2019独角兽企业重金招聘Python工程师标准>>> 1、编写一个程序&#xff0c;创建一个具有26个元素的数组&#xff0c;并在其中存储26个小写字母。并让该程序显示该数组的内容。 #include int main (void) { …

C# String和string的区别

C#中同时存在String与string MSDN中对string的说明&#xff1a; string is an alias for String in the .NET Framework。string是String的别名而已&#xff0c;string是c#中的类&#xff0c;String是Framework的类&#xff0c;C# string 映射为 Framework的 String。如果用str…

要求用户在Python中输入整数| 限制用户仅输入整数值

input() function can be used for the input, but it reads the value as a string, then we can use the int() function to convert string value to an integer. input()函数可用于输入&#xff0c;但它将值读取为字符串&#xff0c;然后可以使用int()函数将字符串值转换为…

[转载] python——if语句、逻辑运算符号

参考链接&#xff1a; 用Python链接比较运算符 1.if条件判断语句&#xff1a; if 要判断的条件(True): 条件成立的时候&#xff0c;要做的事情 elif 要判断的条件(True): .... elif 要判断的条件(True): .... else: 条件不成立的时候要做的事情 示例&#xff1a; 判断学生…

洛谷 P2689 东南西北【模拟/搜索】

题目描述 给出起点和终点的坐标及接下来T个时刻的风向(东南西北)&#xff0c;每次可以选择顺风偏移1个单位或者停在原地。求到达终点的最少时间。 如果无法偏移至终点&#xff0c;输出“-1”。 输入输出格式 输入格式&#xff1a; 第一行两个正整数x1,y1&#xff0c;表示小明所…

单链表遍历_单链表及其遍历实现的基本操作

单链表遍历单链表 (Single linked list) Single linked list contains a number of nodes where each node has a data field and a pointer to next node. The link of the last node is to NULL, indicates end of list. 单个链表包含许多节点&#xff0c;其中每个节点都有一…