====== Object Detection ====== ===== 简介 ===== 参考链接:[[https://paperswithcode.com/task/object-detection|Object Detection-Papers with Code]] Object detection is the task of detecting instances of objects of a certain class within an image. The state-of-the-art methods can be categorized into two main types: one-stage methods and two stage-methods. One-stage methods prioritize inference speed, and example models include YOLO, SSD and RetinaNet. Two-stage methods prioritize detection accuracy, and example models include Faster R-CNN, Mask R-CNN and Cascade R-CNN. The most popular benchmark is the MSCOCO dataset. Models are typically evaluated according to a Mean Average Precision metric. ==== 目标检测模型 ==== * One-Stage methods * [[:yolo]] * [[:ssd]] * [[:retinanet]] * Two-Stage methods * [[Faster R-CNN]] * [[:mask_r-cnn]] * [[Cascade R-CNN]] ===== 目标检测快速入门 ===== [[https://zhuanlan.zhihu.com/p/34142321|干货 | 目标检测入门,看这篇就够了(已更完) - 知乎]]:2018年左右的系列文章,首先介绍了相关的经典网络模型,检测模型整体上由基础网络(Backbone Network)和检测头部(Detection Head)构成。关键内容如下。 ==== 目标检测网络模型 ==== === R-CNN === **基于深度学习的目标检测的开山之作**。**两大贡献**:1)CNN可用于基于区域的定位和分割物体;2)监督训练样本数紧缺时,在额外的数据上预训练的模型经过fine-tuning可以取得很好的效果。R-CNN将检测抽象为**两个过程**,一是基于图片提出若干可能包含物体的区域(即图片的局部裁剪,被称为Region Proposal),文中使用的是Selective Search算法;二是在提出的这些区域上运行当时表现最好的分类网络(AlexNet),得到每个区域内物体的类别。**模型本身存在的问题**也很多,如需要训练三个不同的模型(proposal, classification, regression)、重复计算过多导致的性能问题等。 === Fast R-CNN === **共享卷积运算**。文章指出R-CNN耗时的原因是CNN是在每一个Proposal上单独进行的,没有共享计算,便提出将基础网络在图片整体上运行完毕后,再传入R-CNN子网络,共享了大部分计算,故有Fast之名。文章将Proposal, Feature Extractor, Object Classification&Localization统一在一个整体的结构中,并通过共享卷积计算提高特征利用效率,是**最有贡献**的地方。 === Faster R-CNN === 提出的**RPN网络取代Selective Search算法使得检测任务可以由神经网络端到端地完成**。Faster R-CNN = RPN + Fast R-CNN。使用滑动窗口生成anchor box的思想也在后来的工作中越来越多地被采用(YOLO v2等)。**这项工作奠定了"RPN+RCNN"的两阶段方法元结构**,影响了大部分后续工作。 === YOLO=== **YOLO是单阶段方法的开山之作**。它将检测任务表述成一个统一的、端到端的回归问题,并且以只处理一次图片同时得到位置和分类而得名。其卷积网络:由GoogLeNet更改而来,每个网格对每个类别预测一个条件概率值,并在网格基础上生成B个box,每个box预测五个回归值,四个表征位置,第五个表征这个box含有物体(注意不是某一类物体)的概率和位置的准确程度(由IoU表示)。**损失函数被分为三部分:坐标误差、物体误差、类别误差**。为了平衡类别不均衡和大小物体等带来的影响,损失函数中添加了权重并将长宽取根号。相比两阶段方法,其速度优势明显,实时的特性令人印象深刻。但YOLO本身也存在一些问题,如划分网格较为粗糙,每个网格生成的box个数等**限制了对小尺度物体和相近物体的检测**。 === SSD === Single Shot Multibox Detector。相对于YOLO,**多尺度的feature map**:基于VGG的不同卷积段,输出feature map到回归器中。这一点试图提升小物体的检测精度。**更多的anchor box**,每个网格点生成不同大小和长宽比例的box,并将类别预测概率基于box预测(YOLO是在网格上),得到的输出值个数为(C+4)×k×m×n,其中C为类别数,k为box个数,m×n为feature map的大小。 ==== 模型度量 ==== * 目标检测模型本源上可以用统计推断的框架描述,我们关注其犯第一类错误和第二类错误的概率,通常用准确率和召回率来描述。**准确率描述了模型有多准,即在预测为正例的结果中,有多少是真正例;召回率则描述了模型有多全,即在为真的样本中,有多少被我们的模型预测为正例**。 * 在检测中,mAP(mean Average Precision)作为一个统一的指标将这两种错误兼顾考虑。具体地,对于每张图片,检测模型输出多个预测框(常常远超真实框的个数),我们使用IoU(Intersection Over Union,交并比)来标记预测框是否为预测正确。标记完成后,**随着预测框的增多,召回率总会提升,在不同的召回率水平下对准确率做平均,即得到AP,最后再对所有类别按其所占比例做平均,即得到mAP**。 * 常常用FPS(Frame Per Second,每秒帧率)来表示检测模型能够在指定硬件上每秒处理图片的张数。通常来讲,在单块GPU上,两阶段方法的FPS一般在个位数,而单阶段方法可以达到数十。 ==== 标准数据集 ==== Pascal VOC(Pascal VOC对早期检测工作起到了重要的推动作用),MS COCO(COCO提供的评测标准更为精细化,提供的API不仅包含了可视化、评测数据的功能,还有对模型的错误来源分析脚本,能够更清晰地展现算法的不足之处。COCO所建立的这些标准也逐渐被学术界认可,成为通用的评测标准。),Cityscapes(专注于现代城市道路场景的理解,提供了30个类的像素级标注,是自动驾驶方向较为权威的评测集)。 ==== 提升检测模型性能的技巧 ==== **数据增强**(数据增强是增加深度模型鲁棒性和泛化性能的常用手段,随机翻转、随机裁剪、添加噪声等也被引入到检测任务的训练中来,其信念是通过数据的一般性来迫使模型学习到诸如对称不变性、旋转不变性等更一般的表示)、**多尺度训练/测试**(输入图片的尺寸对检测模型的性能影响相当明显,事实上,多尺度是提升精度最明显的技巧之一。)、**全局语境**(把整张图片作为一个RoI,对其进行RoI Pooling并将得到的feature vector拼接于每个RoI的feature vector上,作为一种辅助信息传入之后的R-CNN子网络)、**预测框微调/投票法**、**OHEM 在线难例挖掘**、**Soft NMS 软化非极大抑制**(检测模型的标准后处理操作,用于去除重合度(IoU)较高的预测框,只保留预测分数最高的预测框作为检测输出)、**RoIAlign RoI对齐**、**更好的先验(YOLOv2)**(使用聚类方法统计数据中box标注的大小和长宽比,以更好的设置anchor box的生成配置)、**更好的pre-train模型**(检测模型的基础网络通常使用ImageNet(通常是ImageNet-1k)上训练好的模型进行初始化,使用更大的数据集(ImageNet-5k)预训练基础网络对精度的提升亦有帮助)、**超参数的调整**(部分工作也发现如NMS中IoU阈值的调整(从0.3到0.5)也有利于精度的提升) ==== 卷积网络设计范式 ==== **Repeat**. 由AlexNet和VGG等开拓,被之后几乎所有的网络采用。即堆叠相同的拓扑结构,整个网络成为模块化的结构。**Multi-path**. 由Inception系列发扬,将前一层的输入分割到不同的路径上进行变换,最后拼接结果。**Skip-connection**. 最初出现于Highway Network,由ResNet发扬并成为标配。即建立浅层信息与深层信息的传递通道,改变原有的单一线性结构。 ==== 典型Backbone network ==== ResNet、Xception、ResNeXt、SENet、NASNet ==== 分类与定位问题的权衡 ==== 分类网络中的Pooling层操作常常会引入平移不变性等使得整体语义的理解更加鲁棒,而在检测任务中我们则需要位置敏感的模型来保证预测位置的精确性,这就产生了分类和定位两个任务间的矛盾。相关的解决方案包括R-FCN和Deformable Convolution Networks ==== 特征复用与整合 ==== **FPN**(Feature Pyramid Networks,特征金字塔本是很自然的想法,但如何构建金字塔同时平衡检测任务的定位和分类双目标,又能保证显存的有效利用,是本文做的比较好的地方。如今,FPN也几乎成为特征提取网络的标配,更说明了这种组合方式的有效性。)、**TDM**(Top-Down Modulation,TDM结构对小物体检测精度的提升帮助明显。而且,TDM是对检测头部的改进,也有推广到单阶段模型的潜力)、**DSSD**(Deconvolutional Single Shot Multibox Detector,利用反卷积操作对SSD的改进)、**RON**:(Reverse Connection with Objectness Prior Networksfor Object Detection,关注两个问题:1)多尺度目标检测,2)正负样本比例失衡的问题。)、**FSSD**(Feature Fusion Single Shot Multibox Detector,特征融合的初衷还是同时利用高层级feature map提供的语义信息和低层级feature map的位置信息,而像FPN中的逐元素相加操作进行融合的方式要求不同层级的feature map具有完全一致的大小,本文则采用拼接的方式,不受channel数的限制)、**RefineDet**(Single-Shot Refinement Neural Network for Object Detection,文章提出两个模块来在一阶段检测器中引入两阶段设计的优势:Anchor Refinement Module(ARM)和Object Detection Module(ODM)。前者用于识别并过滤背景类anchor来降低分类器的负担,并且调整anchor位置以更好的向分类器输入,后者用于多分类和box的进一步回归。) ==== 目标检测的实时处理 ==== **Light Head R-CNN**:**两阶段检测器通常在生成Proposal后进行分类的"头"(head)部分进行密集的计算**,这些密集计算正是两阶段方法在精度上领先而在推断速度上难以满足实时要求的原因。针对这两种元结构(Faster-RCNN和RFCN),文章提出了"头"轻量化方法,试图在保持精度的同时又能减少冗余的计算量,从而实现精度和速度的Trade-off。**YOLOv2**在YOLO的基础上进行了大量更新,达到了与SSD相当的精度和更快的推断速度。**SSDLite(MobileNets V2)**,MobileNets是一系列大面积应用深度可分离卷积的网络结构,试图以较小的参数量来达到跟大型网络相当的精度,以便能够在移动端部署。在本文中,作者提出了对MobileNets的改进版本,通过移动跳跃连接的位置并去掉某些ReLU层来实现更好的参数利用。 ==== 目标检测发展的一些新趋势 ==== YOLO9000,Mask R-CNN,Focal Loss,Mimic,CGBN,A-Fast-RCNN,Relation Module ===== 相关术语 ===== * IoU(Intersection over Union,交并比)。IoU计算了两个区域之交的面积跟它们之并的比,描述了两个区域的重合程度。 * mAP:随着预测框的增多,召回率总会提升,在不同的召回率水平下对准确率做平均,即得到AP,最后再对所有类别按其所占比例做平均,即得到mAP * Backbone network:基础网络(Backbone network)作为特征提取器,对检测模型的性能有着至关重要的影响。 ===== 目标检测项目案例 ===== * [[布料疵点检测]]