1.3 目标检测
目标检测(Object Detection),又译为物体检测,但由于目标检测这个译名更加流行,所以本书将Object Detection翻译为目标检测。
目标检测不是深度学习技术出现后才有的问题,而是计算机视觉领域一直存在且是最基本和最有挑战性的问题。目标检测在许多领域都有广泛的应用,包括机器视觉、自动驾驶、人机交互、基于内容的图像检索、智能视频监控和增强现实等。
目标检测的任务是确定在给定的图像中是否存在期望的物体(如人、汽车、自行车、狗和猫等),如果有,返回每个物体的类别、位置(边界框)和置信度(Confidence),相当于完成了图像分类+图像定位的工作。
对于应用者来说,可以把目标检测算法理解为一个黑盒子,输入是图像,输出是图像中物体的类别、置信度和位置。例如,猫狗检测中,把一张图像输入目标检测算法,若检测到有猫或狗存在,则输出类别(dog/cat)、置信度(××%)和位置(边界框),如图1-12所示。
图1-12 猫狗检测
简单来说,目标检测的任务是分类和定位(Classification+Localization),评价标准主要有:IoU(Intersection over Union)、mAP(Mean Average Precision)和FPS(Frame Per Second)。
● IoU:交并比,即检测结果与真实结果的交集比上它们的并集,表示检测的准确度。IoU值越大表示准确度越好,最理想情况是完全重叠,即IoU=1。
● mAP:平均精度均值,mAP越大表示精度越高,最理想情况mAP=1。
● FPS:评价目标检测速度的常用指标,即每秒内可以处理的图片数量,FPS越大表明检测速度越快。FPS跟硬件处理能力也有关系。
1.3.1 目标检测算法发展简史
自2012年Geoffrey Hinton及其学生Alex Krizhevsky等使用深度卷积神经网络赢得了当年的ImageNet图像分类大赛冠军后,2013年11月,Ross B. Girshick将CNN引入目标检测算法R-CNN,这是基于深度学习的目标检测算法的开山之作,如图1-13所示。
图1-13 目标检测技术发展简史[3]
目标检测算法以2012年为界,可以分为2012年之前的传统目标检测算法与2012年之后出现的基于深度学习的目标检测算法。
传统目标检测算法与深度学习目标检测算法的典型区别是:传统目标检测算法需要手动设计特征提取器,而深度学习目标检测算法则由深度卷积神经网络实现自动特征提取,无需手动设计特征提取器。
不得不说,有不少传统目标检测算法是基于机器学习的,如2005年的HOG算法,它先统计梯度直方图特征,然后用SVM(支持向量机,一种机器学习算法)进行分类,从大的范畴来说,该算法也是AI,但深度学习算法的效果实在太好,远远超过其他非深度学习算法,所以,本书也将其一并归为传统目标检测算法,表明这些算法曾经在2012年以前成为过主流。
在ImageNet大规模视觉识别挑战赛(ILSVRC)上,图像分类算法的Top5分类错误率也从基于非深度学习算法的25.8%降到基于深度学习算法的2.3%(2017年的SENets),这个水平已经超过了人类,意味着各行各业都可以尝试用深度学习算法替代人工,如图1-14所示。
图1-14 ILSVRC竞赛Top5分类错误率
1.3.2 深度学习目标检测算法
2013年11月,Ross B. Girshick将CNN方法引入目标检测算法,设计了R-CNN算法[4],使用Region Proposal(候选区域)+CNN代替传统目标检测使用的滑动窗口+手工设计特征提取器,大大提高了目标检测效果,并开启了基于深度学习目标检测算法的热潮,各种速度更快精度更高的算法不断出现,如图1-15所示。
图1-15 深度学习目标检测算法快速发展[3]
深度学习目标检测的平均精度均值(mAP)不断提升,从2014年VOC07数据集上的不到60%到2018年的超过80%,如图1-16所示。
图1-16 深度学习目标检测算法mAP不断提升
从图1-16中可以看出,2016年后,深度学习目标检测算法的平均精度均值已经满足大多数行业的商业项目落地的精度要求了。
从目标检测算法开发的角度来说,传统目标检测算法需要手工设计特征提取算法,例如人脸检测,需要开发者自己去定义人脸的特征有哪些(如眼睛、鼻子、嘴巴及下巴等),接着将定义的这些特征转化为计算机可以理解的几何形状(如三角形、圆形和长方形等),以及这些几何特征之间的关系(如距离、角度等),然后根据这些特征值转换为抽象程度更高的特征脸空间,最后做分类和判断。
这种方式对开发者的数学功底和编程能力要求极高,要达到一个理想检测精度的时间极长,研发资金投入极大。一般来说,没有商业潜力的目标检测应用是没有人愿意投资去研发的。所以,在传统目标检测算法时代,目标检测算法是定制化而非通用化的。
进入深度学习时代,深度学习目标检测应用的典型开发流程变为收集图片、标注图片、训练模型和部署模型这四步,如图1-17所示。只要掌握了深度学习算法开发工具的人,都可以训练出自己想要的目标检测模型。例如,在垃圾厂负责垃圾分类回收的工程师,希望设计一个自动化垃圾分类设备,对他来说,只需要收集垃圾图片、标注垃圾图片,通过标注的垃圾图片训练垃圾分类模型,然后在自动化设备上部署垃圾分类模型即可。
图1-17 深度学习应用典型开发流程
由此可见,在深度学习目标检测算法时代,人人都可以成为目标检测算法的开发者,不需要深厚的数学功底和高超的编程能力,只需要掌握深度学习开发工具(如本书介绍的TensorFlow Object Detection API),基于现有模型就能训练出自己项目所需的模型。
与传统目标检测算法相比,深度学习目标检测算法是通用化的目标检测算法,而非定制化的目标检测算法,其特点见表1-1。
表1-1 传统目标检测算法vs深度学习目标检测算法
本书第2~5章会分别详述如何搭建深度学习工具运行环境、训练深度学习目标检测模型、部署深度学习模型和在部署中进一步优化模型推理计算速度。