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

从简单的图像分类到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,一经查实,立即删除!

相关文章

设计一个应用程序,以在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…

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]"…

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…

洛谷 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;其中每个节点都有一…

8086简单的指令流水线_在8086微处理器中执行流水线的指令和概念的步骤

8086简单的指令流水线Any computer or machine works according to some instructions. These instructions are responsible for all the work that the machine does. But how does a machine work to understand and execute that instruction? 任何计算机或机器都按照某些…

node.js 爬虫入门总结

node.js爬虫 前端同学可能向来对爬虫不是很感冒&#xff0c;觉得爬虫需要用偏后端的语言&#xff0c;诸如 php &#xff0c; python 等。当然这是在 nodejs 前了&#xff0c;nodejs 的出现&#xff0c;使得 Javascript 也可以用来写爬虫了。由于 nodejs 强大的异步特性&#xf…

将八进制数制转换为二进制,十进制和十六进制数制

1)将八进制数制转换为二进制数制 (1) Conversion of Octal Number System to Binary Number System) To convert octal numbers into binary numbers, we can use the relationship between octal and binary numbers. 要将八进制数转换为二进制数&#xff0c;我们可以使用八进…

想提高用户访问的响应速度和成功率还不赶快学习CDN

2019独角兽企业重金招聘Python工程师标准>>> 课程介绍 CDN可以将源站内容分发至最接近用户的节点&#xff0c;使用户可就近取得所需内容&#xff0c;提高用户访问的响应速度和成功率。解决因分布、带宽、服务器性能带来的访问延迟问题&#xff0c;适用于站点加速、点…

Python 核心编程(第二版)——条件和循环

Python 中的 if 子句由三部分组成: 关键字本身&#xff0c;用于判断结果真假的条件表达式&#xff0c; 以及当表达式为真或者非零时执行的代码块。if 语句的语法如下: if expression: expr_true_suite 单个 if 语句可以通过使用布尔操作符 and , or 和 not实现多重判断条件或…

Silverlight 异步单元测试

Silverlight 中的很多操作都是异步的&#xff0c;很多情况下要求单元测试也是异步的&#xff0c;但是介绍异步单元测试的文档很少。通过对 Silverlight Toolkit 中的 Microsoft.Silverlight.Testing 和 Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight 这两个文件…

Wafer晶圆封装工艺介绍

芯片封装的目的&#xff08;The purpose of chip packaging&#xff09;: 芯片上的IC管芯被切割以进行管芯间连接&#xff0c;通过引线键合连接外部引脚&#xff0c;然后进行成型&#xff0c;以保护电子封装器件免受环境污染&#xff08;水分、温度、污染物等&#xff09;&…

iOS:个人浅谈工厂模式

一、什么是工厂方法&#xff1f; 正式的解释是&#xff1a;在基类中定义创建对象的一个接口&#xff0c;让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。工厂方法要解决的问题是对象的创建时机&#xff0c;它提供了一种扩展的策略&#xff0c;很好地符合了…

wrf 嵌套网格作用_在网格系统中使用响应列,嵌套列和偏移列 引导程序

wrf 嵌套网格作用介绍 (Introduction) In the previous article, we have learnt what is grid and grid system and how it works? Now, we will learn about how Responsive column, Nesting Columns and Offset Columns works and how to use them? If you have any doubt…

[看书笔记]《深入java虚拟机》——java体系结构(二)

java虚拟机的三种含义&#xff1a; - 抽象的规范 - 一个具体的实现 - 一个运行中的虚拟机实例 ---------------------java虚拟机的生命周期&#xff1a; java虚拟机实例的天职就是负责运行一个java程序。 启动一个java程序&#xff0c;一个虚拟机实例诞生了&#xff1b;程序关闭…

全新的membership框架Asp.net Identity(1)——.Net membership的历史

在Asp.net上&#xff0c;微软的membershop框架经历了Asp.net membership到Asp.net simple membership&#xff0c;再到现在的Asp.net Identity. 每一次改变&#xff0c;都使得验证框架更加的适应变化和可定制。这篇文章是Asp.net Identity系列的开篇&#xff0c;主要就membersh…

二.编写第一个c#程序(注释,命名空间,类,Main方法,标识符,关键字,输入,输出语句,)...

复习编写一个控制台应用程序&#xff0c;目标是在控制台输出“Hello World” 1.第一步&#xff0c;打开Visual Studio 2012以上版本(我用的是VS 2015)&#xff0c;打开完成后出现以下界面 2.第二步&#xff0c;这时候就要新建一个解决方案了&#xff0c;创建解决方案可以直接点…

node oauth2验证_如何设置和使用护照OAuth Facebook身份验证(第1部分)| Node.js

node oauth2验证In my last articles, we looked at the implementation of the passport-local authentication strategy. We also looked at the various requirements to get started with the login form. 在上一篇文章中&#xff0c;我们介绍了护照本地身份验证策略的实现…